diff --git a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp index 0e7cea03..508fbfa0 100644 --- a/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp +++ b/MobileGL/MG_Impl/GLImpl/Program/GL_Program.cpp @@ -140,7 +140,23 @@ namespace MobileGL { } void GetAttachedShaders_State(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* shaders) { - THROW_UNIMPL_EXCEPTION; + if (maxCount < 0) { + MG_State::pGLContext->RecordError( + ErrorCode::InvalidValue, + MakeShared("MG_Impl/GLImpl", __func__, + "`maxCount` is less than 0.")); + return; + } + auto programObject = TryToGetProgramObject(program); + if (!programObject) + return; + const auto& s = programObject->GetAttachedShaders(); + GLsizei c = std::min((GLsizei)s.size(), maxCount); + if (count) + *count = c; + for (GLsizei i = 0; i < c; ++i) { + shaders[i] = s[i]->GetId(); + } } GLint GetAttribLocation_State(GLuint program, const GLchar* name) { diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp index a82c57a9..db9bc49a 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.cpp @@ -59,6 +59,10 @@ namespace MobileGL { void ProgramObject::MarkAsDeleted() { m_deleteStatus = true; } + + Vector>& ProgramObject::GetAttachedShaders() { + return m_shaders; + } } // namespace GLState } // namespace MG_State } // namespace MobileGL \ No newline at end of file diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h index 1946707d..a4e5b1b5 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramObject.h @@ -7,12 +7,15 @@ namespace MobileGL { namespace GLState { class ProgramObject { public: + ProgramObject(const Uint id): m_id(id) {} bool ShaderIsAttached(SharedPtr shader); bool AttachShader(SharedPtr shader); SizeT DetachShader(SharedPtr shader); void Link(); void MarkAsDeleted(); + Vector>& GetAttachedShaders(); private: + const Uint m_id = 0; Vector> m_shaders; // basically this contains SPIR-V in binary format Vector> m_programBinary; diff --git a/MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp b/MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp index 6f290128..fb7f22eb 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp +++ b/MobileGL/MG_State/GLState/ProgramState/ProgramState.cpp @@ -7,7 +7,7 @@ namespace MobileGL { Uint programId = 0; m_programIndexGenerator.Generate(1, &programId); EnsureIndexAvail(programId, m_programObjects); - auto programObject = MakeShared(); + auto programObject = MakeShared(programId); if (programObject == nullptr) return 0; m_programObjects[programId] = programObject; @@ -45,7 +45,7 @@ namespace MobileGL { Uint shaderId = 0; m_shaderIndexGenerator.Generate(1, &shaderId); EnsureIndexAvail(shaderId, m_shaderObjects); - auto shaderObject = MakeShared(stage); + auto shaderObject = MakeShared(stage, shaderId); if (shaderObject == nullptr) return 0; m_shaderObjects[shaderId] = shaderObject; diff --git a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h index 3d14af78..271c7939 100644 --- a/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h +++ b/MobileGL/MG_State/GLState/ProgramState/ShaderObject.h @@ -56,16 +56,18 @@ namespace MobileGL { class ShaderObject { public: - ShaderObject(const ShaderStage stage) : m_stage(stage) {} + ShaderObject(const ShaderStage stage, const Uint id) : m_stage(stage), m_id(id) {} void SetShaderSource(const std::string& source); void SetShaderSource(std::string&& source); void Compile(); void MarkAsDeleted(); + Uint GetId() const { return m_id; } ShaderStage GetShaderStage() const { return m_stage; } const std::string& GetShaderSource() const { return m_source; } SharedPtr GetCompiledShader() const { return m_shader; } private: + const Uint m_id = 0; const ShaderStage m_stage; std::string m_source; SharedPtr m_shader;