From ec95c0401a68c7a9b73a78c11a3c9ef6a91e05d5 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Fri, 15 Aug 2025 17:16:49 +0800 Subject: [PATCH] [Feat] (MG_State/Program): GetProgramiv WIP --- .../MG_Impl/GLImpl/Program/GL_Program.cpp | 62 ++++++++++++++++++- .../GLState/ProgramState/ProgramObject.cpp | 7 +++ .../GLState/ProgramState/ProgramObject.h | 10 ++- MobileGL/MG_Test/Program/ProgramTest.cpp | 11 +++- 4 files changed, 85 insertions(+), 5 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index 86dfa415..a94d7f9a 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -199,7 +199,63 @@ namespace MobileGL { } void GetProgramiv_State(GLuint program, GLenum pname, GLint* params) { - THROW_UNIMPL_EXCEPTION; + auto programObject = TryToGetProgramObject(program); + if (!programObject) + return; + + switch (pname) { + case GL_DELETE_STATUS: + *params = programObject->GetDeleteStatus(); + break; + case GL_LINK_STATUS: + *params = programObject->GetLinkStatus(); + break; + case GL_VALIDATE_STATUS: + *params = programObject->GetValidateStatus(); + break; + case GL_INFO_LOG_LENGTH: { + const auto& log = programObject->GetInfoLog(); + *params = log.length(); + break; + } + case GL_ATTACHED_SHADERS: { + const auto& attachedShaders = programObject->GetAttachedShaders(); + *params = attachedShaders.size(); + break; + } + case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS: + *params = programObject->GetActiveAtomicCounterCount(); + break; + case GL_ACTIVE_ATTRIBUTES: + *params = programObject->GetActiveAttributesCount(); + break; + case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: + *params = programObject->GetActiveAttributesMaxLength(); + break; + case GL_ACTIVE_UNIFORMS: + *params = programObject->GetUniformCount(); + break; + case GL_ACTIVE_UNIFORM_MAX_LENGTH: + *params = programObject->GetUniformMaxLength(); + break; + case GL_PROGRAM_BINARY_LENGTH: + case GL_ACTIVE_UNIFORM_BLOCKS: // GL >= 3.1 + case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: // ditto. + case GL_COMPUTE_WORK_GROUP_SIZE: // GL >= 4.3 + + case GL_TRANSFORM_FEEDBACK_BUFFER_MODE: + case GL_TRANSFORM_FEEDBACK_VARYINGS: + case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: + case GL_GEOMETRY_VERTICES_OUT: + case GL_GEOMETRY_INPUT_TYPE: + case GL_GEOMETRY_OUTPUT_TYPE: + default: + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeShared("MG_Impl/GLImpl", __func__, + "`pname` is not an accepted value.")); + return; + } } void GetProgramInfoLog_State(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { @@ -355,7 +411,9 @@ namespace MobileGL { } void ValidateProgram_State(GLuint program) { - THROW_UNIMPL_EXCEPTION; + auto programObject = TryToGetProgramObject(program); + if (!programObject) + return; } void AttachShader(GLuint program, GLuint shader) { diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp index 71e3f767..07b24256 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp @@ -74,6 +74,7 @@ namespace MobileGL { auto& uniform = m_program->getUniform(i); auto location = uniform.layoutLocation(); m_maxUniformLocation = std::max(m_maxUniformLocation, location); + m_uniformNameMaxLength = std::max(m_uniformNameMaxLength, (Int)uniform.name.length()); m_uniformLocations[uniform.name] = location; } @@ -87,6 +88,12 @@ namespace MobileGL { m_uniformNames[location] = uniform.name; m_uniformTypes[location] = uniform.glDefineType; } + + int inCount = m_program->getNumPipeInputs(); + for (int i = 0; i < inCount; i++) { + auto& inVar = m_program->getPipeInput(i); + m_attribInNameMaxLength = std::max(m_attribInNameMaxLength, (Int)inVar.name.length()); + } } // void ProgramObject::PreLink() { diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h index f066be6d..e06c815b 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h @@ -17,7 +17,7 @@ namespace MobileGL { Vector>& GetAttachedShaders(); const String& GetInfoLog() const { return m_infoLog; } Int GetUniformMaxLength() const { return m_uniformNameMaxLength; } - Uint GetUniformCount() { return m_uniformOffsets.size(); } + Uint GetUniformCount() { return m_uniformNames.size(); } Int GetUniformLocation(const String& name) { const auto it = m_uniformLocations.find(name); return (it == m_uniformLocations.end()) ? -1 : it->second; @@ -29,6 +29,13 @@ namespace MobileGL { const String& GetUniformName(Uint index) const { return m_uniformNames[index]; } + + Bool GetDeleteStatus() const { return m_deleteStatus; } + Bool GetLinkStatus() const { return m_linkStatus; } + Bool GetValidateStatus() const { return m_validateStatus; } + Int GetActiveAtomicCounterCount() const { return m_program->getNumAtomicCounters(); } + Int GetActiveAttributesCount() const { return m_program->getNumPipeInputs(); } + Int GetActiveAttributesMaxLength() const { return m_attribInNameMaxLength; } private: void DoReflection(); // void PreLink(); @@ -52,6 +59,7 @@ namespace MobileGL { Int m_uniformNameMaxLength = 0; Uint m_maxUniformLocation = 0; + Int m_attribInNameMaxLength = 0; String m_infoLog; Bool m_deleteStatus = false; diff --git a/MobileGL/MG_Test/Program/ProgramTest.cpp b/MobileGL/MG_Test/Program/ProgramTest.cpp index 3504e45a..6e0cd42a 100644 --- a/MobileGL/MG_Test/Program/ProgramTest.cpp +++ b/MobileGL/MG_Test/Program/ProgramTest.cpp @@ -52,11 +52,12 @@ uniform vec2 InSize; layout(location = 1) uniform vec3 Gray; uniform vec3 RedMatrix; -uniform vec3 GreenMatrix; +uniform vec3 GreenMatrix0; uniform vec3 BlueMatrix; uniform vec3 Offset; uniform vec3 ColorScale; layout(location = 6) uniform float Saturation; +uniform int AQuickFoxJumpsOverALazyDog; out vec4 fragColor; @@ -65,7 +66,7 @@ void main() { // Color Matrix float RedValue = dot(InTexel.rgb, RedMatrix); - float GreenValue = dot(InTexel.rgb, GreenMatrix); + float GreenValue = dot(InTexel.rgb, GreenMatrix0); float BlueValue = dot(InTexel.rgb, BlueMatrix); vec3 OutColor = vec3(RedValue, GreenValue, BlueValue); @@ -116,4 +117,10 @@ TEST_F(ProgramTest, CompileAndLink) { EXPECT_EQ(GetUniformLocation(program, "ProjMat"), 0); EXPECT_EQ(GetUniformLocation(program, "Gray"), 1); EXPECT_EQ(GetUniformLocation(program, "Saturation"), 6); + GLint uniformCount = 0; + GetProgramiv(program, GL_ACTIVE_UNIFORMS, &uniformCount); + EXPECT_EQ(uniformCount, 11); + GLint uniformNameMaxLength = 0; + GetProgramiv(program, GL_ACTIVE_UNIFORM_MAX_LENGTH, &uniformNameMaxLength); + EXPECT_EQ(uniformNameMaxLength, 12); }