2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
9 #include "SDL_opengles2.h"
13 #include "gropenglinternal.h"
17 static GLuint tmapper_prog = 0;
18 static GLuint aabitmap_prog = 0;
19 static GLuint lines_prog = 0;
21 static const char v_generic_tex_src[] =
22 "uniform mat4 vOrtho;\n"
23 "attribute vec4 vPosition;\n"
24 "attribute vec4 vColor;\n"
25 "attribute vec4 vSecColor;\n"
26 "attribute vec2 vTexCoord;\n"
27 "varying vec4 colorVar;\n"
28 "varying vec4 secColorVar;\n"
29 "varying vec2 texCoordVar;\n"
32 " gl_Position = vOrtho * vPosition;\n"
33 " colorVar = vColor;\n"
34 " secColorVar = vSecColor;\n"
35 " texCoordVar = vTexCoord;\n"
38 static const char v_lines_src[] =
39 "uniform mat4 vOrtho;\n"
40 "attribute vec4 vPosition;\n"
41 "attribute vec4 vColor;\n"
42 "varying vec4 colorVar;\n"
45 " gl_Position = vOrtho * vPosition;\n"
46 " colorVar = vColor;\n"
49 static const char f_tmapper_src[] =
50 "precision mediump float;\n"
51 "uniform sampler2D texture;\n"
52 "varying vec4 colorVar;\n"
53 "varying vec4 secColorVar;\n"
54 "varying vec2 texCoordVar;\n"
57 " vec4 base_color = colorVar * texture2D(texture, texCoordVar);\n"
58 " gl_FragColor = vec4(mix(secColorVar.rgb, base_color.rgb, 1.0 - secColorVar.a), base_color.a);\n"
61 static const char f_aabitmap_src[] =
62 "precision mediump float;\n"
63 "uniform sampler2D texture;\n"
64 "varying vec4 colorVar;\n"
65 "varying vec2 texCoordVar;\n"
68 " gl_FragColor = colorVar * texture2D(texture, texCoordVar).aaaa;\n"
71 static const char f_lines_src[] =
72 "precision mediump float;\n"
73 "varying vec4 colorVar;\n"
76 " gl_FragColor = colorVar;\n"
81 static GLuint opengl2_create_shader(const char *src, GLenum type)
86 shader = glCreateShader(type);
92 glShaderSource(shader, 1, &src, NULL);
94 glCompileShader(shader);
96 glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
101 glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);
104 char *log = (char *) malloc(sizeof(char) * len);
106 glGetShaderInfoLog(shader, len, NULL, log);
107 nprintf(("OpenGL", "Error compiling shader:\n%s\n", log));
112 glDeleteShader(shader);
120 static GLuint opengl2_create_program(GLuint vert, GLuint frag)
125 program = glCreateProgram();
131 glAttachShader(program, vert);
132 glAttachShader(program, frag);
134 glBindAttribLocation(program, SDRI_POSITION, "vPosition");
135 glBindAttribLocation(program, SDRI_COLOR, "vColor");
136 glBindAttribLocation(program, SDRI_SEC_COLOR, "vSecColor");
137 glBindAttribLocation(program, SDRI_TEXCOORD, "vTexCoord");
139 glLinkProgram(program);
141 glGetProgramiv(program, GL_LINK_STATUS, &linked);
146 glGetProgramiv(program, GL_INFO_LOG_LENGTH, &len);
149 char *log = (char *) malloc(sizeof(char) * len);
151 glGetProgramInfoLog(program, len, NULL, log);
152 nprintf(("OpenGL", "Error linking program:\n%s\n", log));
157 glDeleteProgram(program);
165 void opengl2_shader_use(sdr_prog_t prog)
167 static sdr_prog_t current = PROG_INVALID;
169 if (prog == current) {
175 glUseProgram(tmapper_prog);
179 glUseProgram(aabitmap_prog);
183 glUseProgram(lines_prog);
194 int opengl2_shader_init()
196 GLuint v_generic_tex = opengl2_create_shader(v_generic_tex_src, GL_VERTEX_SHADER);
197 GLuint v_lines = opengl2_create_shader(v_lines_src, GL_VERTEX_SHADER);
199 GLuint f_tmapper = opengl2_create_shader(f_tmapper_src, GL_FRAGMENT_SHADER);
200 GLuint f_aabitmap = opengl2_create_shader(f_aabitmap_src, GL_FRAGMENT_SHADER);
201 GLuint f_lines = opengl2_create_shader(f_lines_src, GL_FRAGMENT_SHADER);
203 tmapper_prog = opengl2_create_program(v_generic_tex, f_tmapper);
204 aabitmap_prog = opengl2_create_program(v_generic_tex, f_aabitmap);
205 lines_prog = opengl2_create_program(v_lines, f_lines);
212 ortho[0] = 2.0f / gr_screen.max_w;
213 ortho[5] = 2.0f / -gr_screen.max_h;
214 ortho[10] = -2.0f / 1.0f;
222 opengl2_shader_use(PROG_LINES);
223 loc = glGetUniformLocation(lines_prog, "vOrtho");
224 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
226 opengl2_shader_use(PROG_AABITMAP);
227 loc = glGetUniformLocation(aabitmap_prog, "vOrtho");
228 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
230 opengl2_shader_use(PROG_TMAPPER);
231 loc = glGetUniformLocation(tmapper_prog, "vOrtho");
232 glUniformMatrix4fv(loc, 1, GL_FALSE, ortho);
237 void opengl2_shader_cleanup()
240 glDeleteProgram(tmapper_prog);
245 glDeleteProgram(aabitmap_prog);
250 glDeleteProgram(lines_prog);