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/VideoCommon/VertexManagerBase.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/VideoCommon/VertexManagerBase.cpp')
| -rw-r--r-- | Source/Core/VideoCommon/VertexManagerBase.cpp | 45 |
1 files changed, 11 insertions, 34 deletions
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp index 135d3c3899..96d0ce3431 100644 --- a/Source/Core/VideoCommon/VertexManagerBase.cpp +++ b/Source/Core/VideoCommon/VertexManagerBase.cpp @@ -24,6 +24,8 @@ u8 *VertexManager::s_pEndBufferPointer; PrimitiveType VertexManager::current_primitive_type; +bool VertexManager::IsFlushed; + static const PrimitiveType primitive_from_gx[8] = { PRIMITIVE_TRIANGLES, // GX_DRAW_QUADS PRIMITIVE_TRIANGLES, // GX_DRAW_NONE @@ -37,25 +39,13 @@ static const PrimitiveType primitive_from_gx[8] = { VertexManager::VertexManager() { - LocalVBuffer.resize(MAXVBUFFERSIZE); - s_pCurBufferPointer = s_pBaseBufferPointer = &LocalVBuffer[0]; - s_pEndBufferPointer = s_pBaseBufferPointer + LocalVBuffer.size(); - - LocalIBuffer.resize(MAXIBUFFERSIZE); - - ResetBuffer(); + IsFlushed = true; } VertexManager::~VertexManager() { } -void VertexManager::ResetBuffer() -{ - s_pCurBufferPointer = s_pBaseBufferPointer; - IndexGenerator::Start(GetIndexBuffer()); -} - u32 VertexManager::GetRemainingSize() { return (u32)(s_pEndBufferPointer - s_pCurBufferPointer); @@ -84,11 +74,13 @@ void VertexManager::PrepareForAdditionalData(int primitive, u32 count, u32 strid ERROR_LOG(VIDEO, "VertexManager: Buffer not large enough for all vertices! " "Increase MAXVBUFFERSIZE or we need primitive breaking after all."); } -} -bool VertexManager::IsFlushed() const -{ - return s_pBaseBufferPointer == s_pCurBufferPointer; + // need to alloc new buffer + if(IsFlushed) + { + g_vertex_manager->ResetBuffer(stride); + IsFlushed = false; + } } u32 VertexManager::GetRemainingIndices(int primitive) @@ -160,8 +152,7 @@ void VertexManager::AddVertices(int primitive, u32 numVertices) void VertexManager::Flush() { - if (g_vertex_manager->IsFlushed()) - return; + if (IsFlushed) return; // loading a state will invalidate BP, so check for it g_video_backend->CheckInvalidState(); @@ -238,24 +229,10 @@ void VertexManager::Flush() // TODO: need to merge more stuff into VideoCommon g_vertex_manager->vFlush(); - g_vertex_manager->ResetBuffer(); + IsFlushed = true; } void VertexManager::DoState(PointerWrap& p) { g_vertex_manager->vDoState(p); } - -void VertexManager::DoStateShared(PointerWrap& p) -{ - // It seems we half-assume to be flushed here - // We update s_pCurBufferPointer yet don't worry about IndexGenerator's outdated pointers - // and maybe other things are overlooked - - p.Do(LocalVBuffer); - p.Do(LocalIBuffer); - - s_pBaseBufferPointer = &LocalVBuffer[0]; - s_pEndBufferPointer = s_pBaseBufferPointer + LocalVBuffer.size(); - p.DoPointer(s_pCurBufferPointer, s_pBaseBufferPointer); -} |
