From ff002320a5cad5b7ac6b364dc6a13c6df15eecd1 Mon Sep 17 00:00:00 2001 From: degasus Date: Thu, 23 Jan 2014 13:41:53 +0100 Subject: [PATCH] OpenGL: Stream vertices + indices --- Source/Core/VideoBackends/OGL/Render.cpp | 2 +- .../Core/VideoBackends/OGL/VertexManager.cpp | 19 ++++++++++++------- Source/Core/VideoBackends/OGL/VertexManager.h | 2 ++ 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp index 9d8a39220b..a8067f151b 100644 --- a/Source/Core/VideoBackends/OGL/Render.cpp +++ b/Source/Core/VideoBackends/OGL/Render.cpp @@ -1653,7 +1653,7 @@ void Renderer::RestoreAPIState() VertexManager *vm = (OGL::VertexManager*)g_vertex_manager; glBindBuffer(GL_ARRAY_BUFFER, vm->m_vertex_buffers); - vm->m_last_vao = 0; + glBindVertexArray(vm->m_last_vao); TextureCache::SetStage(); } diff --git a/Source/Core/VideoBackends/OGL/VertexManager.cpp b/Source/Core/VideoBackends/OGL/VertexManager.cpp index 7e1ead8954..dba3874ec6 100644 --- a/Source/Core/VideoBackends/OGL/VertexManager.cpp +++ b/Source/Core/VideoBackends/OGL/VertexManager.cpp @@ -85,20 +85,25 @@ void VertexManager::PrepareDrawBuffers(u32 stride) u32 vertex_data_size = IndexGenerator::GetNumVerts() * stride; u32 index_data_size = IndexGenerator::GetIndexLen() * sizeof(u16); - auto buffer = s_vertexBuffer->Map(vertex_data_size, stride); - memcpy(buffer.first, GetVertexBuffer(), vertex_data_size); s_vertexBuffer->Unmap(vertex_data_size); - s_baseVertex = buffer.second / stride; - - buffer = s_indexBuffer->Map(index_data_size); - memcpy(buffer.first, GetIndexBuffer(), index_data_size); s_indexBuffer->Unmap(index_data_size); - s_index_offset = buffer.second; ADDSTAT(stats.thisFrame.bytesVertexStreamed, vertex_data_size); ADDSTAT(stats.thisFrame.bytesIndexStreamed, index_data_size); } +void VertexManager::ResetBuffer(u32 stride) +{ + auto buffer = s_vertexBuffer->Map(MAXVBUFFERSIZE, stride); + s_pCurBufferPointer = s_pBaseBufferPointer = buffer.first; + s_pEndBufferPointer = buffer.first + MAXVBUFFERSIZE; + s_baseVertex = buffer.second / stride; + + buffer = s_indexBuffer->Map(MAXIBUFFERSIZE * sizeof(u16)); + IndexGenerator::Start((u16*)buffer.first); + s_index_offset = buffer.second; +} + void VertexManager::Draw(u32 stride) { u32 index_size = IndexGenerator::GetIndexLen(); diff --git a/Source/Core/VideoBackends/OGL/VertexManager.h b/Source/Core/VideoBackends/OGL/VertexManager.h index f96ec7ec97..11001ff1ca 100644 --- a/Source/Core/VideoBackends/OGL/VertexManager.h +++ b/Source/Core/VideoBackends/OGL/VertexManager.h @@ -40,6 +40,8 @@ public: GLuint m_vertex_buffers; GLuint m_index_buffers; GLuint m_last_vao; +protected: + virtual void ResetBuffer(u32 stride); private: void Draw(u32 stride); void vFlush() override;