From 6649241193418b1eadaa88bb552944d44a96a950 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Thu, 2 Jul 2026 14:17:16 +0800 Subject: [PATCH] [Fix] (MG_Impl/GLImpl): report compute shader minimum limits [skip ci] --- MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp | 39 +++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp index c0ce3733..93960031 100644 --- a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp +++ b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp @@ -39,7 +39,9 @@ namespace MobileGL::MG_Impl::GLImpl { constexpr GLint kFrontendMaxComputeUniformComponents = 1024; constexpr GLint kFrontendMaxComputeAtomicCounters = 8; - constexpr GLint kFrontendMaxComputeAtomicCounterBuffers = 1; + constexpr GLint kFrontendMaxComputeAtomicCounterBuffers = 8; + constexpr GLint kFrontendMaxComputeSharedMemorySize = 32768; + constexpr GLint kFrontendMaxComputeWorkGroupInvocations = 1024; constexpr GLint kFrontendMaxCombinedAtomicCounters = 8; constexpr GLint kFrontendMaxFragmentAtomicCounters = 8; constexpr GLint kFrontendMaxGeometryAtomicCounters = 0; @@ -75,6 +77,14 @@ namespace MobileGL::MG_Impl::GLImpl { constexpr GLint kFrontendSubpixelBits = 4; constexpr GLint kFrontendMaxSamples = 4; + constexpr GLint GetMinComputeWorkGroupCount(GLuint index) { + return index < 3 ? 65535 : 0; + } + + constexpr GLint GetMinComputeWorkGroupSize(GLuint index) { + return index < 2 ? 1024 : (index == 2 ? 64 : 0); + } + GLint GetMaxCombinedUniformComponents(GLint maxDefaultUniformComponents, GLint maxUniformBlocks, GLint maxUniformBlockSizeBytes) { return maxDefaultUniformComponents + maxUniformBlocks * (maxUniformBlockSizeBytes / 4); @@ -622,6 +632,27 @@ namespace MobileGL::MG_Impl::GLImpl { } auto getIntegeri = MG_Backend::gBackendFunctionsTable.GL.GetIntegeri_v; + if (target == GL_MAX_COMPUTE_WORK_GROUP_COUNT || target == GL_MAX_COMPUTE_WORK_GROUP_SIZE) { + if (index >= 3) { + *data = 0; + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeUnique("MG_Impl/GLImpl", __func__, + "Compute work group index is out of range.")); + return; + } + + const GLint minimum = target == GL_MAX_COMPUTE_WORK_GROUP_COUNT + ? GetMinComputeWorkGroupCount(index) + : GetMinComputeWorkGroupSize(index); + GLint backendValue = 0; + if (getIntegeri) { + getIntegeri(target, index, &backendValue); + } + *data = std::max(backendValue, minimum); + return; + } + if (!getIntegeri) { *data = 0; MG_State::pGLContext->RecordError( @@ -848,6 +879,9 @@ namespace MobileGL::MG_Impl::GLImpl { case GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS: *params = kFrontendMaxComputeAtomicCounterBuffers; return; + case GL_MAX_COMPUTE_SHARED_MEMORY_SIZE: + *params = kFrontendMaxComputeSharedMemorySize; + return; case GL_DISPATCH_INDIRECT_BUFFER_BINDING: { auto& obj = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::DispatchIndirect).GetBoundObject(); *params = obj ? static_cast(obj->GetExternalIndex()) : 0; @@ -1604,7 +1638,8 @@ namespace MobileGL::MG_Impl::GLImpl { dynamicParameters.MaxUniformBlockSize); break; case GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS: - *params = dynamicParameters.MaxComputeWorkGroupInvocations; + *params = std::max(dynamicParameters.MaxComputeWorkGroupInvocations, + kFrontendMaxComputeWorkGroupInvocations); break; case GL_MAX_COMPUTE_WORK_GROUP_COUNT: GetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, ¶ms[0]);