X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fgraphicsbuffer.cpp;h=02a8f7cc627bd8345ee015bcf3eb2b8dd5464db1;hp=712caf82ae03cbffbeaec3668f9279005aac1bcf;hb=b716ae547424e4e4bbda86781a151c31e3a64e67;hpb=f71f97f4fd251d02882ace4be3ead033ced434c4 diff --git a/src/graphicsbuffer.cpp b/src/graphicsbuffer.cpp index 712caf8..02a8f7c 100644 --- a/src/graphicsbuffer.cpp +++ b/src/graphicsbuffer.cpp @@ -74,6 +74,7 @@ GraphicsBuffer::GraphicsBuffer() m_buffer_handle = 0; m_buffer_usage = BufferUsageDynamicDraw; m_faking_map = false; + m_name = "Unnamed Buffer"; SetUsage(BufferUsageStaticDraw); } @@ -91,6 +92,11 @@ void GraphicsBuffer::SetType(GraphicsBuffer::BufferType bufType) m_buffer_type = bufType; } +void GraphicsBuffer::SetName(const char *name) +{ + m_name = name; +} + void GraphicsBuffer::SetUsage(GraphicsBuffer::BufferUsage bufUsage) { if (bufUsage != m_buffer_usage) @@ -124,10 +130,13 @@ bool GraphicsBuffer::RecreateBuffer(const void *data) { glDeleteBuffers(1, &m_buffer_handle); } - glGenBuffers(1, &m_buffer_handle); - m_buffer_shape_dirty = false; if (m_buffer_size) + { + glGenBuffers(1, &m_buffer_handle); + glObjectLabel(GL_BUFFER, m_buffer_handle, -1, m_name); + m_buffer_shape_dirty = false; Upload(m_buffer_size, data); + } return true; } @@ -149,6 +158,10 @@ void* GraphicsBuffer::Map(bool read, bool write, bool invalidate) if (m_map_pointer) Warn("Tried to map already mapped buffer!"); + // Intel really doesn't seem to like this. + if (!m_buffer_size) + return (m_map_pointer = 0); + if (!read && m_buffer_usage == BufferUsage::BufferUsageStaticDraw) { @@ -174,6 +187,13 @@ void* GraphicsBuffer::MapRange(int offset, int length, bool read, bool write, bo if (m_map_pointer) Warn("Tried to map already mapped buffer!"); + // This sometimes makes Intel corrupt memory? + if (!length) return (m_map_pointer = 0); + + if ((size_t)(length + offset) > m_buffer_size) + Fatal("Tried to map outside of range!"); + + RecreateBuffer(); Bind(); @@ -185,6 +205,10 @@ void* GraphicsBuffer::MapRange(int offset, int length, bool read, bool write, bo void GraphicsBuffer::UnMap() { GLenum target = BufferTypeToGLType(m_buffer_type); + + // If we're not mapped, unmapping is a no-op. + if (!m_map_pointer) + return; if (m_faking_map) { @@ -213,7 +237,7 @@ void GraphicsBuffer::Upload(size_t length, const void* data) if (!RecreateBuffer(data)) { Bind(); - glBufferData(target, length, data, usage); + glBufferData(target, length+1, data, usage); } if (data != NULL) m_invalidated = false; @@ -232,12 +256,22 @@ void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* dat void GraphicsBuffer::Resize(size_t length) { + if (!m_buffer_size) + { + m_invalidated = true; + m_buffer_size = length; + return; + } if (m_invalidated) { m_buffer_size = length; + m_buffer_shape_dirty = true; } else { + size_t oldsize = m_buffer_size; + glPushDebugGroup(GL_DEBUG_SOURCE_APPLICATION, 0, -1, "Resizing buffer."); + glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DEBUG_SEVERITY_HIGH, 0, NULL, GL_TRUE); // Create a new buffer and copy the old data into it. UnMap(); GLuint old_buffer = m_buffer_handle; @@ -245,9 +279,10 @@ void GraphicsBuffer::Resize(size_t length) Upload(length, NULL); glBindBuffer(GL_COPY_READ_BUFFER, old_buffer); glBindBuffer(GL_COPY_WRITE_BUFFER, m_buffer_handle); - glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, m_buffer_size); + glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, oldsize); glDeleteBuffers(1, &old_buffer); m_buffer_size = length; + glPopDebugGroup(); } } @@ -259,3 +294,7 @@ void GraphicsBuffer::Bind() const glBindBuffer(BufferTypeToGLType(m_buffer_type), m_buffer_handle); } +void GraphicsBuffer::BindRange(size_t start, size_t size) const +{ + glBindBufferRange(BufferTypeToGLType(m_buffer_type), 0, m_buffer_handle, start, size); +}