use depth mask when writing to depth

This commit is contained in:
Samuliak 2025-01-17 14:51:25 +01:00
parent 21e7466670
commit 2a218d418f
No known key found for this signature in database
5 changed files with 17 additions and 8 deletions

View file

@ -678,6 +678,13 @@ uint64 LatteSHRC_CalcPSAuxHash(LatteDecompilerShader* pixelShader, uint32* conte
auxHash = std::rotl<uint64>(auxHash, 7);
auxHash += (uint64)dataType;
}
bool hasDepthBuffer = LatteMRT::GetActiveDepthBufferMask(LatteGPUState.contextNew);
if (hasDepthBuffer)
{
auxHash = std::rotl<uint64>(auxHash, 5);
auxHash += 13u;
}
}
#endif

View file

@ -187,8 +187,8 @@ struct LatteDecompilerShader
// analyzer stage (pixel outputs)
uint32 pixelColorOutputMask{ 0 }; // from LSB to MSB, 1 bit per written output. 1 if written (indices of color attachments)
// analyzer stage (depth write)
bool depthWritten{ false };
// analyzer stage (depth output)
bool depthMask{ false };
// analyzer stage (geometry shader parameters/inputs)
uint32 ringParameterCount{ 0 };
uint32 ringParameterCountFromPrevStage{ 0 }; // used in geometry shader to hold VS ringParameterCount

View file

@ -398,7 +398,8 @@ void LatteDecompiler_analyzeExport(LatteDecompilerShaderContext* shaderContext,
}
else if (cfInstruction->exportType == 0 && cfInstruction->exportArrayBase == 61)
{
shader->depthWritten = true;
if (LatteMRT::GetActiveDepthBufferMask(*shaderContext->contextRegistersNew))
shader->depthMask = true;
}
else
debugBreakpoint();

View file

@ -3316,6 +3316,9 @@ static void _emitExportCode(LatteDecompilerShaderContext* shaderContext, LatteDe
cemu_assert_unimplemented(); // ukn
}
if (!shaderContext->shader->depthMask)
return;
src->add("out.passDepth = ");
_emitExportGPRReadCode(shaderContext, cfInstruction, LATTE_DECOMPILER_DTYPE_FLOAT, 0);
src->add(".x");

View file

@ -298,10 +298,8 @@ namespace LatteDecompiler
}
// generate depth output for pixel shader
if (decompilerContext->shader->depthWritten)
{
if (decompilerContext->shader->depthMask)
src->add("float passDepth [[depth(any)]];" _CRLF);
}
src->add("};" _CRLF _CRLF);
}