Inner step of multiplication in x64 assembly
[ipdf/code.git] / src / graphicsbuffer.cpp
index 37d9b12..576c2d6 100644 (file)
@@ -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,11 +68,12 @@ 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;
        SetUsage(BufferUsageStaticDraw);
 }
 
@@ -103,20 +106,20 @@ 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);
 }
 
-void GraphicsBuffer::RecreateBuffer()
+bool GraphicsBuffer::RecreateBuffer(const void *data)
 {
        // If the buffer is not dirty, don't recreate it.
-       if (!m_buffer_shape_dirty) return;
+       if (!m_buffer_shape_dirty) return false;
        // If the buffer is mapped, don't recreate it.
-       if (m_map_pointer) return;
+       if (!m_faking_map && m_map_pointer) return false;
        // If the buffer has data in it we need, don't recreate it.
-       if (!m_invalidated) return;
+       if (!m_invalidated) return false;
        if (m_buffer_handle)
        {
                glDeleteBuffers(1, &m_buffer_handle);
@@ -124,7 +127,8 @@ void GraphicsBuffer::RecreateBuffer()
        glGenBuffers(1, &m_buffer_handle);
        m_buffer_shape_dirty = false;
        if (m_buffer_size)
-               Upload(m_buffer_size, nullptr);
+               Upload(m_buffer_size, data);
+       return true;
 }
 
 void* GraphicsBuffer::Map(bool read, bool write, bool invalidate)
@@ -145,6 +149,14 @@ void* GraphicsBuffer::Map(bool read, bool write, bool invalidate)
        if (m_map_pointer)
                Warn("Tried to map already mapped buffer!");    
 
+
+       if (!read && m_buffer_usage == BufferUsage::BufferUsageStaticDraw)
+       {
+               m_map_pointer = malloc(m_buffer_size);
+               m_faking_map = true;
+               return m_map_pointer;
+       }
+
        RecreateBuffer();
 
        Bind();
@@ -173,6 +185,16 @@ void* GraphicsBuffer::MapRange(int offset, int length, bool read, bool write, bo
 void GraphicsBuffer::UnMap()
 {
        GLenum target = BufferTypeToGLType(m_buffer_type);
+
+       if (m_faking_map)
+       {
+               Upload(m_buffer_size, m_map_pointer);
+               free(m_map_pointer);
+               m_map_pointer = nullptr;
+               m_invalidated = false;
+               m_faking_map = false;
+               return;
+       }
        
        Bind();
        glUnmapBuffer(target);
@@ -187,13 +209,14 @@ void GraphicsBuffer::Upload(size_t length, const void* data)
        GLenum usage = BufferUsageToGLUsage(m_buffer_usage);
 
        m_invalidated = true;
-       RecreateBuffer();
-       
-       Bind();
-       glBufferData(target, length, data, usage);
+       m_buffer_size = length;
+       if (!RecreateBuffer(data))
+       {
+               Bind();
+               glBufferData(target, length, data, usage);
+       }
        if (data != nullptr)
                m_invalidated = false;
-       m_buffer_size = length;
 }
 
 void GraphicsBuffer::UploadRange(size_t length, intptr_t offset, const void* data)
@@ -212,7 +235,6 @@ void GraphicsBuffer::Resize(size_t length)
        if (m_invalidated)
        {
                m_buffer_size = length;
-               RecreateBuffer();       
        }
        else
        {

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