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
353 sources[0] = defines;
357 ctx->glCompileShaderARB(shader);
366 ctx->glGetInfoLogARB(shader, length,
NULL, info);
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) {
432 location = ctx->glGetUniformLocationARB(data->program, tex_name);
434 ctx->glUniform1iARB(location, 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");
478 ctx->glCreateShaderObjectARB = (PFNGLCREATESHADEROBJECTARBPROC)
SDL_GL_GetProcAddress(
"glCreateShaderObjectARB");
481 ctx->glGetObjectParameterivARB = (PFNGLGETOBJECTPARAMETERIVARBPROC)
SDL_GL_GetProcAddress(
"glGetObjectParameterivARB");
482 ctx->glGetUniformLocationARB = (PFNGLGETUNIFORMLOCATIONARBPROC)
SDL_GL_GetProcAddress(
"glGetUniformLocationARB");
487 ctx->glUseProgramObjectARB = (PFNGLUSEPROGRAMOBJECTARBPROC)
SDL_GL_GetProcAddress(
"glUseProgramObjectARB");
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_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_small_alloc(type, count, pisstack)
#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
#define SDL_small_free(ptr, isstack)
GLAPI GLenum GLAPIENTRY glGetError(void)
#define SDL_arraysize(array)
GLbitfield GLuint program
GLuint GLsizei GLsizei * length
void GL_SelectShader(GL_ShaderContext *ctx, GL_Shader shader)