void Shader::_compile() { if (shader != 0) return; shader = glCreateShaderObjectARB(shaderType()); if (shader == 0) { throw std::runtime_error("failed to create shader object"); } const char *_prog = prog.c_str(); GLint length = prog.size(); glShaderSourceARB(shader, 1, &_prog, &length); glCompileShaderARB(shader); GLint compile_status = 0; glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status); if (compile_status == 0) { std::ostringstream err; err << "failed to compile shader:" << std::endl << glsl_log(shader) << std::endl; glDeleteObjectARB(shader); shader = 0; throw std::runtime_error(err.str()); } }
void Shader::compileFlat() { if (shader != 0) return; shader = glCreateShaderObjectARB(shaderType()); if (shader == 0) { throw std::runtime_error("failed to create shader object"); } std::list<std::string> all_source; s_tag++; _source(all_source); std::ostringstream _prog; std::copy(all_source.begin(), all_source.end(), std::ostream_iterator<std::string>(_prog, "\n")); GLint length = _prog.str().size(); const char *_p = _prog.str().c_str(); glShaderSourceARB(shader, 1, &_p, &length); glCompileShaderARB(shader); GLint compile_status = 0; glGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compile_status); if (compile_status == 0) { std::ostringstream err; err << "failed to compile shader:" << std::endl << "----" << std::endl << glsl_log(shader) << std::endl << "----" << std::endl; glDeleteObjectARB(shader); shader = 0; throw std::runtime_error(err.str()); } }
/** * Disable the shader. */ void GLShader::disable(void) { switch (shaderType()) { case ST_GL_ARB_FRAGMENT_PROGRAM: #ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER case ST_GL_ATI_TEXT_FRAGMENT_SHADER: #endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */ { if (m_ARB_program <= 0) break; #ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER const GLenum prgType = (shaderType() == ST_GL_ARB_FRAGMENT_PROGRAM ? GL_FRAGMENT_PROGRAM_ARB : GL_TEXT_FRAGMENT_SHADER_ATI ); #else /* !ENABLE_ATI_TEXT_FRAGMENT_SHADER */ const GLenum prgType = GL_FRAGMENT_PROGRAM_ARB; #endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */ // Disable the shader. glDisable(prgType); #ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER if (shaderType() == ST_GL_ATI_TEXT_FRAGMENT_SHADER) { // HACK: at least the Mac OS X 10.5 PPC Radeon drivers are broken and // without this disable the texture units while the program is still // running (10.4 PPC seems to work without this though). // Reference: http://git.mplayerhq.hu/?p=mplayer;a=blob;f=libvo/gl_common.c;hb=HEAD // NOTE: It doesn't seem to help any... glFlush(); } #endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */ break; } case ST_GL_ATI_FRAGMENT_SHADER: if (m_ATI_fragment_shader == 0) break; glDisable(GL_FRAGMENT_SHADER_ATI); break; default: break; } }
/** * Enable the shader. */ void GLShader::enable(void) { switch (shaderType()) { case ST_GL_ARB_FRAGMENT_PROGRAM: #ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER case ST_GL_ATI_TEXT_FRAGMENT_SHADER: #endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */ { if (m_ARB_program == 0) break; #ifdef ENABLE_ATI_TEXT_FRAGMENT_SHADER const GLenum prgType = (shaderType() == ST_GL_ARB_FRAGMENT_PROGRAM ? GL_FRAGMENT_PROGRAM_ARB : GL_TEXT_FRAGMENT_SHADER_ATI ); #else /* !ENABLE_ATI_TEXT_FRAGMENT_SHADER */ const GLenum prgType = GL_FRAGMENT_PROGRAM_ARB; #endif /* ENABLE_ATI_TEXT_FRAGMENT_SHADER */ // Enable the shader. glEnable(prgType); glBindProgramARB(prgType, m_ARB_program); break; } case ST_GL_ATI_FRAGMENT_SHADER: if (m_ATI_fragment_shader == 0) break; glEnable(GL_FRAGMENT_SHADER_ATI); glBindFragmentShaderATI(m_ATI_fragment_shader); break; default: break; } }
const char* shaderTypeStr() { return shaderTypeToStr(shaderType()); }