mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
softgpu: Skip fog when no verts have fog.
This commit is contained in:
parent
0c42e45e92
commit
204789a27f
2 changed files with 20 additions and 2 deletions
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Reference in a new issue