mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2025-01-19 00:20:09 +00:00
ef20b706e2
Carry an n_external_textures variable around when selecting programs and compile different programs for different amounts of external textures. For now, this code is unused, but dmabufs will need it.
418 lines
8.7 KiB
GLSL
418 lines
8.7 KiB
GLSL
precision highp float;
|
|
|
|
#if 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 defined(GSK_GLES) && __VERSION__ < 310
|
|
layout(std140)
|
|
#else
|
|
layout(std140, binding = 1)
|
|
#endif
|
|
uniform Floats
|
|
{
|
|
vec4 really_just_floats[1024];
|
|
} floats;
|
|
|
|
#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)
|
|
{
|
|
return floats.really_just_floats[id >> 2][id & 3];
|
|
}
|
|
|
|
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)))
|
|
|
|
#ifdef 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
|