Beispiel #1
0
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);
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}
Beispiel #4
0
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");
   }
}