From e944944e7c1e06c3572c5d9387cd4e3364de9749 Mon Sep 17 00:00:00 2001 From: BZLZHH Date: Sat, 15 Nov 2025 22:41:30 +0800 Subject: [PATCH] [Misc] (MG_Impl/Getter): GL_MAX_COLOR_ATTACHMENTS in GetIntegerv. --- .../GLImpl/Framebuffer/GL_Framebuffer.cpp | 64 ++++++++++++------- MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp | 8 ++- 2 files changed, 46 insertions(+), 26 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp b/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp index 1224a586..f9d5ce40 100644 --- a/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp +++ b/MobileGL/MG_Impl/GLImpl/Framebuffer/GL_Framebuffer.cpp @@ -136,13 +136,14 @@ namespace MobileGL { void DrawBuffers_State(GLsizei n, const GLenum* bufs) { if (n < 0) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", __func__, - "`n` is less than 0.")); + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", __func__, "`n` is less than 0.")); return; } else if (n > MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", __func__, - "`n` is greater than `GL_MAX_DRAW_BUFFERS`.")); + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", __func__, + "`n` is greater than `GL_MAX_DRAW_BUFFERS`.")); return; } @@ -151,10 +152,9 @@ namespace MobileGL { auto fbo = bindingSlot.GetBoundObject(); bool isDefaultFBO = (fbo == FramebufferImpl::pDefaultFramebufferInfo->defaultFBO); - static int existenceMap[(SizeT)FramebufferAttachmentType::FramebufferAttachmentTypeCount] = { - -1 - }; - std::fill(existenceMap, existenceMap + (SizeT)FramebufferAttachmentType::FramebufferAttachmentTypeCount, -1); + static int existenceMap[(SizeT)FramebufferAttachmentType::FramebufferAttachmentTypeCount] = {-1}; + std::fill(existenceMap, existenceMap + (SizeT)FramebufferAttachmentType::FramebufferAttachmentTypeCount, + -1); for (GLsizei i = 0; i < n; ++i) { auto attType = MG_Util::ConvertGLEnumToFramebufferAttachmentType(bufs[i]); @@ -162,40 +162,58 @@ namespace MobileGL { // ------------------- Check validity begin ------------------------ if (attType == FramebufferAttachmentType::Unknown) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", __func__, - std::format("bufs[{}] = %s is not an accepted value.", i, MG_Util::ConvertGLEnumToString(bufs[i])))); + ErrorCode::InvalidEnum, + MakeShared("MG_Impl/GLImpl", __func__, + std::format("bufs[{}] = %s is not an accepted value.", i, + MG_Util::ConvertGLEnumToString(bufs[i])))); return; } - if (isDefaultFBO && - attType >= FramebufferAttachmentType::Color0 && attType <= FramebufferAttachmentType::Color31) { + if (isDefaultFBO && attType >= FramebufferAttachmentType::Color0 && + attType <= FramebufferAttachmentType::Color31) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", __func__, - std::format("FBO is default FBO, but bufs[{}] = {} is one of the `GL_COLOR_ATTACHMENTn` tokens.", i, MG_Util::ConvertGLEnumToString(bufs[i])))); + ErrorCode::InvalidEnum, + MakeShared( + "MG_Impl/GLImpl", __func__, + std::format( + "FBO is default FBO, but bufs[{}] = {} is one of the `GL_COLOR_ATTACHMENTn` tokens.", i, + MG_Util::ConvertGLEnumToString(bufs[i])))); return; } - if (!isDefaultFBO && - attType >= FramebufferAttachmentType::FrontLeft && attType <= FramebufferAttachmentType::BackRight) { + if (!isDefaultFBO && attType >= FramebufferAttachmentType::FrontLeft && + attType <= FramebufferAttachmentType::BackRight) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidEnum, MakeShared("MG_Impl/GLImpl", __func__, - std::format("FBO is not default FBO, but bufs[{}] = {} is anything other than `GL_NONE` or one of the `GL_COLOR_ATTACHMENTn` tokens.", i, MG_Util::ConvertGLEnumToString(bufs[i])))); + ErrorCode::InvalidEnum, + MakeShared( + "MG_Impl/GLImpl", __func__, + std::format("FBO is not default FBO, but bufs[{}] = {} is anything other than `GL_NONE` or " + "one of the `GL_COLOR_ATTACHMENTn` tokens.", + i, MG_Util::ConvertGLEnumToString(bufs[i])))); return; } if (attType != FramebufferAttachmentType::None && existenceMap[(SizeT)attType] >= 0) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, MakeShared("MG_Impl/GLImpl", __func__, - std::format("a symbolic constant other than `GL_NONE` appears more than once in bufs. bufs[{}] == bufs[{}] == {}.", i, existenceMap[(SizeT)attType], MG_Util::ConvertGLEnumToString(bufs[i])))); + ErrorCode::InvalidOperation, + MakeShared("MG_Impl/GLImpl", __func__, + std::format("a symbolic constant other than `GL_NONE` appears " + "more than once in bufs. bufs[{}] == bufs[{}] == {}.", + i, existenceMap[(SizeT)attType], + MG_Util::ConvertGLEnumToString(bufs[i])))); return; } existenceMap[(SizeT)attType] = i; - if ((SizeT)attType > (SizeT)FramebufferAttachmentType::Color0 + MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) { + if ((SizeT)attType > + (SizeT)FramebufferAttachmentType::Color0 + MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS) { MG_State::pGLContext->RecordError( - ErrorCode::InvalidOperation, MakeShared("MG_Impl/GLImpl", __func__, - std::format("bufs[{}] == {} indicates a color buffer that does not exist in the current GL context.", i, MG_Util::ConvertGLEnumToString(bufs[i])))); + ErrorCode::InvalidOperation, + MakeShared("MG_Impl/GLImpl", __func__, + std::format("bufs[{}] == {} indicates a color buffer that does " + "not exist in the current GL context.", + i, MG_Util::ConvertGLEnumToString(bufs[i])))); return; } // ------------------------- Check validity end ---------------------------------- diff --git a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp index fa5489b4..8872387a 100644 --- a/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp +++ b/MobileGL/MG_Impl/GLImpl/Getter/GL_Getter.cpp @@ -1,6 +1,8 @@ #include "GL_Getter.h" #include "GL/gl.h" +#include "GL/glext.h" #include "MG_State/GLState/ErrorState/ErrorInfo.h" +#include "MG_State/GLState/FramebufferState/FramebufferObject.h" #include #include #include @@ -341,9 +343,6 @@ namespace MobileGL { case GL_MAX_DEPTH_TEXTURE_SAMPLES: *params = 16; // TODO break; - case GL_MAX_DRAW_BUFFERS: - *params = 8; // TODO - break; case GL_MAX_DUAL_SOURCE_DRAW_BUFFERS: *params = 1; // TODO break; @@ -854,6 +853,9 @@ namespace MobileGL { case GL_CONTEXT_PROFILE_MASK: *params = GL_CONTEXT_CORE_PROFILE_BIT; break; + case GL_MAX_COLOR_ATTACHMENTS: + case GL_MAX_DRAW_BUFFERS: + *params = MG_State::GLState::FramebufferObject::MAX_DRAW_BUFFERS; // TODO: use backend value default: MGLOG_E("glGetIntegerv: Invalid enum %s (0x%X)", MG_Util::ConvertGLEnumToString(pname).c_str(), pname); MG_State::pGLContext->RecordError(