2 * $Id: gl_sl.c,v 1.2 2007-10-07 05:42:25 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.
21 #define GL_GLEXT_PROTOTYPES 1
25 #include "drivers/gl_common.h"
28 #define MAX_ERROR_BUF 4096
30 static GLuint glsl_program, glsl_vert_shader, glsl_frag_shader;
32 gboolean glsl_is_supported()
34 return isGLExtensionSupported("GL_ARB_fragment_shader") &&
35 isGLExtensionSupported("GL_ARB_vertex_shader") &&
36 isGLExtensionSupported("GL_ARB_shading_language_100");
39 #ifdef GL_ARB_shader_objects
40 void glsl_print_error( char *msg, GLhandleARB obj )
42 char buf[MAX_ERROR_BUF];
44 glGetInfoLogARB( obj, sizeof(buf), &length, buf );
45 ERROR( "%s: %s", msg, buf );
48 gboolean glsl_check_shader_error( char *msg, GLhandleARB obj )
52 glGetObjectParameterivARB(obj, GL_OBJECT_COMPILE_STATUS_ARB, &value);
54 glsl_print_error(msg, obj);
60 gboolean glsl_check_program_error( char *msg, GLhandleARB obj )
62 if( glGetError() != GL_NO_ERROR ) {
63 glsl_print_error(msg, obj);
69 gboolean glsl_load_shaders( const char *vertex_src, const char *fragment_src )
71 gboolean vsok, fsok, pok = FALSE;
72 glsl_program = glCreateProgramObjectARB();
74 glsl_vert_shader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
75 glsl_frag_shader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
76 glShaderSourceARB( glsl_vert_shader, 1, &vertex_src, NULL );
77 glCompileShaderARB(glsl_vert_shader);
78 vsok = glsl_check_shader_error("Failed to compile vertex shader", glsl_vert_shader);
79 glShaderSourceARB( glsl_frag_shader, 1, &fragment_src, NULL );
80 glCompileShaderARB(glsl_frag_shader);
81 fsok = glsl_check_shader_error("Failed to compile fragment shader", glsl_frag_shader);
84 glAttachObjectARB(glsl_program, glsl_vert_shader);
85 glAttachObjectARB(glsl_program, glsl_frag_shader);
86 glLinkProgramARB(glsl_program);
87 pok = glsl_check_program_error( "Failed to link shader program", glsl_program );
90 glUseProgramObjectARB(glsl_program);
91 pok = glsl_check_program_error( "Failed to apply shader program", glsl_program );
93 glsl_unload_shaders();
98 void glsl_unload_shaders(void)
100 glUseProgramObjectARB(0);
101 glDetachObjectARB(glsl_program, glsl_vert_shader);
102 glDetachObjectARB(glsl_program, glsl_frag_shader);
103 glDeleteObjectARB(glsl_program);
104 glDeleteObjectARB(glsl_vert_shader);
105 glDeleteObjectARB(glsl_frag_shader);
109 gboolean glsl_check_shader_error( char *msg, GLuint shader )
113 glGetShaderiv( shader, GL_COMPILE_STATUS, &value );
115 char buf[MAX_ERROR_BUF];
117 glGetShaderInfoLog( shader, sizeof(buf), &length, buf );
118 ERROR( "%s: %s", msg, buf );
123 gboolean glsl_check_program_error( char *msg, GLuint program )
125 if( glGetError() != GL_NO_ERROR ) {
126 char buf[MAX_ERROR_BUF];
128 glGetProgramInfoLog( program, sizeof(buf), &length, buf );
129 ERROR( "%s: %s", msg, buf );
135 gboolean glsl_load_shaders( const char *vertex_src, const char *fragment_src )
137 gboolean vsok, fsok, pok = FALSE;
138 glsl_program = glCreateProgram();
139 glsl_vert_shader = glCreateShader(GL_VERTEX_SHADER);
140 glsl_frag_shader = glCreateShader(GL_FRAGMENT_SHADER);
141 glShaderSource( glsl_vert_shader, 1, &vertex_src, NULL );
142 glCompileShader(glsl_vert_shader);
143 vsok = glsl_check_shader_error( "Failed to compile vertex shader", glsl_vert_shader );
144 glShaderSource( glsl_frag_shader, 1, &fragment_src, NULL );
145 glCompileShader(glsl_frag_shader);
146 fsok = glsl_check_shader_error( "Failed to compile fragment shader", glsl_frag_shader );
149 glAttachShader(glsl_program, glsl_vert_shader);
150 glAttachShader(glsl_program, glsl_frag_shader);
151 glLinkProgram(glsl_program);
152 pok = glsl_check_program_error( "Failed to link shader program", glsl_program );
156 glUseProgram(glsl_program);
158 glsl_unload_shaders();
163 void glsl_unload_shaders(void)
166 glDetachShader(glsl_program, glsl_vert_shader);
167 glDetachShader(glsl_program, glsl_frag_shader);
168 glDeleteProgram(glsl_program);
169 glDeleteShader(glsl_vert_shader);
170 glDeleteShader(glsl_frag_shader);
.