void GLAPIENTRY _mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) { GET_CURRENT_CONTEXT(ctx); get_program_info_log(ctx, program, bufSize, length, infoLog); }
Program::Program(Shader* vertex_shader, Shader* fragment_shader) : info_log(NULL) { GLuint id = glCreateProgram(); if (id == 0) { puts("An error occured creating the program object\n"); exit(EXIT_FAILURE); } vertex_shader->attach_to(id); fragment_shader->attach_to(id); glLinkProgram(id); vertex_shader->detach_from(id); fragment_shader->detach_from(id); /* Program owns the two pointers, so we clean them up now */ if (vertex_shader) { delete vertex_shader; vertex_shader = NULL; } if (fragment_shader) { delete fragment_shader; fragment_shader = NULL; } // Check if the program linking was successful GLint status = (GLint) GL_FALSE; glGetProgramiv(id, GL_LINK_STATUS, &status); get_program_info_log(id); if (status != (GLint) GL_TRUE) { puts("OpenGL program linking failed\n"); puts("Program info log:\n"); puts( info_log ); exit(EXIT_FAILURE); return; } /* Rust code has a try statement here, perhaps we should fail fast with exit(EXIT_FAILURE) ? */ UniformMap uniforms = load_program_uniforms(id); // There shouldn't be anything in glGetError but let's // check to make sure. get_error(); this->id = id; this->uniforms = uniforms; }
bool GlslProgram::link(bool pipeline) { cleanup(); if(pipeline) { glGenProgramPipelines(1, &m_pipeline_id); } else { m_id = glCreateProgram(); } for(GlslShaderUptr &vv : m_shaders) { if(!vv->compile(pipeline)) { return false; } if(pipeline) { glUseProgramStages(m_pipeline_id, vv->getStage(), vv->getPipelineId()); } else { glAttachShader(m_id, vv->getId()); } } if(pipeline) { std::string log = get_pipeline_info_log(m_pipeline_id); if(!log.empty()) { std::cout << log; return false; } } else { glLinkProgram(m_id); if(!get_program_link_status(m_id)) { std::cout << get_program_info_log(m_id); return false; } } return true; }
void GLAPIENTRY _mesa_GetInfoLogARB(GLhandleARB object, GLsizei maxLength, GLsizei * length, GLcharARB * infoLog) { GET_CURRENT_CONTEXT(ctx); if (is_program(ctx, object)) { get_program_info_log(ctx, object, maxLength, length, infoLog); } else if (is_shader(ctx, object)) { get_shader_info_log(ctx, object, maxLength, length, infoLog); } else { _mesa_error(ctx, GL_INVALID_OPERATION, "glGetInfoLogARB"); } }