From af32784f379735873ffc87b490fc81122736af06 Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Mon, 11 Aug 2025 23:19:10 +0800 Subject: [PATCH] [Feat] (MG_State/Program): GetShaderSource --- .../MG_Impl/GLImpl/Program/GL_Program.cpp | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index 508fbfa0..aaf53306 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -180,7 +180,23 @@ namespace MobileGL { } void GetShaderSource_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source) { - THROW_UNIMPL_EXCEPTION; + if (bufSize < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", __func__, + "`bufSize` is less than 0.")); + } + + auto shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) + return; + + auto& src = shaderObject->GetShaderSource(); + auto sz = std::min(bufSize - 1, (GLsizei)src.length()); + if (length) + *length = sz; + memcpy(source, src.c_str(), sz); + source[sz] = '\0'; } GLint GetUniformLocation_State(GLuint program, const GLchar* name) { @@ -226,8 +242,8 @@ namespace MobileGL { "`count` is less than 0.")); } - auto programObject = TryToGetShaderObject(shader); - if (!programObject) + auto shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) return; std::string src; @@ -235,7 +251,7 @@ namespace MobileGL { src += (length[i] <= 0) ? string[i] : std::string(string[i], length[i]); } - programObject->SetShaderSource(Move(src)); + shaderObject->SetShaderSource(Move(src)); } void UseProgram_State(GLuint program) {