#include "../../../include/RenderBackend/OpenGL/ShaderProgram.hpp" #include "../../../include/RenderBackend/OpenGL/Shader.hpp" #include "../../../include/RenderBackend/OpenGL/opengl.hpp" using namespace std; namespace amalgine { ShaderProgram::ShaderProgram(u32 shader_program_id) : program_id(shader_program_id) { } ShaderProgram::~ShaderProgram() { GLint numAttachedShaders = 0; glGetProgramiv(program_id, GL_ATTACHED_SHADERS, &numAttachedShaders); GLuint *attachedShaders = new GLuint[numAttachedShaders]; glGetAttachedShaders(program_id, numAttachedShaders, nullptr, attachedShaders); for(int i = 0; i < numAttachedShaders; ++i) { GLuint attachedShaderId = attachedShaders[i]; glDetachShader(program_id, attachedShaderId); } glDeleteProgram(program_id); delete []attachedShaders; } // static Result> ShaderProgram::build(const std::vector &shaders) { u32 shader_program_id = glCreateProgram(); if(shader_program_id == 0) return Result>::Err("Failed to create shader program"); for(Shader *shader : shaders) { glAttachShader(shader_program_id, shader->id); } glLinkProgram(shader_program_id); std::unique_ptr shader_program; shader_program.reset(new ShaderProgram(shader_program_id)); return Result>::Ok(std::move(shader_program)); } ShaderFrame ShaderProgram::create_frame() { return { program_id }; } }