mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-09 04:38:30 +09:00
[Feat] (ProgramState): Implement automatic GLSL uniform management.
- Add SPIRV-Cross/glslang integration for uniform reflection. - Auto-detect and assign locations for uniforms/samplers. - Support most types of uniform. - Implement glUniform* functions with type safety. - Add MG_Util::Program: - GLSL-SPIRV conversion - SPIRV uniform reflection - Program uniform dumping
This commit is contained in:
@@ -5,18 +5,35 @@
|
||||
#ifndef MOBILEGL_PROGRAMSTATE_H
|
||||
#define MOBILEGL_PROGRAMSTATE_H
|
||||
#define MOBILEGL_GLSTATE_H
|
||||
#define MOBILEGL_PROGRAM_DEBUGTOOL_H
|
||||
#define MOBILEGL_GLSLTOOL_H
|
||||
|
||||
#include "../../../Includes.h"
|
||||
|
||||
struct ShaderObject {
|
||||
GLenum type;
|
||||
std::string source;
|
||||
std::vector<unsigned int> compiledSpirv;
|
||||
UncertainBool compiled;
|
||||
GLint compileStatus;
|
||||
std::string infoLog;
|
||||
bool markedForDeletion;
|
||||
};
|
||||
|
||||
struct UniformValue {
|
||||
GLenum type;
|
||||
std::vector<GLfloat> floatData;
|
||||
std::vector<GLint> intData;
|
||||
std::vector<GLuint> uintData;
|
||||
std::vector<GLboolean> boolData;
|
||||
GLsizei count;
|
||||
|
||||
UniformValue() : type(0), count(0) {}
|
||||
|
||||
template<typename T>
|
||||
void setData(GLenum uniformType, GLsizei numElements, const T* values);
|
||||
};
|
||||
|
||||
struct ProgramObject {
|
||||
std::vector<GLuint> attachedShaders;
|
||||
UncertainBool linked;
|
||||
@@ -25,6 +42,7 @@ struct ProgramObject {
|
||||
std::unordered_map<std::string, GLint> attribBindings;
|
||||
std::unordered_map<std::string, GLint> attribLocations;
|
||||
std::unordered_map<std::string, GLint> uniformLocations;
|
||||
std::unordered_map<std::string, UniformValue> uniformValues;
|
||||
bool markedForDeletion;
|
||||
};
|
||||
|
||||
@@ -39,6 +57,9 @@ private:
|
||||
GLuint currentProgram_ = 0;
|
||||
|
||||
public:
|
||||
ProgramState();
|
||||
~ProgramState();
|
||||
|
||||
// Return: the validity of the operation, according to OpenGL 3 standard
|
||||
GLenum CreateShader(GLenum type, GLuint* shader);
|
||||
GLenum CreateProgram(GLuint* program);
|
||||
@@ -54,7 +75,42 @@ public:
|
||||
GLint QueryProgramUniformLocation(GLuint program, const GLchar* name);
|
||||
GLenum QueryProgramStateIntVector(GLuint program, GLenum pname, GLint* params);
|
||||
GLenum QueryShaderStateIntVector(GLuint shader, GLenum pname, GLint* params);
|
||||
|
||||
template<typename T>
|
||||
GLenum SetUniform(GLuint program, GLint location, GLsizei count, const T* value, GLenum type);
|
||||
|
||||
template<typename T>
|
||||
GLenum SetUniformMatrix(GLuint program, GLint location, GLsizei count, GLboolean transpose, const T* value, GLenum matrixType);
|
||||
|
||||
#define DECLARE_UNIFORM_FUNCTIONS(type, suffix, vecType) \
|
||||
void UpdateUniform##suffix##1(GLint location, type v0); \
|
||||
void UpdateUniform##suffix##2(GLint location, type v0, type v1); \
|
||||
void UpdateUniform##suffix##3(GLint location, type v0, type v1, type v2); \
|
||||
void UpdateUniform##suffix##4(GLint location, type v0, type v1, type v2, type v3); \
|
||||
void UpdateUniform##suffix##Vector1(GLint location, GLsizei count, const type* value); \
|
||||
void UpdateUniform##suffix##Vector2(GLint location, GLsizei count, const type* value); \
|
||||
void UpdateUniform##suffix##Vector3(GLint location, GLsizei count, const type* value); \
|
||||
void UpdateUniform##suffix##Vector4(GLint location, GLsizei count, const type* value);
|
||||
DECLARE_UNIFORM_FUNCTIONS(GLfloat, Float, GL_FLOAT)
|
||||
DECLARE_UNIFORM_FUNCTIONS(GLint, Int, GL_INT)
|
||||
DECLARE_UNIFORM_FUNCTIONS(GLuint, UInt, GL_UNSIGNED_INT)
|
||||
DECLARE_UNIFORM_FUNCTIONS(GLboolean, Bool, GL_BOOL)
|
||||
#undef DECLARE_UNIFORM_FUNCTIONS
|
||||
#define DECLARE_MATRIX_FUNCTIONS(suffix, matrixType) \
|
||||
void UpdateUniformMatrix##suffix##Vector(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
|
||||
DECLARE_MATRIX_FUNCTIONS(2x2, GL_FLOAT_MAT2)
|
||||
DECLARE_MATRIX_FUNCTIONS(3x3, GL_FLOAT_MAT3)
|
||||
DECLARE_MATRIX_FUNCTIONS(4x4, GL_FLOAT_MAT4)
|
||||
DECLARE_MATRIX_FUNCTIONS(2x3, GL_FLOAT_MAT2x3)
|
||||
DECLARE_MATRIX_FUNCTIONS(2x4, GL_FLOAT_MAT2x4)
|
||||
DECLARE_MATRIX_FUNCTIONS(3x2, GL_FLOAT_MAT3x2)
|
||||
DECLARE_MATRIX_FUNCTIONS(3x4, GL_FLOAT_MAT3x4)
|
||||
DECLARE_MATRIX_FUNCTIONS(4x2, GL_FLOAT_MAT4x2)
|
||||
DECLARE_MATRIX_FUNCTIONS(4x3, GL_FLOAT_MAT4x3)
|
||||
#undef DECLARE_MATRIX_FUNCTIONS
|
||||
|
||||
ProgramObject GetProgramObject(GLuint program) const;
|
||||
ShaderObject GetShaderObject(GLuint program) const;
|
||||
GLuint GetCurrentProgram() const;
|
||||
bool SetProgramStatus(GLuint program, GLboolean status);
|
||||
bool SetShaderStatus(GLuint shader, GLboolean status);
|
||||
@@ -63,6 +119,7 @@ private:
|
||||
bool ValidateShader_(GLuint shader);
|
||||
bool ValidateProgram_(GLuint program);
|
||||
void CleanupShaders_();
|
||||
GLint GetUniformLocation_(GLuint program, GLint location, const GLchar* name);
|
||||
};
|
||||
|
||||
#endif // MOBILEGL_PROGRAMSTATE_H
|
||||
|
||||
Reference in New Issue
Block a user