From 9ee2e0a1dbe8eb8347affd94dff0469c88b9be83 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Wed, 12 Aug 2026 15:22:39 -0400 Subject: [PATCH] [Fix] (MG_Backend/DirectGLES): re-push the texture parameters a regenerated driver texture has lost, instead of trusting caches that outlived it --- MobileGL/MG_Backend/DirectGLES/Managers.cpp | 17 ++++++++++++++++- MobileGL/MG_Backend/DirectGLES/Managers.h | 4 ++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.cpp b/MobileGL/MG_Backend/DirectGLES/Managers.cpp index de01ba69..607c11ba 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.cpp +++ b/MobileGL/MG_Backend/DirectGLES/Managers.cpp @@ -1964,6 +1964,20 @@ namespace MobileGL::MG_Backend::DirectGLES { m_isInitialized = false; m_backendStorageImmutable = false; m_prevTextureInfo = {}; + // The new ES texture starts at the ES defaults, so every parameter this object had + // already pushed onto the old one is gone. The change-detection caches below would + // otherwise still claim those values are in force and SyncTextureParamsToBackend + // would skip the whole pass on the unchanged params version, leaving the driver + // texture at defaults for the rest of its life. Latent for swizzle, LOD range and + // border colour long before GL_DEPTH_STENCIL_TEXTURE_MODE joined them; the mode + // makes it visible because falling back to the default silently samples the wrong + // aspect rather than merely mis-filtering. + m_cacheLodRange = {0, 1000}; + m_cacheBorderColor = {0.0f, 0.0f, 0.0f, 0.0f}; + m_cacheSwizzleParams = {TextureSwizzleParam::Red, TextureSwizzleParam::Green, TextureSwizzleParam::Blue, + TextureSwizzleParam::Alpha}; + m_cacheDepthStencilTextureMode = GL_DEPTH_COMPONENT; + m_forceTextureParamsResync = true; } // Sets the backend GL unpack state to MobileGL's upload default for the scope, @@ -3216,11 +3230,12 @@ namespace MobileGL::MG_Backend::DirectGLES { } Uint16 currentTextureParamsVersion = stateTextureObject->GetTextureParamsVersion(); - if (m_syncedTextureParamsVersion == currentTextureParamsVersion) { + if (m_syncedTextureParamsVersion == currentTextureParamsVersion && !m_forceTextureParamsResync) { MGLOG_D("Texture parameters have not changed for texture ID: %u, skipping sync.", m_backendTextureId); return; } m_syncedTextureParamsVersion = currentTextureParamsVersion; + m_forceTextureParamsResync = false; MGLOG_D("Syncing texture params with backend ID %u to backend for state ID %u", m_backendTextureId, stateTextureObject->GetExternalIndex()); diff --git a/MobileGL/MG_Backend/DirectGLES/Managers.h b/MobileGL/MG_Backend/DirectGLES/Managers.h index 20c666b4..33669ed5 100644 --- a/MobileGL/MG_Backend/DirectGLES/Managers.h +++ b/MobileGL/MG_Backend/DirectGLES/Managers.h @@ -707,6 +707,10 @@ namespace MobileGL::MG_Backend::DirectGLES { GLenum m_cacheDepthStencilTextureMode = GL_DEPTH_COMPONENT; Uint16 m_syncedSamplerVersion = 0; Uint16 m_syncedTextureParamsVersion = 0; + // Set when the driver texture underneath was regenerated and has therefore lost every + // parameter already pushed onto it: the params-version early-out has to be overridden + // once, or an unchanged version would skip the re-push forever. + Bool m_forceTextureParamsResync = false; }; void ActivateTextureUnit(Uint unit);