From 3419197ee9997a22caa67dc11f8bf0ac6d7edf2a Mon Sep 17 00:00:00 2001 From: zhang wei Date: Fri, 27 Apr 2018 21:49:43 +0800 Subject: [PATCH] flush back cull mode --- GPU/Common/DrawEngineCommon.cpp | 24 ++++++++++++------------ GPU/Common/IndexGenerator.cpp | 16 ++++++++-------- GPU/Common/IndexGenerator.h | 8 ++++---- GPU/GPUCommon.cpp | 6 ++++++ 4 files changed, 30 insertions(+), 24 deletions(-) diff --git a/GPU/Common/DrawEngineCommon.cpp b/GPU/Common/DrawEngineCommon.cpp index 5eb4c1fdf7..cf3553770d 100644 --- a/GPU/Common/DrawEngineCommon.cpp +++ b/GPU/Common/DrawEngineCommon.cpp @@ -544,29 +544,29 @@ void DrawEngineCommon::DecodeVertsStep(u8 *dest, int &i, int &decodedVerts) { switch (dc.indexType) { case GE_VTYPE_IDX_8BIT >> GE_VTYPE_IDX_SHIFT: for (int j = i; j <= lastMatch; j++) { - int cullMode = drawCalls[j].cullMode; - if (cullMode != -1 && gstate.isCullEnabled()) { - cullMode = gstate.getCullMode() == cullMode ? 0 : 1; + bool clockwise = true; + if (drawCalls[j].cullMode != -1 && gstate.isCullEnabled() && gstate.getCullMode() != drawCalls[j].cullMode) { + clockwise = false; } - indexGen.TranslatePrim(drawCalls[j].prim, drawCalls[j].vertexCount, (const u8 *)drawCalls[j].inds, indexLowerBound, cullMode); + indexGen.TranslatePrim(drawCalls[j].prim, drawCalls[j].vertexCount, (const u8 *)drawCalls[j].inds, indexLowerBound, clockwise); } break; case GE_VTYPE_IDX_16BIT >> GE_VTYPE_IDX_SHIFT: for (int j = i; j <= lastMatch; j++) { - int cullMode = drawCalls[j].cullMode; - if (cullMode != -1 && gstate.isCullEnabled()) { - cullMode = gstate.getCullMode() == cullMode ? 0 : 1; + bool clockwise = true; + if (drawCalls[j].cullMode != -1 && gstate.isCullEnabled() && gstate.getCullMode() != drawCalls[j].cullMode) { + clockwise = false; } - indexGen.TranslatePrim(drawCalls[j].prim, drawCalls[j].vertexCount, (const u16_le *)drawCalls[j].inds, indexLowerBound, cullMode); + indexGen.TranslatePrim(drawCalls[j].prim, drawCalls[j].vertexCount, (const u16_le *)drawCalls[j].inds, indexLowerBound, clockwise); } break; case GE_VTYPE_IDX_32BIT >> GE_VTYPE_IDX_SHIFT: for (int j = i; j <= lastMatch; j++) { - int cullMode = drawCalls[j].cullMode; - if (cullMode != -1 && gstate.isCullEnabled()) { - cullMode = gstate.getCullMode() == cullMode ? 0 : 1; + bool clockwise = true; + if (drawCalls[j].cullMode != -1 && gstate.isCullEnabled() && gstate.getCullMode() != drawCalls[j].cullMode) { + clockwise = false; } - indexGen.TranslatePrim(drawCalls[j].prim, drawCalls[j].vertexCount, (const u32_le *)drawCalls[j].inds, indexLowerBound, cullMode); + indexGen.TranslatePrim(drawCalls[j].prim, drawCalls[j].vertexCount, (const u32_le *)drawCalls[j].inds, indexLowerBound, clockwise); } break; } diff --git a/GPU/Common/IndexGenerator.cpp b/GPU/Common/IndexGenerator.cpp index 347d712c8f..f8de86c905 100644 --- a/GPU/Common/IndexGenerator.cpp +++ b/GPU/Common/IndexGenerator.cpp @@ -235,8 +235,8 @@ void IndexGenerator::TranslateList(int numInds, const ITypeLE *inds, int indexOf } template -void IndexGenerator::TranslateStrip(int numInds, const ITypeLE *inds, int indexOffset, int cullMode) { - int wind = cullMode == 1 ? 2 : 1; +void IndexGenerator::TranslateStrip(int numInds, const ITypeLE *inds, int indexOffset, bool clockwise) { + int wind = clockwise ? 1 : 2; indexOffset = index_ - indexOffset; int numTris = numInds - 2; u16 *outInds = inds_; @@ -286,37 +286,37 @@ inline void IndexGenerator::TranslateRectangles(int numInds, const ITypeLE *inds } // Could template this too, but would have to define in header. -void IndexGenerator::TranslatePrim(int prim, int numInds, const u8 *inds, int indexOffset, int cullMode) { +void IndexGenerator::TranslatePrim(int prim, int numInds, const u8 *inds, int indexOffset, bool clockwise) { switch (prim) { case GE_PRIM_POINTS: TranslatePoints(numInds, inds, indexOffset); break; case GE_PRIM_LINES: TranslateLineList(numInds, inds, indexOffset); break; case GE_PRIM_LINE_STRIP: TranslateLineStrip(numInds, inds, indexOffset); break; case GE_PRIM_TRIANGLES: TranslateList(numInds, inds, indexOffset); break; - case GE_PRIM_TRIANGLE_STRIP: TranslateStrip(numInds, inds, indexOffset, cullMode); break; + case GE_PRIM_TRIANGLE_STRIP: TranslateStrip(numInds, inds, indexOffset, clockwise); break; case GE_PRIM_TRIANGLE_FAN: TranslateFan(numInds, inds, indexOffset); break; case GE_PRIM_RECTANGLES: TranslateRectangles(numInds, inds, indexOffset); break; // Same } } -void IndexGenerator::TranslatePrim(int prim, int numInds, const u16_le *inds, int indexOffset, int cullMode) { +void IndexGenerator::TranslatePrim(int prim, int numInds, const u16_le *inds, int indexOffset, bool clockwise) { switch (prim) { case GE_PRIM_POINTS: TranslatePoints(numInds, inds, indexOffset); break; case GE_PRIM_LINES: TranslateLineList(numInds, inds, indexOffset); break; case GE_PRIM_LINE_STRIP: TranslateLineStrip(numInds, inds, indexOffset); break; case GE_PRIM_TRIANGLES: TranslateList(numInds, inds, indexOffset); break; - case GE_PRIM_TRIANGLE_STRIP: TranslateStrip(numInds, inds, indexOffset, cullMode); break; + case GE_PRIM_TRIANGLE_STRIP: TranslateStrip(numInds, inds, indexOffset, clockwise); break; case GE_PRIM_TRIANGLE_FAN: TranslateFan(numInds, inds, indexOffset); break; case GE_PRIM_RECTANGLES: TranslateRectangles(numInds, inds, indexOffset); break; // Same } } -void IndexGenerator::TranslatePrim(int prim, int numInds, const u32_le *inds, int indexOffset, int cullMode) { +void IndexGenerator::TranslatePrim(int prim, int numInds, const u32_le *inds, int indexOffset, bool clockwise) { switch (prim) { case GE_PRIM_POINTS: TranslatePoints(numInds, inds, indexOffset); break; case GE_PRIM_LINES: TranslateLineList(numInds, inds, indexOffset); break; case GE_PRIM_LINE_STRIP: TranslateLineStrip(numInds, inds, indexOffset); break; case GE_PRIM_TRIANGLES: TranslateList(numInds, inds, indexOffset); break; - case GE_PRIM_TRIANGLE_STRIP: TranslateStrip(numInds, inds, indexOffset, cullMode); break; + case GE_PRIM_TRIANGLE_STRIP: TranslateStrip(numInds, inds, indexOffset, clockwise); break; case GE_PRIM_TRIANGLE_FAN: TranslateFan(numInds, inds, indexOffset); break; case GE_PRIM_RECTANGLES: TranslateRectangles(numInds, inds, indexOffset); break; // Same } diff --git a/GPU/Common/IndexGenerator.h b/GPU/Common/IndexGenerator.h index 040c52626c..ab33ff4f51 100644 --- a/GPU/Common/IndexGenerator.h +++ b/GPU/Common/IndexGenerator.h @@ -50,9 +50,9 @@ public: GEPrimitiveType Prim() const { return prim_; } void AddPrim(int prim, int vertexCount); - void TranslatePrim(int prim, int numInds, const u8 *inds, int indexOffset, int cullMode); - void TranslatePrim(int prim, int numInds, const u16_le *inds, int indexOffset, int cullMode); - void TranslatePrim(int prim, int numInds, const u32_le *inds, int indexOffset, int cullMode); + void TranslatePrim(int prim, int numInds, const u8 *inds, int indexOffset, bool clockwise); + void TranslatePrim(int prim, int numInds, const u16_le *inds, int indexOffset, bool clockwise); + void TranslatePrim(int prim, int numInds, const u32_le *inds, int indexOffset, bool clockwise); void Advance(int numVerts) { index_ += numVerts; @@ -95,7 +95,7 @@ private: inline void TranslateLineStrip(int numVerts, const ITypeLE *inds, int indexOffset); template - void TranslateStrip(int numVerts, const ITypeLE *inds, int indexOffset, int cullMode); + void TranslateStrip(int numVerts, const ITypeLE *inds, int indexOffset, bool clockwise); template void TranslateFan(int numVerts, const ITypeLE *inds, int indexOffset); diff --git a/GPU/GPUCommon.cpp b/GPU/GPUCommon.cpp index 6335c93130..c2a966cda5 100644 --- a/GPU/GPUCommon.cpp +++ b/GPU/GPUCommon.cpp @@ -1669,6 +1669,12 @@ bail: if (cmdCount > 0) { UpdatePC(currentList->pc, currentList->pc + cmdCount * 4); currentList->pc += cmdCount * 4; + // flush back cull mode + if (cullMode != -1 && cullMode != gstate.getCullMode()) { + drawEngineCommon_->DispatchFlush(); + gstate.cmdmem[GE_CMD_CULL] ^= 1; + gstate_c.Dirty(DIRTY_RASTER_STATE); + } } gpuStats.vertexGPUCycles += vertexCost_ * totalVertCount;