diff options
| author | degasus <wickmarkus@web.de> | 2014-01-23 18:40:56 +0100 |
|---|---|---|
| committer | degasus <wickmarkus@web.de> | 2014-01-23 18:40:56 +0100 |
| commit | bfd0b7275e8dee8a72563a1b897e7e53b09c9076 (patch) | |
| tree | bb20309a18244be0da333940ce61dc0329412b50 /Source/Core/VideoBackends/OGL/VertexManager.cpp | |
| parent | 650bae12e1ddbebe992714db9b3eb9d38f2621fe (diff) | |
| parent | 1ff681a41284a757db9dfaa23b93c03aeb2c88f7 (diff) | |
Merge branch 'StreamBuffers'
This branch drops our temporary buffer in VertexLoaderBase.
Instead, every backend now must provide a buffer to convert vertices and indices.
D3D just uses a temporary buffer like before.
OGL maps the gpu based buffer and stream to them directly.
So this will avoid an unneeded memcpy on OGL backend.
Diffstat (limited to 'Source/Core/VideoBackends/OGL/VertexManager.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/OGL/VertexManager.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/Source/Core/VideoBackends/OGL/VertexManager.cpp b/Source/Core/VideoBackends/OGL/VertexManager.cpp index 274c9b9fcc..dba3874ec6 100644 --- a/Source/Core/VideoBackends/OGL/VertexManager.cpp +++ b/Source/Core/VideoBackends/OGL/VertexManager.cpp @@ -39,7 +39,7 @@ namespace OGL { //This are the initially requested size for the buffers expressed in bytes const u32 MAX_IBUFFER_SIZE = 2*1024*1024; -const u32 MAX_VBUFFER_SIZE = 16*1024*1024; +const u32 MAX_VBUFFER_SIZE = 32*1024*1024; static StreamBuffer *s_vertexBuffer; static StreamBuffer *s_indexBuffer; @@ -58,11 +58,11 @@ VertexManager::~VertexManager() void VertexManager::CreateDeviceObjects() { - s_vertexBuffer = new StreamBuffer(GL_ARRAY_BUFFER, MAX_VBUFFER_SIZE); - m_vertex_buffers = s_vertexBuffer->getBuffer(); + s_vertexBuffer = StreamBuffer::Create(GL_ARRAY_BUFFER, MAX_VBUFFER_SIZE); + m_vertex_buffers = s_vertexBuffer->m_buffer; - s_indexBuffer = new StreamBuffer(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE); - m_index_buffers = s_indexBuffer->getBuffer(); + s_indexBuffer = StreamBuffer::Create(GL_ELEMENT_ARRAY_BUFFER, MAX_IBUFFER_SIZE); + m_index_buffers = s_indexBuffer->m_buffer; m_CurrentVertexFmt = NULL; m_last_vao = 0; @@ -85,17 +85,25 @@ void VertexManager::PrepareDrawBuffers(u32 stride) u32 vertex_data_size = IndexGenerator::GetNumVerts() * stride; u32 index_data_size = IndexGenerator::GetIndexLen() * sizeof(u16); - s_vertexBuffer->Alloc(vertex_data_size, stride); - size_t offset = s_vertexBuffer->Upload(GetVertexBuffer(), vertex_data_size); - s_baseVertex = offset / stride; - - s_indexBuffer->Alloc(index_data_size); - s_index_offset = s_indexBuffer->Upload((u8*)GetIndexBuffer(), index_data_size); + s_vertexBuffer->Unmap(vertex_data_size); + s_indexBuffer->Unmap(index_data_size); 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(); @@ -234,4 +242,5 @@ void VertexManager::vFlush() GL_REPORT_ERRORD(); } + } // namespace |
