21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED
39 static 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);\
59 static const Uint8 GLES2_FragmentSrc_SolidSrc_[] =
" \
60 precision mediump float; \
61 uniform vec4 u_color; \
65 gl_FragColor = u_color; \
69 static const Uint8 GLES2_FragmentSrc_TextureABGRSrc_[] =
" \
70 precision mediump float; \
71 uniform sampler2D u_texture; \
72 uniform vec4 u_modulation; \
73 varying vec2 v_texCoord; \
77 gl_FragColor = texture2D(u_texture, v_texCoord); \
78 gl_FragColor *= u_modulation; \
83 static const Uint8 GLES2_FragmentSrc_TextureARGBSrc_[] =
" \
84 precision mediump float; \
85 uniform sampler2D u_texture; \
86 uniform vec4 u_modulation; \
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_modulation; \
100 static const Uint8 GLES2_FragmentSrc_TextureRGBSrc_[] =
" \
101 precision mediump float; \
102 uniform sampler2D u_texture; \
103 uniform vec4 u_modulation; \
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_modulation; \
118 static const Uint8 GLES2_FragmentSrc_TextureBGRSrc_[] =
" \
119 precision mediump float; \
120 uniform sampler2D u_texture; \
121 uniform vec4 u_modulation; \
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_modulation; \
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_modulation;\n" \
167 "varying vec2 v_texCoord;\n" \
170 #define YUV_SHADER_BODY \
174 " mediump vec3 yuv;\n" \
175 " lowp vec3 rgb;\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" \
183 " yuv += offset;\n" \
184 " rgb = matrix * yuv;\n" \
186 " // That was easy. :) \n" \
187 " gl_FragColor = vec4(rgb, 1);\n" \
188 " gl_FragColor *= u_modulation;\n" \
191 #define NV12_SHADER_BODY \
195 " mediump vec3 yuv;\n" \
196 " lowp vec3 rgb;\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" \
203 " yuv += offset;\n" \
204 " rgb = matrix * yuv;\n" \
206 " // That was easy. :) \n" \
207 " gl_FragColor = vec4(rgb, 1);\n" \
208 " gl_FragColor *= u_modulation;\n" \
211 #define NV21_SHADER_BODY \
215 " mediump vec3 yuv;\n" \
216 " lowp vec3 rgb;\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" \
223 " yuv += offset;\n" \
224 " rgb = matrix * yuv;\n" \
226 " // That was easy. :) \n" \
227 " gl_FragColor = vec4(rgb, 1);\n" \
228 " gl_FragColor *= u_modulation;\n" \
232 static const Uint8 GLES2_FragmentSrc_TextureYUVJPEGSrc_[] = \
233 YUV_SHADER_PROLOGUE \
234 JPEG_SHADER_CONSTANTS \
237 static const Uint8 GLES2_FragmentSrc_TextureYUVBT601Src_[] = \
238 YUV_SHADER_PROLOGUE \
239 BT601_SHADER_CONSTANTS \
242 static const Uint8 GLES2_FragmentSrc_TextureYUVBT709Src_[] = \
243 YUV_SHADER_PROLOGUE \
244 BT709_SHADER_CONSTANTS \
249 static const Uint8 GLES2_FragmentSrc_TextureNV12JPEGSrc_[] = \
250 YUV_SHADER_PROLOGUE \
251 JPEG_SHADER_CONSTANTS \
254 static const Uint8 GLES2_FragmentSrc_TextureNV12BT601Src_[] = \
255 YUV_SHADER_PROLOGUE \
256 BT601_SHADER_CONSTANTS \
259 static const Uint8 GLES2_FragmentSrc_TextureNV12BT709Src_[] = \
260 YUV_SHADER_PROLOGUE \
261 BT709_SHADER_CONSTANTS \
266 static const Uint8 GLES2_FragmentSrc_TextureNV21JPEGSrc_[] = \
267 YUV_SHADER_PROLOGUE \
268 JPEG_SHADER_CONSTANTS \
271 static const Uint8 GLES2_FragmentSrc_TextureNV21BT601Src_[] = \
272 YUV_SHADER_PROLOGUE \
273 BT601_SHADER_CONSTANTS \
276 static const Uint8 GLES2_FragmentSrc_TextureNV21BT709Src_[] = \
277 YUV_SHADER_PROLOGUE \
278 BT709_SHADER_CONSTANTS \
283 static 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_modulation; \
288 varying vec2 v_texCoord; \
292 gl_FragColor = texture2D(u_texture, v_texCoord); \
293 gl_FragColor *= u_modulation; \
297 static const GLES2_ShaderInstance GLES2_VertexSrc_Default = {
300 sizeof(GLES2_VertexSrc_Default_),
301 GLES2_VertexSrc_Default_
304 static const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = {
307 sizeof(GLES2_FragmentSrc_SolidSrc_),
308 GLES2_FragmentSrc_SolidSrc_
311 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureABGRSrc = {
314 sizeof(GLES2_FragmentSrc_TextureABGRSrc_),
315 GLES2_FragmentSrc_TextureABGRSrc_
318 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureARGBSrc = {
321 sizeof(GLES2_FragmentSrc_TextureARGBSrc_),
322 GLES2_FragmentSrc_TextureARGBSrc_
325 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureRGBSrc = {
328 sizeof(GLES2_FragmentSrc_TextureRGBSrc_),
329 GLES2_FragmentSrc_TextureRGBSrc_
332 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureBGRSrc = {
335 sizeof(GLES2_FragmentSrc_TextureBGRSrc_),
336 GLES2_FragmentSrc_TextureBGRSrc_
339 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVJPEGSrc = {
342 sizeof(GLES2_FragmentSrc_TextureYUVJPEGSrc_),
343 GLES2_FragmentSrc_TextureYUVJPEGSrc_
346 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT601Src = {
349 sizeof(GLES2_FragmentSrc_TextureYUVBT601Src_),
350 GLES2_FragmentSrc_TextureYUVBT601Src_
353 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT709Src = {
356 sizeof(GLES2_FragmentSrc_TextureYUVBT709Src_),
357 GLES2_FragmentSrc_TextureYUVBT709Src_
360 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12JPEGSrc = {
363 sizeof(GLES2_FragmentSrc_TextureNV12JPEGSrc_),
364 GLES2_FragmentSrc_TextureNV12JPEGSrc_
367 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT601Src = {
370 sizeof(GLES2_FragmentSrc_TextureNV12BT601Src_),
371 GLES2_FragmentSrc_TextureNV12BT601Src_
374 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT709Src = {
377 sizeof(GLES2_FragmentSrc_TextureNV21BT709Src_),
378 GLES2_FragmentSrc_TextureNV21BT709Src_
381 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21JPEGSrc = {
384 sizeof(GLES2_FragmentSrc_TextureNV21JPEGSrc_),
385 GLES2_FragmentSrc_TextureNV21JPEGSrc_
388 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT601Src = {
391 sizeof(GLES2_FragmentSrc_TextureNV21BT601Src_),
392 GLES2_FragmentSrc_TextureNV21BT601Src_
395 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT709Src = {
398 sizeof(GLES2_FragmentSrc_TextureNV12BT709Src_),
399 GLES2_FragmentSrc_TextureNV12BT709Src_
402 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureExternalOESSrc = {
405 sizeof(GLES2_FragmentSrc_TextureExternalOESSrc_),
406 GLES2_FragmentSrc_TextureExternalOESSrc_
414 static GLES2_Shader GLES2_VertexShader_Default = {
417 &GLES2_VertexSrc_Default
421 static GLES2_Shader GLES2_FragmentShader_SolidSrc = {
424 &GLES2_FragmentSrc_SolidSrc
428 static GLES2_Shader GLES2_FragmentShader_TextureABGRSrc = {
431 &GLES2_FragmentSrc_TextureABGRSrc
435 static GLES2_Shader GLES2_FragmentShader_TextureARGBSrc = {
438 &GLES2_FragmentSrc_TextureARGBSrc
442 static GLES2_Shader GLES2_FragmentShader_TextureRGBSrc = {
445 &GLES2_FragmentSrc_TextureRGBSrc
449 static GLES2_Shader GLES2_FragmentShader_TextureBGRSrc = {
452 &GLES2_FragmentSrc_TextureBGRSrc
456 static GLES2_Shader GLES2_FragmentShader_TextureYUVJPEGSrc = {
459 &GLES2_FragmentSrc_TextureYUVJPEGSrc
463 static GLES2_Shader GLES2_FragmentShader_TextureYUVBT601Src = {
466 &GLES2_FragmentSrc_TextureYUVBT601Src
470 static GLES2_Shader GLES2_FragmentShader_TextureYUVBT709Src = {
473 &GLES2_FragmentSrc_TextureYUVBT709Src
477 static GLES2_Shader GLES2_FragmentShader_TextureNV12JPEGSrc = {
480 &GLES2_FragmentSrc_TextureNV12JPEGSrc
484 static GLES2_Shader GLES2_FragmentShader_TextureNV12BT601Src = {
487 &GLES2_FragmentSrc_TextureNV12BT601Src
491 static GLES2_Shader GLES2_FragmentShader_TextureNV12BT709Src = {
494 &GLES2_FragmentSrc_TextureNV12BT709Src
498 static GLES2_Shader GLES2_FragmentShader_TextureNV21JPEGSrc = {
501 &GLES2_FragmentSrc_TextureNV21JPEGSrc
505 static GLES2_Shader GLES2_FragmentShader_TextureNV21BT601Src = {
508 &GLES2_FragmentSrc_TextureNV21BT601Src
512 static GLES2_Shader GLES2_FragmentShader_TextureNV21BT709Src = {
515 &GLES2_FragmentSrc_TextureNV21BT709Src
519 static GLES2_Shader GLES2_FragmentShader_TextureExternalOESSrc = {
522 &GLES2_FragmentSrc_TextureExternalOESSrc
531 const 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;
#define GL_FRAGMENT_SHADER
GLuint GLuint GLsizei GLenum type