From 2b9938d48a4e93dbcdec0661d1ea3328a7e88751 Mon Sep 17 00:00:00 2001 From: goeiecool9999 <7033575+goeiecool9999@users.noreply.github.com> Date: Fri, 10 Jul 2026 16:50:17 +0200 Subject: [PATCH] Latte: Fix caching of shader error state Fixes: #1985 --- src/Cafe/HW/Latte/Core/LatteShader.cpp | 14 +++++++++++--- .../Latte/Renderer/OpenGL/OpenGLRendererCore.cpp | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Cafe/HW/Latte/Core/LatteShader.cpp b/src/Cafe/HW/Latte/Core/LatteShader.cpp index 4e89b02f..d7891051 100644 --- a/src/Cafe/HW/Latte/Core/LatteShader.cpp +++ b/src/Cafe/HW/Latte/Core/LatteShader.cpp @@ -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) diff --git a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp index a67306b3..39ff9f7a 100644 --- a/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp +++ b/src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp @@ -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