From 24efb0bb17b262ee7952d6b96d0695f2a7767179 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Sat, 6 Jun 2026 17:27:09 +0800 Subject: [PATCH] [Fix] (MG_Impl/Program): implement direct state uniform updates --- .../MG_Impl/GLImpl/Exporting/Definitions.cpp | 54 ++-- .../MG_Impl/GLImpl/Program/GL_Program.cpp | 262 ++++++++++++++++++ MobileGL/MG_Impl/GLImpl/Program/GL_Program.h | 30 ++ 3 files changed, 319 insertions(+), 27 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp b/MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp index 1b0e68d5..dbdf9294 100644 --- a/MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp +++ b/MobileGL/MG_Impl/GLImpl/Exporting/Definitions.cpp @@ -323,33 +323,33 @@ DECLARE_GL_FUNCTION_STUB_HEAD(void, DeleteProgramPipelines, GLsizei n, const GLu DECLARE_GL_FUNCTION_STUB_HEAD(void, GenProgramPipelines, GLsizei n, GLuint* pipelines) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GenProgramPipelines, n, pipelines) DECLARE_GL_FUNCTION_STUB_HEAD(GLboolean, IsProgramPipeline, GLuint pipeline) DECLARE_GL_FUNCTION_STUB_END(GLboolean, IsProgramPipeline, pipeline) DECLARE_GL_FUNCTION_STUB_HEAD(void, GetProgramPipelineiv, GLuint pipeline, GLenum pname, GLint* params) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, GetProgramPipelineiv, pipeline, pname, params) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform1i, GLuint program, GLint location, GLint v0) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform1i, program, location, v0) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform2i, GLuint program, GLint location, GLint v0, GLint v1) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform2i, program, location, v0, v1) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform3i, GLuint program, GLint location, GLint v0, GLint v1, GLint v2) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform3i, program, location, v0, v1, v2) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform4i, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform4i, program, location, v0, v1, v2, v3) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform1ui, GLuint program, GLint location, GLuint v0) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform1ui, program, location, v0) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform2ui, GLuint program, GLint location, GLuint v0, GLuint v1) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform2ui, program, location, v0, v1) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform3ui, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform3ui, program, location, v0, v1, v2) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform4ui, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform4ui, program, location, v0, v1, v2, v3) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform1f, GLuint program, GLint location, GLfloat v0) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform1f, program, location, v0) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform2f, GLuint program, GLint location, GLfloat v0, GLfloat v1) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform2f, program, location, v0, v1) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform3f, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform3f, program, location, v0, v1, v2) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform4f, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform4f, program, location, v0, v1, v2, v3) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform1iv, GLuint program, GLint location, GLsizei count, const GLint* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform1iv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform2iv, GLuint program, GLint location, GLsizei count, const GLint* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform2iv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform3iv, GLuint program, GLint location, GLsizei count, const GLint* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform3iv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform4iv, GLuint program, GLint location, GLsizei count, const GLint* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform4iv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform1uiv, GLuint program, GLint location, GLsizei count, const GLuint* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform1uiv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform2uiv, GLuint program, GLint location, GLsizei count, const GLuint* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform2uiv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform3uiv, GLuint program, GLint location, GLsizei count, const GLuint* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform3uiv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform4uiv, GLuint program, GLint location, GLsizei count, const GLuint* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform4uiv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform1fv, GLuint program, GLint location, GLsizei count, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform1fv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform2fv, GLuint program, GLint location, GLsizei count, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform2fv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform3fv, GLuint program, GLint location, GLsizei count, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform3fv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniform4fv, GLuint program, GLint location, GLsizei count, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniform4fv, program, location, count, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniformMatrix2fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniformMatrix2fv, program, location, count, transpose, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniformMatrix3fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniformMatrix3fv, program, location, count, transpose, value) -DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniformMatrix4fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniformMatrix4fv, program, location, count, transpose, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform1i, GLuint program, GLint location, GLint v0) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform1i, program, location, v0) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform2i, GLuint program, GLint location, GLint v0, GLint v1) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform2i, program, location, v0, v1) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform3i, GLuint program, GLint location, GLint v0, GLint v1, GLint v2) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform3i, program, location, v0, v1, v2) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform4i, GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform4i, program, location, v0, v1, v2, v3) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform1ui, GLuint program, GLint location, GLuint v0) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform1ui, program, location, v0) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform2ui, GLuint program, GLint location, GLuint v0, GLuint v1) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform2ui, program, location, v0, v1) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform3ui, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform3ui, program, location, v0, v1, v2) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform4ui, GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform4ui, program, location, v0, v1, v2, v3) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform1f, GLuint program, GLint location, GLfloat v0) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform1f, program, location, v0) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform2f, GLuint program, GLint location, GLfloat v0, GLfloat v1) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform2f, program, location, v0, v1) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform3f, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform3f, program, location, v0, v1, v2) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform4f, GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform4f, program, location, v0, v1, v2, v3) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform1iv, GLuint program, GLint location, GLsizei count, const GLint* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform1iv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform2iv, GLuint program, GLint location, GLsizei count, const GLint* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform2iv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform3iv, GLuint program, GLint location, GLsizei count, const GLint* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform3iv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform4iv, GLuint program, GLint location, GLsizei count, const GLint* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform4iv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform1uiv, GLuint program, GLint location, GLsizei count, const GLuint* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform1uiv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform2uiv, GLuint program, GLint location, GLsizei count, const GLuint* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform2uiv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform3uiv, GLuint program, GLint location, GLsizei count, const GLuint* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform3uiv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform4uiv, GLuint program, GLint location, GLsizei count, const GLuint* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform4uiv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform1fv, GLuint program, GLint location, GLsizei count, const GLfloat* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform1fv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform2fv, GLuint program, GLint location, GLsizei count, const GLfloat* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform2fv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform3fv, GLuint program, GLint location, GLsizei count, const GLfloat* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform3fv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniform4fv, GLuint program, GLint location, GLsizei count, const GLfloat* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniform4fv, program, location, count, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniformMatrix2fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniformMatrix2fv, program, location, count, transpose, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniformMatrix3fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniformMatrix3fv, program, location, count, transpose, value) +DECLARE_GL_FUNCTION_HEAD(void, ProgramUniformMatrix4fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_END_NO_RETURN(void, ProgramUniformMatrix4fv, program, location, count, transpose, value) DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniformMatrix2x3fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniformMatrix2x3fv, program, location, count, transpose, value) DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniformMatrix3x2fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniformMatrix3x2fv, program, location, count, transpose, value) DECLARE_GL_FUNCTION_STUB_HEAD(void, ProgramUniformMatrix2x4fv, GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat* value) DECLARE_GL_FUNCTION_STUB_END_NO_RETURN(void, ProgramUniformMatrix2x4fv, program, location, count, transpose, value) diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index eab97596..279044cd 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -596,6 +596,36 @@ namespace MobileGL::MG_Impl::GLImpl { } } + template + void ProgramUniformv_State(GLuint program, GLint location, GLsizei count, T* value) { + if (location == -1) return; + + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "program " + std::to_string(program) + " is not linked.")); + return; + } + + if (location > programObject->GetMaxUniformLocation() || location < -1) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " is an invalid uniform location for program " + + std::to_string(program) + ".")); + return; + } + + for (GLint offset = 0; offset < count; offset++) { + Uniform_State(*programObject, location + offset, value + offset * ItemCount); + } + } + // Helper function to transpose a 2x2 matrix void TransposeMatrix2x2(const GLfloat* input, GLfloat* output) { // Input matrix is in column-major order (OpenGL default) @@ -815,6 +845,118 @@ namespace MobileGL::MG_Impl::GLImpl { } } + void ProgramUniformMatrix2fv_State(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value) { + if (location == -1) return; + + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "program " + std::to_string(program) + " is not linked.")); + return; + } + + if (location > programObject->GetMaxUniformLocation() || location < -1) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " is an invalid uniform location for program " + + std::to_string(program) + ".")); + return; + } + + for (GLint i = 0; i < count; i++) { + if (transpose == GL_TRUE) { + GLfloat transposedMatrix[4]; + TransposeMatrix2x2(value + i * 4, transposedMatrix); + Uniform_State<4>(*programObject, location + i, transposedMatrix); + } else { + Uniform_State<4>(*programObject, location + i, value + i * 4); + } + } + } + + void ProgramUniformMatrix3fv_State(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value) { + if (location == -1) return; + + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "program " + std::to_string(program) + " is not linked.")); + return; + } + + if (location > programObject->GetMaxUniformLocation() || location < -1) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " is an invalid uniform location for program " + + std::to_string(program) + ".")); + return; + } + + for (GLint i = 0; i < count; i++) { + if (transpose == GL_TRUE) { + GLfloat transposedMatrix[9]; + TransposeMatrix3x3(value + i * 9, transposedMatrix); + for (int row = 0; row < 3; ++row) { + Uniform_State<3>(*programObject, location + i, transposedMatrix + row * 3, row * 4 * sizeof(float)); + } + } else { + for (int row = 0; row < 3; ++row) { + Uniform_State<3>(*programObject, location + i, value + i * 9 + row * 3, row * 4 * sizeof(float)); + } + } + } + } + + void ProgramUniformMatrix4fv_State(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value) { + if (location == -1) return; + + auto& programObject = TryToGetProgramObject(program); + if (!programObject) return; + + if (!programObject->GetLinkStatus()) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "program " + std::to_string(program) + " is not linked.")); + return; + } + + if (location > programObject->GetMaxUniformLocation() || location < -1) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidOperation, + MakeUnique("MG_Impl/GLImpl", __func__, + "location " + std::to_string(location) + + " is an invalid uniform location for program " + + std::to_string(program) + ".")); + return; + } + + for (GLint i = 0; i < count; i++) { + if (transpose == GL_TRUE) { + GLfloat transposedMatrix[16]; + TransposeMatrix4x4(value + i * 16, transposedMatrix); + Uniform_State<16>(*programObject, location + i, transposedMatrix); + } else { + Uniform_State<16>(*programObject, location + i, value + i * 16); + } + } + } + GLuint GetUniformBlockIndex_State(GLuint program, const GLchar* uniformBlockName) { const auto& programObject = TryToGetProgramObject(program); if (!programObject) return GL_INVALID_INDEX; @@ -1160,6 +1302,126 @@ namespace MobileGL::MG_Impl::GLImpl { UniformMatrix4fv_State(location, count, transpose, value); } + void ProgramUniform1f(GLuint program, GLint location, GLfloat v0) { + ProgramUniform1fv(program, location, 1, &v0); + } + + void ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1) { + GLfloat v[] = {v0, v1}; + ProgramUniform2fv(program, location, 1, v); + } + + void ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) { + GLfloat v[] = {v0, v1, v2}; + ProgramUniform3fv(program, location, 1, v); + } + + void ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) { + GLfloat v[] = {v0, v1, v2, v3}; + ProgramUniform4fv(program, location, 1, v); + } + + void ProgramUniform1i(GLuint program, GLint location, GLint v0) { + ProgramUniform1iv(program, location, 1, &v0); + } + + void ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1) { + GLint v[] = {v0, v1}; + ProgramUniform2iv(program, location, 1, v); + } + + void ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2) { + GLint v[] = {v0, v1, v2}; + ProgramUniform3iv(program, location, 1, v); + } + + void ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3) { + GLint v[] = {v0, v1, v2, v3}; + ProgramUniform4iv(program, location, 1, v); + } + + void ProgramUniform1ui(GLuint program, GLint location, GLuint v0) { + ProgramUniform1uiv(program, location, 1, &v0); + } + + void ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1) { + GLuint v[] = {v0, v1}; + ProgramUniform2uiv(program, location, 1, v); + } + + void ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2) { + GLuint v[] = {v0, v1, v2}; + ProgramUniform3uiv(program, location, 1, v); + } + + void ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3) { + GLuint v[] = {v0, v1, v2, v3}; + ProgramUniform4uiv(program, location, 1, v); + } + + void ProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { + ProgramUniformv_State<1>(program, location, count, value); + } + + void ProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { + ProgramUniformv_State<2>(program, location, count, value); + } + + void ProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { + ProgramUniformv_State<3>(program, location, count, value); + } + + void ProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat* value) { + ProgramUniformv_State<4>(program, location, count, value); + } + + void ProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint* value) { + ProgramUniformv_State<1>(program, location, count, value); + } + + void ProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint* value) { + ProgramUniformv_State<2>(program, location, count, value); + } + + void ProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint* value) { + ProgramUniformv_State<3>(program, location, count, value); + } + + void ProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint* value) { + ProgramUniformv_State<4>(program, location, count, value); + } + + void ProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { + ProgramUniformv_State<1>(program, location, count, value); + } + + void ProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { + ProgramUniformv_State<2>(program, location, count, value); + } + + void ProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { + ProgramUniformv_State<3>(program, location, count, value); + } + + void ProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint* value) { + ProgramUniformv_State<4>(program, location, count, value); + } + + void ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value) { + ProgramUniformMatrix2fv_State(program, location, count, transpose, value); + } + + void ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value) { + ProgramUniformMatrix3fv_State(program, location, count, transpose, value); + } + + void ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value) { + ProgramUniformMatrix4fv_State(program, location, count, transpose, value); + } + GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName) { return GetUniformBlockIndex_State(program, uniformBlockName); } diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.h b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.h index dd3db51c..d58e643f 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.h +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.h @@ -56,6 +56,36 @@ namespace MobileGL::MG_Impl::GLImpl { void UniformMatrix2fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); void UniformMatrix3fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); void UniformMatrix4fv(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value); + void ProgramUniform1f(GLuint program, GLint location, GLfloat v0); + void ProgramUniform2f(GLuint program, GLint location, GLfloat v0, GLfloat v1); + void ProgramUniform3f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); + void ProgramUniform4f(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); + void ProgramUniform1i(GLuint program, GLint location, GLint v0); + void ProgramUniform2i(GLuint program, GLint location, GLint v0, GLint v1); + void ProgramUniform3i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); + void ProgramUniform4i(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); + void ProgramUniform1ui(GLuint program, GLint location, GLuint v0); + void ProgramUniform2ui(GLuint program, GLint location, GLuint v0, GLuint v1); + void ProgramUniform3ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); + void ProgramUniform4ui(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); + void ProgramUniform1fv(GLuint program, GLint location, GLsizei count, const GLfloat* value); + void ProgramUniform2fv(GLuint program, GLint location, GLsizei count, const GLfloat* value); + void ProgramUniform3fv(GLuint program, GLint location, GLsizei count, const GLfloat* value); + void ProgramUniform4fv(GLuint program, GLint location, GLsizei count, const GLfloat* value); + void ProgramUniform1iv(GLuint program, GLint location, GLsizei count, const GLint* value); + void ProgramUniform2iv(GLuint program, GLint location, GLsizei count, const GLint* value); + void ProgramUniform3iv(GLuint program, GLint location, GLsizei count, const GLint* value); + void ProgramUniform4iv(GLuint program, GLint location, GLsizei count, const GLint* value); + void ProgramUniform1uiv(GLuint program, GLint location, GLsizei count, const GLuint* value); + void ProgramUniform2uiv(GLuint program, GLint location, GLsizei count, const GLuint* value); + void ProgramUniform3uiv(GLuint program, GLint location, GLsizei count, const GLuint* value); + void ProgramUniform4uiv(GLuint program, GLint location, GLsizei count, const GLuint* value); + void ProgramUniformMatrix2fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value); + void ProgramUniformMatrix3fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value); + void ProgramUniformMatrix4fv(GLuint program, GLint location, GLsizei count, GLboolean transpose, + const GLfloat* value); GLuint GetUniformBlockIndex(GLuint program, const GLchar* uniformBlockName); void UniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); void GetActiveUniformBlockiv(GLuint program, GLuint uniformBlockIndex, GLenum pname, GLint* params);