check for overflow vertex indices, fixes issue 6135

thx @ JMC47 for identifying the reversion, creating a useful bug report with fifo log :-)
This commit is contained in:
degasus 2013-03-23 00:18:35 +01:00
parent 59b3600284
commit 470c9ff08a
3 changed files with 15 additions and 4 deletions

View File

@ -166,3 +166,10 @@ void IndexGenerator::AddPoints(u32 numVerts)
++numP; ++numP;
} }
} }
u32 IndexGenerator::GetRemainingIndices()
{
u32 max_index = 65535;
return max_index - index;
}

View File

@ -41,6 +41,8 @@ public:
static u32 GetTriangleindexLen() {return (u32)(Tptr - BASETptr);} static u32 GetTriangleindexLen() {return (u32)(Tptr - BASETptr);}
static u32 GetLineindexLen() {return (u32)(Lptr - BASELptr);} static u32 GetLineindexLen() {return (u32)(Lptr - BASELptr);}
static u32 GetPointindexLen() {return (u32)(Pptr - BASEPptr);} static u32 GetPointindexLen() {return (u32)(Pptr - BASEPptr);}
static u32 GetRemainingIndices();
/* /*
enum IndexPrimitiveType enum IndexPrimitiveType
{ {

View File

@ -52,16 +52,18 @@ void VertexManager::PrepareForAdditionalData(int primitive, u32 count, u32 strid
{ {
u32 const needed_vertex_bytes = count * stride; u32 const needed_vertex_bytes = count * stride;
if (needed_vertex_bytes > GetRemainingSize() || count > GetRemainingIndices(primitive)) if (count > IndexGenerator::GetRemainingIndices() || count > GetRemainingIndices(primitive) || needed_vertex_bytes > GetRemainingSize())
{ {
Flush(); Flush();
if (needed_vertex_bytes > GetRemainingSize()) if(count > IndexGenerator::GetRemainingIndices())
ERROR_LOG(VIDEO, "VertexManager: Buffer not large enough for all vertices! " ERROR_LOG(VIDEO, "Too less index values. Use 32bit or reset them on flush.");
"Increase MAXVBUFFERSIZE or we need primitive breaking afterall.");
if (count > GetRemainingIndices(primitive)) if (count > GetRemainingIndices(primitive))
ERROR_LOG(VIDEO, "VertexManager: Buffer not large enough for all indices! " ERROR_LOG(VIDEO, "VertexManager: Buffer not large enough for all indices! "
"Increase MAXIBUFFERSIZE or we need primitive breaking afterall."); "Increase MAXIBUFFERSIZE or we need primitive breaking afterall.");
if (needed_vertex_bytes > GetRemainingSize())
ERROR_LOG(VIDEO, "VertexManager: Buffer not large enough for all vertices! "
"Increase MAXVBUFFERSIZE or we need primitive breaking afterall.");
} }
} }