diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index 0f0b3ed5..51475f0a 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -100,7 +100,7 @@ namespace MobileGL { } GLuint CreateShader_State(GLenum type) { - auto shaderId = MG_State::pGLContext->CreateShader(MG_State::GLState::GetMGLShaderStageByGLShaderType(type)); + auto shaderId = MG_State::pGLContext->CreateShader(MG_State::GLState::ConvertMGLShaderStageByGLShaderType(type)); if (shaderId == 0) { MG_State::pGLContext->RecordError( ErrorCode::InvalidValue, @@ -273,7 +273,33 @@ namespace MobileGL { } void GetShaderiv_State(GLuint shader, GLenum pname, GLint* params) { - THROW_UNIMPL_EXCEPTION; + auto shaderObject = TryToGetShaderObject(shader); + if (!shaderObject) + return; + + switch (pname) { + case GL_SHADER_TYPE: + *params = ConvertGLShaderTypeByMGLShaderStage(shaderObject->GetShaderStage()); + break; + case GL_DELETE_STATUS: + *params = shaderObject->GetDeleteStatus(); + break; + case GL_COMPILE_STATUS: + *params = shaderObject->GetCompileStatus(); + break; + case GL_INFO_LOG_LENGTH: + *params = shaderObject->GetInfoLog().length(); + break; + case GL_SHADER_SOURCE_LENGTH: + *params = shaderObject->GetShaderSource().length(); + break; + default: + MG_State::pGLContext->RecordError( + ErrorCode::InvalidEnum, + MakeShared("MG_Impl/GLImpl", __func__, + "`pname` is not an accepted value.")); + return; + } } void GetShaderInfoLog_State(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog) { diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp index e87a1982..f4534ed4 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp @@ -31,7 +31,7 @@ namespace MobileGL { Vector shaderTypes(m_shaders.size()); Vector> shaders(m_shaders.size()); for (SizeT i = 0; i < m_shaders.size(); i++) { - shaderTypes[i] = GetGLShaderTypeByMGLShaderStage(m_shaders[i]->GetShaderStage()); + shaderTypes[i] = ConvertGLShaderTypeByMGLShaderStage(m_shaders[i]->GetShaderStage()); shaders[i] = m_shaders[i]->GetCompiledShader(); } diff --git a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp index ec795d3a..145ef741 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.cpp @@ -25,7 +25,7 @@ namespace MobileGL { // like a real OpenGL driver at linking stage // Will compile for other backends later. ShaderAttrib attrib{ - .shaderType = GetGLShaderTypeByMGLShaderStage(m_stage), + .shaderType = ConvertGLShaderTypeByMGLShaderStage(m_stage), .sourceStr = m_source, .flags = ShaderCompileBits::CompileForOpenGL }; diff --git a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h index 9ed7ebb8..21818928 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h @@ -14,7 +14,7 @@ namespace MobileGL { Unknown = -1 }; - inline static GLenum GetGLShaderTypeByMGLShaderStage(ShaderStage stage) { + inline static GLenum ConvertGLShaderTypeByMGLShaderStage(ShaderStage stage) { switch (stage) { case ShaderStage::Vertex: return GL_VERTEX_SHADER; @@ -34,7 +34,7 @@ namespace MobileGL { } } - inline static ShaderStage GetMGLShaderStageByGLShaderType(GLenum type) { + inline static ShaderStage ConvertMGLShaderStageByGLShaderType(GLenum type) { switch (type) { case GL_VERTEX_SHADER: return ShaderStage::Vertex; @@ -68,6 +68,8 @@ namespace MobileGL { SharedPtr GetCompiledShader() const { return m_shader; } const String& GetInfoLog() const { return m_infoLog; } const UnorderedMap& GetUniformLocations() const { return m_uniforms; } + Bool GetCompileStatus() const { return m_compileStatus; } + Bool GetDeleteStatus() const { return m_deleteStatus; } private: // bool DoReflection(); const Uint m_id = 0;