X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fgraphicsbuffer.cpp;h=844dfe86e9835a6b6238106893bae9b38b90223f;hp=82c6a3098eb1d1b029d8900a44bf758270edb704;hb=6b7e92069596a3f19fbe068b14a9c5ef59c22061;hpb=ddf7783ce69eb619f5a6b12e779c134279aa2ac6 diff --git a/src/graphicsbuffer.cpp b/src/graphicsbuffer.cpp index 82c6a30..844dfe8 100644 --- a/src/graphicsbuffer.cpp +++ b/src/graphicsbuffer.cpp @@ -36,7 +36,7 @@ static GLenum BufferUsageToGLUsage(GraphicsBuffer::BufferUsage buffer_usage) usage = GL_STREAM_COPY; break; default: - SDL_assert(false && "Unknown buffer usage type."); + SDL_assert(false && "Unknown buffer usage type."); //WTF? usage = GL_DYNAMIC_DRAW; } return usage; @@ -56,6 +56,8 @@ static GLenum BufferTypeToGLType(GraphicsBuffer::BufferType buffer_type) return GL_PIXEL_UNPACK_BUFFER; case GraphicsBuffer::BufferTypeUniform: return GL_UNIFORM_BUFFER; + case GraphicsBuffer::BufferTypeTexture: + return GL_TEXTURE_BUFFER; case GraphicsBuffer::BufferTypeDrawIndirect: return GL_DRAW_INDIRECT_BUFFER; default: @@ -66,12 +68,13 @@ static GLenum BufferTypeToGLType(GraphicsBuffer::BufferType buffer_type) GraphicsBuffer::GraphicsBuffer() { m_invalidated = true; - m_map_pointer = nullptr; + m_map_pointer = NULL; m_buffer_size = 0; m_buffer_shape_dirty = true; m_buffer_handle = 0; m_buffer_usage = BufferUsageDynamicDraw; m_faking_map = false; + m_name = "Unnamed Buffer"; SetUsage(BufferUsageStaticDraw); } @@ -89,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) @@ -104,7 +112,7 @@ void GraphicsBuffer::Invalidate() if (!m_buffer_shape_dirty) { // Orphan the block of memory we're pointing to. - Upload(m_buffer_size, nullptr); + Upload(m_buffer_size, NULL); } // Apparently not supported. //glInvalidateBufferData(m_buffer_handle); @@ -123,6 +131,7 @@ bool GraphicsBuffer::RecreateBuffer(const void *data) glDeleteBuffers(1, &m_buffer_handle); } glGenBuffers(1, &m_buffer_handle); + glObjectLabel(GL_BUFFER, m_buffer_handle, -1, m_name); m_buffer_shape_dirty = false; if (m_buffer_size) Upload(m_buffer_size, data); @@ -183,12 +192,16 @@ 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) { Upload(m_buffer_size, m_map_pointer); free(m_map_pointer); - m_map_pointer = nullptr; + m_map_pointer = NULL; m_invalidated = false; m_faking_map = false; return; @@ -196,7 +209,7 @@ void GraphicsBuffer::UnMap() Bind(); glUnmapBuffer(target); - m_map_pointer = nullptr; + m_map_pointer = NULL; m_invalidated = false; } @@ -211,9 +224,9 @@ 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 != nullptr) + if (data != NULL) m_invalidated = false; } @@ -230,22 +243,25 @@ void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* dat void GraphicsBuffer::Resize(size_t length) { - if (m_invalidated) + if (m_invalidated && m_buffer_size >= length) { m_buffer_size = length; } else { + 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; glGenBuffers(1, &m_buffer_handle); - Upload(length, nullptr); + 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); glDeleteBuffers(1, &old_buffer); m_buffer_size = length; + glPopDebugGroup(); } } @@ -257,3 +273,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); +}