#version 450 #extension GL_EXT_buffer_reference : require struct String { vec2 pos; vec4 color; float size; uint code; }; layout(std430, buffer_reference) readonly buffer StringList { String s[]; }; struct Glyph { vec2 pos; vec4 color; float size; uint code; }; layout(std430, buffer_reference) readonly buffer GlyphList { Glyph g[]; }; struct Rect { vec2 pos; vec2 size; vec4 color; }; layout(std430, buffer_reference) readonly buffer RectList { Rect r[]; }; layout(std430, buffer_reference) readonly buffer CodeList { uint c[]; }; struct DrawCommand { uint vertex_count; uint instance_count; uint fist_vertex; uint first_instance; }; struct DispatchCommand { uint x; uint y; uint z; }; layout(std430, buffer_reference) buffer UILayer { StringList strings; CodeList codes; RectList rects; GlyphList glyphs; DrawCommand draw_glyphs; DrawCommand draw_rects; DispatchCommand dispatch_strings; }; struct Symbol { int top; uint left; uint width; uint height; uint advance; }; layout(std430, buffer_reference) buffer SymbolList { Symbol s[]; }; struct Font { uint num_symbols; uint width; uint height; SymbolList symbols; }; layout(std430, buffer_reference) buffer FontList { Font f[]; }; layout(std430, buffer_reference) buffer UIContext { mat4 screen; FontList fonts; }; layout(std430, push_constant) uniform PushConstant { UIContext context; UILayer layer; } pc; layout(location = 0) out vec4 fragColor; const vec2 square[6] = { vec2(0.0, 0.0), vec2(1.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 0.0), vec2(1.0, 1.0), vec2(0.0, 1.0), }; void main() { Rect rect = pc.layer.rects.r[gl_InstanceIndex]; gl_Position = pc.context.screen * vec4(square[gl_VertexIndex] * rect.size + rect.pos, 0.0, 1.0); fragColor = rect.color; }