summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VertexManagerBase.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/VideoCommon/VertexManagerBase.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/VideoCommon/VertexManagerBase.cpp')
-rw-r--r--Source/Core/VideoCommon/VertexManagerBase.cpp45
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);
-}