mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-05 14:31:17 +12:00
use depth mask when writing to depth
This commit is contained in:
parent
21e7466670
commit
2a218d418f
5 changed files with 17 additions and 8 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue