From bde81380c38c601e70fa2a4708762d96aa02b2ce Mon Sep 17 00:00:00 2001 From: Stenzek Date: Thu, 13 Apr 2023 23:49:25 +1000 Subject: [PATCH] GS/SW: Stop C rasterizer crashing with AA1 --- pcsx2/GS/Renderers/SW/GSDrawScanline.cpp | 21 ++++++++----------- pcsx2/GS/Renderers/SW/GSDrawScanline.h | 1 + .../SW/GSDrawScanlineCodeGenerator.cpp | 3 ++- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanline.cpp b/pcsx2/GS/Renderers/SW/GSDrawScanline.cpp index 1aec5522b9..fede8e4827 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanline.cpp +++ b/pcsx2/GS/Renderers/SW/GSDrawScanline.cpp @@ -451,10 +451,14 @@ __ri static void WritePixel(const T& src, int addr, int i, u32 psm, const GSScan } void GSDrawScanline::CDrawScanline(int pixels, int left, int top, const GSVertexSW& scan, GSScanlineLocalData& local) +{ + CDrawScanline(pixels, left, top, scan, local, GlobalFromLocal(local).sel); +} + +__ri void GSDrawScanline::CDrawScanline(int pixels, int left, int top, const GSVertexSW& scan, GSScanlineLocalData& local, GSScanlineSelector sel) { const GSScanlineGlobalData& global = GlobalFromLocal(local); - GSScanlineSelector sel = global.sel; constexpr int vlen = sizeof(VectorF) / sizeof(float); #if _M_SSE < 0x501 @@ -1729,17 +1733,10 @@ void GSDrawScanline::CDrawScanline(int pixels, int left, int top, const GSVertex void GSDrawScanline::CDrawEdge(int pixels, int left, int top, const GSVertexSW& scan, GSScanlineLocalData& local) { - // This sucks. But so does not jitting! - const GSScanlineGlobalData* old_gd = local.gd; - GSScanlineGlobalData gd; - std::memcpy(&gd, &local.gd, sizeof(gd)); - gd.sel.zwrite = 0; - gd.sel.edge = 1; - local.gd = &gd; - - CDrawScanline(pixels, left, top, scan, local); - - local.gd = old_gd; + GSScanlineSelector sel = local.gd->sel; + sel.zwrite = 0; + sel.edge = 1; + CDrawScanline(pixels, left, top, scan, local, sel); } template diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanline.h b/pcsx2/GS/Renderers/SW/GSDrawScanline.h index 3814e625ff..41c8d779de 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanline.h +++ b/pcsx2/GS/Renderers/SW/GSDrawScanline.h @@ -63,6 +63,7 @@ private: static void CSetupPrim(const GSVertexSW* vertex, const u16* index, const GSVertexSW& dscan, GSScanlineLocalData& local); static void CDrawScanline(int pixels, int left, int top, const GSVertexSW& scan, GSScanlineLocalData& local); static void CDrawEdge(int pixels, int left, int top, const GSVertexSW& scan, GSScanlineLocalData& local); + __ri static void CDrawScanline(int pixels, int left, int top, const GSVertexSW& scan, GSScanlineLocalData& local, GSScanlineSelector sel); }; MULTI_ISA_UNSHARED_END diff --git a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp index 212b61131b..22e36a52f0 100644 --- a/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp +++ b/pcsx2/GS/Renderers/SW/GSDrawScanlineCodeGenerator.cpp @@ -91,7 +91,8 @@ GSDrawScanlineCodeGenerator::GSDrawScanlineCodeGenerator(u64 key, void* code, si if (shouldUseCDrawScanline(key)) { - jmp(reinterpret_cast(&GSDrawScanline::CDrawScanline)); + jmp(reinterpret_cast(static_cast( + &GSDrawScanline::CDrawScanline))); return; }