Skip to content

File Buffers.cpp

File List > render > Buffers.cpp

Go to the documentation of this file

#include "Buffers.h"

void Buffers::_delBuffer()
{
    glDeleteBuffers(1, &buf_ID);
    buf_ID = 0;
}

void Buffers::_deepCopyFrom(const Buffers& src)
{
    buf_size = src.buf_size;

    if (src.buf_ID == 0)
    {
        buf_ID = 0;
        return;
    }

    glGenBuffers(1, &buf_ID);

    // Nothing to copy for a zero-size allocation (e.g. SSBO created but not yet filled).
    if (buf_size == 0)
        return;

    glBindBuffer(GL_COPY_READ_BUFFER,  src.buf_ID);
    glBindBuffer(GL_COPY_WRITE_BUFFER, buf_ID);
    glBufferData(GL_COPY_WRITE_BUFFER, buf_size, nullptr, GL_STATIC_DRAW);
    glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, buf_size);
    glBindBuffer(GL_COPY_READ_BUFFER,  0);
    glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
}

Buffers::~Buffers()
{
    if (buf_ID != 0)
        _delBuffer();
}

Buffers::Buffers(const Buffers& buf)
{
    _deepCopyFrom(buf);
}

Buffers::Buffers(Buffers&& buf) noexcept
{
    buf_ID   = buf.buf_ID;
    buf_size = buf.buf_size;
    buf.buf_ID   = 0;
    buf.buf_size = 0;
}

Buffers& Buffers::operator=(const Buffers& buf)
{
    if (this == &buf)
        return *this;

    if (buf_ID != 0)
        _delBuffer();

    _deepCopyFrom(buf);
    return *this;
}

Buffers& Buffers::operator=(Buffers&& buf) noexcept
{
    if (this == &buf)
        return *this;

    if (buf_ID != 0)
        _delBuffer();

    buf_ID   = buf.buf_ID;
    buf_size = buf.buf_size;
    buf.buf_ID   = 0;
    buf.buf_size = 0;
    return *this;
}