TachyonUI 0.1.0
High-performance UI for building tools.
Loading...
Searching...
No Matches
gui_render_primitives.h
Go to the documentation of this file.
1#pragma once
2
3// GPU primitive formats for the GUI renderer. The structs are std430 buffer
4// layouts shared verbatim with the shaders, so they are graphics-API-neutral:
5// any backend (Vulkan today; D3D12/Metal/WebGPU later) consumes the same
6// bytes. The per-kind spec table drives pipeline creation and dispatch -
7// adding a primitive kind is one enum value, one table row, one shader pair
8// and one emit method.
9
10#include <gui_core/gui_base_types.h> // int2, float2, short2, color4f, float4x4
11#include <gui_core/graphics/gui_image.h> // ImageIndex
12
13#include <stdint.h>
14#include <stddef.h>
15
16namespace tachyon
17{
20
21 struct alignas(16) glsl_float4 { float x, y, z, w; };
22
23 // Every primitive starts with the same header: transform0, transform1 (its 3x2 transform
24 // as two rows), clipMin, clipMax. transform0.w is its draw order in its target, which
25 // the world matrix makes its depth: later is nearer, so an occluder (opaque content drawn
26 // after) hides what was drawn before it.
27
30 inline constexpr float kPrimitiveDepthStep = 1.0f / float(1 << 22);
31
32 struct alignas(16) Box
33 {
34 glsl_float4 transform0 = { 1, 0, 0 };
35 glsl_float4 transform1 = { 0, 1, 0 };
38
39 tachyon::int2 pos = { 0,0 };
41
43 uint32_t styleIndex = 0;
44 int16_t colorIndex = 0;
45 int16_t _pad3 = 0;
46 uint32_t styleIndexTo = 0;
47 float blendT = 1.0f;
48 uint32_t _pad0 = 0;
51 int16_t snappedPx[4] = { 0, 0, 0, 0 };
52 };
53 static_assert(sizeof(Box) == 96, "Box struct size must be 96 bytes to match GLSL std430 layout");
54 static_assert(offsetof(Box, snappedPx) == 88, "Box::snappedPx offset mismatch with GLSL");
55 static_assert(sizeof(Box::textureIndex) == sizeof(uint32_t), "Box::textureIndex must be uint32_t for packing reasons");
56
57 struct alignas(16) Glyph
58 {
59 glsl_float4 transform0 = { 1, 0, 0 };
60 glsl_float4 transform1 = { 0, 1, 0 };
63
66
69
70 float scale = 0;
71 uint16_t bpp = 0;
72 uint16_t mode = 0;
73
75 int16_t textColorIndex = 0;
77 int16_t shadowBlur = -1;
78 };
79 static_assert(sizeof(Glyph) == 96, "Glyph struct size must be 96 bytes to match GLSL std430 layout");
80 static_assert(sizeof(Glyph::textureIndex) == sizeof(uint32_t), "Glyph::textureIndex must be uint32_t for packing reasons");
81
82 struct alignas(16) Dot
83 {
84 glsl_float4 transform0 = { 1, 0, 0 };
85 glsl_float4 transform1 = { 0, 1, 0 };
88
90 float size = 0;
95 float pos[2] = { 0, 0 };
96 };
97
98 struct alignas(16) Line
99 {
100 glsl_float4 transform0 = { 1, 0, 0 };
101 glsl_float4 transform1 = { 0, 1, 0 };
104
105 int colorIndex = 0;
106 float lineWidth = 0;
107 float dashSize = 0;
108 float dashOffset = 0;
109 float gradientOffset = 0;
110 float gradientScale = 1;
111
116 };
117
118 static_assert(sizeof(Line) == 96, "Line struct size mismatch with GLSL std430 layout");
119 static_assert(offsetof(Line, colorIndex) == 48, "Line::colorIndex offset mismatch");
120 static_assert(offsetof(Line, lineWidth) == 52, "Line::lineWidth offset mismatch");
121 static_assert(offsetof(Line, gradientOffset) == 64, "Line::gradientOffset offset mismatch");
122 static_assert(offsetof(Line, p0) == 72, "Line::p0 offset mismatch");
123
124 struct alignas(16) Triangle
125 {
126 glsl_float4 transform0 = { 1, 0, 0 };
127 glsl_float4 transform1 = { 0, 1, 0 };
130
134
136
137 int16_t colorIndex = 0;
138
139 int16_t hardEdges = 0;
140 };
141
142 struct alignas(16) Quad
143 {
144 glsl_float4 transform0 = { 1, 0, 0 };
145 glsl_float4 transform1 = { 0, 1, 0 };
148
151
153
154 int16_t colorIndex = 0;
155 int16_t blur = 0;
156 float cornerRadius = 0.0f;
157 };
158
161 struct alignas(16) Circle
162 {
163 glsl_float4 transform0 = { 1, 0, 0 };
164 glsl_float4 transform1 = { 0, 1, 0 };
167
169 float radius = 0;
170 float lineWidth = 0;
171 int colorIndex = 0;
172 float dashSize = 0;
173 float dashOffset = 0;
174 float gradientOffset = 0;
175 float gradientScale = 1;
176 };
177 static_assert(sizeof(Circle) == 96, "Circle struct size mismatch with GLSL std430 layout");
178 static_assert(offsetof(Circle, center) == 48, "Circle::center offset mismatch");
179 static_assert(offsetof(Circle, colorIndex) == 64, "Circle::colorIndex offset mismatch");
180
183 struct alignas(16) Occluder
184 {
185 glsl_float4 transform0 = { 1, 0, 0 };
186 glsl_float4 transform1 = { 0, 1, 0 };
189
192 };
193 static_assert(sizeof(Occluder) == 64, "Occluder struct size mismatch with GLSL std430 layout");
194
197 using DeviceAddress = uint64_t;
198
211 inline constexpr size_t kPrimitiveKindCount = size_t(PrimitiveKind::Count);
212
215 enum class PrimitiveShape : uint8_t
216 {
219 };
220
222 {
223 const char* shaderBaseName;
224 uint32_t stride;
225 uint8_t pushSlot;
228 bool depthOnly = false;
229 };
230
237 /* Box */ { "box_shader", sizeof(Box), 0 },
238 /* Glyph */ { "glyph_shader", sizeof(Glyph), 1 },
239 /* Dot */ { "dot_shader", sizeof(Dot), 2, PrimitiveShape::Triangle },
240 /* Line */ { "line_shader", sizeof(Line), 3 },
241 /* Triangle */ { "triangle_shader", sizeof(Triangle), 4 },
242 /* Quad */ { "quad_shader", sizeof(Quad), 4 },
243 /* Circle */ { "circle_shader", sizeof(Circle), 3 },
244 /* Occluder */ { "occluder_shader", sizeof(Occluder), 0, PrimitiveShape::Quad, true },
245 };
246
259 static_assert(sizeof(GPUDrawPushConstants) == 128, "GPUDrawPushConstants must be 128 bytes");
261}
ImageIndex
Index of an image in the graphics context's image set, as the shaders sample it.
Definition gui_image.h:37
PrimitiveKind
Definition gui_render_primitives.h:200
constexpr PrimitiveSpec kPrimitiveSpecs[kPrimitiveKindCount]
Push-constant slot order matches the GLSL push block (box, glyph, dot, line, triangle).
Definition gui_render_primitives.h:236
uint64_t DeviceAddress
Shader-visible buffer address.
Definition gui_render_primitives.h:197
PrimitiveShape
The vertices a primitive's vertex shader is run for; gl_VertexIndex divided by their count is the pri...
Definition gui_render_primitives.h:216
constexpr float kPrimitiveDepthStep
The depth between two primitives drawn one after the other; past the depth range all are at the neare...
Definition gui_render_primitives.h:30
constexpr size_t kPrimitiveKindCount
Definition gui_render_primitives.h:211
@ Invalid
Definition gui_image.h:37
@ Count
Definition gui_render_primitives.h:209
@ Triangle
3 corners of one triangle around its shape (clipped per fragment)
Definition gui_render_primitives.h:218
@ Quad
4 corners of its rectangle, drawn as two indexed triangles (0,1,3, 0,3,2)
Definition gui_render_primitives.h:217
Definition gui_logging.h:24
Definition gui_render_primitives.h:33
tachyon::int2 pos
Definition gui_render_primitives.h:39
uint32_t _pad0
Definition gui_render_primitives.h:48
int16_t snappedPx[4]
The box in window pixels, snapped relative to its parent (SnapToParent); { x0, y0,...
Definition gui_render_primitives.h:51
tachyon::ImageIndex textureIndex
Definition gui_render_primitives.h:42
tachyon::int2 size
Definition gui_render_primitives.h:40
tachyon::int2 clipMin
Definition gui_render_primitives.h:36
tachyon::int2 clipMax
Definition gui_render_primitives.h:37
uint32_t styleIndex
"from" state GPU style index
Definition gui_render_primitives.h:43
glsl_float4 transform1
Definition gui_render_primitives.h:35
int16_t _pad3
Definition gui_render_primitives.h:45
uint32_t styleIndexTo
"to" state GPU style index
Definition gui_render_primitives.h:46
float blendT
0 = fully "from", 1 = fully "to"
Definition gui_render_primitives.h:47
int16_t colorIndex
color style overriding the background (gradients too); 0: none
Definition gui_render_primitives.h:44
glsl_float4 transform0
Definition gui_render_primitives.h:34
A circle outline: the ring lineWidth wide around center at radius, its color and dashes running clock...
Definition gui_render_primitives.h:162
tachyon::int2 clipMin
Definition gui_render_primitives.h:165
tachyon::float2 center
Definition gui_render_primitives.h:168
glsl_float4 transform1
Definition gui_render_primitives.h:164
float dashSize
Definition gui_render_primitives.h:172
float gradientOffset
Definition gui_render_primitives.h:174
tachyon::int2 clipMax
Definition gui_render_primitives.h:166
float lineWidth
Definition gui_render_primitives.h:170
int colorIndex
Definition gui_render_primitives.h:171
glsl_float4 transform0
Definition gui_render_primitives.h:163
float gradientScale
Definition gui_render_primitives.h:175
float dashOffset
Definition gui_render_primitives.h:173
float radius
Definition gui_render_primitives.h:169
Definition gui_render_primitives.h:83
glsl_float4 transform1
Definition gui_render_primitives.h:85
float size
Definition gui_render_primitives.h:90
glsl_float4 transform0
Definition gui_render_primitives.h:84
tachyon::color4f color
Definition gui_render_primitives.h:89
tachyon::int2 clipMin
Definition gui_render_primitives.h:86
float _pad_size_to_pos
std430 aligns vec2 to 8 bytes: pos must start at offset 72, not 68.
Definition gui_render_primitives.h:92
tachyon::int2 clipMax
Definition gui_render_primitives.h:87
float pos[2]
Float so positions far from origin or under a pan/zoom transform don't wrap.
Definition gui_render_primitives.h:95
Definition gui_render_primitives.h:248
DeviceAddress boxStyleBuffer
Definition gui_render_primitives.h:253
tachyon::float4x4 worldMatrix
Definition gui_render_primitives.h:249
DeviceAddress primitiveAddresses[5]
Indexed by PrimitiveSpec::pushSlot (slot order is shader contract).
Definition gui_render_primitives.h:252
float _timePad
pad to 128 bytes (Vulkan minimum)
Definition gui_render_primitives.h:257
DeviceAddress colorStyleBuffer
Definition gui_render_primitives.h:254
float elapsedTime
frame clock seconds, for shader animation
Definition gui_render_primitives.h:256
Definition gui_render_primitives.h:58
int16_t textColorIndex
Definition gui_render_primitives.h:75
glsl_float4 transform0
Definition gui_render_primitives.h:59
tachyon::ImageIndex textureIndex
Definition gui_render_primitives.h:74
tachyon::int2 clipMax
Definition gui_render_primitives.h:62
float scale
Definition gui_render_primitives.h:70
int16_t shadowBlur
-1: the glyph itself; 0 and up: a text shadow blurred by this many 1/8 pixels
Definition gui_render_primitives.h:77
uint16_t bpp
Definition gui_render_primitives.h:71
uint16_t mode
Definition gui_render_primitives.h:72
tachyon::int2 clipMin
Definition gui_render_primitives.h:61
tachyon::float2 uvMax
Definition gui_render_primitives.h:68
tachyon::float2 uvMin
Definition gui_render_primitives.h:67
tachyon::float2 pos
Definition gui_render_primitives.h:64
tachyon::float2 size
Definition gui_render_primitives.h:65
glsl_float4 transform1
Definition gui_render_primitives.h:60
Definition gui_render_primitives.h:99
tachyon::short2 p1
Definition gui_render_primitives.h:113
glsl_float4 transform0
Definition gui_render_primitives.h:100
float dashSize
Definition gui_render_primitives.h:107
float lineWidth
Definition gui_render_primitives.h:106
float gradientOffset
Definition gui_render_primitives.h:109
float gradientScale
Definition gui_render_primitives.h:110
tachyon::short2 p0
Definition gui_render_primitives.h:112
tachyon::int2 clipMax
Definition gui_render_primitives.h:103
glsl_float4 transform1
Definition gui_render_primitives.h:101
float dashOffset
Definition gui_render_primitives.h:108
tachyon::int2 clipMin
Definition gui_render_primitives.h:102
tachyon::short2 p2
Definition gui_render_primitives.h:114
tachyon::short2 p3
Definition gui_render_primitives.h:115
int colorIndex
Definition gui_render_primitives.h:105
Depth only: marks pos/size as covered by opaque content drawn after it, so what was drawn before unde...
Definition gui_render_primitives.h:184
glsl_float4 transform1
Definition gui_render_primitives.h:186
tachyon::int2 clipMin
Definition gui_render_primitives.h:187
glsl_float4 transform0
Definition gui_render_primitives.h:185
tachyon::int2 size
Definition gui_render_primitives.h:191
tachyon::int2 clipMax
Definition gui_render_primitives.h:188
tachyon::int2 pos
Definition gui_render_primitives.h:190
Definition gui_render_primitives.h:222
bool depthOnly
Writes depth and no color, before the other kinds; they test depth without writing it.
Definition gui_render_primitives.h:228
PrimitiveShape shape
Definition gui_render_primitives.h:226
uint8_t pushSlot
index into GPUDrawPushConstants::primitiveAddresses
Definition gui_render_primitives.h:225
const char * shaderBaseName
backend composes path + stage suffix + format
Definition gui_render_primitives.h:223
uint32_t stride
per-primitive byte size (std430)
Definition gui_render_primitives.h:224
Definition gui_render_primitives.h:143
glsl_float4 transform1
Definition gui_render_primitives.h:145
tachyon::int2 clipMin
Definition gui_render_primitives.h:146
tachyon::ImageIndex textureIndex
Definition gui_render_primitives.h:152
float cornerRadius
Definition gui_render_primitives.h:156
tachyon::int2 clipMax
Definition gui_render_primitives.h:147
glsl_float4 transform0
Definition gui_render_primitives.h:144
tachyon::int2 pos
Definition gui_render_primitives.h:149
int16_t blur
shadow blur, pixels; pos/size include it on every side
Definition gui_render_primitives.h:155
tachyon::int2 size
Definition gui_render_primitives.h:150
int16_t colorIndex
Definition gui_render_primitives.h:154
Definition gui_render_primitives.h:125
glsl_float4 transform0
Definition gui_render_primitives.h:126
int16_t colorIndex
Definition gui_render_primitives.h:137
tachyon::float2 p1
Definition gui_render_primitives.h:132
tachyon::ImageIndex textureIndex
Definition gui_render_primitives.h:135
tachyon::float2 p0
Definition gui_render_primitives.h:131
tachyon::int2 clipMax
Definition gui_render_primitives.h:129
glsl_float4 transform1
Definition gui_render_primitives.h:127
tachyon::int2 clipMin
Definition gui_render_primitives.h:128
int16_t hardEdges
TriangleEdges without a soft edge.
Definition gui_render_primitives.h:139
tachyon::float2 p2
Definition gui_render_primitives.h:133
Definition gui_base_types.h:395
Definition gui_base_types.h:121
Definition gui_base_types.h:259
Definition gui_render_primitives.h:21
float z
Definition gui_render_primitives.h:21
float x
Definition gui_render_primitives.h:21
float y
Definition gui_render_primitives.h:21
float w
Definition gui_render_primitives.h:21
Integer 2D vector.
Definition gui_base_types.h:19
Definition gui_base_types.h:313