diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index 32fd7d57..980cfe94 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -5,7 +5,7 @@ namespace MobileGL { namespace MG_Impl::GLImpl { static bool CheckShaderNameValidity(Uint shader) { - if (!MG_State::pGLContext->ValidateShaderName(shader)) { + if (shader == 0 || !MG_State::pGLContext->ValidateShaderName(shader)) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, MakeShared("MG_Impl/GLImpl", __func__, @@ -216,7 +216,10 @@ namespace MobileGL { GLint GetUniformLocation_State(GLuint program, const GLchar* name) { - THROW_UNIMPL_EXCEPTION; + auto programObject = TryToGetProgramObject(program); + if (!programObject) + return -1; + return programObject->GetUniformLocation(name); } void GetUniformfv_State(GLuint program, GLint location, GLfloat* params) { diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h index 94f29e50..9955ed96 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h @@ -15,6 +15,10 @@ namespace MobileGL { void MarkAsDeleted(); Vector>& GetAttachedShaders(); const String& GetInfoLog() const { return m_infoLog; } + Int GetUniformLocation(const String& name) { + const auto it = m_uniforms.find(name); + return (it == m_uniforms.end()) ? -1 : it->second; + } private: void PreLink(); void PostLink(); diff --git a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h index d4366345..bdbf74e4 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h @@ -67,7 +67,7 @@ namespace MobileGL { const String& GetShaderSource() const { return m_source; } SharedPtr GetCompiledShader() const { return m_shader; } const String& GetInfoLog() const { return m_infoLog; } - const UnorderedMap GetUniformLocations() const { return m_uniforms; } + const UnorderedMap& GetUniformLocations() const { return m_uniforms; } private: bool DoReflection(); const Uint m_id = 0;