D3D9 rectangle rendering fix (maxindex)

This commit is contained in:
Henrik Rydgard 2015-01-15 23:58:07 +01:00
parent 8a574e5cd2
commit c2500744e1
4 changed files with 10 additions and 6 deletions

View File

@ -122,7 +122,7 @@ static bool IsReallyAClear(const TransformedVertex *transformed, int numVerts) {
void SoftwareTransform( void SoftwareTransform(
int prim, u8 *decoded, int vertexCount, u32 vertType, u16 *&inds, int indexType, int prim, u8 *decoded, int vertexCount, u32 vertType, u16 *&inds, int indexType,
const DecVtxFormat &decVtxFormat, int maxIndex, FramebufferManagerCommon *fbman, TextureCacheCommon *texCache, TransformedVertex *transformed, TransformedVertex *transformedExpanded, TransformedVertex *&drawBuffer, int &numTrans, bool &drawIndexed, SoftwareTransformResult *result) { const DecVtxFormat &decVtxFormat, int &maxIndex, FramebufferManagerCommon *fbman, TextureCacheCommon *texCache, TransformedVertex *transformed, TransformedVertex *transformedExpanded, TransformedVertex *&drawBuffer, int &numTrans, bool &drawIndexed, SoftwareTransformResult *result) {
bool throughmode = (vertType & GE_VTYPE_THROUGH_MASK) != 0; bool throughmode = (vertType & GE_VTYPE_THROUGH_MASK) != 0;
bool lmode = gstate.isUsingSecondaryColor() && gstate.isLightingEnabled(); bool lmode = gstate.isUsingSecondaryColor() && gstate.isLightingEnabled();
@ -465,6 +465,7 @@ void SoftwareTransform(
const u16 *indsIn = (const u16 *)inds; const u16 *indsIn = (const u16 *)inds;
u16 *newInds = inds + vertexCount; u16 *newInds = inds + vertexCount;
u16 *indsOut = newInds; u16 *indsOut = newInds;
maxIndex = 4 * vertexCount;
for (int i = 0; i < vertexCount; i += 2) { for (int i = 0; i < vertexCount; i += 2) {
const TransformedVertex &transVtxTL = transformed[indsIn[i + 0]]; const TransformedVertex &transVtxTL = transformed[indsIn[i + 0]];
const TransformedVertex &transVtxBR = transformed[indsIn[i + 1]]; const TransformedVertex &transVtxBR = transformed[indsIn[i + 1]];

View File

@ -38,5 +38,5 @@ struct SoftwareTransformResult {
u8 stencilValue; u8 stencilValue;
}; };
void SoftwareTransform(int prim, u8 *decoded, int vertexCount, u32 vertexType, u16 *&inds, int indexType, const DecVtxFormat &decVtxFormat, int maxIndex, FramebufferManagerCommon *fbman, TextureCacheCommon *texCache, TransformedVertex *transformed, TransformedVertex *transformedExpanded, TransformedVertex *&drawBuffer, void SoftwareTransform(int prim, u8 *decoded, int vertexCount, u32 vertexType, u16 *&inds, int indexType, const DecVtxFormat &decVtxFormat, int &maxIndex, FramebufferManagerCommon *fbman, TextureCacheCommon *texCache, TransformedVertex *transformed, TransformedVertex *transformedExpanded, TransformedVertex *&drawBuffer,
int &numTrans, bool &drawIndexed, SoftwareTransformResult *result); int &numTrans, bool &drawIndexed, SoftwareTransformResult *result);

View File

@ -831,10 +831,11 @@ rotateVBO:
SoftwareTransformResult result; SoftwareTransformResult result;
memset(&result, 0, sizeof(result)); memset(&result, 0, sizeof(result));
int maxIndex = indexGen.MaxIndex();
SoftwareTransform( SoftwareTransform(
prim, decoded, indexGen.VertexCount(), prim, decoded, indexGen.VertexCount(),
dec_->VertexType(), inds, GE_VTYPE_IDX_16BIT, dec_->GetDecVtxFmt(), dec_->VertexType(), inds, GE_VTYPE_IDX_16BIT, dec_->GetDecVtxFmt(),
indexGen.MaxIndex(), framebufferManager_, textureCache_, transformed, transformedExpanded, drawBuffer, numTrans, drawIndexed, &result); maxIndex, framebufferManager_, textureCache_, transformed, transformedExpanded, drawBuffer, numTrans, drawIndexed, &result);
if (result.action == SW_DRAW_PRIMITIVES) { if (result.action == SW_DRAW_PRIMITIVES) {
if (result.setStencil) { if (result.setStencil) {
@ -849,7 +850,7 @@ rotateVBO:
pD3Ddevice->SetVertexDeclaration(pSoftVertexDecl); pD3Ddevice->SetVertexDeclaration(pSoftVertexDecl);
if (drawIndexed) { if (drawIndexed) {
pD3Ddevice->DrawIndexedPrimitiveUP(glprim[prim], 0, indexGen.MaxIndex(), D3DPrimCount(glprim[prim], numTrans), inds, D3DFMT_INDEX16, drawBuffer, sizeof(TransformedVertex)); pD3Ddevice->DrawIndexedPrimitiveUP(glprim[prim], 0, maxIndex, D3DPrimCount(glprim[prim], numTrans), inds, D3DFMT_INDEX16, drawBuffer, sizeof(TransformedVertex));
} else { } else {
pD3Ddevice->DrawPrimitiveUP(glprim[prim], D3DPrimCount(glprim[prim], numTrans), drawBuffer, sizeof(TransformedVertex)); pD3Ddevice->DrawPrimitiveUP(glprim[prim], D3DPrimCount(glprim[prim], numTrans), drawBuffer, sizeof(TransformedVertex));
} }

View File

@ -821,10 +821,11 @@ rotateVBO:
SoftwareTransformResult result; SoftwareTransformResult result;
memset(&result, 0, sizeof(result)); memset(&result, 0, sizeof(result));
int maxIndex = indexGen.MaxIndex();
SoftwareTransform( SoftwareTransform(
prim, decoded, indexGen.VertexCount(), prim, decoded, indexGen.VertexCount(),
dec_->VertexType(), inds, GE_VTYPE_IDX_16BIT, dec_->GetDecVtxFmt(), dec_->VertexType(), inds, GE_VTYPE_IDX_16BIT, dec_->GetDecVtxFmt(),
indexGen.MaxIndex(), framebufferManager_, textureCache_, transformed, transformedExpanded, drawBuffer, numTrans, drawIndexed, &result); maxIndex, framebufferManager_, textureCache_, transformed, transformedExpanded, drawBuffer, numTrans, drawIndexed, &result);
if (result.action == SW_DRAW_PRIMITIVES) { if (result.action == SW_DRAW_PRIMITIVES) {
if (result.setStencil) { if (result.setStencil) {
@ -844,7 +845,8 @@ rotateVBO:
#if 1 // USING_GLES2 #if 1 // USING_GLES2
glDrawElements(glprim[prim], numTrans, GL_UNSIGNED_SHORT, inds); glDrawElements(glprim[prim], numTrans, GL_UNSIGNED_SHORT, inds);
#else #else
glDrawRangeElements(glprim[prim], 0, indexGen.MaxIndex(), numTrans, GL_UNSIGNED_SHORT, inds); // This doesn't seem to provide much of a win.
glDrawRangeElements(glprim[prim], 0, maxIndex, numTrans, GL_UNSIGNED_SHORT, inds);
#endif #endif
} else { } else {
glDrawArrays(glprim[prim], 0, numTrans); glDrawArrays(glprim[prim], 0, numTrans);