diff --git a/pcsx2/GS/Renderers/Common/GSVertexTrace.cpp b/pcsx2/GS/Renderers/Common/GSVertexTrace.cpp index 110a705e10..a3dfefd2d9 100644 --- a/pcsx2/GS/Renderers/Common/GSVertexTrace.cpp +++ b/pcsx2/GS/Renderers/Common/GSVertexTrace.cpp @@ -27,9 +27,7 @@ GSVertexTrace::GSVertexTrace(const GSState* state, bool provoking_vertex_first) memset(&m_alpha, 0, sizeof(m_alpha)); #define InitUpdate3(P, IIP, TME, FST, COLOR) \ - m_fmm[COLOR][FST][TME][IIP][P] = \ - provoking_vertex_first ? &GSVertexTrace::FindMinMax : \ - &GSVertexTrace::FindMinMax; + m_fmm[COLOR][FST][TME][IIP][P] = GetFMM(provoking_vertex_first); #define InitUpdate2(P, IIP, TME) \ InitUpdate3(P, IIP, TME, 0, 0) \ @@ -153,6 +151,19 @@ void GSVertexTrace::Update(const void* vertex, const u32* index, int v_count, in } } +template +GSVertexTrace::FindMinMaxPtr GSVertexTrace::GetFMM(bool provoking_vertex_first) +{ + constexpr bool real_fst = tme ? fst : false; + constexpr bool provoking_vertex_first_class = primclass == GS_LINE_CLASS || primclass == GS_TRIANGLE_CLASS; + const bool swap = provoking_vertex_first_class && !iip && provoking_vertex_first; + + if (swap) + return &GSVertexTrace::FindMinMax; + else + return &GSVertexTrace::FindMinMax; +} + template void GSVertexTrace::FindMinMax(const void* vertex, const u32* index, int count) { diff --git a/pcsx2/GS/Renderers/Common/GSVertexTrace.h b/pcsx2/GS/Renderers/Common/GSVertexTrace.h index 688b02710d..07c0aa1314 100644 --- a/pcsx2/GS/Renderers/Common/GSVertexTrace.h +++ b/pcsx2/GS/Renderers/Common/GSVertexTrace.h @@ -51,6 +51,9 @@ protected: template void FindMinMax(const void* vertex, const u32* index, int count); + template + FindMinMaxPtr GetFMM(bool provoking_vertex_first); + public: GS_PRIM_CLASS m_primclass;