2 * $Id: gl_sl.c,v 1.1 2007-09-28 07:24:14 nkeynes Exp $
4 * GLSL shader loader/unloader. Current version assumes there's exactly
5 * 1 shader program that's used globally. This may turn out not to be the
6 * most efficient approach.
8 * Copyright (c) 2007 Nathan Keynes.
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
24 #include "drivers/gl_common.h"
27 #define MAX_ERROR_BUF 4096
29 static GLuint glsl_program, glsl_vert_shader, glsl_frag_shader;
31 gboolean glsl_is_supported()
33 return isGLExtensionSupported("GL_ARB_fragment_shader") &&
34 isGLExtensionSupported("GL_ARB_vertex_shader") &&
35 isGLExtensionSupported("GL_ARB_shading_language_100");
38 #ifdef GL_ARB_shader_objects
39 void glsl_print_error( char *msg, GLhandleARB obj )
41 char buf[MAX_ERROR_BUF];
43 glGetInfoLogARB( obj, sizeof(buf), &length, buf );
44 ERROR( "%s: %s", msg, buf );
47 gboolean glsl_check_shader_error( char *msg, GLhandleARB obj )
51 glGetObjectParameterivARB(obj, GL_OBJECT_COMPILE_STATUS_ARB, &value);
53 glsl_print_error(msg, obj);
59 gboolean glsl_check_program_error( char *msg, GLhandleARB obj )
61 if( glGetError() != GL_NO_ERROR ) {
62 glsl_print_error(msg, obj);
68 gboolean glsl_load_shaders( const char *vertex_src, const char *fragment_src )
70 gboolean vsok, fsok, pok = FALSE;
71 glsl_program = glCreateProgramObjectARB();
73 glsl_vert_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
74 glsl_frag_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
75 glShaderSourceARB( glsl_vert_shader, 1, &vertex_src, NULL );
76 glCompileShaderARB(glsl_vert_shader);
77 vsok = glsl_check_shader_error("Failed to compile vertex shader", glsl_vert_shader);
78 glShaderSourceARB( glsl_frag_shader, 1, &fragment_src, NULL );
79 glCompileShaderARB(glsl_frag_shader);
80 fsok = glsl_check_shader_error("Failed to compile fragment shader", glsl_frag_shader);
83 glAttachObjectARB(glsl_program, glsl_vert_shader);
84 glAttachObjectARB(glsl_program, glsl_frag_shader);
85 glLinkProgramARB(glsl_program);
86 pok = glsl_check_program_error( "Failed to link shader program", glsl_program );
89 glUseProgramObjectARB(glsl_program);
90 pok = glsl_check_program_error( "Failed to apply shader program", glsl_program );
92 glsl_unload_shaders();
97 void glsl_unload_shaders(void)
99 glUseProgramObjectARB(0);
100 glDetachObjectARB(glsl_program, glsl_vert_shader);
101 glDetachObjectARB(glsl_program, glsl_frag_shader);
102 glDeleteObjectARB(glsl_program);
103 glDeleteObjectARB(glsl_vert_shader);
104 glDeleteObjectARB(glsl_frag_shader);
108 gboolean glsl_check_shader_error( char *msg, GLuint shader )
112 glGetShaderiv( shader, GL_COMPILE_STATUS, &value );
114 char buf[MAX_ERROR_BUF];
116 glGetShaderInfoLog( shader, sizeof(buf), &length, buf );
117 ERROR( "%s: %s", msg, buf );
122 gboolean glsl_check_program_error( char *msg, GLuint program )
124 if( glGetError() != GL_NO_ERROR ) {
125 char buf[MAX_ERROR_BUF];
127 glGetProgramInfoLog( program, sizeof(buf), &length, buf );
128 ERROR( "%s: %s", msg, buf );
134 gboolean glsl_load_shaders( const char *vertex_src, const char *fragment_src )
136 gboolean vsok, fsok, pok = FALSE;
137 glsl_program = glCreateProgram();
138 glsl_vert_shader = glCreateShader(GL_VERTEX_SHADER);
139 glsl_frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
140 glShaderSource( glsl_vert_shader, 1, &vertex_src, NULL );
141 glCompileShader(glsl_vert_shader);
142 vsok = glsl_check_shader_error( "Failed to compile vertex shader", glsl_vert_shader );
143 glShaderSource( glsl_frag_shader, 1, &fragment_src, NULL );
144 glCompileShader(glsl_frag_shader);
145 fsok = glsl_check_shader_error( "Failed to compile fragment shader", glsl_frag_shader );
148 glAttachShader(glsl_program, glsl_vert_shader);
149 glAttachShader(glsl_program, glsl_frag_shader);
150 glLinkProgram(glsl_program);
151 pok = glsl_check_program_error( "Failed to link shader program", glsl_program );
155 glUseProgram(glsl_program);
157 glsl_unload_shaders();
162 void glsl_unload_shaders(void)
165 glDetachShader(glsl_program, glsl_vert_shader);
166 glDetachShader(glsl_program, glsl_frag_shader);
167 glDeleteProgram(glsl_program);
168 glDeleteShader(glsl_vert_shader);
169 glDeleteShader(glsl_frag_shader);
.