My eyes, they burn! Also runs faster, slightly less buggy.
[ipdf/code.git] / src / graphicsbuffer.cpp
index 576c2d6..02a8f7c 100644 (file)
@@ -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,12 +205,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;
@@ -198,7 +222,7 @@ void GraphicsBuffer::UnMap()
        
        Bind();
        glUnmapBuffer(target);
-       m_map_pointer = nullptr;
+       m_map_pointer = NULL;
        m_invalidated = false;
 }
 
@@ -213,9 +237,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;
 }
 
@@ -232,22 +256,33 @@ 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;    
                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);
+               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);
+}

UCC git Repository :: git.ucc.asn.au