Use more "safe" function pointers.

This commit is contained in:
Themaister 2011-01-07 21:02:46 +01:00
parent 5ab9b15302
commit b50d1fa178

View File

@ -32,19 +32,19 @@
#include <libxml/tree.h> #include <libxml/tree.h>
#include <GL/glext.h> #include <GL/glext.h>
static PFNGLCREATEPROGRAMPROC glCreateProgram = NULL; static PFNGLCREATEPROGRAMPROC pglCreateProgram = NULL;
static PFNGLUSEPROGRAMPROC glUseProgram = NULL; static PFNGLUSEPROGRAMPROC pglUseProgram = NULL;
static PFNGLCREATESHADERPROC glCreateShader = NULL; static PFNGLCREATESHADERPROC pglCreateShader = NULL;
static PFNGLDELETESHADERPROC glDeleteShader = NULL; static PFNGLDELETESHADERPROC pglDeleteShader = NULL;
static PFNGLSHADERSOURCEPROC glShaderSource = NULL; static PFNGLSHADERSOURCEPROC pglShaderSource = NULL;
static PFNGLCOMPILESHADERPROC glCompileShader = NULL; static PFNGLCOMPILESHADERPROC pglCompileShader = NULL;
static PFNGLATTACHSHADERPROC glAttachShader = NULL; static PFNGLATTACHSHADERPROC pglAttachShader = NULL;
static PFNGLDETACHSHADERPROC glDetachShader = NULL; static PFNGLDETACHSHADERPROC pglDetachShader = NULL;
static PFNGLLINKPROGRAMPROC glLinkProgram = NULL; static PFNGLLINKPROGRAMPROC pglLinkProgram = NULL;
static PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = NULL; static PFNGLGETUNIFORMLOCATIONPROC pglGetUniformLocation = NULL;
static PFNGLUNIFORM1IPROC glUniform1i = NULL; static PFNGLUNIFORM1IPROC pglUniform1i = NULL;
static PFNGLUNIFORM2FVPROC glUniform2fv = NULL; static PFNGLUNIFORM2FVPROC pglUniform2fv = NULL;
static PFNGLUNIFORM4FVPROC glUniform4fv = NULL; static PFNGLUNIFORM4FVPROC pglUniform4fv = NULL;
static bool glsl_enable = false; static bool glsl_enable = false;
static GLuint gl_program; static GLuint gl_program;
@ -139,25 +139,25 @@ error:
bool gl_glsl_init(const char *path) bool gl_glsl_init(const char *path)
{ {
// Load shader functions. // Load shader functions.
glCreateProgram = SDL_GL_GetProcAddress("glCreateProgram"); pglCreateProgram = SDL_GL_GetProcAddress("glCreateProgram");
glUseProgram = SDL_GL_GetProcAddress("glUseProgram"); pglUseProgram = SDL_GL_GetProcAddress("glUseProgram");
glCreateShader = SDL_GL_GetProcAddress("glCreateShader"); pglCreateShader = SDL_GL_GetProcAddress("glCreateShader");
glDeleteShader = SDL_GL_GetProcAddress("glDeleteShader"); pglDeleteShader = SDL_GL_GetProcAddress("glDeleteShader");
glShaderSource = SDL_GL_GetProcAddress("glShaderSource"); pglShaderSource = SDL_GL_GetProcAddress("glShaderSource");
glCompileShader = SDL_GL_GetProcAddress("glCompileShader"); pglCompileShader = SDL_GL_GetProcAddress("glCompileShader");
glAttachShader = SDL_GL_GetProcAddress("glAttachShader"); pglAttachShader = SDL_GL_GetProcAddress("glAttachShader");
glDetachShader = SDL_GL_GetProcAddress("glDetachShader"); pglDetachShader = SDL_GL_GetProcAddress("glDetachShader");
glLinkProgram = SDL_GL_GetProcAddress("glLinkProgram"); pglLinkProgram = SDL_GL_GetProcAddress("glLinkProgram");
glGetUniformLocation = SDL_GL_GetProcAddress("glGetUniformLocation"); pglGetUniformLocation = SDL_GL_GetProcAddress("glGetUniformLocation");
glUniform1i = SDL_GL_GetProcAddress("glUniform1i"); pglUniform1i = SDL_GL_GetProcAddress("glUniform1i");
glUniform2fv = SDL_GL_GetProcAddress("glUniform2fv"); pglUniform2fv = SDL_GL_GetProcAddress("glUniform2fv");
glUniform4fv = SDL_GL_GetProcAddress("glUniform4fv"); pglUniform4fv = SDL_GL_GetProcAddress("glUniform4fv");
SSNES_LOG("Checking GLSL shader support ...\n"); SSNES_LOG("Checking GLSL shader support ...\n");
bool shader_support = glCreateProgram && glUseProgram && glCreateShader bool shader_support = pglCreateProgram && pglUseProgram && pglCreateShader
&& glDeleteShader && glShaderSource && glCompileShader && glAttachShader && pglDeleteShader && pglShaderSource && pglCompileShader && pglAttachShader
&& glDetachShader && glLinkProgram && glGetUniformLocation && pglDetachShader && pglLinkProgram && pglGetUniformLocation
&& glUniform1i && glUniform2fv && glUniform4fv; && pglUniform1i && pglUniform2fv && pglUniform4fv;
if (!shader_support) if (!shader_support)
{ {
@ -165,7 +165,7 @@ bool gl_glsl_init(const char *path)
return false; return false;
} }
gl_program = glCreateProgram(); gl_program = pglCreateProgram();
char *vertex_prog = NULL; char *vertex_prog = NULL;
char *fragment_prog = NULL; char *fragment_prog = NULL;
@ -174,25 +174,25 @@ bool gl_glsl_init(const char *path)
if (vertex_prog) if (vertex_prog)
{ {
vertex_shader = glCreateShader(GL_VERTEX_SHADER); vertex_shader = pglCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex_shader, 1, (const char**)&vertex_prog, 0); pglShaderSource(vertex_shader, 1, (const char**)&vertex_prog, 0);
glCompileShader(vertex_shader); pglCompileShader(vertex_shader);
glAttachShader(gl_program, vertex_shader); pglAttachShader(gl_program, vertex_shader);
free(vertex_prog); free(vertex_prog);
} }
if (fragment_prog) if (fragment_prog)
{ {
fragment_shader = glCreateShader(GL_FRAGMENT_SHADER); fragment_shader = pglCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragment_shader, 1, (const char**)&fragment_prog, 0); pglShaderSource(fragment_shader, 1, (const char**)&fragment_prog, 0);
glCompileShader(fragment_shader); pglCompileShader(fragment_shader);
glAttachShader(gl_program, fragment_shader); pglAttachShader(gl_program, fragment_shader);
free(fragment_prog); free(fragment_prog);
} }
if (vertex_prog || fragment_prog) if (vertex_prog || fragment_prog)
{ {
glLinkProgram(gl_program); pglLinkProgram(gl_program);
glUseProgram(gl_program); pglUseProgram(gl_program);
} }
glsl_enable = true; glsl_enable = true;
@ -211,16 +211,16 @@ void gl_glsl_set_params(unsigned width, unsigned height,
GLint location; GLint location;
float inputSize[2] = {width, height}; float inputSize[2] = {width, height};
location = glGetUniformLocation(gl_program, "rubyInputSize"); location = pglGetUniformLocation(gl_program, "rubyInputSize");
glUniform2fv(location, 1, inputSize); pglUniform2fv(location, 1, inputSize);
float outputSize[2] = {out_width, out_height}; float outputSize[2] = {out_width, out_height};
location = glGetUniformLocation(gl_program, "rubyOutputSize"); location = pglGetUniformLocation(gl_program, "rubyOutputSize");
glUniform2fv(location, 1, outputSize); pglUniform2fv(location, 1, outputSize);
float textureSize[2] = {tex_width, tex_height}; float textureSize[2] = {tex_width, tex_height};
location = glGetUniformLocation(gl_program, "rubyTextureSize"); location = pglGetUniformLocation(gl_program, "rubyTextureSize");
glUniform2fv(location, 1, textureSize); pglUniform2fv(location, 1, textureSize);
} }
} }