21#include "../../SDL_internal.h"
23#if SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED
39static const Uint8 GLES2_VertexSrc_Default_[] =
" \
40 uniform mat4 u_projection; \
41 attribute vec2 a_position; \
42 attribute vec2 a_texCoord; \
43 attribute vec2 a_angle; \
44 attribute vec2 a_center; \
45 varying vec2 v_texCoord; \
49 float s = a_angle[0]; \
50 float c = a_angle[1] + 1.0; \
51 mat2 rotationMatrix = mat2(c, -s, s, c); \
52 vec2 position = rotationMatrix * (a_position - a_center) + a_center; \
53 v_texCoord = a_texCoord; \
54 gl_Position = u_projection * vec4(position, 0.0, 1.0);\
59static const Uint8 GLES2_FragmentSrc_SolidSrc_[] =
" \
60 precision mediump float; \
61 uniform vec4 u_color; \
65 gl_FragColor = u_color; \
69static const Uint8 GLES2_FragmentSrc_TextureABGRSrc_[] =
" \
70 precision mediump float; \
71 uniform sampler2D u_texture; \
72 uniform vec4 u_color; \
73 varying vec2 v_texCoord; \
77 gl_FragColor = texture2D(u_texture, v_texCoord); \
78 gl_FragColor *= u_color; \
83static const Uint8 GLES2_FragmentSrc_TextureARGBSrc_[] =
" \
84 precision mediump float; \
85 uniform sampler2D u_texture; \
86 uniform vec4 u_color; \
87 varying vec2 v_texCoord; \
91 vec4 abgr = texture2D(u_texture, v_texCoord); \
92 gl_FragColor = abgr; \
93 gl_FragColor.r = abgr.b; \
94 gl_FragColor.b = abgr.r; \
95 gl_FragColor *= u_color; \
100static const Uint8 GLES2_FragmentSrc_TextureRGBSrc_[] =
" \
101 precision mediump float; \
102 uniform sampler2D u_texture; \
103 uniform vec4 u_color; \
104 varying vec2 v_texCoord; \
108 vec4 abgr = texture2D(u_texture, v_texCoord); \
109 gl_FragColor = abgr; \
110 gl_FragColor.r = abgr.b; \
111 gl_FragColor.b = abgr.r; \
112 gl_FragColor.a = 1.0; \
113 gl_FragColor *= u_color; \
118static const Uint8 GLES2_FragmentSrc_TextureBGRSrc_[] =
" \
119 precision mediump float; \
120 uniform sampler2D u_texture; \
121 uniform vec4 u_color; \
122 varying vec2 v_texCoord; \
126 vec4 abgr = texture2D(u_texture, v_texCoord); \
127 gl_FragColor = abgr; \
128 gl_FragColor.a = 1.0; \
129 gl_FragColor *= u_color; \
133#define JPEG_SHADER_CONSTANTS \
135"const vec3 offset = vec3(0, -0.501960814, -0.501960814);\n" \
137"// RGB coefficients \n" \
138"const mat3 matrix = mat3( 1, 1, 1,\n" \
139" 0, -0.3441, 1.772,\n" \
140" 1.402, -0.7141, 0);\n" \
142#define BT601_SHADER_CONSTANTS \
144"const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \
146"// RGB coefficients \n" \
147"const mat3 matrix = mat3( 1.1644, 1.1644, 1.1644,\n" \
148" 0, -0.3918, 2.0172,\n" \
149" 1.596, -0.813, 0);\n" \
151#define BT709_SHADER_CONSTANTS \
153"const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \
155"// RGB coefficients \n" \
156"const mat3 matrix = mat3( 1.1644, 1.1644, 1.1644,\n" \
157" 0, -0.2132, 2.1124,\n" \
158" 1.7927, -0.5329, 0);\n" \
161#define YUV_SHADER_PROLOGUE \
162"precision mediump float;\n" \
163"uniform sampler2D u_texture;\n" \
164"uniform sampler2D u_texture_u;\n" \
165"uniform sampler2D u_texture_v;\n" \
166"uniform vec4 u_color;\n" \
167"varying vec2 v_texCoord;\n" \
170#define YUV_SHADER_BODY \
174" mediump vec3 yuv;\n" \
177" // Get the YUV values \n" \
178" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \
179" yuv.y = texture2D(u_texture_u, v_texCoord).r;\n" \
180" yuv.z = texture2D(u_texture_v, v_texCoord).r;\n" \
182" // Do the color transform \n" \
184" rgb = matrix * yuv;\n" \
186" // That was easy. :) \n" \
187" gl_FragColor = vec4(rgb, 1);\n" \
188" gl_FragColor *= u_color;\n" \
191#define NV12_SHADER_BODY \
195" mediump vec3 yuv;\n" \
198" // Get the YUV values \n" \
199" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \
200" yuv.yz = texture2D(u_texture_u, v_texCoord).ra;\n" \
202" // Do the color transform \n" \
204" rgb = matrix * yuv;\n" \
206" // That was easy. :) \n" \
207" gl_FragColor = vec4(rgb, 1);\n" \
208" gl_FragColor *= u_color;\n" \
211#define NV21_SHADER_BODY \
215" mediump vec3 yuv;\n" \
218" // Get the YUV values \n" \
219" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \
220" yuv.yz = texture2D(u_texture_u, v_texCoord).ar;\n" \
222" // Do the color transform \n" \
224" rgb = matrix * yuv;\n" \
226" // That was easy. :) \n" \
227" gl_FragColor = vec4(rgb, 1);\n" \
228" gl_FragColor *= u_color;\n" \
232static const Uint8 GLES2_FragmentSrc_TextureYUVJPEGSrc_[] = \
233 YUV_SHADER_PROLOGUE \
234 JPEG_SHADER_CONSTANTS \
237static const Uint8 GLES2_FragmentSrc_TextureYUVBT601Src_[] = \
238 YUV_SHADER_PROLOGUE \
239 BT601_SHADER_CONSTANTS \
242static const Uint8 GLES2_FragmentSrc_TextureYUVBT709Src_[] = \
243 YUV_SHADER_PROLOGUE \
244 BT709_SHADER_CONSTANTS \
249static const Uint8 GLES2_FragmentSrc_TextureNV12JPEGSrc_[] = \
250 YUV_SHADER_PROLOGUE \
251 JPEG_SHADER_CONSTANTS \
254static const Uint8 GLES2_FragmentSrc_TextureNV12BT601Src_[] = \
255 YUV_SHADER_PROLOGUE \
256 BT601_SHADER_CONSTANTS \
259static const Uint8 GLES2_FragmentSrc_TextureNV12BT709Src_[] = \
260 YUV_SHADER_PROLOGUE \
261 BT709_SHADER_CONSTANTS \
266static const Uint8 GLES2_FragmentSrc_TextureNV21JPEGSrc_[] = \
267 YUV_SHADER_PROLOGUE \
268 JPEG_SHADER_CONSTANTS \
271static const Uint8 GLES2_FragmentSrc_TextureNV21BT601Src_[] = \
272 YUV_SHADER_PROLOGUE \
273 BT601_SHADER_CONSTANTS \
276static const Uint8 GLES2_FragmentSrc_TextureNV21BT709Src_[] = \
277 YUV_SHADER_PROLOGUE \
278 BT709_SHADER_CONSTANTS \
283static const Uint8 GLES2_FragmentSrc_TextureExternalOESSrc_[] =
" \
284 #extension GL_OES_EGL_image_external : require\n\
285 precision mediump float; \
286 uniform samplerExternalOES u_texture; \
287 uniform vec4 u_color; \
288 varying vec2 v_texCoord; \
292 gl_FragColor = texture2D(u_texture, v_texCoord); \
293 gl_FragColor *= u_color; \
297static const GLES2_ShaderInstance GLES2_VertexSrc_Default = {
300 sizeof(GLES2_VertexSrc_Default_),
301 GLES2_VertexSrc_Default_
304static const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = {
307 sizeof(GLES2_FragmentSrc_SolidSrc_),
308 GLES2_FragmentSrc_SolidSrc_
311static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureABGRSrc = {
314 sizeof(GLES2_FragmentSrc_TextureABGRSrc_),
315 GLES2_FragmentSrc_TextureABGRSrc_
318static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureARGBSrc = {
321 sizeof(GLES2_FragmentSrc_TextureARGBSrc_),
322 GLES2_FragmentSrc_TextureARGBSrc_
325static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureRGBSrc = {
328 sizeof(GLES2_FragmentSrc_TextureRGBSrc_),
329 GLES2_FragmentSrc_TextureRGBSrc_
332static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureBGRSrc = {
335 sizeof(GLES2_FragmentSrc_TextureBGRSrc_),
336 GLES2_FragmentSrc_TextureBGRSrc_
339static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVJPEGSrc = {
342 sizeof(GLES2_FragmentSrc_TextureYUVJPEGSrc_),
343 GLES2_FragmentSrc_TextureYUVJPEGSrc_
346static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT601Src = {
349 sizeof(GLES2_FragmentSrc_TextureYUVBT601Src_),
350 GLES2_FragmentSrc_TextureYUVBT601Src_
353static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT709Src = {
356 sizeof(GLES2_FragmentSrc_TextureYUVBT709Src_),
357 GLES2_FragmentSrc_TextureYUVBT709Src_
360static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12JPEGSrc = {
363 sizeof(GLES2_FragmentSrc_TextureNV12JPEGSrc_),
364 GLES2_FragmentSrc_TextureNV12JPEGSrc_
367static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT601Src = {
370 sizeof(GLES2_FragmentSrc_TextureNV12BT601Src_),
371 GLES2_FragmentSrc_TextureNV12BT601Src_
374static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT709Src = {
377 sizeof(GLES2_FragmentSrc_TextureNV21BT709Src_),
378 GLES2_FragmentSrc_TextureNV21BT709Src_
381static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21JPEGSrc = {
384 sizeof(GLES2_FragmentSrc_TextureNV21JPEGSrc_),
385 GLES2_FragmentSrc_TextureNV21JPEGSrc_
388static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT601Src = {
391 sizeof(GLES2_FragmentSrc_TextureNV21BT601Src_),
392 GLES2_FragmentSrc_TextureNV21BT601Src_
395static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT709Src = {
398 sizeof(GLES2_FragmentSrc_TextureNV12BT709Src_),
399 GLES2_FragmentSrc_TextureNV12BT709Src_
402static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureExternalOESSrc = {
405 sizeof(GLES2_FragmentSrc_TextureExternalOESSrc_),
406 GLES2_FragmentSrc_TextureExternalOESSrc_
414static GLES2_Shader GLES2_VertexShader_Default = {
417 &GLES2_VertexSrc_Default
421static GLES2_Shader GLES2_FragmentShader_SolidSrc = {
424 &GLES2_FragmentSrc_SolidSrc
428static GLES2_Shader GLES2_FragmentShader_TextureABGRSrc = {
431 &GLES2_FragmentSrc_TextureABGRSrc
435static GLES2_Shader GLES2_FragmentShader_TextureARGBSrc = {
438 &GLES2_FragmentSrc_TextureARGBSrc
442static GLES2_Shader GLES2_FragmentShader_TextureRGBSrc = {
445 &GLES2_FragmentSrc_TextureRGBSrc
449static GLES2_Shader GLES2_FragmentShader_TextureBGRSrc = {
452 &GLES2_FragmentSrc_TextureBGRSrc
456static GLES2_Shader GLES2_FragmentShader_TextureYUVJPEGSrc = {
459 &GLES2_FragmentSrc_TextureYUVJPEGSrc
463static GLES2_Shader GLES2_FragmentShader_TextureYUVBT601Src = {
466 &GLES2_FragmentSrc_TextureYUVBT601Src
470static GLES2_Shader GLES2_FragmentShader_TextureYUVBT709Src = {
473 &GLES2_FragmentSrc_TextureYUVBT709Src
477static GLES2_Shader GLES2_FragmentShader_TextureNV12JPEGSrc = {
480 &GLES2_FragmentSrc_TextureNV12JPEGSrc
484static GLES2_Shader GLES2_FragmentShader_TextureNV12BT601Src = {
487 &GLES2_FragmentSrc_TextureNV12BT601Src
491static GLES2_Shader GLES2_FragmentShader_TextureNV12BT709Src = {
494 &GLES2_FragmentSrc_TextureNV12BT709Src
498static GLES2_Shader GLES2_FragmentShader_TextureNV21JPEGSrc = {
501 &GLES2_FragmentSrc_TextureNV21JPEGSrc
505static GLES2_Shader GLES2_FragmentShader_TextureNV21BT601Src = {
508 &GLES2_FragmentSrc_TextureNV21BT601Src
512static GLES2_Shader GLES2_FragmentShader_TextureNV21BT709Src = {
515 &GLES2_FragmentSrc_TextureNV21BT709Src
519static GLES2_Shader GLES2_FragmentShader_TextureExternalOESSrc = {
522 &GLES2_FragmentSrc_TextureExternalOESSrc
531const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType
type)
534 case GLES2_SHADER_VERTEX_DEFAULT:
535 return &GLES2_VertexShader_Default;
536 case GLES2_SHADER_FRAGMENT_SOLID_SRC:
537 return &GLES2_FragmentShader_SolidSrc;
538 case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC:
539 return &GLES2_FragmentShader_TextureABGRSrc;
540 case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC:
541 return &GLES2_FragmentShader_TextureARGBSrc;
542 case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC:
543 return &GLES2_FragmentShader_TextureRGBSrc;
544 case GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC:
545 return &GLES2_FragmentShader_TextureBGRSrc;
546 case GLES2_SHADER_FRAGMENT_TEXTURE_YUV_JPEG_SRC:
547 return &GLES2_FragmentShader_TextureYUVJPEGSrc;
548 case GLES2_SHADER_FRAGMENT_TEXTURE_YUV_BT601_SRC:
549 return &GLES2_FragmentShader_TextureYUVBT601Src;
550 case GLES2_SHADER_FRAGMENT_TEXTURE_YUV_BT709_SRC:
551 return &GLES2_FragmentShader_TextureYUVBT709Src;
552 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_JPEG_SRC:
553 return &GLES2_FragmentShader_TextureNV12JPEGSrc;
554 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_BT601_SRC:
555 return &GLES2_FragmentShader_TextureNV12BT601Src;
556 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_BT709_SRC:
557 return &GLES2_FragmentShader_TextureNV12BT709Src;
558 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_JPEG_SRC:
559 return &GLES2_FragmentShader_TextureNV21JPEGSrc;
560 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_BT601_SRC:
561 return &GLES2_FragmentShader_TextureNV21BT601Src;
562 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_BT709_SRC:
563 return &GLES2_FragmentShader_TextureNV21BT709Src;
564 case GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES_SRC:
565 return &GLES2_FragmentShader_TextureExternalOESSrc;
GLuint GLuint GLsizei GLenum type
#define GL_FRAGMENT_SHADER