[Feat] (MG_State/Program): GetProgramiv WIP

This commit is contained in:
2025-08-15 17:16:49 +08:00
parent ef5b7cd99a
commit ec95c0401a
4 changed files with 85 additions and 5 deletions
+60 -2
View File
@@ -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<GenericErrorInfo>("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) {