Skip to content

Commit 2b9938d

Browse files
committed
Latte: Fix caching of shader error state
Fixes: #1985
1 parent aa7c82d commit 2b9938d

2 files changed

Lines changed: 12 additions & 4 deletions

File tree

src/Cafe/HW/Latte/Core/LatteShader.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,7 @@ void LatteSHRC_UpdateActiveShaders()
12451245
_activeVertexShader = shaderStateInfo->vertexShader;
12461246
_activePixelShader = shaderStateInfo->pixelShader;
12471247
_activeGeometryShader = shaderStateInfo->geometryShader;
1248+
LatteGPUState.activeShaderHasError = shaderStateInfo->shaderError;
12481249
return;
12491250
}
12501251
for (auto& auxVariant : shaderStateInfo->auxVariants)
@@ -1255,20 +1256,27 @@ void LatteSHRC_UpdateActiveShaders()
12551256
_activeVertexShader = auxVariant.vertexShader;
12561257
_activePixelShader = auxVariant.pixelShader;
12571258
_activeGeometryShader = auxVariant.geometryShader;
1259+
LatteGPUState.activeShaderHasError = shaderStateInfo->shaderError;
12581260
return;
12591261
}
12601262
}
12611263
}
12621264
// no cache entry found, get/create shaders individually and add to cache
12631265
LatteFetchShader* fetchShader = LatteSHRC_GetOrCreateFetchShader();
12641266
_activeFetchShader = fetchShader;
1267+
1268+
// check whether shaders have errors
12651269
bool shaderError = LatteGPUState.activeShaderHasError;
12661270
LatteDecompilerShader* vertexShader = LatteSHRC_GetOrCreateVertexShader((uint8*)memory_getPointerFromPhysicalOffset(vsProgramAddr), vsProgramSize, geometryShaderUsed, fetchShader);
1267-
shaderError |= LatteGPUState.activeShaderHasError;
1271+
if (vertexShader)
1272+
shaderError |= vertexShader->hasError;
12681273
LatteDecompilerShader* pixelShader = LatteSHRC_GetOrCreatePixelShader((uint8*)memory_getPointerFromPhysicalOffset(psProgramAddr), psProgramSize, geometryShaderUsed);
1269-
shaderError |= LatteGPUState.activeShaderHasError;
1274+
if (pixelShader)
1275+
shaderError |= pixelShader->hasError;
12701276
LatteDecompilerShader* geometryShader = LatteSHRC_GetOrCreateGeometryShader(geometryShaderUsed, (uint8*)memory_getPointerFromPhysicalOffset(gsProgramAddr), gsProgramSize, (uint8*)memory_getPointerFromPhysicalOffset(copyProgramAddr), copyProgramSize, vertexShader);
1271-
shaderError |= LatteGPUState.activeShaderHasError;
1277+
if (geometryShader)
1278+
shaderError |= geometryShader->hasError;
1279+
12721280
uint64 combinedAuxHash = CalcCombinedAuxHash(fetchShader, vertexShader, pixelShader);
12731281

12741282
if (!shaderStateInfo)

src/Cafe/HW/Latte/Renderer/OpenGL/OpenGLRendererCore.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -866,7 +866,7 @@ void OpenGLRenderer::draw_genericDrawHandler(uint32 baseVertex, uint32 baseInsta
866866
}
867867
if (LatteGPUState.activeShaderHasError)
868868
{
869-
debug_printf("Skipped drawcall due to shader error\n");
869+
cemuLog_logDebugOnce(LogType::Force, "Skipped drawcall due to shader error\n");
870870
return;
871871
}
872872
// check for blacklisted shaders

0 commit comments

Comments
 (0)