Index: Extensions/Terrain/Source/terrain.cpp =================================================================== --- Extensions/Terrain/Source/terrain.cpp (revision 572) +++ Extensions/Terrain/Source/terrain.cpp (working copy) @@ -448,11 +448,11 @@ delete[] _heightArray; _heightArray = 0x0; _heightArray = new float[getVertexCount()]; float *posArray = createVertices(); - _vertexBuffer = Modules::renderer().createVertexBuffer( getVertexCount() * sizeof( float ) * 4, posArray ); + _vertexBuffer = Modules::renderer().createVertexBuffer( getVertexCount() * sizeof( float ) * 4, posArray, true ); delete[] posArray; uint16 *indices = createIndices(); - _indexBuffer = Modules::renderer().createIndexBuffer( getIndexCount() * sizeof( short ), indices ); + _indexBuffer = Modules::renderer().createIndexBuffer( getIndexCount() * sizeof( short ), indices, false ); delete[] indices; } Index: Horde3D/Source/Horde3DEngine/egGeometry.cpp =================================================================== --- Horde3D/Source/Horde3DEngine/egGeometry.cpp (revision 572) +++ Horde3D/Source/Horde3DEngine/egGeometry.cpp (working copy) @@ -32,8 +32,8 @@ void GeometryResource::initializationFunc() { - defVertBuffer = Modules::renderer().createVertexBuffer( 0, 0x0 ); - defIndexBuffer = Modules::renderer().createIndexBuffer( 0, 0x0 ); + defVertBuffer = Modules::renderer().createVertexBuffer( 0, 0x0, false ); + defIndexBuffer = Modules::renderer().createIndexBuffer( 0, 0x0, false ); } @@ -434,15 +434,15 @@ { // Upload indices _indexBuf = Modules::renderer().createIndexBuffer( - _indexCount * (_16BitIndices ? 2 : 4), _indexData ); + _indexCount * (_16BitIndices ? 2 : 4), _indexData, false ); // Upload vertices _posVBuf = Modules::renderer().createVertexBuffer( - _vertCount * sizeof( Vec3f ), _vertPosData ); + _vertCount * sizeof( Vec3f ), _vertPosData, true ); _tanVBuf = Modules::renderer().createVertexBuffer( - _vertCount * sizeof( VertexDataTan ), _vertTanData ); + _vertCount * sizeof( VertexDataTan ), _vertTanData, true ); _staticVBuf = Modules::renderer().createVertexBuffer( - _vertCount * sizeof( VertexDataStatic ), _vertStaticData ); + _vertCount * sizeof( VertexDataStatic ), _vertStaticData, true ); } return true; Index: Horde3D/Source/Horde3DEngine/egRenderer.cpp =================================================================== --- Horde3D/Source/Horde3DEngine/egRenderer.cpp (revision 572) +++ Horde3D/Source/Horde3DEngine/egRenderer.cpp (working copy) @@ -156,7 +156,7 @@ quadIndices[i*6+0] = i * 4 + 0; quadIndices[i*6+1] = i * 4 + 1; quadIndices[i*6+2] = i * 4 + 2; quadIndices[i*6+3] = i * 4 + 2; quadIndices[i*6+4] = i * 4 + 3; quadIndices[i*6+5] = i * 4 + 0; } - _quadIdxBuf = createIndexBuffer( QuadIndexBufCount * sizeof( uint16 ), quadIndices ); + _quadIdxBuf = createIndexBuffer( QuadIndexBufCount * sizeof( uint16 ), quadIndices, false ); delete[] quadIndices; quadIndices = 0x0; // Create particle geometry array @@ -173,12 +173,12 @@ parVerts[i * 4 + 2] = v2; parVerts[i * 4 + 2].index = (float)i; parVerts[i * 4 + 3] = v3; parVerts[i * 4 + 3].index = (float)i; } - _particleVBO = createVertexBuffer( ParticlesPerBatch * 4 * sizeof( ParticleVert ), (float *)parVerts ); + _particleVBO = createVertexBuffer( ParticlesPerBatch * 4 * sizeof( ParticleVert ), (float *)parVerts, false ); delete[] parVerts; parVerts = 0x0; _overlayBatches.reserve( 64 ); _overlayVerts = new OverlayVert[MaxNumOverlayVerts]; - _overlayVB = createVertexBuffer( MaxNumOverlayVerts * sizeof( OverlayVert ), 0x0 ); + _overlayVB = createVertexBuffer( MaxNumOverlayVerts * sizeof( OverlayVert ), 0x0, true ); // Create unit primitives createPrimitives(); @@ -237,8 +237,8 @@ 0, 1, 2, 2, 3, 0, 1, 5, 6, 6, 2, 1, 5, 4, 7, 7, 6, 5, 4, 0, 3, 3, 7, 4, 3, 2, 6, 6, 7, 3, 4, 5, 1, 1, 0, 4 }; - _vbCube = Modules::renderer().createVertexBuffer( 8 * 3 * sizeof( float ), cubeVerts ); - _ibCube = Modules::renderer().createIndexBuffer( 36 * sizeof( uint16 ), cubeInds ); + _vbCube = Modules::renderer().createVertexBuffer( 8 * 3 * sizeof( float ), cubeVerts, false ); + _ibCube = Modules::renderer().createIndexBuffer( 36 * sizeof( uint16 ), cubeInds, false ); // Unit (geodesic) sphere (created by recursively subdividing a base octahedron) Vec3f spVerts[126] = { // x, y, z @@ -264,8 +264,8 @@ spInds[j + 0] = nv - 3; spInds[j + 1] = nv - 2; spInds[j + 2] = nv - 1; } } - _vbSphere = Modules::renderer().createVertexBuffer( 126 * sizeof( Vec3f ), spVerts ); - _ibSphere = Modules::renderer().createIndexBuffer( 128 * 3 * sizeof( uint16 ), spInds ); + _vbSphere = Modules::renderer().createVertexBuffer( 126 * sizeof( Vec3f ), spVerts, false ); + _ibSphere = Modules::renderer().createIndexBuffer( 128 * 3 * sizeof( uint16 ), spInds, false ); // Unit cone float coneVerts[13 * 3] = { // x, y, z @@ -281,14 +281,14 @@ 10, 6, 2, 10, 8, 6, 10, 9, 8, 8, 7, 6, 6, 4, 2, 6, 5, 4, 4, 3, 2, 2, 12, 10, 2, 1, 12, 12, 11, 10 }; - _vbCone = Modules::renderer().createVertexBuffer( 13 * 3 * sizeof( float ), coneVerts ); - _ibCone = Modules::renderer().createIndexBuffer( 22 * 3 * sizeof( uint16 ), coneInds ); + _vbCone = Modules::renderer().createVertexBuffer( 13 * 3 * sizeof( float ), coneVerts, false ); + _ibCone = Modules::renderer().createIndexBuffer( 22 * 3 * sizeof( uint16 ), coneInds, false ); // Fullscreen polygon float fsVerts[3 * 5] = { // x, y, z 0.f, 0.f, 1.f, 2.f, 0.f, 1.f, 0.f, 2.f, 1.f }; - _vbFSPoly = Modules::renderer().createVertexBuffer( 3 * 5 * sizeof( float ), fsVerts ); + _vbFSPoly = Modules::renderer().createVertexBuffer( 3 * 5 * sizeof( float ), fsVerts, false ); } Index: Horde3D/Source/Horde3DEngine/egRendererBase.cpp =================================================================== --- Horde3D/Source/Horde3DEngine/egRendererBase.cpp (revision 572) +++ Horde3D/Source/Horde3DEngine/egRendererBase.cpp (working copy) @@ -231,15 +231,16 @@ // Buffers // ================================================================================================= -uint32 RenderDeviceInterface::createVertexBuffer( uint32 size, void *data ) +uint32 RenderDeviceInterface::createVertexBuffer( uint32 size, void *data, bool dynamic ) { RDIBuffer buf; buf.type = GL_ARRAY_BUFFER; buf.size = size; + buf.usage = dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; glGenBuffers( 1, &buf.glObj ); glBindBuffer( buf.type, buf.glObj ); - glBufferData( buf.type, size, data, GL_DYNAMIC_DRAW ); + glBufferData( buf.type, size, data, buf.usage ); glBindBuffer( buf.type, 0 ); _bufferMem += size; @@ -247,15 +248,16 @@ } -uint32 RenderDeviceInterface::createIndexBuffer( uint32 size, void *data ) +uint32 RenderDeviceInterface::createIndexBuffer( uint32 size, void *data, bool dynamic ) { RDIBuffer buf; buf.type = GL_ELEMENT_ARRAY_BUFFER; buf.size = size; + buf.usage = dynamic ? GL_DYNAMIC_DRAW : GL_STATIC_DRAW; glGenBuffers( 1, &buf.glObj ); glBindBuffer( buf.type, buf.glObj ); - glBufferData( buf.type, size, data, GL_DYNAMIC_DRAW ); + glBufferData( buf.type, size, data, buf.usage ); glBindBuffer( buf.type, 0 ); _bufferMem += size; @@ -285,7 +287,7 @@ if( offset == 0 && size == buf.size ) { // Replacing the whole buffer can help the driver to avoid pipeline stalls - glBufferData( buf.type, size, data, GL_DYNAMIC_DRAW ); + glBufferData( buf.type, size, data, buf.usage ); return; } @@ -304,8 +306,8 @@ glGetBufferSubData( buf.type, 0, size, data ); uint32 newBufObj = 0; - if( buf.type == GL_ARRAY_BUFFER ) newBufObj = createVertexBuffer( size, data ); - else if( buf.type == GL_ELEMENT_ARRAY_BUFFER ) newBufObj = createIndexBuffer( size, data ); + if( buf.type == GL_ARRAY_BUFFER ) newBufObj = createVertexBuffer( size, data, buf.usage==GL_DYNAMIC_DRAW ); + else if( buf.type == GL_ELEMENT_ARRAY_BUFFER ) newBufObj = createIndexBuffer( size, data, buf.usage==GL_DYNAMIC_DRAW ); delete[] data; return newBufObj; Index: Horde3D/Source/Horde3DEngine/egRendererBase.h =================================================================== --- Horde3D/Source/Horde3DEngine/egRendererBase.h (revision 572) +++ Horde3D/Source/Horde3DEngine/egRendererBase.h (working copy) @@ -121,6 +121,7 @@ uint32 type; uint32 glObj; uint32 size; + uint32 usage; }; struct RDIVertBufSlot @@ -295,8 +296,8 @@ // ----------------------------------------------------------------------------- // Buffers - uint32 createVertexBuffer( uint32 size, void *data ); - uint32 createIndexBuffer( uint32 size, void *data ); + uint32 createVertexBuffer( uint32 size, void *data, bool dynamic ); + uint32 createIndexBuffer( uint32 size, void *data, bool dynamic ); void releaseBuffer( uint32 bufObj ); void updateBufferData( uint32 bufObj, uint32 offset, uint32 size, void *data ); uint32 cloneBuffer( uint32 bufObj );