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;