void GLSL_DeleteGPUShader(shaderProgram_t *program) { if(program->program) { if (program->vertexShader) { qglDetachObjectARB(program->program, program->vertexShader); qglDeleteObjectARB(program->vertexShader); } if (program->fragmentShader) { qglDetachObjectARB(program->program, program->fragmentShader); qglDeleteObjectARB(program->fragmentShader); } qglDeleteObjectARB(program->program); if (program->uniformBuffer) { ri.Free(program->uniformBuffer); } Com_Memset(program, 0, sizeof(*program)); } }
static int GLSL_CompileGPUShader(GLhandleARB program, GLhandleARB *prevShader, const GLcharARB *buffer, int size, GLenum shaderType) { GLint compiled; GLhandleARB shader; shader = qglCreateShaderObjectARB(shaderType); qglShaderSourceARB(shader, 1, (const GLcharARB **)&buffer, &size); // compile shader qglCompileShaderARB(shader); // check if shader compiled qglGetObjectParameterivARB(shader, GL_OBJECT_COMPILE_STATUS_ARB, &compiled); if(!compiled) { GLSL_PrintShaderSource(shader); GLSL_PrintInfoLog(shader, qfalse); ri.Error(ERR_DROP, "Couldn't compile shader"); return 0; } //GLSL_PrintInfoLog(shader, qtrue); //GLSL_PrintShaderSource(shader); if (*prevShader) { qglDetachObjectARB(program, *prevShader); qglDeleteObjectARB(*prevShader); } // attach shader to program qglAttachObjectARB(program, shader); *prevShader = shader; return 1; }
void R_DeleteGlslShadersAndPrograms( void ) { if ( !r_enablePostProcess->integer || !glsl ) { return; } // detach qglDetachObjectARB(tr.blurHorizSp, tr.blurHorizFs); qglDetachObjectARB(tr.blurHorizSp, tr.mainVs); qglDetachObjectARB(tr.blurVerticalSp, tr.blurVerticalFs); qglDetachObjectARB(tr.blurVerticalSp, tr.mainVs); qglDetachObjectARB(tr.brightPassSp, tr.brightPassFs); qglDetachObjectARB(tr.brightPassSp, tr.mainVs); qglDetachObjectARB(tr.downSample1Sp, tr.downSample1Fs); qglDetachObjectARB(tr.downSample1Sp, tr.mainVs); qglDetachObjectARB(tr.combineSp, tr.combineFs); qglDetachObjectARB(tr.combineSp, tr.mainVs); qglDetachObjectARB(tr.colorCorrectSp, tr.colorCorrectFs); qglDetachObjectARB(tr.colorCorrectSp, tr.mainVs); // delete qglDeleteObjectARB(tr.blurHorizSp); qglDeleteObjectARB(tr.blurHorizFs); qglDeleteObjectARB(tr.blurVerticalSp); qglDeleteObjectARB(tr.blurVerticalFs); qglDeleteObjectARB(tr.brightPassSp); qglDeleteObjectARB(tr.brightPassFs); qglDeleteObjectARB(tr.downSample1Sp); qglDeleteObjectARB(tr.downSample1Fs); qglDeleteObjectARB(tr.combineSp); qglDeleteObjectARB(tr.combineFs); qglDeleteObjectARB(tr.colorCorrectSp); qglDeleteObjectARB(tr.colorCorrectFs); qglDeleteObjectARB(tr.mainVs); // reset tr.blurHorizSp = 0; tr.blurHorizFs = 0; tr.blurVerticalSp = 0; tr.blurVerticalFs = 0; tr.brightPassSp = 0; tr.brightPassFs = 0; tr.downSample1Sp = 0; tr.downSample1Fs = 0; tr.combineSp = 0; tr.combineFs = 0; tr.colorCorrectSp = 0; tr.colorCorrectFs = 0; tr.mainVs = 0; }