summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/OGL/VertexManager.cpp
diff options
context:
space:
mode:
authordegasus <wickmarkus@web.de>2014-01-23 18:40:56 +0100
committerdegasus <wickmarkus@web.de>2014-01-23 18:40:56 +0100
commitbfd0b7275e8dee8a72563a1b897e7e53b09c9076 (patch)
treebb20309a18244be0da333940ce61dc0329412b50 /Source/Core/VideoBackends/OGL/VertexManager.cpp
parent650bae12e1ddbebe992714db9b3eb9d38f2621fe (diff)
parent1ff681a41284a757db9dfaa23b93c03aeb2c88f7 (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.cpp31
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