Atlas - SDL_shaders_gles2.c

Home / ext / SDL / src / render / opengles2 Lines: 297 | Size: 23995 bytes [Download] [Show on GitHub] [Search similar files] [Raw] [Raw (proxy)]
[FILE BEGIN]
1/* 2 Simple DirectMedia Layer 3 Copyright (C) 1997-2025 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#ifdef SDL_VIDEO_RENDER_OGL_ES2 24 25#include <SDL3/SDL_opengles2.h> 26#include "SDL_shaders_gles2.h" 27 28/* *INDENT-OFF* */ // clang-format off 29 30/************************************************************************************************* 31 * Vertex/fragment shader source * 32 *************************************************************************************************/ 33 34static const char GLES2_Fragment_Include_Best_Texture_Precision[] = 35"#ifdef GL_FRAGMENT_PRECISION_HIGH\n" 36"#define SDL_TEXCOORD_PRECISION highp\n" 37"#else\n" 38"#define SDL_TEXCOORD_PRECISION mediump\n" 39"#endif\n" 40"\n" 41"precision mediump float;\n" 42"\n" 43; 44 45static const char GLES2_Fragment_Include_Medium_Texture_Precision[] = 46"#define SDL_TEXCOORD_PRECISION mediump\n" 47"precision mediump float;\n" 48"\n" 49; 50 51static const char GLES2_Fragment_Include_High_Texture_Precision[] = 52"#define SDL_TEXCOORD_PRECISION highp\n" 53"precision mediump float;\n" 54"\n" 55; 56 57static const char GLES2_Fragment_Include_Undef_Precision[] = 58"#define mediump\n" 59"#define highp\n" 60"#define lowp\n" 61"#define SDL_TEXCOORD_PRECISION\n" 62"\n" 63; 64 65static const char GLES2_Vertex_Default[] = 66"uniform mat4 u_projection;\n" 67"attribute vec2 a_position;\n" 68"attribute vec4 a_color;\n" 69"attribute vec2 a_texCoord;\n" 70"varying vec2 v_texCoord;\n" 71"varying vec4 v_color;\n" 72"\n" 73"void main()\n" 74"{\n" 75" v_texCoord = a_texCoord;\n" 76" gl_Position = u_projection * vec4(a_position, 0.0, 1.0);\n" 77" gl_PointSize = 1.0;\n" 78" v_color = a_color;\n" 79"}\n" 80; 81 82static const char GLES2_Fragment_Solid[] = 83"varying mediump vec4 v_color;\n" 84"\n" 85"void main()\n" 86"{\n" 87" gl_FragColor = v_color;\n" 88"}\n" 89; 90 91#define RGB_SHADER_PROLOGUE \ 92"uniform sampler2D u_texture;\n" \ 93"varying mediump vec4 v_color;\n" \ 94"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \ 95 96#define RGB_PIXELART_SHADER_PROLOGUE \ 97"uniform sampler2D u_texture;\n" \ 98"uniform mediump vec4 u_texel_size;\n" \ 99"varying mediump vec4 v_color;\n" \ 100"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \ 101 102#define PALETTE_SHADER_PROLOGUE \ 103"uniform sampler2D u_texture;\n" \ 104"uniform sampler2D u_palette;\n" \ 105"uniform mediump vec4 u_texel_size;\n" \ 106"varying mediump vec4 v_color;\n" \ 107"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \ 108 109// Implementation with thanks from bgolus: 110// https://discussions.unity.com/t/how-to-make-data-shader-support-bilinear-trilinear/598639/8 111#define PALETTE_SHADER_FUNCTIONS \ 112"mediump vec4 SamplePaletteNearest(SDL_TEXCOORD_PRECISION vec2 uv)\n" \ 113"{\n" \ 114" mediump float index = texture2D(u_texture, uv).r * 255.0;\n" \ 115" return texture2D(u_palette, vec2((index + 0.5) / 256.0, 0.5));\n" \ 116"}\n" \ 117"\n" \ 118"mediump vec4 SamplePaletteLinear(SDL_TEXCOORD_PRECISION vec2 uv)\n" \ 119"{\n" \ 120" // scale & offset uvs to integer values at texel centers\n" \ 121" SDL_TEXCOORD_PRECISION vec2 uv_texels = uv * u_texel_size.zw + 0.5;\n" \ 122"\n" \ 123" // get uvs for the center of the 4 surrounding texels by flooring\n" \ 124" SDL_TEXCOORD_PRECISION vec4 uv_min_max = vec4((floor(uv_texels) - 0.5) * u_texel_size.xy, (floor(uv_texels) + 0.5) * u_texel_size.xy);\n" \ 125"\n" \ 126" // blend factor\n" \ 127" SDL_TEXCOORD_PRECISION vec2 uv_frac = fract(uv_texels);\n" \ 128"\n" \ 129" // sample all 4 texels\n" \ 130" mediump vec4 texelA = SamplePaletteNearest(uv_min_max.xy);\n" \ 131" mediump vec4 texelB = SamplePaletteNearest(uv_min_max.xw);\n" \ 132" mediump vec4 texelC = SamplePaletteNearest(uv_min_max.zy);\n" \ 133" mediump vec4 texelD = SamplePaletteNearest(uv_min_max.zw);\n" \ 134"\n" \ 135" // bilinear interpolation\n" \ 136" return mix(mix(texelA, texelB, uv_frac.y), mix(texelC, texelD, uv_frac.y), uv_frac.x);\n" \ 137"}\n" \ 138"\n" 139 140#ifdef OPENGLES_300 // This is required for fwidth() and textureGrad() 141#define PIXELART_SHADER_FUNCTIONS \ 142"SDL_TEXCOORD_PRECISION vec2 GetPixelArtUV(SDL_TEXCOORD_PRECISION vec2 uv)\n" \ 143"{\n" \ 144" SDL_TEXCOORD_PRECISION vec2 boxSize = clamp(fwidth(uv) * u_texel_size.zw, 1e-5, 1.0);\n" \ 145" SDL_TEXCOORD_PRECISION vec2 tx = uv * u_texel_size.zw - 0.5 * boxSize;\n" \ 146" SDL_TEXCOORD_PRECISION vec2 txOffset = smoothstep(vec2(1.0) - boxSize, vec2(1.0), fract(tx));\n" \ 147" return (floor(tx) + 0.5 + txOffset) * u_texel_size.xy;\n" \ 148"}\n" \ 149"\n" \ 150"mediump vec4 GetPixelArtSample(vec2 uv)\n" \ 151"{\n" \ 152" return textureGrad(u_texture, GetPixelArtUV(uv), dFdx(v_texCoord), dFdy(v_texCoord));\n" \ 153"}\n" \ 154"\n" 155#else 156#define PIXELART_SHADER_FUNCTIONS \ 157"mediump vec4 GetPixelArtSample(vec2 uv)\n" \ 158"{\n" \ 159" return texture2D(u_texture, uv);\n" \ 160"}\n" \ 161"\n" 162#endif 163 164static const char GLES2_Fragment_TexturePalette_Nearest[] = 165 PALETTE_SHADER_PROLOGUE 166 PALETTE_SHADER_FUNCTIONS 167"\n" 168"void main()\n" 169"{\n" 170" mediump vec4 color = SamplePaletteNearest(v_texCoord);\n" 171" gl_FragColor = color;\n" 172" gl_FragColor *= v_color;\n" 173"}\n" 174; 175 176static const char GLES2_Fragment_TexturePalette_Nearest_Colorswap[] = 177 PALETTE_SHADER_PROLOGUE 178 PALETTE_SHADER_FUNCTIONS 179"\n" 180"void main()\n" 181"{\n" 182" mediump vec4 color = SamplePaletteNearest(v_texCoord);\n" 183" gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n" 184" gl_FragColor *= v_color;\n" 185"}\n" 186; 187 188static const char GLES2_Fragment_TexturePalette_Linear[] = 189 PALETTE_SHADER_PROLOGUE 190 PALETTE_SHADER_FUNCTIONS 191"\n" 192"void main()\n" 193"{\n" 194" mediump vec4 color = SamplePaletteLinear(v_texCoord);\n" 195" gl_FragColor = color;\n" 196" gl_FragColor *= v_color;\n" 197"}\n" 198; 199 200static const char GLES2_Fragment_TexturePalette_Linear_Colorswap[] = 201 PALETTE_SHADER_PROLOGUE 202 PALETTE_SHADER_FUNCTIONS 203"\n" 204"void main()\n" 205"{\n" 206" mediump vec4 color = SamplePaletteLinear(v_texCoord);\n" 207" gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n" 208" gl_FragColor *= v_color;\n" 209"}\n" 210; 211 212static const char GLES2_Fragment_TexturePalette_PixelArt[] = 213 PALETTE_SHADER_PROLOGUE 214 PALETTE_SHADER_FUNCTIONS 215 PIXELART_SHADER_FUNCTIONS 216"\n" 217"void main()\n" 218"{\n" 219#ifdef OPENGLES_300 220" mediump vec4 color = SamplePaletteLinear(GetPixelArtUV(v_texCoord));\n" 221#else 222" mediump vec4 color = SamplePaletteNearest(v_texCoord);\n" 223#endif 224" gl_FragColor = color;\n" 225" gl_FragColor *= v_color;\n" 226"}\n" 227; 228 229static const char GLES2_Fragment_TexturePalette_PixelArt_Colorswap[] = 230 PALETTE_SHADER_PROLOGUE 231 PALETTE_SHADER_FUNCTIONS 232 PIXELART_SHADER_FUNCTIONS 233"\n" 234"void main()\n" 235"{\n" 236#ifdef OPENGLES_300 237" mediump vec4 color = SamplePaletteLinear(GetPixelArtUV(v_texCoord));\n" 238#else 239" mediump vec4 color = SamplePaletteNearest(v_texCoord);\n" 240#endif 241" gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n" 242" gl_FragColor *= v_color;\n" 243"}\n" 244; 245 246// RGB to ABGR conversion 247static const char GLES2_Fragment_TextureRGB[] = 248 RGB_SHADER_PROLOGUE 249"\n" 250"void main()\n" 251"{\n" 252" mediump vec4 color = texture2D(u_texture, v_texCoord);\n" 253" gl_FragColor = vec4(color.b, color.g, color.r, 1.0);\n" 254" gl_FragColor *= v_color;\n" 255"}\n" 256; 257 258// RGB to ABGR conversion 259static const char GLES2_Fragment_TextureRGB_PixelArt[] = 260 RGB_PIXELART_SHADER_PROLOGUE 261 PIXELART_SHADER_FUNCTIONS 262"\n" 263"void main()\n" 264"{\n" 265" mediump vec4 color = GetPixelArtSample(v_texCoord);\n" 266" gl_FragColor = vec4(color.b, color.g, color.r, 1.0);\n" 267" gl_FragColor *= v_color;\n" 268"}\n" 269; 270 271// BGR to ABGR conversion 272static const char GLES2_Fragment_TextureBGR[] = 273 RGB_SHADER_PROLOGUE 274"\n" 275"void main()\n" 276"{\n" 277" mediump vec4 color = texture2D(u_texture, v_texCoord);\n" 278" gl_FragColor = vec4(color.r, color.g, color.b, 1.0);\n" 279" gl_FragColor *= v_color;\n" 280"}\n" 281; 282 283// BGR to ABGR conversion 284static const char GLES2_Fragment_TextureBGR_PixelArt[] = 285 RGB_PIXELART_SHADER_PROLOGUE 286 PIXELART_SHADER_FUNCTIONS 287"\n" 288"void main()\n" 289"{\n" 290" mediump vec4 color = GetPixelArtSample(v_texCoord);\n" 291" gl_FragColor = vec4(color.r, color.g, color.b, 1.0);\n" 292" gl_FragColor *= v_color;\n" 293"}\n" 294; 295 296// ARGB to ABGR conversion 297static const char GLES2_Fragment_TextureARGB[] = 298 RGB_SHADER_PROLOGUE 299"\n" 300"void main()\n" 301"{\n" 302" mediump vec4 color = texture2D(u_texture, v_texCoord);\n" 303" gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n" 304" gl_FragColor *= v_color;\n" 305"}\n" 306; 307 308// ARGB to ABGR conversion 309static const char GLES2_Fragment_TextureARGB_PixelArt[] = 310 RGB_PIXELART_SHADER_PROLOGUE 311 PIXELART_SHADER_FUNCTIONS 312"\n" 313"void main()\n" 314"{\n" 315" mediump vec4 color = GetPixelArtSample(v_texCoord);\n" 316" gl_FragColor = vec4(color.b, color.g, color.r, color.a);\n" 317" gl_FragColor *= v_color;\n" 318"}\n" 319; 320 321static const char GLES2_Fragment_TextureABGR[] = 322 RGB_SHADER_PROLOGUE 323"\n" 324"void main()\n" 325"{\n" 326" mediump vec4 color = texture2D(u_texture, v_texCoord);\n" 327" gl_FragColor = color;\n" 328" gl_FragColor *= v_color;\n" 329"}\n" 330; 331 332static const char GLES2_Fragment_TextureABGR_PixelArt[] = 333 RGB_PIXELART_SHADER_PROLOGUE 334 PIXELART_SHADER_FUNCTIONS 335"\n" 336"void main()\n" 337"{\n" 338" mediump vec4 color = GetPixelArtSample(v_texCoord);\n" 339" gl_FragColor = color;\n" 340" gl_FragColor *= v_color;\n" 341"}\n" 342; 343 344#ifdef SDL_HAVE_YUV 345 346#define YUV_SHADER_PROLOGUE \ 347"uniform sampler2D u_texture;\n" \ 348"uniform sampler2D u_texture_u;\n" \ 349"uniform sampler2D u_texture_v;\n" \ 350"uniform vec3 u_offset;\n" \ 351"uniform mat3 u_matrix;\n" \ 352"varying mediump vec4 v_color;\n" \ 353"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" \ 354"\n" \ 355 356#define YUV_SHADER_BODY \ 357"void main()\n" \ 358"{\n" \ 359" mediump vec3 yuv;\n" \ 360" lowp vec3 rgb;\n" \ 361"\n" \ 362" // Get the YUV values \n" \ 363" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \ 364" yuv.y = texture2D(u_texture_u, v_texCoord).r;\n" \ 365" yuv.z = texture2D(u_texture_v, v_texCoord).r;\n" \ 366"\n" \ 367" // Do the color transform \n" \ 368" yuv += u_offset;\n" \ 369" rgb = yuv * u_matrix;\n" \ 370"\n" \ 371" // That was easy. :) \n" \ 372" gl_FragColor = vec4(rgb, 1);\n" \ 373" gl_FragColor *= v_color;\n" \ 374"}" \ 375 376#define NV12_RA_SHADER_BODY \ 377"void main()\n" \ 378"{\n" \ 379" mediump vec3 yuv;\n" \ 380" lowp vec3 rgb;\n" \ 381"\n" \ 382" // Get the YUV values \n" \ 383" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \ 384" yuv.yz = texture2D(u_texture_u, v_texCoord).ra;\n" \ 385"\n" \ 386" // Do the color transform \n" \ 387" yuv += u_offset;\n" \ 388" rgb = yuv * u_matrix;\n" \ 389"\n" \ 390" // That was easy. :) \n" \ 391" gl_FragColor = vec4(rgb, 1);\n" \ 392" gl_FragColor *= v_color;\n" \ 393"}" \ 394 395#define NV12_RG_SHADER_BODY \ 396"void main()\n" \ 397"{\n" \ 398" mediump vec3 yuv;\n" \ 399" lowp vec3 rgb;\n" \ 400"\n" \ 401" // Get the YUV values \n" \ 402" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \ 403" yuv.yz = texture2D(u_texture_u, v_texCoord).rg;\n" \ 404"\n" \ 405" // Do the color transform \n" \ 406" yuv += u_offset;\n" \ 407" rgb = yuv * u_matrix;\n" \ 408"\n" \ 409" // That was easy. :) \n" \ 410" gl_FragColor = vec4(rgb, 1);\n" \ 411" gl_FragColor *= v_color;\n" \ 412"}" \ 413 414#define NV21_RA_SHADER_BODY \ 415"void main()\n" \ 416"{\n" \ 417" mediump vec3 yuv;\n" \ 418" lowp vec3 rgb;\n" \ 419"\n" \ 420" // Get the YUV values \n" \ 421" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \ 422" yuv.yz = texture2D(u_texture_u, v_texCoord).ar;\n" \ 423"\n" \ 424" // Do the color transform \n" \ 425" yuv += u_offset;\n" \ 426" rgb = yuv * u_matrix;\n" \ 427"\n" \ 428" // That was easy. :) \n" \ 429" gl_FragColor = vec4(rgb, 1);\n" \ 430" gl_FragColor *= v_color;\n" \ 431"}" \ 432 433#define NV21_RG_SHADER_BODY \ 434"void main()\n" \ 435"{\n" \ 436" mediump vec3 yuv;\n" \ 437" lowp vec3 rgb;\n" \ 438"\n" \ 439" // Get the YUV values \n" \ 440" yuv.x = texture2D(u_texture, v_texCoord).r;\n" \ 441" yuv.yz = texture2D(u_texture_u, v_texCoord).gr;\n" \ 442"\n" \ 443" // Do the color transform \n" \ 444" yuv += u_offset;\n" \ 445" rgb = yuv * u_matrix;\n" \ 446"\n" \ 447" // That was easy. :) \n" \ 448" gl_FragColor = vec4(rgb, 1);\n" \ 449" gl_FragColor *= v_color;\n" \ 450"}" \ 451 452// YUV to ABGR conversion 453static const char GLES2_Fragment_TextureYUV[] = 454 YUV_SHADER_PROLOGUE 455 YUV_SHADER_BODY 456; 457 458// NV12 to ABGR conversion 459static const char GLES2_Fragment_TextureNV12_RA[] = 460 YUV_SHADER_PROLOGUE 461 NV12_RA_SHADER_BODY 462; 463static const char GLES2_Fragment_TextureNV12_RG[] = 464 YUV_SHADER_PROLOGUE 465 NV12_RG_SHADER_BODY 466; 467 468// NV21 to ABGR conversion 469static const char GLES2_Fragment_TextureNV21_RA[] = 470 YUV_SHADER_PROLOGUE 471 NV21_RA_SHADER_BODY 472; 473static const char GLES2_Fragment_TextureNV21_RG[] = 474 YUV_SHADER_PROLOGUE 475 NV21_RG_SHADER_BODY 476; 477#endif 478 479// Custom Android video format texture 480static const char GLES2_Fragment_TextureExternalOES_Prologue[] = 481"#extension GL_OES_EGL_image_external : require\n" 482"\n" 483; 484static const char GLES2_Fragment_TextureExternalOES[] = 485"uniform samplerExternalOES u_texture;\n" 486"varying mediump vec4 v_color;\n" 487"varying SDL_TEXCOORD_PRECISION vec2 v_texCoord;\n" 488"\n" 489"void main()\n" 490"{\n" 491" gl_FragColor = texture2D(u_texture, v_texCoord);\n" 492" gl_FragColor *= v_color;\n" 493"}\n" 494; 495 496/* *INDENT-ON* */ // clang-format on 497 498/************************************************************************************************* 499 * Shader selector * 500 *************************************************************************************************/ 501 502const char *GLES2_GetShaderPrologue(GLES2_ShaderType type) 503{ 504 switch (type) { 505 case GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES: 506 return GLES2_Fragment_TextureExternalOES_Prologue; 507 default: 508 return ""; 509 } 510} 511 512const char *GLES2_GetShaderInclude(GLES2_ShaderIncludeType type) 513{ 514 switch (type) { 515 case GLES2_SHADER_FRAGMENT_INCLUDE_UNDEF_PRECISION: 516 return GLES2_Fragment_Include_Undef_Precision; 517 case GLES2_SHADER_FRAGMENT_INCLUDE_BEST_TEXCOORD_PRECISION: 518 return GLES2_Fragment_Include_Best_Texture_Precision; 519 case GLES2_SHADER_FRAGMENT_INCLUDE_MEDIUM_TEXCOORD_PRECISION: 520 return GLES2_Fragment_Include_Medium_Texture_Precision; 521 case GLES2_SHADER_FRAGMENT_INCLUDE_HIGH_TEXCOORD_PRECISION: 522 return GLES2_Fragment_Include_High_Texture_Precision; 523 default: 524 return ""; 525 } 526} 527 528GLES2_ShaderIncludeType GLES2_GetTexCoordPrecisionEnumFromHint(void) 529{ 530 const char *texcoord_hint = SDL_GetHint("SDL_RENDER_OPENGLES2_TEXCOORD_PRECISION"); 531 GLES2_ShaderIncludeType value = GLES2_SHADER_FRAGMENT_INCLUDE_BEST_TEXCOORD_PRECISION; 532 if (texcoord_hint) { 533 if (SDL_strcmp(texcoord_hint, "undefined") == 0) { 534 return GLES2_SHADER_FRAGMENT_INCLUDE_UNDEF_PRECISION; 535 } 536 if (SDL_strcmp(texcoord_hint, "high") == 0) { 537 return GLES2_SHADER_FRAGMENT_INCLUDE_HIGH_TEXCOORD_PRECISION; 538 } 539 if (SDL_strcmp(texcoord_hint, "medium") == 0) { 540 return GLES2_SHADER_FRAGMENT_INCLUDE_MEDIUM_TEXCOORD_PRECISION; 541 } 542 } 543 return value; 544} 545 546const char *GLES2_GetShader(GLES2_ShaderType type) 547{ 548 switch (type) { 549 case GLES2_SHADER_VERTEX_DEFAULT: 550 return GLES2_Vertex_Default; 551 case GLES2_SHADER_FRAGMENT_SOLID: 552 return GLES2_Fragment_Solid; 553 case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST: 554 return GLES2_Fragment_TexturePalette_Nearest; 555 case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR: 556 return GLES2_Fragment_TexturePalette_Linear; 557 case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART: 558 return GLES2_Fragment_TexturePalette_PixelArt; 559 case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_NEAREST_COLORSWAP: 560 return GLES2_Fragment_TexturePalette_Nearest_Colorswap; 561 case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_LINEAR_COLORSWAP: 562 return GLES2_Fragment_TexturePalette_Linear_Colorswap; 563 case GLES2_SHADER_FRAGMENT_TEXTURE_PALETTE_PIXELART_COLORSWAP: 564 return GLES2_Fragment_TexturePalette_PixelArt_Colorswap; 565 case GLES2_SHADER_FRAGMENT_TEXTURE_RGB: 566 return GLES2_Fragment_TextureRGB; 567 case GLES2_SHADER_FRAGMENT_TEXTURE_RGB_PIXELART: 568 return GLES2_Fragment_TextureRGB_PixelArt; 569 case GLES2_SHADER_FRAGMENT_TEXTURE_BGR: 570 return GLES2_Fragment_TextureBGR; 571 case GLES2_SHADER_FRAGMENT_TEXTURE_BGR_PIXELART: 572 return GLES2_Fragment_TextureBGR_PixelArt; 573 case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB: 574 return GLES2_Fragment_TextureARGB; 575 case GLES2_SHADER_FRAGMENT_TEXTURE_ARGB_PIXELART: 576 return GLES2_Fragment_TextureARGB_PixelArt; 577 case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR: 578 return GLES2_Fragment_TextureABGR; 579 case GLES2_SHADER_FRAGMENT_TEXTURE_ABGR_PIXELART: 580 return GLES2_Fragment_TextureABGR_PixelArt; 581#ifdef SDL_HAVE_YUV 582 case GLES2_SHADER_FRAGMENT_TEXTURE_YUV: 583 return GLES2_Fragment_TextureYUV; 584 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RA: 585 return GLES2_Fragment_TextureNV12_RA; 586 case GLES2_SHADER_FRAGMENT_TEXTURE_NV12_RG: 587 return GLES2_Fragment_TextureNV12_RG; 588 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_RA: 589 return GLES2_Fragment_TextureNV21_RA; 590 case GLES2_SHADER_FRAGMENT_TEXTURE_NV21_RG: 591 return GLES2_Fragment_TextureNV21_RG; 592#endif 593 case GLES2_SHADER_FRAGMENT_TEXTURE_EXTERNAL_OES: 594 return GLES2_Fragment_TextureExternalOES; 595 default: 596 return NULL; 597 } 598} 599 600#endif // SDL_VIDEO_RENDER_OGL_ES2 601
[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.