mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-29 06:51:10 +00:00
19fccb13c3
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
446 lines
9.8 KiB
GLSL
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
|