From 00534d8bbcb93a7d2e6743f372ac8ba83834418f Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Tue, 4 Aug 2026 09:52:40 -0400 Subject: [PATCH] [Fix] (MG_Impl): report the draw-indirect binding and the buffer access state Three pieces of queryable buffer state were missing, all of them read by the KHR-GL40.draw_indirect basic-binding-* and basic-buffer-* cases: - GL_DRAW_INDIRECT_BUFFER_BINDING had no case in glGetIntegerv, so it raised GL_INVALID_ENUM and left the caller's variable untouched (the test read back its own -9999 sentinel). GL_DISPATCH_INDIRECT_BUFFER_BINDING right next to it was already handled; this is the same two lines against BufferTarget::DrawIndirect. Because glGetBooleanv/glGetFloatv/glGetDoublev all widen from the integer path, one case fixes all four getters. - GL_BUFFER_ACCESS answered 0 for an unmapped buffer. Its initial value is GL_READ_WRITE and glUnmapBuffer restores it (GL 4.6 core table 6.2); 0 is not a legal value of that state at all, and the test threw on the unrecognised enum. - GL_BUFFER_ACCESS_FLAGS was not implemented, so it fell through to the invalid-pname arm. It is the MapBufferRange bitfield verbatim, which the mapping access flags already hold in normalised form - glMapBuffer's access enum is converted on the way in - so it converts straight back out, and reads zero while unmapped. --- MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp | 13 +++++++++++-- MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp | 5 +++++ .../Converters/MGToGL/BufferEnumConverter.cpp | 2 +- .../MG_Util/Converters/MGToGL/BufferEnumConverter.h | 2 +- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp b/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp index 7f11e8cc..e9f0136a 100644 --- a/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp +++ b/MobileGL/MG_Impl/GLImpl/Buffer/GL_Buffer.cpp @@ -330,12 +330,21 @@ namespace MobileGL::MG_Impl::GLImpl { } else if (access & BufferMappingAccessBit::Write) { *params = GL_WRITE_ONLY; } else { - *params = 0; + *params = GL_READ_WRITE; } } else { - *params = 0; + // Initial value, and what glUnmapBuffer restores (GL 4.6 core table 6.2). + *params = GL_READ_WRITE; } break; + case GL_BUFFER_ACCESS_FLAGS: + // The MapBufferRange flags verbatim; glMapBuffer's access enum has already been + // normalised into the same bits. Zero while the buffer is not mapped. + *params = bufferObject->IsMapped() + ? static_cast( + MG_Util::ConvertBufferMappingAccessToGLEnum(bufferObject->GetMappingAccess())) + : 0; + break; case GL_BUFFER_MAPPED: *params = bufferObject->IsMapped() ? GL_TRUE : GL_FALSE; break; diff --git a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp index 853cd179..3458df5f 100644 --- a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp +++ b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp @@ -1030,6 +1030,11 @@ namespace MobileGL::MG_Impl::GLImpl { *params = obj ? static_cast(obj->GetExternalIndex()) : 0; return; } + case GL_DRAW_INDIRECT_BUFFER_BINDING: { + auto& obj = MG_State::pGLContext->GetBufferBindingSlot(BufferTarget::DrawIndirect).GetBoundObject(); + *params = obj ? static_cast(obj->GetExternalIndex()) : 0; + return; + } case GL_MAX_DEBUG_GROUP_STACK_DEPTH: *params = 0; // debug-group entrypoints are stubbed return; diff --git a/MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.cpp b/MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.cpp index 14c87c88..5ae52213 100644 --- a/MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.cpp +++ b/MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.cpp @@ -73,7 +73,7 @@ namespace MobileGL { } } - GLbitfield ConvertBufferMappingAccessToGLEnum(BufferMappingAccessBit access) { + GLbitfield ConvertBufferMappingAccessToGLEnum(Flags access) { GLbitfield result = 0; if (access & BufferMappingAccessBit::Read) result |= GL_MAP_READ_BIT; if (access & BufferMappingAccessBit::Write) result |= GL_MAP_WRITE_BIT; diff --git a/MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.h b/MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.h index 2f72282b..0fbb406a 100644 --- a/MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.h +++ b/MobileGL/MG_Util/Converters/MGToGL/BufferEnumConverter.h @@ -14,6 +14,6 @@ namespace MobileGL { namespace MG_Util { GLenum ConvertBufferTargetToGLEnum(BufferTarget bufferTarget); GLenum ConvertBufferUsageToGLEnum(BufferUsage usage); - GLbitfield ConvertBufferMappingAccessToGLEnum(BufferMappingAccessBit access); + GLbitfield ConvertBufferMappingAccessToGLEnum(Flags access); } // namespace MG_Util } // namespace MobileGL \ No newline at end of file