21 #include "../../SDL_internal.h" 23 #if SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED 34 static const Uint8 GLES2_VertexSrc_Default_[] =
" \ 35 uniform mat4 u_projection; \ 36 attribute vec2 a_position; \ 37 attribute vec2 a_texCoord; \ 38 attribute float a_angle; \ 39 attribute vec2 a_center; \ 40 varying vec2 v_texCoord; \ 44 float angle = radians(a_angle); \ 45 float c = cos(angle); \ 46 float s = sin(angle); \ 47 mat2 rotationMatrix = mat2(c, -s, s, c); \ 48 vec2 position = rotationMatrix * (a_position - a_center) + a_center; \ 49 v_texCoord = a_texCoord; \ 50 gl_Position = u_projection * vec4(position, 0.0, 1.0);\ 55 static const Uint8 GLES2_FragmentSrc_SolidSrc_[] =
" \ 56 precision mediump float; \ 57 uniform vec4 u_color; \ 61 gl_FragColor = u_color; \ 65 static const Uint8 GLES2_FragmentSrc_TextureABGRSrc_[] =
" \ 66 precision mediump float; \ 67 uniform sampler2D u_texture; \ 68 uniform vec4 u_modulation; \ 69 varying vec2 v_texCoord; \ 73 gl_FragColor = texture2D(u_texture, v_texCoord); \ 74 gl_FragColor *= u_modulation; \ 79 static const Uint8 GLES2_FragmentSrc_TextureARGBSrc_[] =
" \ 80 precision mediump float; \ 81 uniform sampler2D u_texture; \ 82 uniform vec4 u_modulation; \ 83 varying vec2 v_texCoord; \ 87 vec4 abgr = texture2D(u_texture, v_texCoord); \ 88 gl_FragColor = abgr; \ 89 gl_FragColor.r = abgr.b; \ 90 gl_FragColor.b = abgr.r; \ 91 gl_FragColor *= u_modulation; \ 96 static const Uint8 GLES2_FragmentSrc_TextureRGBSrc_[] =
" \ 97 precision mediump float; \ 98 uniform sampler2D u_texture; \ 99 uniform vec4 u_modulation; \ 100 varying vec2 v_texCoord; \ 104 vec4 abgr = texture2D(u_texture, v_texCoord); \ 105 gl_FragColor = abgr; \ 106 gl_FragColor.r = abgr.b; \ 107 gl_FragColor.b = abgr.r; \ 108 gl_FragColor.a = 1.0; \ 109 gl_FragColor *= u_modulation; \ 114 static const Uint8 GLES2_FragmentSrc_TextureBGRSrc_[] =
" \ 115 precision mediump float; \ 116 uniform sampler2D u_texture; \ 117 uniform vec4 u_modulation; \ 118 varying vec2 v_texCoord; \ 122 vec4 abgr = texture2D(u_texture, v_texCoord); \ 123 gl_FragColor = abgr; \ 124 gl_FragColor.a = 1.0; \ 125 gl_FragColor *= u_modulation; \ 129 #define JPEG_SHADER_CONSTANTS \ 131 "const vec3 offset = vec3(0, -0.501960814, -0.501960814);\n" \ 133 "// RGB coefficients \n" \ 134 "const mat3 matrix = mat3( 1, 1, 1,\n" \ 135 " 0, -0.3441, 1.772,\n" \ 136 " 1.402, -0.7141, 0);\n" \ 138 #define BT601_SHADER_CONSTANTS \ 140 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \ 142 "// RGB coefficients \n" \ 143 "const mat3 matrix = mat3( 1.1644, 1.1644, 1.1644,\n" \ 144 " 0, -0.3918, 2.0172,\n" \ 145 " 1.596, -0.813, 0);\n" \ 147 #define BT709_SHADER_CONSTANTS \ 149 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \ 151 "// RGB coefficients \n" \ 152 "const mat3 matrix = mat3( 1.1644, 1.1644, 1.1644,\n" \ 153 " 0, -0.2132, 2.1124,\n" \ 154 " 1.7927, -0.5329, 0);\n" \ 157 #define YUV_SHADER_PROLOGUE \ 158 "precision mediump float;\n" \ 159 "uniform sampler2D u_texture;\n" \ 160 "uniform sampler2D u_texture_u;\n" \ 161 "uniform sampler2D u_texture_v;\n" \ 162 "uniform vec4 u_modulation;\n" \ 163 "varying vec2 v_texCoord;\n" \ 166 #define YUV_SHADER_BODY \ 170 " mediump vec3 yuv;\n" \ 171 " lowp vec3 rgb;\n" \ 173 " // Get the YUV values \n" \ 174 " yuv.x = texture2D(u_texture, v_texCoord).r;\n" \ 175 " yuv.y = texture2D(u_texture_u, v_texCoord).r;\n" \ 176 " yuv.z = texture2D(u_texture_v, v_texCoord).r;\n" \ 178 " // Do the color transform \n" \ 179 " yuv += offset;\n" \ 180 " rgb = matrix * yuv;\n" \ 182 " // That was easy. :) \n" \ 183 " gl_FragColor = vec4(rgb, 1);\n" \ 184 " gl_FragColor *= u_modulation;\n" \ 187 #define NV12_SHADER_BODY \ 191 " mediump vec3 yuv;\n" \ 192 " lowp vec3 rgb;\n" \ 194 " // Get the YUV values \n" \ 195 " yuv.x = texture2D(u_texture, v_texCoord).r;\n" \ 196 " yuv.yz = texture2D(u_texture_u, v_texCoord).ra;\n" \ 198 " // Do the color transform \n" \ 199 " yuv += offset;\n" \ 200 " rgb = matrix * yuv;\n" \ 202 " // That was easy. :) \n" \ 203 " gl_FragColor = vec4(rgb, 1);\n" \ 204 " gl_FragColor *= u_modulation;\n" \ 207 #define NV21_SHADER_BODY \ 211 " mediump vec3 yuv;\n" \ 212 " lowp vec3 rgb;\n" \ 214 " // Get the YUV values \n" \ 215 " yuv.x = texture2D(u_texture, v_texCoord).r;\n" \ 216 " yuv.yz = texture2D(u_texture_u, v_texCoord).ar;\n" \ 218 " // Do the color transform \n" \ 219 " yuv += offset;\n" \ 220 " rgb = matrix * yuv;\n" \ 222 " // That was easy. :) \n" \ 223 " gl_FragColor = vec4(rgb, 1);\n" \ 224 " gl_FragColor *= u_modulation;\n" \ 228 static const Uint8 GLES2_FragmentSrc_TextureYUVJPEGSrc_[] = \
229 YUV_SHADER_PROLOGUE \
230 JPEG_SHADER_CONSTANTS \
233 static const Uint8 GLES2_FragmentSrc_TextureYUVBT601Src_[] = \
234 YUV_SHADER_PROLOGUE \
235 BT601_SHADER_CONSTANTS \
238 static const Uint8 GLES2_FragmentSrc_TextureYUVBT709Src_[] = \
239 YUV_SHADER_PROLOGUE \
240 BT709_SHADER_CONSTANTS \
245 static const Uint8 GLES2_FragmentSrc_TextureNV12JPEGSrc_[] = \
246 YUV_SHADER_PROLOGUE \
247 JPEG_SHADER_CONSTANTS \
250 static const Uint8 GLES2_FragmentSrc_TextureNV12BT601Src_[] = \
251 YUV_SHADER_PROLOGUE \
252 BT601_SHADER_CONSTANTS \
255 static const Uint8 GLES2_FragmentSrc_TextureNV12BT709Src_[] = \
256 YUV_SHADER_PROLOGUE \
257 BT709_SHADER_CONSTANTS \
262 static const Uint8 GLES2_FragmentSrc_TextureNV21JPEGSrc_[] = \
263 YUV_SHADER_PROLOGUE \
264 JPEG_SHADER_CONSTANTS \
267 static const Uint8 GLES2_FragmentSrc_TextureNV21BT601Src_[] = \
268 YUV_SHADER_PROLOGUE \
269 BT601_SHADER_CONSTANTS \
272 static const Uint8 GLES2_FragmentSrc_TextureNV21BT709Src_[] = \
273 YUV_SHADER_PROLOGUE \
274 BT709_SHADER_CONSTANTS \
279 static const Uint8 GLES2_FragmentSrc_TextureExternalOESSrc_[] =
" \ 280 #extension GL_OES_EGL_image_external : require\n\ 281 precision mediump float; \ 282 uniform samplerExternalOES u_texture; \ 283 uniform vec4 u_modulation; \ 284 varying vec2 v_texCoord; \ 288 gl_FragColor = texture2D(u_texture, v_texCoord); \ 289 gl_FragColor *= u_modulation; \ 293 static const GLES2_ShaderInstance GLES2_VertexSrc_Default = {
296 sizeof(GLES2_VertexSrc_Default_),
297 GLES2_VertexSrc_Default_
300 static const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = {
303 sizeof(GLES2_FragmentSrc_SolidSrc_),
304 GLES2_FragmentSrc_SolidSrc_
307 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureABGRSrc = {
310 sizeof(GLES2_FragmentSrc_TextureABGRSrc_),
311 GLES2_FragmentSrc_TextureABGRSrc_
314 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureARGBSrc = {
317 sizeof(GLES2_FragmentSrc_TextureARGBSrc_),
318 GLES2_FragmentSrc_TextureARGBSrc_
321 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureRGBSrc = {
324 sizeof(GLES2_FragmentSrc_TextureRGBSrc_),
325 GLES2_FragmentSrc_TextureRGBSrc_
328 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureBGRSrc = {
331 sizeof(GLES2_FragmentSrc_TextureBGRSrc_),
332 GLES2_FragmentSrc_TextureBGRSrc_
335 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVJPEGSrc = {
338 sizeof(GLES2_FragmentSrc_TextureYUVJPEGSrc_),
339 GLES2_FragmentSrc_TextureYUVJPEGSrc_
342 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT601Src = {
345 sizeof(GLES2_FragmentSrc_TextureYUVBT601Src_),
346 GLES2_FragmentSrc_TextureYUVBT601Src_
349 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT709Src = {
352 sizeof(GLES2_FragmentSrc_TextureYUVBT709Src_),
353 GLES2_FragmentSrc_TextureYUVBT709Src_
356 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12JPEGSrc = {
359 sizeof(GLES2_FragmentSrc_TextureNV12JPEGSrc_),
360 GLES2_FragmentSrc_TextureNV12JPEGSrc_
363 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT601Src = {
366 sizeof(GLES2_FragmentSrc_TextureNV12BT601Src_),
367 GLES2_FragmentSrc_TextureNV12BT601Src_
370 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT709Src = {
373 sizeof(GLES2_FragmentSrc_TextureNV21BT709Src_),
374 GLES2_FragmentSrc_TextureNV21BT709Src_
377 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21JPEGSrc = {
380 sizeof(GLES2_FragmentSrc_TextureNV21JPEGSrc_),
381 GLES2_FragmentSrc_TextureNV21JPEGSrc_
384 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT601Src = {
387 sizeof(GLES2_FragmentSrc_TextureNV21BT601Src_),
388 GLES2_FragmentSrc_TextureNV21BT601Src_
391 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT709Src = {
394 sizeof(GLES2_FragmentSrc_TextureNV12BT709Src_),
395 GLES2_FragmentSrc_TextureNV12BT709Src_
398 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureExternalOESSrc = {
401 sizeof(GLES2_FragmentSrc_TextureExternalOESSrc_),
402 GLES2_FragmentSrc_TextureExternalOESSrc_
410 static GLES2_Shader GLES2_VertexShader_Default = {
413 &GLES2_VertexSrc_Default
417 static GLES2_Shader GLES2_FragmentShader_SolidSrc = {
420 &GLES2_FragmentSrc_SolidSrc
424 static GLES2_Shader GLES2_FragmentShader_TextureABGRSrc = {
427 &GLES2_FragmentSrc_TextureABGRSrc
431 static GLES2_Shader GLES2_FragmentShader_TextureARGBSrc = {
434 &GLES2_FragmentSrc_TextureARGBSrc
438 static GLES2_Shader GLES2_FragmentShader_TextureRGBSrc = {
441 &GLES2_FragmentSrc_TextureRGBSrc
445 static GLES2_Shader GLES2_FragmentShader_TextureBGRSrc = {
448 &GLES2_FragmentSrc_TextureBGRSrc
452 static GLES2_Shader GLES2_FragmentShader_TextureYUVJPEGSrc = {
455 &GLES2_FragmentSrc_TextureYUVJPEGSrc
459 static GLES2_Shader GLES2_FragmentShader_TextureYUVBT601Src = {
462 &GLES2_FragmentSrc_TextureYUVBT601Src
466 static GLES2_Shader GLES2_FragmentShader_TextureYUVBT709Src = {
469 &GLES2_FragmentSrc_TextureYUVBT709Src
473 static GLES2_Shader GLES2_FragmentShader_TextureNV12JPEGSrc = {
476 &GLES2_FragmentSrc_TextureNV12JPEGSrc
480 static GLES2_Shader GLES2_FragmentShader_TextureNV12BT601Src = {
483 &GLES2_FragmentSrc_TextureNV12BT601Src
487 static GLES2_Shader GLES2_FragmentShader_TextureNV12BT709Src = {
490 &GLES2_FragmentSrc_TextureNV12BT709Src
494 static GLES2_Shader GLES2_FragmentShader_TextureNV21JPEGSrc = {
497 &GLES2_FragmentSrc_TextureNV21JPEGSrc
501 static GLES2_Shader GLES2_FragmentShader_TextureNV21BT601Src = {
504 &GLES2_FragmentSrc_TextureNV21BT601Src
508 static GLES2_Shader GLES2_FragmentShader_TextureNV21BT709Src = {
511 &GLES2_FragmentSrc_TextureNV21BT709Src
515 static GLES2_Shader GLES2_FragmentShader_TextureExternalOESSrc = {
518 &GLES2_FragmentSrc_TextureExternalOESSrc
527 const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType
type)
530 case GLES2_SHADER_VERTEX_DEFAULT:
531 return &GLES2_VertexShader_Default;
532 case GLES2_SHADER_FRAGMENT_SOLID_SRC:
533 return &GLES2_FragmentShader_SolidSrc;
534 case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_SRC:
535 return &GLES2_FragmentShader_TextureABGRSrc;
536 case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_SRC:
537 return &GLES2_FragmentShader_TextureARGBSrc;
538 case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_SRC:
539 return &GLES2_FragmentShader_TextureRGBSrc;
540 case GLES2_SHADER_FRAGMENT_TEXTURE_BGR_SRC:
541 return &GLES2_FragmentShader_TextureBGRSrc;
542 case GLES2_SHADER_FRAGMENT_TEXTURE_YUV_JPEG_SRC:
543 return &GLES2_FragmentShader_TextureYUVJPEGSrc;
544 case GLES2_SHADER_FRAGMENT_TEXTURE_YUV_BT601_SRC:
545 return &GLES2_FragmentShader_TextureYUVBT601Src;
546 case GLES2_SHADER_FRAGMENT_TEXTURE_YUV_BT709_SRC:
547 return &GLES2_FragmentShader_TextureYUVBT709Src;
548 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_JPEG_SRC:
549 return &GLES2_FragmentShader_TextureNV12JPEGSrc;
550 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_BT601_SRC:
551 return &GLES2_FragmentShader_TextureNV12BT601Src;
552 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_BT709_SRC:
553 return &GLES2_FragmentShader_TextureNV12BT709Src;
554 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_JPEG_SRC:
555 return &GLES2_FragmentShader_TextureNV21JPEGSrc;
556 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_BT601_SRC:
557 return &GLES2_FragmentShader_TextureNV21BT601Src;
558 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_BT709_SRC:
559 return &GLES2_FragmentShader_TextureNV21BT709Src;
560 case GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES_SRC:
561 return &GLES2_FragmentShader_TextureExternalOESSrc;
#define GL_FRAGMENT_SHADER
GLuint GLuint GLsizei GLenum type