Пример #1
0
void GLProgramFactory::assertProgramLinked(GLuint program)
{
    // Check the link status
    GLint linkStatus;
    glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
    if (linkStatus != GL_TRUE)
    {
        throw std::runtime_error(
            "Failed to construct GLSL program:\n"
            + getProgramInfoLog(program)
        );
    }

#ifdef _DEBUG

    // Ask GL to validate the program (this means that it will run)
    glValidateProgram(program);

    // Get the valid status and info log
    GLint validStatus;
    glGetProgramiv(program, GL_VALIDATE_STATUS, &validStatus);

    std::string validLog = getProgramInfoLog(program);

    // Output to console
    rConsole() << "[renderer] GLSL program "
              << (validStatus == GL_TRUE ? "IS " : "IS NOT ") << "valid.\n";
    rConsole() << "Info:\n" << validLog << std::endl;

#endif
}
Пример #2
0
const bool GLSLProgram::validate()
{
	assert( getProgramObject() != 0 && "Empty glsl program" );

	// VALIDATE
	glValidateProgram( getProgramObject() );

	// CHECK if successfully validated
	GLint result = GL_FALSE;
	glGetProgramiv( getProgramObject(), GL_VALIDATE_STATUS, &result );

	std::string strInfoLog = getProgramInfoLog( getProgramObject() );

	if ( isLogInteresting(strInfoLog) )
	{
		// There is a log
		m_linkLog += "Validation log:\n";
		m_linkLog += strInfoLog;

		if ( result == GL_FALSE )
		{
			// Message in cerr only if validation fails
			std::cerr << " --" << std::endl;
			std::cerr << "Program " << getProgramObject() << "not validated :" << std::endl;
			std::cerr << strInfoLog << std::endl;
		}
	}

	return result == GL_TRUE;
}
Пример #3
0
GLuint linkShader(size_t count, ...)
{
    // Create program object
    GLuint program = glCreateProgram();
    if(program == 0) throw GL_Exception("glCreateProgram failed");

    // Attach arguments
    va_list args;
    va_start(args, count);
    for(size_t i = 0; i < count; ++i)
    {
        glAttachShader(program, va_arg(args, GLuint));
    }
    va_end(args);

    // Link program and check for errors
    glLinkProgram(program);
    std::cout << getProgramInfoLog(program);

    int linkStatus;
    glGetProgramiv(program, GL_LINK_STATUS, &linkStatus);
    if(linkStatus == GL_FALSE) throw std::runtime_error("shader linking failed");

    return program;
}
Пример #4
0
std::string 
VSShaderLib::getAllInfoLogs() {

	std::string s;

	for (int i = 0; i < VSShaderLib::COUNT_SHADER_TYPE; ++i) {
		if (pShader[i]) {
			getShaderInfoLog((VSShaderLib::ShaderType)i);
			s.append(VSShaderLib::spStringShaderTypes[i]);
			s.append(": ");
			s.append(pResult);
			s.append("\n");
			//s += VSShaderLib::spStringShaderTypes[i] + ": " + pResult + "\n";
		}
	}

	if (pProgram) {
		getProgramInfoLog();
		s += "Program: " + pResult;
		if (isProgramValid())
			s += " - Valid\n";
		else
			s += " - Not Valid\n";
	}

	pResult = s;
	return pResult;
}
Пример #5
0
//! Links all attached shader and creates a complete shader program
void Shader::link()
{
	int linkStatus;
	//link the program
	glLinkProgram(id);
	// Check validity
	glGetProgramiv(id, GL_LINK_STATUS, &linkStatus);
	if(linkStatus != GL_TRUE)
	{
		std::cerr << getProgramInfoLog() << std::endl;
		throw std::runtime_error("Unable to link shader program.");
	}
}
Пример #6
0
	Program(const vector<shared_ptr<Shader>>& shaders) {

		_handle = glCreateProgram();

		for(auto& shader : shaders)
			glAttachShader(_handle, *shader);

		glLinkProgram(_handle);

		if (getProgramiv(_handle, GL_LINK_STATUS) == GL_FALSE) {
			throw logic_error("failed to link the program:\n" + getProgramInfoLog(_handle));
		}

		for(auto& shader : shaders)
			glDetachShader(_handle, *shader);
	}
Пример #7
0
bool ShaderProgram::link(void)
{
  assert(glIsProgram(m_program));

  /* link program */
  glLinkProgram(m_program);

  /* query link status */
  GLint status = GL_FALSE;
  glGetProgramiv(m_program, GL_LINK_STATUS, &status);

  /* print linking log */
  std::cerr << "Linking status: " << (status == GL_TRUE ? "succeeded" : "failed") << std::endl;
  std::cerr << getProgramInfoLog(m_program) << std::endl;

  /* check linking status */
  return status != GL_FALSE;
}
Пример #8
0
GLuint linkProgram(unsigned int count, ...)
{
  /* create program object */
  GLuint program = glCreateProgram();
  if (program == 0)
  {
    std::cerr << "Failed to create shader program object: "
              << errorToStr(glGetError())
              << std::endl;
    return 0;
  }

  /* attach shaders */
  va_list args;
  va_start(args, count);
  for (unsigned int i = 0; i < count; ++i)
  {
    glAttachShader(program, va_arg(args, GLuint));
  }
  va_end(args);

  /* link program */
  glLinkProgram(program);

  /* query link status */
  GLint status = GL_FALSE;
  glGetProgramiv(program, GL_LINK_STATUS, &status);

  /* print linking log */
  std::cerr << "Linking status: " << (status == GL_TRUE ? "succeeded" : "failed") << std::endl;
  std::cerr << getProgramInfoLog(program) << std::endl;

  /* check linking status */
  if (status == GL_FALSE)
  {
    glDeleteProgram(program);
    return 0;
  }

  return program;
}
void LoggedShaderProgramService::checkLinkStatus(GLuint programID) {
	auto infoLog = getProgramInfoLog(programID);
	m_logService->info("Program Info Log:\n%s\n", infoLog.c_str());
	ShaderProgramService::checkLinkStatus(programID);
}