mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-09 04:38:30 +09:00
[Feat] (MG_State/Program): GetProgramiv WIP
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -17,7 +17,7 @@ namespace MobileGL {
|
||||
Vector<SharedPtr<ShaderObject>>& 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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user