Added sanity checks when killing shaders

git-svn-id: https://svn.code.sf.net/p/vbam/code/trunk@229 a31d4220-a93d-0410-bf67-fe4944624d44
This commit is contained in:
mudlord 2007-12-24 20:13:17 +00:00
parent 41657bc9b4
commit 31e5d61273
1 changed files with 36 additions and 26 deletions

View File

@ -37,9 +37,9 @@
// OpenGL // OpenGL
#include <gl/GL.h> // main include file #include <gl/GL.h> // main include file
#include <GL/glu.h> #include <GL/glu.h>
#ifdef HAS_GLEXT
#include <gl/glext.h> #include <gl/glext.h>
#endif
typedef BOOL (APIENTRY *PFNWGLSWAPINTERVALFARPROC)( int ); typedef BOOL (APIENTRY *PFNWGLSWAPINTERVALFARPROC)( int );
PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL; PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB = NULL;
@ -117,10 +117,7 @@ public:
virtual int selectFullScreenMode( GUID ** ); virtual int selectFullScreenMode( GUID ** );
}; };
#include "gzglfont.h" #include "gzglfont.h"
char *readShaderFile(char *FileName);
void OpenGLDisplay::initializeFont() void OpenGLDisplay::initializeFont()
{ {
int ret; int ret;
@ -174,20 +171,6 @@ char *readShaderFile(char *FileName) {
} }
void OpenGLDisplay::InitGLSLShader (void) { void OpenGLDisplay::InitGLSLShader (void) {
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress("glCreateProgramObjectARB");
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)wglGetProcAddress("glDeleteObjectARB");
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress("glUseProgramObjectARB");
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress("glCreateShaderObjectARB");
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress("glShaderSourceARB");
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress("glCompileShaderARB");
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB");
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress("glAttachObjectARB");
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress("glGetInfoLogARB");
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress("glLinkProgramARB");
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)wglGetProcAddress("glGetUniformLocationARB");
glUniform4fARB = (PFNGLUNIFORM4FARBPROC)wglGetProcAddress("glUniform4fARB");
glUniform1iARB = (PFNGLUNIFORM1IARBPROC)wglGetProcAddress("glUniform1iARB");
VertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); VertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
FragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); FragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
@ -216,7 +199,7 @@ void OpenGLDisplay::InitGLSLShader (void) {
void OpenGLDisplay::SetGLSLShaderConstants() void OpenGLDisplay::SetGLSLShaderConstants()
{ {
//get shader uniforms and shader weights //get shader uniforms and shader weights
textureLocation = glGetUniformLocationARB( ShaderProgram, "testTexture" ); textureLocation = glGetUniformLocationARB( ShaderProgram, "OGL2Texture" );
g_location_grayScaleWeights = glGetUniformLocationARB( ShaderProgram, "grayScaleWeights" ); g_location_grayScaleWeights = glGetUniformLocationARB( ShaderProgram, "grayScaleWeights" );
glUniform1iARB( textureLocation, 1 ); glUniform1iARB( textureLocation, 1 );
@ -227,9 +210,16 @@ void OpenGLDisplay::SetGLSLShaderConstants()
} }
void OpenGLDisplay::DeInitGLSLShader (void) { void OpenGLDisplay::DeInitGLSLShader (void) {
glDeleteObjectARB(VertexShader); if (VertexShader != 0){
glDeleteObjectARB(FragmentShader); glDeleteObjectARB(VertexShader);
glDeleteObjectARB(ShaderProgram); }
if (FragmentShader != 0){
glDeleteObjectARB(FragmentShader);
}
if (FragmentShader != 0){
glDeleteObjectARB(ShaderProgram);
}
} }
OpenGLDisplay::OpenGLDisplay() OpenGLDisplay::OpenGLDisplay()
@ -247,7 +237,6 @@ OpenGLDisplay::OpenGLDisplay()
OpenGLDisplay::~OpenGLDisplay() OpenGLDisplay::~OpenGLDisplay()
{ {
DeInitGLSLShader();
cleanup(); cleanup();
} }
@ -279,6 +268,9 @@ void OpenGLDisplay::DisableOpenGL()
void OpenGLDisplay::cleanup() void OpenGLDisplay::cleanup()
{ {
DeInitGLSLShader();
if(texture != 0) { if(texture != 0) {
glDeleteTextures(1, &texture); glDeleteTextures(1, &texture);
texture = 0; texture = 0;
@ -310,6 +302,23 @@ bool OpenGLDisplay::initialize()
glEnable( GL_TEXTURE_2D ); glEnable( GL_TEXTURE_2D );
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
if(theApp.GLSLShaders)
{
glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)wglGetProcAddress("glCreateProgramObjectARB");
glDeleteObjectARB = (PFNGLDELETEOBJECTARBPROC)wglGetProcAddress("glDeleteObjectARB");
glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)wglGetProcAddress("glUseProgramObjectARB");
glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)wglGetProcAddress("glCreateShaderObjectARB");
glShaderSourceARB = (PFNGLSHADERSOURCEARBPROC)wglGetProcAddress("glShaderSourceARB");
glCompileShaderARB = (PFNGLCOMPILESHADERARBPROC)wglGetProcAddress("glCompileShaderARB");
glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)wglGetProcAddress("glGetObjectParameterivARB");
glAttachObjectARB = (PFNGLATTACHOBJECTARBPROC)wglGetProcAddress("glAttachObjectARB");
glGetInfoLogARB = (PFNGLGETINFOLOGARBPROC)wglGetProcAddress("glGetInfoLogARB");
glLinkProgramARB = (PFNGLLINKPROGRAMARBPROC)wglGetProcAddress("glLinkProgramARB");
glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)wglGetProcAddress("glGetUniformLocationARB");
glUniform4fARB = (PFNGLUNIFORM4FARBPROC)wglGetProcAddress("glUniform4fARB");
glUniform1iARB = (PFNGLUNIFORM1IARBPROC)wglGetProcAddress("glUniform1iARB");
}
initializeMatrices( theApp.surfaceSizeX, theApp.surfaceSizeY ); initializeMatrices( theApp.surfaceSizeX, theApp.surfaceSizeY );
@ -355,11 +364,12 @@ void OpenGLDisplay::render()
glUseProgramObjectARB( ShaderProgram ); glUseProgramObjectARB( ShaderProgram );
SetGLSLShaderConstants(); SetGLSLShaderConstants();
} }
else{ else
glUseProgramObjectARB(NULL); {
DeInitGLSLShader(); DeInitGLSLShader();
} }
int pitch = theApp.filterWidth * (systemColorDepth>>3) + 4; int pitch = theApp.filterWidth * (systemColorDepth>>3) + 4;
u8 *data = pix + ( theApp.sizeX + 1 ) * 4; u8 *data = pix + ( theApp.sizeX + 1 ) * 4;