21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_RENDER_OGL && !SDL_RENDER_DISABLED
45 PFNGLATTACHOBJECTARBPROC glAttachObjectARB;
46 PFNGLCOMPILESHADERARBPROC glCompileShaderARB;
47 PFNGLCREATEPROGRAMOBJECTARBPROC glCreateProgramObjectARB;
48 PFNGLCREATESHADEROBJECTARBPROC glCreateShaderObjectARB;
49 PFNGLDELETEOBJECTARBPROC glDeleteObjectARB;
50 PFNGLGETINFOLOGARBPROC glGetInfoLogARB;
51 PFNGLGETOBJECTPARAMETERIVARBPROC glGetObjectParameterivARB;
52 PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
53 PFNGLLINKPROGRAMARBPROC glLinkProgramARB;
54 PFNGLSHADERSOURCEARBPROC glShaderSourceARB;
55 PFNGLUNIFORM1IARBPROC glUniform1iARB;
56 PFNGLUNIFORM1FARBPROC glUniform1fARB;
57 PFNGLUSEPROGRAMOBJECTARBPROC glUseProgramObjectARB;
59 SDL_bool GL_ARB_texture_rectangle_supported;
64 #define COLOR_VERTEX_SHADER \
65 "varying vec4 v_color;\n" \
69 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" \
70 " v_color = gl_Color;\n" \
73 #define TEXTURE_VERTEX_SHADER \
74 "varying vec4 v_color;\n" \
75 "varying vec2 v_texCoord;\n" \
79 " gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;\n" \
80 " v_color = gl_Color;\n" \
81 " v_texCoord = vec2(gl_MultiTexCoord0);\n" \
84 #define JPEG_SHADER_CONSTANTS \
86 "const vec3 offset = vec3(0, -0.501960814, -0.501960814);\n" \
88 "// RGB coefficients \n" \
89 "const vec3 Rcoeff = vec3(1, 0.000, 1.402);\n" \
90 "const vec3 Gcoeff = vec3(1, -0.3441, -0.7141);\n" \
91 "const vec3 Bcoeff = vec3(1, 1.772, 0.000);\n" \
93 #define BT601_SHADER_CONSTANTS \
95 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \
97 "// RGB coefficients \n" \
98 "const vec3 Rcoeff = vec3(1.1644, 0.000, 1.596);\n" \
99 "const vec3 Gcoeff = vec3(1.1644, -0.3918, -0.813);\n" \
100 "const vec3 Bcoeff = vec3(1.1644, 2.0172, 0.000);\n" \
102 #define BT709_SHADER_CONSTANTS \
104 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \
106 "// RGB coefficients \n" \
107 "const vec3 Rcoeff = vec3(1.1644, 0.000, 1.7927);\n" \
108 "const vec3 Gcoeff = vec3(1.1644, -0.2132, -0.5329);\n" \
109 "const vec3 Bcoeff = vec3(1.1644, 2.1124, 0.000);\n" \
111 #define YUV_SHADER_PROLOGUE \
112 "varying vec4 v_color;\n" \
113 "varying vec2 v_texCoord;\n" \
114 "uniform sampler2D tex0; // Y \n" \
115 "uniform sampler2D tex1; // U \n" \
116 "uniform sampler2D tex2; // V \n" \
119 #define YUV_SHADER_BODY \
124 " vec3 yuv, rgb;\n" \
126 " // Get the Y value \n" \
127 " tcoord = v_texCoord;\n" \
128 " yuv.x = texture2D(tex0, tcoord).r;\n" \
130 " // Get the U and V values \n" \
131 " tcoord *= UVCoordScale;\n" \
132 " yuv.y = texture2D(tex1, tcoord).r;\n" \
133 " yuv.z = texture2D(tex2, tcoord).r;\n" \
135 " // Do the color transform \n" \
136 " yuv += offset;\n" \
137 " rgb.r = dot(yuv, Rcoeff);\n" \
138 " rgb.g = dot(yuv, Gcoeff);\n" \
139 " rgb.b = dot(yuv, Bcoeff);\n" \
141 " // That was easy. :) \n" \
142 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
145 #define NV12_SHADER_PROLOGUE \
146 "varying vec4 v_color;\n" \
147 "varying vec2 v_texCoord;\n" \
148 "uniform sampler2D tex0; // Y \n" \
149 "uniform sampler2D tex1; // U/V \n" \
152 #define NV12_SHADER_BODY \
157 " vec3 yuv, rgb;\n" \
159 " // Get the Y value \n" \
160 " tcoord = v_texCoord;\n" \
161 " yuv.x = texture2D(tex0, tcoord).r;\n" \
163 " // Get the U and V values \n" \
164 " tcoord *= UVCoordScale;\n" \
165 " yuv.yz = texture2D(tex1, tcoord).ra;\n" \
167 " // Do the color transform \n" \
168 " yuv += offset;\n" \
169 " rgb.r = dot(yuv, Rcoeff);\n" \
170 " rgb.g = dot(yuv, Gcoeff);\n" \
171 " rgb.b = dot(yuv, Bcoeff);\n" \
173 " // That was easy. :) \n" \
174 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
177 #define NV21_SHADER_PROLOGUE \
178 "varying vec4 v_color;\n" \
179 "varying vec2 v_texCoord;\n" \
180 "uniform sampler2D tex0; // Y \n" \
181 "uniform sampler2D tex1; // U/V \n" \
184 #define NV21_SHADER_BODY \
189 " vec3 yuv, rgb;\n" \
191 " // Get the Y value \n" \
192 " tcoord = v_texCoord;\n" \
193 " yuv.x = texture2D(tex0, tcoord).r;\n" \
195 " // Get the U and V values \n" \
196 " tcoord *= UVCoordScale;\n" \
197 " yuv.yz = texture2D(tex1, tcoord).ar;\n" \
199 " // Do the color transform \n" \
200 " yuv += offset;\n" \
201 " rgb.r = dot(yuv, Rcoeff);\n" \
202 " rgb.g = dot(yuv, Gcoeff);\n" \
203 " rgb.b = dot(yuv, Bcoeff);\n" \
205 " // That was easy. :) \n" \
206 " gl_FragColor = vec4(rgb, 1.0) * v_color;\n" \
223 "varying vec4 v_color;\n"
227 " gl_FragColor = v_color;\n"
234 TEXTURE_VERTEX_SHADER,
236 "varying vec4 v_color;\n"
237 "varying vec2 v_texCoord;\n"
238 "uniform sampler2D tex0;\n"
242 " gl_FragColor = texture2D(tex0, v_texCoord);\n"
243 " gl_FragColor.a = 1.0;\n"
244 " gl_FragColor *= v_color;\n"
251 TEXTURE_VERTEX_SHADER,
253 "varying vec4 v_color;\n"
254 "varying vec2 v_texCoord;\n"
255 "uniform sampler2D tex0;\n"
259 " gl_FragColor = texture2D(tex0, v_texCoord) * v_color;\n"
266 TEXTURE_VERTEX_SHADER,
269 JPEG_SHADER_CONSTANTS
275 TEXTURE_VERTEX_SHADER,
278 BT601_SHADER_CONSTANTS
284 TEXTURE_VERTEX_SHADER,
287 BT709_SHADER_CONSTANTS
293 TEXTURE_VERTEX_SHADER,
296 JPEG_SHADER_CONSTANTS
302 TEXTURE_VERTEX_SHADER,
305 BT601_SHADER_CONSTANTS
311 TEXTURE_VERTEX_SHADER,
314 BT709_SHADER_CONSTANTS
320 TEXTURE_VERTEX_SHADER,
323 JPEG_SHADER_CONSTANTS
329 TEXTURE_VERTEX_SHADER,
332 BT601_SHADER_CONSTANTS
338 TEXTURE_VERTEX_SHADER,
341 BT709_SHADER_CONSTANTS
367 "Failed to compile shader:\n%s%s\n%s", defines,
source, info);
370 "Failed to compile shader:\n%s%s\n%s", defines,
source, info);
383 const int num_tmus_bound = 4;
384 const char *vert_defines =
"";
385 const char *frag_defines =
"";
396 if (
ctx->GL_ARB_texture_rectangle_supported) {
398 "#define sampler2D sampler2DRect\n"
399 "#define texture2D texture2DRect\n"
400 "#define UVCoordScale 0.5\n";
403 "#define UVCoordScale 1.0\n";
407 data->program =
ctx->glCreateProgramObjectARB();
411 if (!CompileShader(
ctx,
data->vert_shader, vert_defines, shader_source[
index][0])) {
417 if (!CompileShader(
ctx,
data->frag_shader, frag_defines, shader_source[
index][1])) {
422 ctx->glAttachObjectARB(
data->program,
data->vert_shader);
423 ctx->glAttachObjectARB(
data->program,
data->frag_shader);
424 ctx->glLinkProgramARB(
data->program);
427 ctx->glUseProgramObjectARB(
data->program);
428 for (
i = 0;
i < num_tmus_bound; ++
i) {
436 ctx->glUseProgramObjectARB(0);
444 ctx->glDeleteObjectARB(
data->vert_shader);
445 ctx->glDeleteObjectARB(
data->frag_shader);
446 ctx->glDeleteObjectARB(
data->program);
464 ctx->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
476 ctx->glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateProgramObjectARB");
480 ctx->glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)
SDL_GL_GetProcAddress(
"glGetObjectParameterivARB");
487 if (
ctx->glGetError &&
488 ctx->glAttachObjectARB &&
489 ctx->glCompileShaderARB &&
490 ctx->glCreateProgramObjectARB &&
491 ctx->glCreateShaderObjectARB &&
492 ctx->glDeleteObjectARB &&
493 ctx->glGetInfoLogARB &&
494 ctx->glGetObjectParameterivARB &&
495 ctx->glGetUniformLocationARB &&
496 ctx->glLinkProgramARB &&
497 ctx->glShaderSourceARB &&
498 ctx->glUniform1iARB &&
499 ctx->glUniform1fARB &&
500 ctx->glUseProgramObjectARB) {
505 if (!shaders_supported) {
512 if (!CompileShaderProgram(
ctx,
i, &
ctx->shaders[
i])) {
525 ctx->glUseProgramObjectARB(
ctx->shaders[
shader].program);
534 DestroyShaderProgram(
ctx, &
ctx->shaders[
i]);
#define SDL_GL_GetProcAddress
#define SDL_GL_ExtensionSupported
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
#define SDL_small_alloc(type, count, pisstack)
#define SDL_small_free(ptr, isstack)
@ SDL_LOG_CATEGORY_RENDER
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLAPI GLenum GLAPIENTRY glGetError(void)
#define GL_OBJECT_INFO_LOG_LENGTH_ARB
#define GL_FRAGMENT_SHADER_ARB
#define GL_OBJECT_COMPILE_STATUS_ARB
GLsizei GLsizei GLchar * source
#define GL_VERTEX_SHADER_ARB
GLsizei GLsizei GLuint * shaders
GLuint GLsizei GLsizei * length
GLbitfield GLuint program
GL_ShaderContext * GL_CreateShaderContext(void)
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)
void GL_DestroyShaderContext(GL_ShaderContext *ctx)
struct GL_ShaderContext GL_ShaderContext
#define SDL_arraysize(array)
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)