SDL  2.0
SDL_shaders_gles2.c
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
4 
5  This software is provided 'as-is', without any express or implied
6  warranty. In no event will the authors be held liable for any damages
7  arising from the use of this software.
8 
9  Permission is granted to anyone to use this software for any purpose,
10  including commercial applications, and to alter it and redistribute it
11  freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14  claim that you wrote the original software. If you use this software
15  in a product, an acknowledgment in the product documentation would be
16  appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 #include "../../SDL_internal.h"
22 
23 #if SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED
24 
25 #include "SDL_video.h"
26 #include "SDL_opengles2.h"
27 #include "SDL_shaders_gles2.h"
28 #include "SDL_stdinc.h"
29 
30 /*************************************************************************************************
31  * Vertex/fragment shader source *
32  *************************************************************************************************/
33 
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; \
41  \
42  void main() \
43  { \
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);\
51  gl_PointSize = 1.0; \
52  } \
53 ";
54 
55 static const Uint8 GLES2_FragmentSrc_SolidSrc_[] = " \
56  precision mediump float; \
57  uniform vec4 u_color; \
58  \
59  void main() \
60  { \
61  gl_FragColor = u_color; \
62  } \
63 ";
64 
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; \
70  \
71  void main() \
72  { \
73  gl_FragColor = texture2D(u_texture, v_texCoord); \
74  gl_FragColor *= u_modulation; \
75  } \
76 ";
77 
78 /* ARGB to ABGR conversion */
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; \
84  \
85  void main() \
86  { \
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; \
92  } \
93 ";
94 
95 /* RGB to ABGR conversion */
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; \
101  \
102  void main() \
103  { \
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; \
110  } \
111 ";
112 
113 /* BGR to ABGR conversion */
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; \
119  \
120  void main() \
121  { \
122  vec4 abgr = texture2D(u_texture, v_texCoord); \
123  gl_FragColor = abgr; \
124  gl_FragColor.a = 1.0; \
125  gl_FragColor *= u_modulation; \
126  } \
127 ";
128 
129 #define JPEG_SHADER_CONSTANTS \
130 "// YUV offset \n" \
131 "const vec3 offset = vec3(0, -0.501960814, -0.501960814);\n" \
132 "\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" \
137 
138 #define BT601_SHADER_CONSTANTS \
139 "// YUV offset \n" \
140 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \
141 "\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" \
146 
147 #define BT709_SHADER_CONSTANTS \
148 "// YUV offset \n" \
149 "const vec3 offset = vec3(-0.0627451017, -0.501960814, -0.501960814);\n" \
150 "\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" \
155 
156 
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" \
164 "\n" \
165 
166 #define YUV_SHADER_BODY \
167 "\n" \
168 "void main()\n" \
169 "{\n" \
170 " mediump vec3 yuv;\n" \
171 " lowp vec3 rgb;\n" \
172 "\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" \
177 "\n" \
178 " // Do the color transform \n" \
179 " yuv += offset;\n" \
180 " rgb = matrix * yuv;\n" \
181 "\n" \
182 " // That was easy. :) \n" \
183 " gl_FragColor = vec4(rgb, 1);\n" \
184 " gl_FragColor *= u_modulation;\n" \
185 "}" \
186 
187 #define NV12_SHADER_BODY \
188 "\n" \
189 "void main()\n" \
190 "{\n" \
191 " mediump vec3 yuv;\n" \
192 " lowp vec3 rgb;\n" \
193 "\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" \
197 "\n" \
198 " // Do the color transform \n" \
199 " yuv += offset;\n" \
200 " rgb = matrix * yuv;\n" \
201 "\n" \
202 " // That was easy. :) \n" \
203 " gl_FragColor = vec4(rgb, 1);\n" \
204 " gl_FragColor *= u_modulation;\n" \
205 "}" \
206 
207 #define NV21_SHADER_BODY \
208 "\n" \
209 "void main()\n" \
210 "{\n" \
211 " mediump vec3 yuv;\n" \
212 " lowp vec3 rgb;\n" \
213 "\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" \
217 "\n" \
218 " // Do the color transform \n" \
219 " yuv += offset;\n" \
220 " rgb = matrix * yuv;\n" \
221 "\n" \
222 " // That was easy. :) \n" \
223 " gl_FragColor = vec4(rgb, 1);\n" \
224 " gl_FragColor *= u_modulation;\n" \
225 "}" \
226 
227 /* YUV to ABGR conversion */
228 static const Uint8 GLES2_FragmentSrc_TextureYUVJPEGSrc_[] = \
229  YUV_SHADER_PROLOGUE \
230  JPEG_SHADER_CONSTANTS \
231  YUV_SHADER_BODY \
232 ;
233 static const Uint8 GLES2_FragmentSrc_TextureYUVBT601Src_[] = \
234  YUV_SHADER_PROLOGUE \
235  BT601_SHADER_CONSTANTS \
236  YUV_SHADER_BODY \
237 ;
238 static const Uint8 GLES2_FragmentSrc_TextureYUVBT709Src_[] = \
239  YUV_SHADER_PROLOGUE \
240  BT709_SHADER_CONSTANTS \
241  YUV_SHADER_BODY \
242 ;
243 
244 /* NV12 to ABGR conversion */
245 static const Uint8 GLES2_FragmentSrc_TextureNV12JPEGSrc_[] = \
246  YUV_SHADER_PROLOGUE \
247  JPEG_SHADER_CONSTANTS \
248  NV12_SHADER_BODY \
249 ;
250 static const Uint8 GLES2_FragmentSrc_TextureNV12BT601Src_[] = \
251  YUV_SHADER_PROLOGUE \
252  BT601_SHADER_CONSTANTS \
253  NV12_SHADER_BODY \
254 ;
255 static const Uint8 GLES2_FragmentSrc_TextureNV12BT709Src_[] = \
256  YUV_SHADER_PROLOGUE \
257  BT709_SHADER_CONSTANTS \
258  NV12_SHADER_BODY \
259 ;
260 
261 /* NV21 to ABGR conversion */
262 static const Uint8 GLES2_FragmentSrc_TextureNV21JPEGSrc_[] = \
263  YUV_SHADER_PROLOGUE \
264  JPEG_SHADER_CONSTANTS \
265  NV21_SHADER_BODY \
266 ;
267 static const Uint8 GLES2_FragmentSrc_TextureNV21BT601Src_[] = \
268  YUV_SHADER_PROLOGUE \
269  BT601_SHADER_CONSTANTS \
270  NV21_SHADER_BODY \
271 ;
272 static const Uint8 GLES2_FragmentSrc_TextureNV21BT709Src_[] = \
273  YUV_SHADER_PROLOGUE \
274  BT709_SHADER_CONSTANTS \
275  NV21_SHADER_BODY \
276 ;
277 
278 /* Custom Android video format texture */
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; \
285  \
286  void main() \
287  { \
288  gl_FragColor = texture2D(u_texture, v_texCoord); \
289  gl_FragColor *= u_modulation; \
290  } \
291 ";
292 
293 static const GLES2_ShaderInstance GLES2_VertexSrc_Default = {
295  GLES2_SOURCE_SHADER,
296  sizeof(GLES2_VertexSrc_Default_),
297  GLES2_VertexSrc_Default_
298 };
299 
300 static const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = {
302  GLES2_SOURCE_SHADER,
303  sizeof(GLES2_FragmentSrc_SolidSrc_),
304  GLES2_FragmentSrc_SolidSrc_
305 };
306 
307 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureABGRSrc = {
309  GLES2_SOURCE_SHADER,
310  sizeof(GLES2_FragmentSrc_TextureABGRSrc_),
311  GLES2_FragmentSrc_TextureABGRSrc_
312 };
313 
314 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureARGBSrc = {
316  GLES2_SOURCE_SHADER,
317  sizeof(GLES2_FragmentSrc_TextureARGBSrc_),
318  GLES2_FragmentSrc_TextureARGBSrc_
319 };
320 
321 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureRGBSrc = {
323  GLES2_SOURCE_SHADER,
324  sizeof(GLES2_FragmentSrc_TextureRGBSrc_),
325  GLES2_FragmentSrc_TextureRGBSrc_
326 };
327 
328 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureBGRSrc = {
330  GLES2_SOURCE_SHADER,
331  sizeof(GLES2_FragmentSrc_TextureBGRSrc_),
332  GLES2_FragmentSrc_TextureBGRSrc_
333 };
334 
335 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVJPEGSrc = {
337  GLES2_SOURCE_SHADER,
338  sizeof(GLES2_FragmentSrc_TextureYUVJPEGSrc_),
339  GLES2_FragmentSrc_TextureYUVJPEGSrc_
340 };
341 
342 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT601Src = {
344  GLES2_SOURCE_SHADER,
345  sizeof(GLES2_FragmentSrc_TextureYUVBT601Src_),
346  GLES2_FragmentSrc_TextureYUVBT601Src_
347 };
348 
349 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT709Src = {
351  GLES2_SOURCE_SHADER,
352  sizeof(GLES2_FragmentSrc_TextureYUVBT709Src_),
353  GLES2_FragmentSrc_TextureYUVBT709Src_
354 };
355 
356 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12JPEGSrc = {
358  GLES2_SOURCE_SHADER,
359  sizeof(GLES2_FragmentSrc_TextureNV12JPEGSrc_),
360  GLES2_FragmentSrc_TextureNV12JPEGSrc_
361 };
362 
363 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT601Src = {
365  GLES2_SOURCE_SHADER,
366  sizeof(GLES2_FragmentSrc_TextureNV12BT601Src_),
367  GLES2_FragmentSrc_TextureNV12BT601Src_
368 };
369 
370 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT709Src = {
372  GLES2_SOURCE_SHADER,
373  sizeof(GLES2_FragmentSrc_TextureNV21BT709Src_),
374  GLES2_FragmentSrc_TextureNV21BT709Src_
375 };
376 
377 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21JPEGSrc = {
379  GLES2_SOURCE_SHADER,
380  sizeof(GLES2_FragmentSrc_TextureNV21JPEGSrc_),
381  GLES2_FragmentSrc_TextureNV21JPEGSrc_
382 };
383 
384 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT601Src = {
386  GLES2_SOURCE_SHADER,
387  sizeof(GLES2_FragmentSrc_TextureNV21BT601Src_),
388  GLES2_FragmentSrc_TextureNV21BT601Src_
389 };
390 
391 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT709Src = {
393  GLES2_SOURCE_SHADER,
394  sizeof(GLES2_FragmentSrc_TextureNV12BT709Src_),
395  GLES2_FragmentSrc_TextureNV12BT709Src_
396 };
397 
398 static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureExternalOESSrc = {
400  GLES2_SOURCE_SHADER,
401  sizeof(GLES2_FragmentSrc_TextureExternalOESSrc_),
402  GLES2_FragmentSrc_TextureExternalOESSrc_
403 };
404 
405 
406 /*************************************************************************************************
407  * Vertex/fragment shader definitions *
408  *************************************************************************************************/
409 
410 static GLES2_Shader GLES2_VertexShader_Default = {
411  1,
412  {
413  &GLES2_VertexSrc_Default
414  }
415 };
416 
417 static GLES2_Shader GLES2_FragmentShader_SolidSrc = {
418  1,
419  {
420  &GLES2_FragmentSrc_SolidSrc
421  }
422 };
423 
424 static GLES2_Shader GLES2_FragmentShader_TextureABGRSrc = {
425  1,
426  {
427  &GLES2_FragmentSrc_TextureABGRSrc
428  }
429 };
430 
431 static GLES2_Shader GLES2_FragmentShader_TextureARGBSrc = {
432  1,
433  {
434  &GLES2_FragmentSrc_TextureARGBSrc
435  }
436 };
437 
438 static GLES2_Shader GLES2_FragmentShader_TextureRGBSrc = {
439  1,
440  {
441  &GLES2_FragmentSrc_TextureRGBSrc
442  }
443 };
444 
445 static GLES2_Shader GLES2_FragmentShader_TextureBGRSrc = {
446  1,
447  {
448  &GLES2_FragmentSrc_TextureBGRSrc
449  }
450 };
451 
452 static GLES2_Shader GLES2_FragmentShader_TextureYUVJPEGSrc = {
453  1,
454  {
455  &GLES2_FragmentSrc_TextureYUVJPEGSrc
456  }
457 };
458 
459 static GLES2_Shader GLES2_FragmentShader_TextureYUVBT601Src = {
460  1,
461  {
462  &GLES2_FragmentSrc_TextureYUVBT601Src
463  }
464 };
465 
466 static GLES2_Shader GLES2_FragmentShader_TextureYUVBT709Src = {
467  1,
468  {
469  &GLES2_FragmentSrc_TextureYUVBT709Src
470  }
471 };
472 
473 static GLES2_Shader GLES2_FragmentShader_TextureNV12JPEGSrc = {
474  1,
475  {
476  &GLES2_FragmentSrc_TextureNV12JPEGSrc
477  }
478 };
479 
480 static GLES2_Shader GLES2_FragmentShader_TextureNV12BT601Src = {
481  1,
482  {
483  &GLES2_FragmentSrc_TextureNV12BT601Src
484  }
485 };
486 
487 static GLES2_Shader GLES2_FragmentShader_TextureNV12BT709Src = {
488  1,
489  {
490  &GLES2_FragmentSrc_TextureNV12BT709Src
491  }
492 };
493 
494 static GLES2_Shader GLES2_FragmentShader_TextureNV21JPEGSrc = {
495  1,
496  {
497  &GLES2_FragmentSrc_TextureNV21JPEGSrc
498  }
499 };
500 
501 static GLES2_Shader GLES2_FragmentShader_TextureNV21BT601Src = {
502  1,
503  {
504  &GLES2_FragmentSrc_TextureNV21BT601Src
505  }
506 };
507 
508 static GLES2_Shader GLES2_FragmentShader_TextureNV21BT709Src = {
509  1,
510  {
511  &GLES2_FragmentSrc_TextureNV21BT709Src
512  }
513 };
514 
515 static GLES2_Shader GLES2_FragmentShader_TextureExternalOESSrc = {
516  1,
517  {
518  &GLES2_FragmentSrc_TextureExternalOESSrc
519  }
520 };
521 
522 
523 /*************************************************************************************************
524  * Shader selector *
525  *************************************************************************************************/
526 
527 const GLES2_Shader *GLES2_GetShader(GLES2_ShaderType type)
528 {
529  switch (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;
562  default:
563  return NULL;
564  }
565 }
566 
567 #endif /* SDL_VIDEO_RENDER_OGL_ES2 && !SDL_RENDER_DISABLED */
568 
569 /* vi: set ts=4 sw=4 expandtab: */
#define GL_VERTEX_SHADER
uint8_t Uint8
Definition: SDL_stdinc.h:157
#define GL_FRAGMENT_SHADER
#define NULL
Definition: begin_code.h:164
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571