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 \
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" \
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 \
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" \
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 \
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" \
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]);
#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
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)
void GL_DestroyShaderContext(GL_ShaderContext *ctx)
struct GL_ShaderContext GL_ShaderContext
GL_ShaderContext * GL_CreateShaderContext(void)
#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)