mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-12 06:08: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) {
|
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) {
|
void GetProgramInfoLog_State(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog) {
|
||||||
@@ -355,7 +411,9 @@ namespace MobileGL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ValidateProgram_State(GLuint program) {
|
void ValidateProgram_State(GLuint program) {
|
||||||
THROW_UNIMPL_EXCEPTION;
|
auto programObject = TryToGetProgramObject(program);
|
||||||
|
if (!programObject)
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AttachShader(GLuint program, GLuint shader) {
|
void AttachShader(GLuint program, GLuint shader) {
|
||||||
|
|||||||
@@ -74,6 +74,7 @@ namespace MobileGL {
|
|||||||
auto& uniform = m_program->getUniform(i);
|
auto& uniform = m_program->getUniform(i);
|
||||||
auto location = uniform.layoutLocation();
|
auto location = uniform.layoutLocation();
|
||||||
m_maxUniformLocation = std::max(m_maxUniformLocation, location);
|
m_maxUniformLocation = std::max(m_maxUniformLocation, location);
|
||||||
|
m_uniformNameMaxLength = std::max(m_uniformNameMaxLength, (Int)uniform.name.length());
|
||||||
m_uniformLocations[uniform.name] = location;
|
m_uniformLocations[uniform.name] = location;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,6 +88,12 @@ namespace MobileGL {
|
|||||||
m_uniformNames[location] = uniform.name;
|
m_uniformNames[location] = uniform.name;
|
||||||
m_uniformTypes[location] = uniform.glDefineType;
|
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() {
|
// void ProgramObject::PreLink() {
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace MobileGL {
|
|||||||
Vector<SharedPtr<ShaderObject>>& GetAttachedShaders();
|
Vector<SharedPtr<ShaderObject>>& GetAttachedShaders();
|
||||||
const String& GetInfoLog() const { return m_infoLog; }
|
const String& GetInfoLog() const { return m_infoLog; }
|
||||||
Int GetUniformMaxLength() const { return m_uniformNameMaxLength; }
|
Int GetUniformMaxLength() const { return m_uniformNameMaxLength; }
|
||||||
Uint GetUniformCount() { return m_uniformOffsets.size(); }
|
Uint GetUniformCount() { return m_uniformNames.size(); }
|
||||||
Int GetUniformLocation(const String& name) {
|
Int GetUniformLocation(const String& name) {
|
||||||
const auto it = m_uniformLocations.find(name);
|
const auto it = m_uniformLocations.find(name);
|
||||||
return (it == m_uniformLocations.end()) ? -1 : it->second;
|
return (it == m_uniformLocations.end()) ? -1 : it->second;
|
||||||
@@ -29,6 +29,13 @@ namespace MobileGL {
|
|||||||
const String& GetUniformName(Uint index) const {
|
const String& GetUniformName(Uint index) const {
|
||||||
return m_uniformNames[index];
|
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:
|
private:
|
||||||
void DoReflection();
|
void DoReflection();
|
||||||
// void PreLink();
|
// void PreLink();
|
||||||
@@ -52,6 +59,7 @@ namespace MobileGL {
|
|||||||
|
|
||||||
Int m_uniformNameMaxLength = 0;
|
Int m_uniformNameMaxLength = 0;
|
||||||
Uint m_maxUniformLocation = 0;
|
Uint m_maxUniformLocation = 0;
|
||||||
|
Int m_attribInNameMaxLength = 0;
|
||||||
|
|
||||||
String m_infoLog;
|
String m_infoLog;
|
||||||
Bool m_deleteStatus = false;
|
Bool m_deleteStatus = false;
|
||||||
|
|||||||
@@ -52,11 +52,12 @@ uniform vec2 InSize;
|
|||||||
|
|
||||||
layout(location = 1) uniform vec3 Gray;
|
layout(location = 1) uniform vec3 Gray;
|
||||||
uniform vec3 RedMatrix;
|
uniform vec3 RedMatrix;
|
||||||
uniform vec3 GreenMatrix;
|
uniform vec3 GreenMatrix0;
|
||||||
uniform vec3 BlueMatrix;
|
uniform vec3 BlueMatrix;
|
||||||
uniform vec3 Offset;
|
uniform vec3 Offset;
|
||||||
uniform vec3 ColorScale;
|
uniform vec3 ColorScale;
|
||||||
layout(location = 6) uniform float Saturation;
|
layout(location = 6) uniform float Saturation;
|
||||||
|
uniform int AQuickFoxJumpsOverALazyDog;
|
||||||
|
|
||||||
out vec4 fragColor;
|
out vec4 fragColor;
|
||||||
|
|
||||||
@@ -65,7 +66,7 @@ void main() {
|
|||||||
|
|
||||||
// Color Matrix
|
// Color Matrix
|
||||||
float RedValue = dot(InTexel.rgb, RedMatrix);
|
float RedValue = dot(InTexel.rgb, RedMatrix);
|
||||||
float GreenValue = dot(InTexel.rgb, GreenMatrix);
|
float GreenValue = dot(InTexel.rgb, GreenMatrix0);
|
||||||
float BlueValue = dot(InTexel.rgb, BlueMatrix);
|
float BlueValue = dot(InTexel.rgb, BlueMatrix);
|
||||||
vec3 OutColor = vec3(RedValue, GreenValue, BlueValue);
|
vec3 OutColor = vec3(RedValue, GreenValue, BlueValue);
|
||||||
|
|
||||||
@@ -116,4 +117,10 @@ TEST_F(ProgramTest, CompileAndLink) {
|
|||||||
EXPECT_EQ(GetUniformLocation(program, "ProjMat"), 0);
|
EXPECT_EQ(GetUniformLocation(program, "ProjMat"), 0);
|
||||||
EXPECT_EQ(GetUniformLocation(program, "Gray"), 1);
|
EXPECT_EQ(GetUniformLocation(program, "Gray"), 1);
|
||||||
EXPECT_EQ(GetUniformLocation(program, "Saturation"), 6);
|
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