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) * v_color;\n" 250 TEXTURE_VERTEX_SHADER,
253 JPEG_SHADER_CONSTANTS
259 TEXTURE_VERTEX_SHADER,
262 BT601_SHADER_CONSTANTS
268 TEXTURE_VERTEX_SHADER,
271 BT709_SHADER_CONSTANTS
277 TEXTURE_VERTEX_SHADER,
280 JPEG_SHADER_CONSTANTS
286 TEXTURE_VERTEX_SHADER,
289 BT601_SHADER_CONSTANTS
295 TEXTURE_VERTEX_SHADER,
298 BT709_SHADER_CONSTANTS
304 TEXTURE_VERTEX_SHADER,
307 JPEG_SHADER_CONSTANTS
313 TEXTURE_VERTEX_SHADER,
316 BT601_SHADER_CONSTANTS
322 TEXTURE_VERTEX_SHADER,
325 BT709_SHADER_CONSTANTS
336 sources[0] = defines;
340 ctx->glCompileShaderARB(shader);
348 ctx->glGetInfoLogARB(shader, length,
NULL, info);
350 "Failed to compile shader:\n%s%s\n%s", defines, source, info);
353 "Failed to compile shader:\n%s%s\n%s", defines, source, info);
366 const int num_tmus_bound = 4;
367 const char *vert_defines =
"";
368 const char *frag_defines =
"";
379 if (ctx->GL_ARB_texture_rectangle_supported) {
381 "#define sampler2D sampler2DRect\n" 382 "#define texture2D texture2DRect\n" 383 "#define UVCoordScale 0.5\n";
386 "#define UVCoordScale 1.0\n";
390 data->program = ctx->glCreateProgramObjectARB();
394 if (!CompileShader(ctx, data->vert_shader, vert_defines, shader_source[index][0])) {
400 if (!CompileShader(ctx, data->frag_shader, frag_defines, shader_source[index][1])) {
405 ctx->glAttachObjectARB(data->program, data->vert_shader);
406 ctx->glAttachObjectARB(data->program, data->frag_shader);
407 ctx->glLinkProgramARB(data->program);
410 ctx->glUseProgramObjectARB(data->program);
411 for (i = 0; i < num_tmus_bound; ++
i) {
414 location = ctx->glGetUniformLocationARB(data->program, tex_name);
416 ctx->glUniform1iARB(location, i);
419 ctx->glUseProgramObjectARB(0);
427 ctx->glDeleteObjectARB(data->vert_shader);
428 ctx->glDeleteObjectARB(data->frag_shader);
429 ctx->glDeleteObjectARB(data->program);
447 ctx->GL_ARB_texture_rectangle_supported =
SDL_TRUE;
459 ctx->glCreateProgramObjectARB = (PFNGLCREATEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateProgramObjectARB");
460 ctx->glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateShaderObjectARB");
463 ctx->glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)
SDL_GL_GetProcAddress(
"glGetObjectParameterivARB");
464 ctx->glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
SDL_GL_GetProcAddress(
"glGetUniformLocationARB");
469 ctx->glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glUseProgramObjectARB");
470 if (ctx->glGetError &&
471 ctx->glAttachObjectARB &&
472 ctx->glCompileShaderARB &&
473 ctx->glCreateProgramObjectARB &&
474 ctx->glCreateShaderObjectARB &&
475 ctx->glDeleteObjectARB &&
476 ctx->glGetInfoLogARB &&
477 ctx->glGetObjectParameterivARB &&
478 ctx->glGetUniformLocationARB &&
479 ctx->glLinkProgramARB &&
480 ctx->glShaderSourceARB &&
481 ctx->glUniform1iARB &&
482 ctx->glUniform1fARB &&
483 ctx->glUseProgramObjectARB) {
488 if (!shaders_supported) {
495 if (!CompileShaderProgram(ctx, i, &ctx->shaders[i])) {
508 ctx->glUseProgramObjectARB(ctx->shaders[shader].program);
517 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)
#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
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)
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)