Atlas - SDL_shaders_gles2.c
Home / ext / SDL2 / src / render / opengles2 Lines: 82 | Size: 19888 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)][FILE BEGIN]1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2018 Sam Lantinga <[email protected]> 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 34static 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 55static 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 65static 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 */ 79static 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 */ 96static 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 */ 114static 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 */ 228static const Uint8 GLES2_FragmentSrc_TextureYUVJPEGSrc_[] = \ 229 YUV_SHADER_PROLOGUE \ 230 JPEG_SHADER_CONSTANTS \ 231 YUV_SHADER_BODY \ 232; 233static const Uint8 GLES2_FragmentSrc_TextureYUVBT601Src_[] = \ 234 YUV_SHADER_PROLOGUE \ 235 BT601_SHADER_CONSTANTS \ 236 YUV_SHADER_BODY \ 237; 238static const Uint8 GLES2_FragmentSrc_TextureYUVBT709Src_[] = \ 239 YUV_SHADER_PROLOGUE \ 240 BT709_SHADER_CONSTANTS \ 241 YUV_SHADER_BODY \ 242; 243 244/* NV12 to ABGR conversion */ 245static const Uint8 GLES2_FragmentSrc_TextureNV12JPEGSrc_[] = \ 246 YUV_SHADER_PROLOGUE \ 247 JPEG_SHADER_CONSTANTS \ 248 NV12_SHADER_BODY \ 249; 250static const Uint8 GLES2_FragmentSrc_TextureNV12BT601Src_[] = \ 251 YUV_SHADER_PROLOGUE \ 252 BT601_SHADER_CONSTANTS \ 253 NV12_SHADER_BODY \ 254; 255static const Uint8 GLES2_FragmentSrc_TextureNV12BT709Src_[] = \ 256 YUV_SHADER_PROLOGUE \ 257 BT709_SHADER_CONSTANTS \ 258 NV12_SHADER_BODY \ 259; 260 261/* NV21 to ABGR conversion */ 262static const Uint8 GLES2_FragmentSrc_TextureNV21JPEGSrc_[] = \ 263 YUV_SHADER_PROLOGUE \ 264 JPEG_SHADER_CONSTANTS \ 265 NV21_SHADER_BODY \ 266; 267static const Uint8 GLES2_FragmentSrc_TextureNV21BT601Src_[] = \ 268 YUV_SHADER_PROLOGUE \ 269 BT601_SHADER_CONSTANTS \ 270 NV21_SHADER_BODY \ 271; 272static 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 */ 279static 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 293static const GLES2_ShaderInstance GLES2_VertexSrc_Default = { 294 GL_VERTEX_SHADER, 295 GLES2_SOURCE_SHADER, 296 sizeof(GLES2_VertexSrc_Default_), 297 GLES2_VertexSrc_Default_ 298}; 299 300static const GLES2_ShaderInstance GLES2_FragmentSrc_SolidSrc = { 301 GL_FRAGMENT_SHADER, 302 GLES2_SOURCE_SHADER, 303 sizeof(GLES2_FragmentSrc_SolidSrc_), 304 GLES2_FragmentSrc_SolidSrc_ 305}; 306 307static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureABGRSrc = { 308 GL_FRAGMENT_SHADER, 309 GLES2_SOURCE_SHADER, 310 sizeof(GLES2_FragmentSrc_TextureABGRSrc_), 311 GLES2_FragmentSrc_TextureABGRSrc_ 312}; 313 314static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureARGBSrc = { 315 GL_FRAGMENT_SHADER, 316 GLES2_SOURCE_SHADER, 317 sizeof(GLES2_FragmentSrc_TextureARGBSrc_), 318 GLES2_FragmentSrc_TextureARGBSrc_ 319}; 320 321static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureRGBSrc = { 322 GL_FRAGMENT_SHADER, 323 GLES2_SOURCE_SHADER, 324 sizeof(GLES2_FragmentSrc_TextureRGBSrc_), 325 GLES2_FragmentSrc_TextureRGBSrc_ 326}; 327 328static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureBGRSrc = { 329 GL_FRAGMENT_SHADER, 330 GLES2_SOURCE_SHADER, 331 sizeof(GLES2_FragmentSrc_TextureBGRSrc_), 332 GLES2_FragmentSrc_TextureBGRSrc_ 333}; 334 335static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVJPEGSrc = { 336 GL_FRAGMENT_SHADER, 337 GLES2_SOURCE_SHADER, 338 sizeof(GLES2_FragmentSrc_TextureYUVJPEGSrc_), 339 GLES2_FragmentSrc_TextureYUVJPEGSrc_ 340}; 341 342static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT601Src = { 343 GL_FRAGMENT_SHADER, 344 GLES2_SOURCE_SHADER, 345 sizeof(GLES2_FragmentSrc_TextureYUVBT601Src_), 346 GLES2_FragmentSrc_TextureYUVBT601Src_ 347}; 348 349static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureYUVBT709Src = { 350 GL_FRAGMENT_SHADER, 351 GLES2_SOURCE_SHADER, 352 sizeof(GLES2_FragmentSrc_TextureYUVBT709Src_), 353 GLES2_FragmentSrc_TextureYUVBT709Src_ 354}; 355 356static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12JPEGSrc = { 357 GL_FRAGMENT_SHADER, 358 GLES2_SOURCE_SHADER, 359 sizeof(GLES2_FragmentSrc_TextureNV12JPEGSrc_), 360 GLES2_FragmentSrc_TextureNV12JPEGSrc_ 361}; 362 363static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT601Src = { 364 GL_FRAGMENT_SHADER, 365 GLES2_SOURCE_SHADER, 366 sizeof(GLES2_FragmentSrc_TextureNV12BT601Src_), 367 GLES2_FragmentSrc_TextureNV12BT601Src_ 368}; 369 370static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT709Src = { 371 GL_FRAGMENT_SHADER, 372 GLES2_SOURCE_SHADER, 373 sizeof(GLES2_FragmentSrc_TextureNV21BT709Src_), 374 GLES2_FragmentSrc_TextureNV21BT709Src_ 375}; 376 377static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21JPEGSrc = { 378 GL_FRAGMENT_SHADER, 379 GLES2_SOURCE_SHADER, 380 sizeof(GLES2_FragmentSrc_TextureNV21JPEGSrc_), 381 GLES2_FragmentSrc_TextureNV21JPEGSrc_ 382}; 383 384static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV21BT601Src = { 385 GL_FRAGMENT_SHADER, 386 GLES2_SOURCE_SHADER, 387 sizeof(GLES2_FragmentSrc_TextureNV21BT601Src_), 388 GLES2_FragmentSrc_TextureNV21BT601Src_ 389}; 390 391static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureNV12BT709Src = { 392 GL_FRAGMENT_SHADER, 393 GLES2_SOURCE_SHADER, 394 sizeof(GLES2_FragmentSrc_TextureNV12BT709Src_), 395 GLES2_FragmentSrc_TextureNV12BT709Src_ 396}; 397 398static const GLES2_ShaderInstance GLES2_FragmentSrc_TextureExternalOESSrc = { 399 GL_FRAGMENT_SHADER, 400 GLES2_SOURCE_SHADER, 401 sizeof(GLES2_FragmentSrc_TextureExternalOESSrc_), 402 GLES2_FragmentSrc_TextureExternalOESSrc_ 403}; 404 405 406/************************************************************************************************* 407 * Vertex/fragment shader definitions * 408 *************************************************************************************************/ 409 410static GLES2_Shader GLES2_VertexShader_Default = { 411 1, 412 { 413 &GLES2_VertexSrc_Default 414 } 415}; 416 417static GLES2_Shader GLES2_FragmentShader_SolidSrc = { 418 1, 419 { 420 &GLES2_FragmentSrc_SolidSrc 421 } 422}; 423 424static GLES2_Shader GLES2_FragmentShader_TextureABGRSrc = { 425 1, 426 { 427 &GLES2_FragmentSrc_TextureABGRSrc 428 } 429}; 430 431static GLES2_Shader GLES2_FragmentShader_TextureARGBSrc = { 432 1, 433 { 434 &GLES2_FragmentSrc_TextureARGBSrc 435 } 436}; 437 438static GLES2_Shader GLES2_FragmentShader_TextureRGBSrc = { 439 1, 440 { 441 &GLES2_FragmentSrc_TextureRGBSrc 442 } 443}; 444 445static GLES2_Shader GLES2_FragmentShader_TextureBGRSrc = { 446 1, 447 { 448 &GLES2_FragmentSrc_TextureBGRSrc 449 } 450}; 451 452static GLES2_Shader GLES2_FragmentShader_TextureYUVJPEGSrc = { 453 1, 454 { 455 &GLES2_FragmentSrc_TextureYUVJPEGSrc 456 } 457}; 458 459static GLES2_Shader GLES2_FragmentShader_TextureYUVBT601Src = { 460 1, 461 { 462 &GLES2_FragmentSrc_TextureYUVBT601Src 463 } 464}; 465 466static GLES2_Shader GLES2_FragmentShader_TextureYUVBT709Src = { 467 1, 468 { 469 &GLES2_FragmentSrc_TextureYUVBT709Src 470 } 471}; 472 473static GLES2_Shader GLES2_FragmentShader_TextureNV12JPEGSrc = { 474 1, 475 { 476 &GLES2_FragmentSrc_TextureNV12JPEGSrc 477 } 478}; 479 480static GLES2_Shader GLES2_FragmentShader_TextureNV12BT601Src = { 481 1, 482 { 483 &GLES2_FragmentSrc_TextureNV12BT601Src 484 } 485}; 486 487static GLES2_Shader GLES2_FragmentShader_TextureNV12BT709Src = { 488 1, 489 { 490 &GLES2_FragmentSrc_TextureNV12BT709Src 491 } 492}; 493 494static GLES2_Shader GLES2_FragmentShader_TextureNV21JPEGSrc = { 495 1, 496 { 497 &GLES2_FragmentSrc_TextureNV21JPEGSrc 498 } 499}; 500 501static GLES2_Shader GLES2_FragmentShader_TextureNV21BT601Src = { 502 1, 503 { 504 &GLES2_FragmentSrc_TextureNV21BT601Src 505 } 506}; 507 508static GLES2_Shader GLES2_FragmentShader_TextureNV21BT709Src = { 509 1, 510 { 511 &GLES2_FragmentSrc_TextureNV21BT709Src 512 } 513}; 514 515static GLES2_Shader GLES2_FragmentShader_TextureExternalOESSrc = { 516 1, 517 { 518 &GLES2_FragmentSrc_TextureExternalOESSrc 519 } 520}; 521 522 523/************************************************************************************************* 524 * Shader selector * 525 *************************************************************************************************/ 526 527const 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: */ 570[FILE END](C) 2025 0x4248 (C) 2025 4248 Media and 4248 Systems, All part of 0x4248 See LICENCE files for more information. Not all files are by 0x4248 always check Licencing.