1#version 450
2// One quad per instance, in the scene's paint order. Draw parameters are
3// fetched in the vertex stage and passed flat, not read per fragment.
4
5struct Draw {
6 ivec4 rect; // visible x0, y0, x1, y1 in target pixels
7 vec4 map; // source texel = map.xy + fragment centre.x * map.zw
8 vec4 mapy; // + fragment centre.y * mapy.xy; mapy.z and w are unused
9 vec4 color; // solid premultiplied RGBA; content opacity in alpha
10 vec4 crop; // source crop bounds in buffer pixels
11 uvec4 buf; // pixel-buffer first word, width, height; YUV metadata in w
12 uvec4 misc; // mode, flags, target width, target height
13 uvec4 resourceIndex; // slot, outer radius bits, inner radius bits, padding
14 vec4 round;
15 vec4 roundInner;
16};
17layout(std430, set = 0, binding = 3) readonly buffer Draws { Draw draws[]; };
18layout(location = 0) out Parameters {
19 flat vec4 map;
20 flat vec4 mapy;
21 flat vec4 color;
22 flat vec4 crop;
23 flat uvec4 buf;
24 flat uvec4 misc;
25 flat uint resourceIndex;
26 flat vec4 round;
27 flat vec4 roundInner;
28 flat vec2 radii;
29} parameters;
30
31void main() {
32 Draw d = draws[gl_InstanceIndex];
33 const ivec2 corners[6] = ivec2[](ivec2(0, 0), ivec2(1, 0), ivec2(0, 1), ivec2(0, 1), ivec2(1, 0), ivec2(1, 1));
34 ivec2 c = corners[gl_VertexIndex];
35 vec2 p = vec2(c.x == 0 ? d.rect.x : d.rect.z, c.y == 0 ? d.rect.y : d.rect.w);
36 gl_Position = vec4(p / vec2(d.misc.zw) * 2.0 - 1.0, 0.0, 1.0);
37 parameters.map = d.map;
38 parameters.mapy = d.mapy;
39 parameters.color = d.color;
40 parameters.crop = d.crop;
41 parameters.buf = d.buf;
42 parameters.misc = d.misc;
43 parameters.resourceIndex = d.resourceIndex.x;
44 parameters.round = d.round;
45 parameters.roundInner = d.roundInner;
46 parameters.radii = uintBitsToFloat(d.resourceIndex.yz);
47}