summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/VertexManagerBase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/VideoCommon/VertexManagerBase.cpp')
-rw-r--r--Source/Core/VideoCommon/VertexManagerBase.cpp58
1 files changed, 37 insertions, 21 deletions
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp
index b5285dd0e2..bce4af457e 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/VertexManagerBase.cpp
@@ -21,15 +21,26 @@ u8 *VertexManager::s_pCurBufferPointer;
u8 *VertexManager::s_pBaseBufferPointer;
u8 *VertexManager::s_pEndBufferPointer;
+PrimitiveType VertexManager::current_primitive_type;
+
+static const PrimitiveType primitive_from_gx[8] = {
+ PRIMITIVE_TRIANGLES, // GX_DRAW_QUADS
+ PRIMITIVE_TRIANGLES, // GX_DRAW_NONE
+ PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLES
+ PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLE_STRIP
+ PRIMITIVE_TRIANGLES, // GX_DRAW_TRIANGLE_FAN
+ PRIMITIVE_LINES, // GX_DRAW_LINES
+ PRIMITIVE_LINES, // GX_DRAW_LINE_STRIP
+ PRIMITIVE_POINTS, // GX_DRAW_POINTS
+};
+
VertexManager::VertexManager()
{
LocalVBuffer.resize(MAXVBUFFERSIZE);
s_pCurBufferPointer = s_pBaseBufferPointer = &LocalVBuffer[0];
s_pEndBufferPointer = s_pBaseBufferPointer + LocalVBuffer.size();
- TIBuffer.resize(MAXIBUFFERSIZE);
- LIBuffer.resize(MAXIBUFFERSIZE);
- PIBuffer.resize(MAXIBUFFERSIZE);
+ LocalIBuffer.resize(MAXIBUFFERSIZE);
ResetBuffer();
}
@@ -41,7 +52,7 @@ VertexManager::~VertexManager()
void VertexManager::ResetBuffer()
{
s_pCurBufferPointer = s_pBaseBufferPointer;
- IndexGenerator::Start(GetTriangleIndexBuffer(), GetLineIndexBuffer(), GetPointIndexBuffer());
+ IndexGenerator::Start(GetIndexBuffer());
}
u32 VertexManager::GetRemainingSize()
@@ -53,6 +64,12 @@ void VertexManager::PrepareForAdditionalData(int primitive, u32 count, u32 strid
{
u32 const needed_vertex_bytes = count * stride;
+ // We can't merge different kinds of primitives, so we have to flush here
+ if (current_primitive_type != primitive_from_gx[primitive])
+ Flush();
+ current_primitive_type = primitive_from_gx[primitive];
+
+ // Check for size in buffer, if the buffer gets full, call Flush()
if (count > IndexGenerator::GetRemainingIndices() || count > GetRemainingIndices(primitive) || needed_vertex_bytes > GetRemainingSize())
{
Flush();
@@ -75,27 +92,28 @@ bool VertexManager::IsFlushed() const
u32 VertexManager::GetRemainingIndices(int primitive)
{
+ u32 index_len = MAXIBUFFERSIZE - IndexGenerator::GetIndexLen();
if(g_Config.backend_info.bSupportsPrimitiveRestart)
{
switch (primitive)
{
case GX_DRAW_QUADS:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 5 * 4;
+ return index_len / 5 * 4;
case GX_DRAW_TRIANGLES:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 4 * 3;
+ return index_len / 4 * 3;
case GX_DRAW_TRIANGLE_STRIP:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 1 - 1;
+ return index_len / 1 - 1;
case GX_DRAW_TRIANGLE_FAN:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 6 * 4 + 1;
+ return index_len / 6 * 4 + 1;
case GX_DRAW_LINES:
- return (MAXIBUFFERSIZE - IndexGenerator::GetLineindexLen());
+ return index_len;
case GX_DRAW_LINE_STRIP:
- return (MAXIBUFFERSIZE - IndexGenerator::GetLineindexLen()) / 2 + 1;
+ return index_len / 2 + 1;
case GX_DRAW_POINTS:
- return (MAXIBUFFERSIZE - IndexGenerator::GetPointindexLen());
+ return index_len;
default:
return 0;
@@ -106,21 +124,21 @@ u32 VertexManager::GetRemainingIndices(int primitive)
switch (primitive)
{
case GX_DRAW_QUADS:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 6 * 4;
+ return index_len / 6 * 4;
case GX_DRAW_TRIANGLES:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen());
+ return index_len;
case GX_DRAW_TRIANGLE_STRIP:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 3 + 2;
+ return index_len / 3 + 2;
case GX_DRAW_TRIANGLE_FAN:
- return (MAXIBUFFERSIZE - IndexGenerator::GetTriangleindexLen()) / 3 + 2;
+ return index_len / 3 + 2;
case GX_DRAW_LINES:
- return (MAXIBUFFERSIZE - IndexGenerator::GetLineindexLen());
+ return index_len;
case GX_DRAW_LINE_STRIP:
- return (MAXIBUFFERSIZE - IndexGenerator::GetLineindexLen()) / 2 + 1;
+ return index_len / 2 + 1;
case GX_DRAW_POINTS:
- return (MAXIBUFFERSIZE - IndexGenerator::GetPointindexLen());
+ return index_len;
default:
return 0;
@@ -167,9 +185,7 @@ void VertexManager::DoStateShared(PointerWrap& p)
// and maybe other things are overlooked
p.Do(LocalVBuffer);
- p.Do(TIBuffer);
- p.Do(LIBuffer);
- p.Do(PIBuffer);
+ p.Do(LocalIBuffer);
s_pBaseBufferPointer = &LocalVBuffer[0];
s_pEndBufferPointer = s_pBaseBufferPointer + LocalVBuffer.size();