softgpu: Skip fog when no verts have fog.

This commit is contained in:
Unknown W. Brackets 2022-12-02 21:55:49 -08:00
parent 0c42e45e92
commit 204789a27f
2 changed files with 20 additions and 2 deletions

View file

@ -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);

View file

@ -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,