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;
65 #define COLOR_VERTEX_SHADER \
66 "varying vec4 v_color;\n" \
70 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" \
71 " v_color = gl_Color;\n" \
74 #define TEXTURE_VERTEX_SHADER \
75 "varying vec4 v_color;\n" \
76 "varying vec2 v_texCoord;\n" \
80 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" \
81 " v_color = gl_Color;\n" \
82 " v_texCoord = vec2(gl_MultiTexCoord0);\n" \
85 #define JPEG_SHADER_CONSTANTS \
87 "const vec3 offset = vec3(0, -0.501960814, -0.501960814);\n" \
89 "// RGB coefficients \n" \
90 "const vec3 Rcoeff = vec3(1, 0.000, 1.402);\n" \
91 "const vec3 Gcoeff = vec3(1, -0.3441, -0.7141);\n" \
92 "const vec3 Bcoeff = vec3(1, 1.772, 0.000);\n" \
94 #define BT601_SHADER_CONSTANTS \
96 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \
98 "// RGB coefficients \n" \
99 "const vec3 Rcoeff = vec3(1.1644, 0.000, 1.596);\n" \
100 "const vec3 Gcoeff = vec3(1.1644, -0.3918, -0.813);\n" \
101 "const vec3 Bcoeff = vec3(1.1644, 2.0172, 0.000);\n" \
103 #define BT709_SHADER_CONSTANTS \
105 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \
107 "// RGB coefficients \n" \
108 "const vec3 Rcoeff = vec3(1.1644, 0.000, 1.7927);\n" \
109 "const vec3 Gcoeff = vec3(1.1644, -0.2132, -0.5329);\n" \
110 "const vec3 Bcoeff = vec3(1.1644, 2.1124, 0.000);\n" \
112 #define YUV_SHADER_PROLOGUE \
113 "varying vec4 v_color;\n" \
114 "varying vec2 v_texCoord;\n" \
115 "uniform sampler2D tex0; // Y \n" \
116 "uniform sampler2D tex1; // U \n" \
117 "uniform sampler2D tex2; // V \n" \
120 #define YUV_SHADER_BODY \
125 " vec3 yuv, rgb;\n" \
127 " // Get the Y value \n" \
128 " tcoord = v_texCoord;\n" \
129 " yuv.x = texture2D(tex0, tcoord).r;\n" \
131 " // Get the U and V values \n" \
132 " tcoord *= UVCoordScale;\n" \
133 " yuv.y = texture2D(tex1, tcoord).r;\n" \
134 " yuv.z = texture2D(tex2, tcoord).r;\n" \
136 " // Do the color transform \n" \
137 " yuv += offset;\n" \
138 " rgb.r = dot(yuv, Rcoeff);\n" \
139 " rgb.g = dot(yuv, Gcoeff);\n" \
140 " rgb.b = dot(yuv, Bcoeff);\n" \
142 " // That was easy. :) \n" \
143 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
146 #define NV12_SHADER_PROLOGUE \
147 "varying vec4 v_color;\n" \
148 "varying vec2 v_texCoord;\n" \
149 "uniform sampler2D tex0; // Y \n" \
150 "uniform sampler2D tex1; // U/V \n" \
153 #define NV12_SHADER_BODY \
158 " vec3 yuv, rgb;\n" \
160 " // Get the Y value \n" \
161 " tcoord = v_texCoord;\n" \
162 " yuv.x = texture2D(tex0, tcoord).r;\n" \
164 " // Get the U and V values \n" \
165 " tcoord *= UVCoordScale;\n" \
166 " yuv.yz = texture2D(tex1, tcoord).ra;\n" \
168 " // Do the color transform \n" \
169 " yuv += offset;\n" \
170 " rgb.r = dot(yuv, Rcoeff);\n" \
171 " rgb.g = dot(yuv, Gcoeff);\n" \
172 " rgb.b = dot(yuv, Bcoeff);\n" \
174 " // That was easy. :) \n" \
175 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
178 #define NV21_SHADER_PROLOGUE \
179 "varying vec4 v_color;\n" \
180 "varying vec2 v_texCoord;\n" \
181 "uniform sampler2D tex0; // Y \n" \
182 "uniform sampler2D tex1; // U/V \n" \
185 #define NV21_SHADER_BODY \
190 " vec3 yuv, rgb;\n" \
192 " // Get the Y value \n" \
193 " tcoord = v_texCoord;\n" \
194 " yuv.x = texture2D(tex0, tcoord).r;\n" \
196 " // Get the U and V values \n" \
197 " tcoord *= UVCoordScale;\n" \
198 " yuv.yz = texture2D(tex1, tcoord).ar;\n" \
200 " // Do the color transform \n" \
201 " yuv += offset;\n" \
202 " rgb.r = dot(yuv, Rcoeff);\n" \
203 " rgb.g = dot(yuv, Gcoeff);\n" \
204 " rgb.b = dot(yuv, Bcoeff);\n" \
206 " // That was easy. :) \n" \
207 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
224 "varying vec4 v_color;\n"
228 " gl_FragColor = v_color;\n"
235 TEXTURE_VERTEX_SHADER,
237 "varying vec4 v_color;\n"
238 "varying vec2 v_texCoord;\n"
239 "uniform sampler2D tex0;\n"
243 " gl_FragColor = texture2D(tex0, v_texCoord);\n"
244 " gl_FragColor.a = 1.0;\n"
245 " gl_FragColor *= v_color;\n"
252 TEXTURE_VERTEX_SHADER,
254 "varying vec4 v_color;\n"
255 "varying vec2 v_texCoord;\n"
256 "uniform sampler2D tex0;\n"
260 " gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n"
267 TEXTURE_VERTEX_SHADER,
270 JPEG_SHADER_CONSTANTS
276 TEXTURE_VERTEX_SHADER,
279 BT601_SHADER_CONSTANTS
285 TEXTURE_VERTEX_SHADER,
288 BT709_SHADER_CONSTANTS
294 TEXTURE_VERTEX_SHADER,
297 JPEG_SHADER_CONSTANTS
303 TEXTURE_VERTEX_SHADER,
306 BT601_SHADER_CONSTANTS
312 TEXTURE_VERTEX_SHADER,
315 BT709_SHADER_CONSTANTS
321 TEXTURE_VERTEX_SHADER,
324 JPEG_SHADER_CONSTANTS
330 TEXTURE_VERTEX_SHADER,
333 BT601_SHADER_CONSTANTS
339 TEXTURE_VERTEX_SHADER,
342 BT709_SHADER_CONSTANTS
368 "Failed to compile shader:\n%s%s\n%s", defines,
source, info);
371 "Failed to compile shader:\n%s%s\n%s", defines,
source, info);
384 const int num_tmus_bound = 4;
385 const char *vert_defines =
"";
386 const char *frag_defines =
"";
397 if (
ctx->GL_ARB_texture_rectangle_supported) {
399 "#define sampler2D sampler2DRect\n"
400 "#define texture2D texture2DRect\n"
401 "#define UVCoordScale 0.5\n";
404 "#define UVCoordScale 1.0\n";
408 data->program =
ctx->glCreateProgramObjectARB();
412 if (!CompileShader(
ctx,
data->vert_shader, vert_defines, shader_source[
index][0])) {
418 if (!CompileShader(
ctx,
data->frag_shader, frag_defines, shader_source[
index][1])) {
423 ctx->glAttachObjectARB(
data->program,
data->vert_shader);
424 ctx->glAttachObjectARB(
data->program,
data->frag_shader);
425 ctx->glLinkProgramARB(
data->program);
428 ctx->glUseProgramObjectARB(
data->program);
429 for (
i = 0;
i < num_tmus_bound; ++
i) {
437 ctx->glUseProgramObjectARB(0);
445 ctx->glDeleteObjectARB(
data->vert_shader);
446 ctx->glDeleteObjectARB(
data->frag_shader);
447 ctx->glDeleteObjectARB(
data->program);
465 ctx->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
477 ctx->glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateProgramObjectARB");
481 ctx->glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)
SDL_GL_GetProcAddress(
"glGetObjectParameterivARB");
488 if (
ctx->glGetError &&
489 ctx->glAttachObjectARB &&
490 ctx->glCompileShaderARB &&
491 ctx->glCreateProgramObjectARB &&
492 ctx->glCreateShaderObjectARB &&
493 ctx->glDeleteObjectARB &&
494 ctx->glGetInfoLogARB &&
495 ctx->glGetObjectParameterivARB &&
496 ctx->glGetUniformLocationARB &&
497 ctx->glLinkProgramARB &&
498 ctx->glShaderSourceARB &&
499 ctx->glUniform1iARB &&
500 ctx->glUniform1fARB &&
501 ctx->glUseProgramObjectARB) {
506 if (!shaders_supported) {
513 if (!CompileShaderProgram(
ctx,
i, &
ctx->shaders[
i])) {
526 ctx->glUseProgramObjectARB(
ctx->shaders[
shader].program);
535 DestroyShaderProgram(
ctx, &
ctx->shaders[
i]);