diff --git a/common/gal/opengl/cached_container.cpp b/common/gal/opengl/cached_container.cpp index ca53d48142..3fa6100347 100644 --- a/common/gal/opengl/cached_container.cpp +++ b/common/gal/opengl/cached_container.cpp @@ -254,9 +254,9 @@ void CACHED_CONTAINER::Unmap() void CACHED_CONTAINER::init() { glGenBuffers( 1, &m_glBufferHandle ); - glBindBuffer( GL_COPY_WRITE_BUFFER, m_glBufferHandle ); - glBufferData( GL_COPY_WRITE_BUFFER, m_currentSize * VertexSize, NULL, GL_DYNAMIC_DRAW ); - glBindBuffer( GL_COPY_WRITE_BUFFER, 0 ); + glBindBuffer( GL_ARRAY_BUFFER, m_glBufferHandle ); + glBufferData( GL_ARRAY_BUFFER, m_currentSize * VertexSize, NULL, GL_DYNAMIC_DRAW ); + glBindBuffer( GL_ARRAY_BUFFER, 0 ); checkGlError( "allocating video memory for cached container" ); m_isInitialized = true; @@ -410,6 +410,8 @@ void CACHED_CONTAINER::mergeFreeChunks() bool CACHED_CONTAINER::defragmentResize( unsigned int aNewSize ) { + assert( IsMapped() ); + wxLogTrace( "GAL_CACHED_CONTAINER", wxT( "Resizing container from %d to %d" ), m_currentSize, aNewSize ); @@ -424,11 +426,10 @@ bool CACHED_CONTAINER::defragmentResize( unsigned int aNewSize ) GLuint newBuffer; - Unmap(); glGenBuffers( 1, &newBuffer ); glBindBuffer( GL_COPY_WRITE_BUFFER, newBuffer ); glBufferData( GL_COPY_WRITE_BUFFER, aNewSize * VertexSize, NULL, GL_DYNAMIC_DRAW ); - glBindBuffer( GL_COPY_READ_BUFFER, m_glBufferHandle ); + glBindBuffer( GL_ARRAY_BUFFER, m_glBufferHandle ); checkGlError( "resizing vertex buffer" ); // Special case: the container is either already defragmented or filled up to its capacity, @@ -438,7 +439,7 @@ bool CACHED_CONTAINER::defragmentResize( unsigned int aNewSize ) { assert( aNewSize != m_currentSize ); - glCopyBufferSubData( GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, + glCopyBufferSubData( GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, usedSpace() * VertexSize ); } else @@ -453,7 +454,7 @@ bool CACHED_CONTAINER::defragmentResize( unsigned int aNewSize ) int itemSize = item->GetSize(); // Move an item to the new container - glCopyBufferSubData( GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, + glCopyBufferSubData( GL_ARRAY_BUFFER, GL_COPY_WRITE_BUFFER, itemOffset * VertexSize, newOffset * VertexSize, itemSize * VertexSize ); // Update new offset @@ -464,10 +465,14 @@ bool CACHED_CONTAINER::defragmentResize( unsigned int aNewSize ) } } + // Cleanup glBindBuffer( GL_COPY_WRITE_BUFFER, 0 ); - glBindBuffer( GL_COPY_READ_BUFFER, 0 ); + glBindBuffer( GL_ARRAY_BUFFER, 0 ); glDeleteBuffers( 1, &m_glBufferHandle ); + + // Switch to the new vertex buffer m_glBufferHandle = newBuffer; + glBindBuffer( GL_ARRAY_BUFFER, m_glBufferHandle ); checkGlError( "switching buffers during defragmentation" ); Map();