gtk/gsk/gpu/shaders/common-gl.glsl
Benjamin Otte 19fccb13c3 gpu: GL < 4.0 needs the ifelse ladder for textures
GL 4.0 (section 4.1.7) allows dynamically uniform expressions as texture
indexes, GL 3.3 (again section 4.1.7) requires constants.

Related: #6401
2024-02-07 19:09:07 +01:00

446 lines
9.8 KiB
GLSL

precision highp float;
#if __VERSION__ < 420 || (defined(GSK_GLES) && __VERSION__ < 310)
layout(std140)
#else
layout(std140, binding = 0)
#endif
uniform PushConstants
{
mat4 mvp;
mat3x4 clip;
vec2 scale;
} push;
#define GSK_GLOBAL_MVP push.mvp
#define GSK_GLOBAL_CLIP push.clip
#define GSK_GLOBAL_CLIP_RECT push.clip[0]
#define GSK_GLOBAL_SCALE push.scale
#if __VERSION__ < 420 || (defined(GSK_GLES) && __VERSION__ < 310)
layout(std140)
#else
layout(std140, binding = 1)
#endif
uniform Floats
{
vec4 really_just_floats[1024];
} floats[11];
#if N_EXTERNAL_TEXTURES > 0
uniform samplerExternalOES external_textures[N_EXTERNAL_TEXTURES];
#endif
#if N_TEXTURES > 0
uniform sampler2D textures[N_TEXTURES];
#endif
#define GSK_VERTEX_INDEX gl_VertexID
#ifdef GSK_VERTEX_SHADER
#define IN(_loc) in
#define PASS(_loc) out
#define PASS_FLAT(_loc) flat out
#endif
#ifdef GSK_FRAGMENT_SHADER
#define PASS(_loc) in
#define PASS_FLAT(_loc) flat in
float
gsk_get_float (int id)
{
int float_id = id & 0x3FFFFF;
int array_id = (id >> 22) & 0xFF;
switch (array_id)
{
case 0:
return floats[0].really_just_floats[float_id >> 2][float_id & 3];
case 1:
return floats[1].really_just_floats[float_id >> 2][float_id & 3];
case 2:
return floats[2].really_just_floats[float_id >> 2][float_id & 3];
case 3:
return floats[3].really_just_floats[float_id >> 2][float_id & 3];
case 4:
return floats[4].really_just_floats[float_id >> 2][float_id & 3];
case 5:
return floats[5].really_just_floats[float_id >> 2][float_id & 3];
case 6:
return floats[6].really_just_floats[float_id >> 2][float_id & 3];
case 7:
return floats[7].really_just_floats[float_id >> 2][float_id & 3];
case 8:
return floats[8].really_just_floats[float_id >> 2][float_id & 3];
case 9:
return floats[9].really_just_floats[float_id >> 2][float_id & 3];
case 10:
return floats[10].really_just_floats[float_id >> 2][float_id & 3];
default:
return 0.0;
}
}
float
gsk_get_float (uint id)
{
return gsk_get_float (int (id));
}
#define gsk_get_int(id) (floatBitsToInt(gsk_get_float(id)))
#define gsk_get_uint(id) (floatBitsToUint(gsk_get_float(id)))
#if __VERSION__ < 400 || defined(GSK_GLES)
vec4
gsk_texture (uint id,
vec2 pos)
{
if ((id & 1u) != 0u)
{
switch (id >> 1u)
{
case 0u:
#if N_EXTERNAL_TEXTURES > 0
return texture (external_textures[0], pos);
#endif
#if N_EXTERNAL_TEXTURES > 1
case 1u:
return texture (external_textures[1], pos);
#endif
case 2u:
#if N_EXTERNAL_TEXTURES > 2
return texture (external_textures[2], pos);
#endif
case 3u:
#if N_EXTERNAL_TEXTURES > 3
return texture (external_textures[3], pos);
#endif
case 4u:
#if N_EXTERNAL_TEXTURES > 4
return texture (external_textures[4], pos);
#endif
case 5u:
#if N_EXTERNAL_TEXTURES > 5
return texture (external_textures[5], pos);
#endif
default:
break;
}
}
else
{
switch (id >> 1u)
{
case 0u:
#if N_TEXTURES > 0
return texture (textures[0], pos);
#endif
case 1u:
#if N_TEXTURES > 1
return texture (textures[1], pos);
#endif
case 2u:
#if N_TEXTURES > 2
return texture (textures[2], pos);
#endif
case 3u:
#if N_TEXTURES > 3
return texture (textures[3], pos);
#endif
case 4u:
#if N_TEXTURES > 4
return texture (textures[4], pos);
#endif
case 5u:
#if N_TEXTURES > 5
return texture (textures[5], pos);
#endif
case 6u:
#if N_TEXTURES > 6
return texture (textures[6], pos);
#endif
case 7u:
#if N_TEXTURES > 7
return texture (textures[7], pos);
#endif
case 8u:
#if N_TEXTURES > 8
return texture (textures[8], pos);
#endif
case 9u:
#if N_TEXTURES > 9
return texture (textures[9], pos);
#endif
case 10u:
#if N_TEXTURES > 10
return texture (textures[10], pos);
#endif
case 11u:
#if N_TEXTURES > 11
return texture (textures[11], pos);
#endif
case 12u:
#if N_TEXTURES > 12
return texture (textures[12], pos);
#endif
case 13u:
#if N_TEXTURES > 13
return texture (textures[13], pos);
#endif
case 14u:
#if N_TEXTURES > 14
return texture (textures[14], pos);
#endif
case 15u:
#if N_TEXTURES > 15
return texture (textures[15], pos);
#endif
default:
break;
}
}
return vec4 (1.0, 0.0, 0.8, 1.0);
}
ivec2
gsk_texture_size (uint id,
int lod)
{
if ((id & 1u) != 0u)
{
switch (id >> 1u)
{
case 0u:
#if N_EXTERNAL_TEXTURES > 0
return textureSize (external_textures[0], lod);
#endif
#if N_EXTERNAL_TEXTURES > 1
case 1u:
return textureSize (external_textures[1], lod);
#endif
case 2u:
#if N_EXTERNAL_TEXTURES > 2
return textureSize (external_textures[2], lod);
#endif
case 3u:
#if N_EXTERNAL_TEXTURES > 3
return textureSize (external_textures[3], lod);
#endif
case 4u:
#if N_EXTERNAL_TEXTURES > 4
return textureSize (external_textures[4], lod);
#endif
case 5u:
#if N_EXTERNAL_TEXTURES > 5
return textureSize (external_textures[5], lod);
#endif
default:
break;
}
}
else
{
switch (id >> 1u)
{
case 0u:
#if N_TEXTURES > 0
return textureSize (textures[0], lod);
#endif
case 1u:
#if N_TEXTURES > 1
return textureSize (textures[1], lod);
#endif
case 2u:
#if N_TEXTURES > 2
return textureSize (textures[2], lod);
#endif
case 3u:
#if N_TEXTURES > 3
return textureSize (textures[3], lod);
#endif
case 4u:
#if N_TEXTURES > 4
return textureSize (textures[4], lod);
#endif
case 5u:
#if N_TEXTURES > 5
return textureSize (textures[5], lod);
#endif
case 6u:
#if N_TEXTURES > 6
return textureSize (textures[6], lod);
#endif
case 7u:
#if N_TEXTURES > 7
return textureSize (textures[7], lod);
#endif
case 8u:
#if N_TEXTURES > 8
return textureSize (textures[8], lod);
#endif
case 9u:
#if N_TEXTURES > 9
return textureSize (textures[9], lod);
#endif
case 10u:
#if N_TEXTURES > 10
return textureSize (textures[10], lod);
#endif
case 11u:
#if N_TEXTURES > 11
return textureSize (textures[11], lod);
#endif
case 12u:
#if N_TEXTURES > 12
return textureSize (textures[12], lod);
#endif
case 13u:
#if N_TEXTURES > 13
return textureSize (textures[13], lod);
#endif
case 14u:
#if N_TEXTURES > 14
return textureSize (textures[14], lod);
#endif
case 15u:
#if N_TEXTURES > 15
return textureSize (textures[15], lod);
#endif
default:
break;
}
}
return ivec2 (1, 1);
}
vec4
gsk_texel_fetch (uint id,
ivec2 pos,
int lod)
{
if ((id & 1u) != 0u)
{
switch (id >> 1u)
{
case 0u:
#if N_EXTERNAL_TEXTURES > 0
return texelFetch (external_textures[0], pos, lod);
#endif
#if N_EXTERNAL_TEXTURES > 1
case 1u:
return texelFetch (external_textures[1], pos, lod);
#endif
case 2u:
#if N_EXTERNAL_TEXTURES > 2
return texelFetch (external_textures[2], pos, lod);
#endif
case 3u:
#if N_EXTERNAL_TEXTURES > 3
return texelFetch (external_textures[3], pos, lod);
#endif
case 4u:
#if N_EXTERNAL_TEXTURES > 4
return texelFetch (external_textures[4], pos, lod);
#endif
case 5u:
#if N_EXTERNAL_TEXTURES > 5
return texelFetch (external_textures[5], pos, lod);
#endif
default:
break;
}
}
else
{
switch (id >> 1u)
{
case 0u:
#if N_TEXTURES > 0
return texelFetch (textures[0], pos, lod);
#endif
case 1u:
#if N_TEXTURES > 1
return texelFetch (textures[1], pos, lod);
#endif
case 2u:
#if N_TEXTURES > 2
return texelFetch (textures[2], pos, lod);
#endif
case 3u:
#if N_TEXTURES > 3
return texelFetch (textures[3], pos, lod);
#endif
case 4u:
#if N_TEXTURES > 4
return texelFetch (textures[4], pos, lod);
#endif
case 5u:
#if N_TEXTURES > 5
return texelFetch (textures[5], pos, lod);
#endif
case 6u:
#if N_TEXTURES > 6
return texelFetch (textures[6], pos, lod);
#endif
case 7u:
#if N_TEXTURES > 7
return texelFetch (textures[7], pos, lod);
#endif
case 8u:
#if N_TEXTURES > 8
return texelFetch (textures[8], pos, lod);
#endif
case 9u:
#if N_TEXTURES > 9
return texelFetch (textures[9], pos, lod);
#endif
case 10u:
#if N_TEXTURES > 10
return texelFetch (textures[10], pos, lod);
#endif
case 11u:
#if N_TEXTURES > 11
return texelFetch (textures[11], pos, lod);
#endif
case 12u:
#if N_TEXTURES > 12
return texelFetch (textures[12], pos, lod);
#endif
case 13u:
#if N_TEXTURES > 13
return texelFetch (textures[13], pos, lod);
#endif
case 14u:
#if N_TEXTURES > 14
return texelFetch (textures[14], pos, lod);
#endif
case 15u:
#if N_TEXTURES > 15
return texelFetch (textures[15], pos, lod);
#endif
default:
break;
}
}
return vec4 (1.0, 0.0, 0.8, 1.0);
}
#else /* !GSK_GLES */
#define gsk_texture(id, pos) texture (textures[id >> 1], pos)
#define gsk_texture_size(id, lod) textureSize (textures[id >> 1], lod)
#define gsk_texel_fetch(id, pos, lod) texelFetch (textures[id >> 1], pos, lod)
#endif
layout(location = 0) out vec4 out_color;
void
gsk_set_output_color (vec4 color)
{
out_color = color;
}
#endif