From 7228b01c2dce40a6a581bb413d605e0f76cab6eb Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Thu, 6 Nov 2025 23:21:23 +0800 Subject: [PATCH] [Fix] (GLImpl/Program, MG_Backend/DirectGLES): guard against not linked program object --- MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp | 4 ++-- MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp index d3af7173..58c2b858 100644 --- a/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp +++ b/MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp @@ -223,7 +223,7 @@ namespace MobileGL::MG_Backend::DirectGLES { namespace PrgramImpl { void SyncCurrentProgram() { auto currentProgram = MG_State::pGLContext->GetCurrentProgram(); - if (!currentProgram) { + if (!currentProgram || !currentProgram->GetLinkStatus()) { MG_External::GLES::glUseProgram(0); return; } @@ -311,7 +311,7 @@ namespace MobileGL::MG_Backend::DirectGLES { MG_External::GLES::glActiveTexture(GL_TEXTURE0 + originalActiveUnit); const auto& currentProgram = MG_State::pGLContext->GetCurrentProgram(); - if (currentProgram) { + if (currentProgram && currentProgram->GetLinkStatus()) { const auto& backendProgramIt = PrgramImpl::g_backendProgramObjects.find(currentProgram); if (backendProgramIt != PrgramImpl::g_backendProgramObjects.end()) { backendProgramIt->second->Use(); diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index 8031d294..afb209fd 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -158,7 +158,7 @@ namespace MobileGL { return; } auto programObject = TryToGetProgramObject(program); - if (!programObject) return; + if (!programObject || !programObject->GetLinkStatus()) return; auto attribCount = programObject->GetActiveAttributesCount(); if (index >= attribCount) { MG_State::pGLContext->RecordError( @@ -183,7 +183,7 @@ namespace MobileGL { return; } auto programObject = TryToGetProgramObject(program); - if (!programObject) return; + if (!programObject || !programObject->GetLinkStatus()) return; auto uniformCount = programObject->GetUniformCount(); if (index >= uniformCount) { MG_State::pGLContext->RecordError( @@ -438,6 +438,7 @@ namespace MobileGL { void LinkProgram_State(GLuint program) { auto programObject = TryToGetProgramObject(program); if (!programObject) return; + MGLOG_D("%s: linking program %d", __func__, program); programObject->Link(); } @@ -827,7 +828,7 @@ namespace MobileGL { } void ValidateProgram_State(GLuint program) { - THROW_UNIMPL_EXCEPTION; +// THROW_UNIMPL_EXCEPTION; } void AttachShader(GLuint program, GLuint shader) {