#version 450 #extension GL_EXT_buffer_reference : require struct Symbol { uint x; uint top; uint width; }; struct Character { vec3 pos; vec4 color; float size; uint code; }; struct String { vec3 pos; vec4 color; float size; uint offset; uint len; }; layout(buffer_reference, std430) readonly buffer SymbolList{ Symbol symbols[]; }; layout(buffer_reference, std430) writeonly buffer CharacterList{ Character characters[]; }; layout(buffer_reference, std430) readonly buffer Characters{ uint codes[]; }; layout(buffer_reference, std430) readonly buffer Strings{ String strings[]; }; layout(set = 0, binding = 0) uniform Font { uint num_symbols; uint width; uint height; uint space_width; SymbolList symbol_list; } font; layout(buffer_reference, std430) buffer DrawCommand { uint vertex_count; uint instance_count; uint first_vertx; uint first_instance; }; layout(buffer_reference, std430) readonly buffer Pointers { Strings strings; Characters codes; CharacterList characters; DrawCommand draw; }; layout(std430, push_constant) uniform Push { Pointers pointers; } push; layout(local_size_x = 1) in; void main() { uint gID = gl_GlobalInvocationID.x; String string = push.pointers.strings.strings[gID]; uint buffer_pos = atomicAdd(push.pointers.draw.instance_count, string.len); // Write the characters to push.pointers.characters.characters[buffer_pos:buffer_pos+string.len) }