Latte: Fix caching of shader error state

Fixes: #1985
This commit is contained in:
goeiecool9999 2026-07-10 16:50:17 +02:00
parent aa7c82dda3
commit 2b9938d48a
2 changed files with 12 additions and 4 deletions

View File

@ -1245,6 +1245,7 @@ void LatteSHRC_UpdateActiveShaders()
_activeVertexShader = shaderStateInfo->vertexShader;
_activePixelShader = shaderStateInfo->pixelShader;
_activeGeometryShader = shaderStateInfo->geometryShader;
LatteGPUState.activeShaderHasError = shaderStateInfo->shaderError;
return;
}
for (auto& auxVariant : shaderStateInfo->auxVariants)
@ -1255,6 +1256,7 @@ void LatteSHRC_UpdateActiveShaders()
_activeVertexShader = auxVariant.vertexShader;
_activePixelShader = auxVariant.pixelShader;
_activeGeometryShader = auxVariant.geometryShader;
LatteGPUState.activeShaderHasError = shaderStateInfo->shaderError;
return;
}
}
@ -1262,13 +1264,19 @@ void LatteSHRC_UpdateActiveShaders()
// no cache entry found, get/create shaders individually and add to cache
LatteFetchShader* fetchShader = LatteSHRC_GetOrCreateFetchShader();
_activeFetchShader = fetchShader;
// check whether shaders have errors
bool shaderError = LatteGPUState.activeShaderHasError;
LatteDecompilerShader* vertexShader = LatteSHRC_GetOrCreateVertexShader((uint8*)memory_getPointerFromPhysicalOffset(vsProgramAddr), vsProgramSize, geometryShaderUsed, fetchShader);
shaderError |= LatteGPUState.activeShaderHasError;
if (vertexShader)
shaderError |= vertexShader->hasError;
LatteDecompilerShader* pixelShader = LatteSHRC_GetOrCreatePixelShader((uint8*)memory_getPointerFromPhysicalOffset(psProgramAddr), psProgramSize, geometryShaderUsed);
shaderError |= LatteGPUState.activeShaderHasError;
if (pixelShader)
shaderError |= pixelShader->hasError;
LatteDecompilerShader* geometryShader = LatteSHRC_GetOrCreateGeometryShader(geometryShaderUsed, (uint8*)memory_getPointerFromPhysicalOffset(gsProgramAddr), gsProgramSize, (uint8*)memory_getPointerFromPhysicalOffset(copyProgramAddr), copyProgramSize, vertexShader);
shaderError |= LatteGPUState.activeShaderHasError;
if (geometryShader)
shaderError |= geometryShader->hasError;
uint64 combinedAuxHash = CalcCombinedAuxHash(fetchShader, vertexShader, pixelShader);
if (!shaderStateInfo)

View File

@ -866,7 +866,7 @@ void OpenGLRenderer::draw_genericDrawHandler(uint32 baseVertex, uint32 baseInsta
}
if (LatteGPUState.activeShaderHasError)
{
debug_printf("Skipped drawcall due to shader error\n");
cemuLog_logDebugOnce(LogType::Force, "Skipped drawcall due to shader error\n");
return;
}
// check for blacklisted shaders