21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED
46 PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
47 PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
48 PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
49 PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
50 PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
51 PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
52 PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
53 PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
54 PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
55 PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
56 PFNGLUNIFORM1IARBPROC glUniform1iARB;
57 PFNGLUNIFORM1FARBPROC glUniform1fARB;
58 PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
60 SDL_bool GL_ARB_texture_rectangle_supported;
77 "varying vec4 v_color;\n"
81 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
82 " v_color = gl_Color;\n"
85 "varying vec4 v_color;\n"
89 " gl_FragColor = v_color;\n"
96 "varying vec4 v_color;\n"
97 "varying vec2 v_texCoord;\n"
101 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
102 " v_color = gl_Color;\n"
103 " v_texCoord = vec2(gl_MultiTexCoord0);\n"
106 "varying vec4 v_color;\n"
107 "varying vec2 v_texCoord;\n"
108 "uniform sampler2D tex0;\n"
112 " gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n"
119 "varying vec4 v_color;\n"
120 "varying vec2 v_texCoord;\n"
124 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
125 " v_color = gl_Color;\n"
126 " v_texCoord = vec2(gl_MultiTexCoord0);\n"
129 "varying vec4 v_color;\n"
130 "varying vec2 v_texCoord;\n"
131 "uniform sampler2D tex0; // Y \n"
132 "uniform sampler2D tex1; // U \n"
133 "uniform sampler2D tex2; // V \n"
136 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n"
138 "// RGB coefficients \n"
139 "const vec3 Rcoeff = vec3(1.164, 0.000, 1.596);\n"
140 "const vec3 Gcoeff = vec3(1.164, -0.391, -0.813);\n"
141 "const vec3 Bcoeff = vec3(1.164, 2.018, 0.000);\n"
148 " // Get the Y value \n"
149 " tcoord = v_texCoord;\n"
150 " yuv.x = texture2D(tex0, tcoord).r;\n"
152 " // Get the U and V values \n"
153 " tcoord *= UVCoordScale;\n"
154 " yuv.y = texture2D(tex1, tcoord).r;\n"
155 " yuv.z = texture2D(tex2, tcoord).r;\n"
157 " // Do the color transform \n"
159 " rgb.r = dot(yuv, Rcoeff);\n"
160 " rgb.g = dot(yuv, Gcoeff);\n"
161 " rgb.b = dot(yuv, Bcoeff);\n"
163 " // That was easy. :) \n"
164 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n"
171 "varying vec4 v_color;\n"
172 "varying vec2 v_texCoord;\n"
176 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
177 " v_color = gl_Color;\n"
178 " v_texCoord = vec2(gl_MultiTexCoord0);\n"
181 "varying vec4 v_color;\n"
182 "varying vec2 v_texCoord;\n"
183 "uniform sampler2D tex0; // Y \n"
184 "uniform sampler2D tex1; // U/V \n"
187 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n"
189 "// RGB coefficients \n"
190 "const vec3 Rcoeff = vec3(1.164, 0.000, 1.596);\n"
191 "const vec3 Gcoeff = vec3(1.164, -0.391, -0.813);\n"
192 "const vec3 Bcoeff = vec3(1.164, 2.018, 0.000);\n"
199 " // Get the Y value \n"
200 " tcoord = v_texCoord;\n"
201 " yuv.x = texture2D(tex0, tcoord).r;\n"
203 " // Get the U and V values \n"
204 " tcoord *= UVCoordScale;\n"
205 " yuv.yz = texture2D(tex1, tcoord).ra;\n"
207 " // Do the color transform \n"
209 " rgb.r = dot(yuv, Rcoeff);\n"
210 " rgb.g = dot(yuv, Gcoeff);\n"
211 " rgb.b = dot(yuv, Bcoeff);\n"
213 " // That was easy. :) \n"
214 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n"
221 "varying vec4 v_color;\n"
222 "varying vec2 v_texCoord;\n"
226 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n"
227 " v_color = gl_Color;\n"
228 " v_texCoord = vec2(gl_MultiTexCoord0);\n"
231 "varying vec4 v_color;\n"
232 "varying vec2 v_texCoord;\n"
233 "uniform sampler2D tex0; // Y \n"
234 "uniform sampler2D tex1; // U/V \n"
237 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n"
239 "// RGB coefficients \n"
240 "const vec3 Rcoeff = vec3(1.164, 0.000, 1.596);\n"
241 "const vec3 Gcoeff = vec3(1.164, -0.391, -0.813);\n"
242 "const vec3 Bcoeff = vec3(1.164, 2.018, 0.000);\n"
249 " // Get the Y value \n"
250 " tcoord = v_texCoord;\n"
251 " yuv.x = texture2D(tex0, tcoord).r;\n"
253 " // Get the U and V values \n"
254 " tcoord *= UVCoordScale;\n"
255 " yuv.yz = texture2D(tex1, tcoord).ar;\n"
257 " // Do the color transform \n"
259 " rgb.r = dot(yuv, Rcoeff);\n"
260 " rgb.g = dot(yuv, Gcoeff);\n"
261 " rgb.b = dot(yuv, Bcoeff);\n"
263 " // That was easy. :) \n"
264 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n"
275 sources[0] = defines;
279 ctx->glCompileShaderARB(shader);
287 ctx->glGetInfoLogARB(shader, length,
NULL, info);
289 "Failed to compile shader:\n%s%s\n%s", defines, source, info);
292 "Failed to compile shader:\n%s%s\n%s", defines, source, info);
305 const int num_tmus_bound = 4;
306 const char *vert_defines =
"";
307 const char *frag_defines =
"";
318 if (ctx->GL_ARB_texture_rectangle_supported) {
320 "#define sampler2D sampler2DRect\n"
321 "#define texture2D texture2DRect\n"
322 "#define UVCoordScale 0.5\n";
325 "#define UVCoordScale 1.0\n";
329 data->program = ctx->glCreateProgramObjectARB();
333 if (!CompileShader(ctx, data->vert_shader, vert_defines, shader_source[index][0])) {
339 if (!CompileShader(ctx, data->frag_shader, frag_defines, shader_source[index][1])) {
344 ctx->glAttachObjectARB(data->program, data->vert_shader);
345 ctx->glAttachObjectARB(data->program, data->frag_shader);
346 ctx->glLinkProgramARB(data->program);
349 ctx->glUseProgramObjectARB(data->program);
350 for (i = 0; i < num_tmus_bound; ++
i) {
353 location = ctx->glGetUniformLocationARB(data->program, tex_name);
355 ctx->glUniform1iARB(location, i);
358 ctx->glUseProgramObjectARB(0);
366 ctx->glDeleteObjectARB(data->vert_shader);
367 ctx->glDeleteObjectARB(data->frag_shader);
368 ctx->glDeleteObjectARB(data->program);
386 ctx->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
398 ctx->glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateProgramObjectARB");
399 ctx->glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateShaderObjectARB");
402 ctx->glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)
SDL_GL_GetProcAddress(
"glGetObjectParameterivARB");
403 ctx->glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
SDL_GL_GetProcAddress(
"glGetUniformLocationARB");
408 ctx->glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glUseProgramObjectARB");
409 if (ctx->glGetError &&
410 ctx->glAttachObjectARB &&
411 ctx->glCompileShaderARB &&
412 ctx->glCreateProgramObjectARB &&
413 ctx->glCreateShaderObjectARB &&
414 ctx->glDeleteObjectARB &&
415 ctx->glGetInfoLogARB &&
416 ctx->glGetObjectParameterivARB &&
417 ctx->glGetUniformLocationARB &&
418 ctx->glLinkProgramARB &&
419 ctx->glShaderSourceARB &&
420 ctx->glUniform1iARB &&
421 ctx->glUniform1fARB &&
422 ctx->glUseProgramObjectARB) {
427 if (!shaders_supported) {
434 if (!CompileShaderProgram(ctx, i, &ctx->shaders[i])) {
447 ctx->glUseProgramObjectARB(ctx->shaders[shader].program);
456 DestroyShaderProgram(ctx, &ctx->shaders[i]);
#define SDL_GL_ExtensionSupported
GL_ShaderContext * GL_CreateShaderContext(void)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
#define GL_VERTEX_SHADER_ARB
GLsizei GLsizei GLuint * shaders
struct GL_ShaderContext GL_ShaderContext
void GL_DestroyShaderContext(GL_ShaderContext *ctx)
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
void * SDL_calloc(size_t nmemb, size_t size)
#define SDL_stack_alloc(type, count)
#define SDL_GL_GetProcAddress
#define GL_OBJECT_INFO_LOG_LENGTH_ARB
#define GL_OBJECT_COMPILE_STATUS_ARB
GLsizei GLsizei GLchar * source
#define GL_FRAGMENT_SHADER_ARB
SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char int SDL_PRINTF_FORMAT_STRING const char const char SDL_SCANF_FORMAT_STRING const char return SDL_ThreadFunction const char void return Uint32 return Uint32 void
GLAPI GLenum GLAPIENTRY glGetError(void)
#define SDL_arraysize(array)
GLbitfield GLuint program
#define SDL_stack_free(data)
GLuint GLsizei GLsizei * length
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)