[Fix] (Espryt, Pipe): carry the bound sampler state's CSO handle into the sampler twin's sync and mix the texture-bind generation into the shader-image shutter - the twin resolved a content-addressed record by an identity handle, and an image re-bind that only moved the level never re-emitted the set

This commit is contained in:
rereview
2026-09-08 18:46:58 -04:00
parent 2e03b82a67
commit 41b7905000
2 changed files with 11 additions and 2 deletions
@@ -5301,7 +5301,15 @@ namespace MobileGL::MG_Backend::DirectGLES {
}
backendSampler = backendObj.get();
}
#if MOBILEGL_PIPE_PUSH
backendSampler->SyncToBackend(
samplerObject,
static_cast<SizeT>(unit) < MG_Pipe::MGPipeApplier().BoundSamplerStates.size()
? MG_Pipe::MGPipeApplier().BoundSamplerStates[static_cast<SizeT>(unit)]
: MG_Pipe::kMGPipeNullHandle);
#else
backendSampler->SyncToBackend(samplerObject);
#endif
// Syncing the object's parameters is not the same as putting it on the
// unit: without this the driver kept sampling with the texture's own
// parameters and every sampler object was inert.
+3 -2
View File
@@ -515,8 +515,9 @@ namespace MobileGL::MG_Pipe {
now[Index(MGPipeDirty::NewSamplers)] = MGPipeMixShutter(
MGPipeMixShutter(textureParams, ctx.GetSamplingResolutionGeneration()),
ctx.GetTextureBindGeneration());
now[Index(MGPipeDirty::NewShaderImages)] =
MGPipeMixShutter(MGPipeMixShutter(textureContent, textureParams), programImages);
now[Index(MGPipeDirty::NewShaderImages)] = MGPipeMixShutter(
MGPipeMixShutter(MGPipeMixShutter(textureContent, textureParams), programImages),
ctx.GetTextureBindGeneration());
now[Index(MGPipeDirty::NewConstBuffers)] = buffers;
now[Index(MGPipeDirty::NewShaderBuffers)] = buffers;
now[Index(MGPipeDirty::NewSoTargets)] =