bool Compile(GLuint target, const char* targetName, GLuint program, const VfsPath& file, const CStr& code) { ogl_WarnIfError(); pglBindProgramARB(target, program); ogl_WarnIfError(); pglProgramStringARB(target, GL_PROGRAM_FORMAT_ASCII_ARB, (GLsizei)code.length(), code.c_str()); if (ogl_SquelchError(GL_INVALID_OPERATION)) { GLint errPos = 0; glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); int errLine = std::count(code.begin(), code.begin() + std::min((int)code.length(), errPos + 1), '\n') + 1; char* errStr = (char*)glGetString(GL_PROGRAM_ERROR_STRING_ARB); LOGERROR(L"Failed to compile %hs program '%ls' (line %d):\n%hs", targetName, file.string().c_str(), errLine, errStr); return false; } pglBindProgramARB(target, 0); ogl_WarnIfError(); return true; }
virtual void Bind() { glEnable(GL_VERTEX_PROGRAM_ARB); glEnable(GL_FRAGMENT_PROGRAM_ARB); pglBindProgramARB(GL_VERTEX_PROGRAM_ARB, m_VertexProgram); pglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, m_FragmentProgram); BindClientStates(); }
virtual void Unbind() { glDisable(GL_VERTEX_PROGRAM_ARB); glDisable(GL_FRAGMENT_PROGRAM_ARB); pglBindProgramARB(GL_VERTEX_PROGRAM_ARB, 0); pglBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, 0); UnbindClientStates(); // TODO: should unbind textures, probably }
void COGL_FragmentProgramCombiner::GenerateCombinerSetting(int index) { GLuint ID = m_vCompiledShaders[index].programID; pglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, ID ); OPENGL_CHECK_ERRORS; glEnable(GL_FRAGMENT_PROGRAM_ARB); OPENGL_CHECK_ERRORS; }
int COGL_FragmentProgramCombiner::ParseDecodedMux() { if( !m_bFragmentProgramIsSupported ) return COGLColorCombiner4::ParseDecodedMux(); OGLShaderCombinerSaveType res; pglGenProgramsARB( 1, &res.programID); OPENGL_CHECK_ERRORS; pglBindProgramARB( GL_FRAGMENT_PROGRAM_ARB, res.programID); OPENGL_CHECK_ERRORS; GenerateProgramStr(); pglProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(oglNewFP), oglNewFP); OPENGL_CHECK_ERRORS; //pglProgramStringARB( GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(oglFPTest), oglFPTest); if (glGetError() != 0) { GLint position; #ifdef DEBUGGER char *str = (char*)glGetString(GL_PROGRAM_ERROR_STRING_ARB); #endif glGetIntegerv( GL_PROGRAM_ERROR_POSITION_ARB, &position); if( position >= 0 ) { #ifdef DEBUGGER if( m_lastIndex >= 0 ) COGLColorCombiner4::DisplaySimpleMuxString(); DebugMessage(M64MSG_ERROR, "%s - %s", str, oglNewFP+position); #endif glDisable(GL_FRAGMENT_PROGRAM_ARB); return COGLColorCombiner4::ParseDecodedMux(); } } glEnable(GL_FRAGMENT_PROGRAM_ARB); OPENGL_CHECK_ERRORS; res.dwMux0 = m_pDecodedMux->m_dwMux0; res.dwMux1 = m_pDecodedMux->m_dwMux1; res.fogIsUsed = gRDP.bFogEnableInBlender && gRSP.bFogEnabled; m_vCompiledShaders.push_back(res); m_lastIndex = m_vCompiledShaders.size()-1; return m_lastIndex; }