From 204789a27fe977cef7e783aabc0563c0ea216f27 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Fri, 2 Dec 2022 21:55:49 -0800 Subject: [PATCH] softgpu: Skip fog when no verts have fog. --- GPU/Software/Rasterizer.cpp | 15 ++++++++++++++- GPU/Software/Rasterizer.h | 7 ++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/GPU/Software/Rasterizer.cpp b/GPU/Software/Rasterizer.cpp index 5508b10d3b..b2c2a1e104 100644 --- a/GPU/Software/Rasterizer.cpp +++ b/GPU/Software/Rasterizer.cpp @@ -165,6 +165,8 @@ static inline void CalculateRasterStateFlags(RasterizerState *state, const Verte if (alpha != 0xFF) state->flags |= RasterizerStateFlags::VERTEX_ALPHA_NON_FULL; } + if (!(v0.fogdepth >= 1.0f)) + state->flags |= RasterizerStateFlags::VERTEX_HAS_FOG; } void CalculateRasterStateFlags(RasterizerState *state, const VertexData &v0) { @@ -241,6 +243,13 @@ static RasterizerStateFlags DetectStateOptimizations(RasterizerState *state) { optimize |= RasterizerStateFlags::OPTIMIZED_BLEND_OFF; } } + + bool applyFog = pixelID.applyFog || (state->flags & RasterizerStateFlags::OPTIMIZED_FOG_OFF); + if (applyFog) { + bool hasFog = state->flags & RasterizerStateFlags::VERTEX_HAS_FOG; + if (!hasFog) + optimize |= RasterizerStateFlags::OPTIMIZED_FOG_OFF; + } } if (state->enableTextures) { @@ -281,6 +290,10 @@ static bool ApplyStateOptimizations(RasterizerState *state, const RasterizerStat pixelID.alphaBlendDst = (uint8_t)(canFull ? PixelBlendFactor::ZERO : PixelBlendFactor::ONE); else if (state->flags & RasterizerStateFlags::OPTIMIZED_BLEND_DST) pixelID.alphaBlendDst = (uint8_t)PixelBlendFactor::INVSRCALPHA; + if (optimize & RasterizerStateFlags::OPTIMIZED_FOG_OFF) + pixelID.applyFog = false; + else if (state->flags & RasterizerStateFlags::OPTIMIZED_FOG_OFF) + pixelID.applyFog = true; SingleFunc drawPixel = Rasterizer::GetSingleFunc(pixelID, nullptr); // Can't compile during runtime. This failing is a bit of a problem when undoing... @@ -346,7 +359,7 @@ RasterizerState OptimizeFlatRasterizerState(const RasterizerState &origState, co RasterizerState state = origState; // Sometimes, a particular draw can do better than the overall state. - state.flags = ClearFlags(state.flags, RasterizerStateFlags::VERTEX_NON_FULL_WHITE | RasterizerStateFlags::VERTEX_ALPHA_NON_FULL | RasterizerStateFlags::VERTEX_ALPHA_NON_ZERO); + state.flags = ClearFlags(state.flags, RasterizerStateFlags::VERTEX_FLAT_RESET); CalculateRasterStateFlags(&state, v1, true); RasterizerStateFlags optimize = DetectStateOptimizations(&state); diff --git a/GPU/Software/Rasterizer.h b/GPU/Software/Rasterizer.h index 2a7a3171c2..ed14d7ca12 100644 --- a/GPU/Software/Rasterizer.h +++ b/GPU/Software/Rasterizer.h @@ -38,14 +38,19 @@ enum class RasterizerStateFlags { VERTEX_NON_FULL_WHITE = 0x0001, VERTEX_ALPHA_NON_ZERO = 0x0002, VERTEX_ALPHA_NON_FULL = 0x0004, + VERTEX_HAS_FOG = 0x0008, + + VERTEX_FLAT_RESET = VERTEX_NON_FULL_WHITE | VERTEX_ALPHA_NON_FULL | VERTEX_ALPHA_NON_ZERO | VERTEX_HAS_FOG, OPTIMIZED = 0x0001'0000, OPTIMIZED_BLEND_SRC = 0x0002'0000, OPTIMIZED_BLEND_DST = 0x0004'0000, OPTIMIZED_BLEND_OFF = 0x0008'0000, OPTIMIZED_TEXREPLACE = 0x0010'0000, + OPTIMIZED_FOG_OFF = 0x0020'0000, - OPTIMIZED_PIXELID = OPTIMIZED_BLEND_SRC | OPTIMIZED_BLEND_DST | OPTIMIZED_BLEND_OFF, + // Anything that changes the actual pixel or sampler func. + OPTIMIZED_PIXELID = OPTIMIZED_BLEND_SRC | OPTIMIZED_BLEND_DST | OPTIMIZED_BLEND_OFF | OPTIMIZED_FOG_OFF, OPTIMIZED_SAMPLERID = OPTIMIZED_TEXREPLACE, INVALID = 0x7FFFFFFF,