1 /*
2 * Copyright 2018 Collabora Ltd.
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * on the rights to use, copy, modify, merge, publish, distribute, sub
8 * license, and/or sell copies of the Software, and to permit persons to whom
9 * the Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
19 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
20 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
21 * USE OR OTHER DEALINGS IN THE SOFTWARE.
22 */
23
24 #ifndef SPIRV_BUILDER_H
25 #define SPIRV_BUILDER_H
26
27 #include "compiler/spirv/spirv.h"
28 #include "compiler/spirv/GLSL.std.450.h"
29
30 #include <stdbool.h>
31 #include <stdint.h>
32 #include <stdlib.h>
33
34 struct hash_table;
35 struct set;
36
37 struct spirv_buffer {
38 uint32_t *words;
39 size_t num_words, room;
40 };
41
42 struct spirv_builder {
43 void *mem_ctx;
44
45 struct set *caps;
46
47 struct spirv_buffer extensions;
48 struct spirv_buffer imports;
49 struct spirv_buffer memory_model;
50 struct spirv_buffer entry_points;
51 struct spirv_buffer exec_modes;
52 struct spirv_buffer debug_names;
53 struct spirv_buffer decorations;
54
55 struct spirv_buffer types_const_defs;
56 struct spirv_buffer local_vars;
57 struct hash_table *types;
58 struct hash_table *consts;
59
60 struct spirv_buffer instructions;
61 SpvId prev_id;
62 unsigned local_vars_begin;
63
64 struct set* name_syms;
65 int name_syms_index;
66 };
67
68 struct spriv_tex_src {
69 SpvId src;
70 SpvId cl_sampler;
71 SpvId coord;
72 SpvId proj;
73 SpvId bias;
74 SpvId lod;
75 SpvId dref;
76 SpvId dx;
77 SpvId dy;
78 SpvId const_offset;
79 SpvId offset;
80 SpvId sample;
81 SpvId tex_offset;
82 SpvId min_lod;
83 bool sparse;
84 };
85
86 static inline SpvId
spirv_builder_new_id(struct spirv_builder * b)87 spirv_builder_new_id(struct spirv_builder *b)
88 {
89 return ++b->prev_id;
90 }
91
92 void
93 spirv_builder_emit_cap(struct spirv_builder *b, SpvCapability cap);
94
95 void
96 spirv_builder_emit_extension(struct spirv_builder *b, const char *ext);
97
98 void
99 spirv_builder_emit_source(struct spirv_builder *b, SpvSourceLanguage lang,
100 uint32_t version);
101
102 void
103 spirv_builder_emit_mem_model(struct spirv_builder *b,
104 SpvAddressingModel addr_model,
105 SpvMemoryModel mem_model);
106
107 void
108 spirv_builder_emit_name(struct spirv_builder *b, SpvId target,
109 const char *name);
110
111 void
112 spirv_builder_emit_decoration(struct spirv_builder *b, SpvId target,
113 SpvDecoration decoration);
114
115 void
116 spirv_builder_emit_rounding_mode(struct spirv_builder *b, SpvId target,
117 SpvFPRoundingMode rounding);
118
119 void
120 spirv_builder_emit_input_attachment_index(struct spirv_builder *b, SpvId target, uint32_t id);
121
122 void
123 spirv_builder_emit_specid(struct spirv_builder *b, SpvId target, uint32_t id);
124
125 void
126 spirv_builder_emit_location(struct spirv_builder *b, SpvId target,
127 uint32_t location);
128
129 void
130 spirv_builder_emit_component(struct spirv_builder *b, SpvId target,
131 uint32_t component);
132
133 void
134 spirv_builder_emit_builtin(struct spirv_builder *b, SpvId target,
135 SpvBuiltIn builtin);
136
137 void
138 spirv_builder_emit_index(struct spirv_builder *b, SpvId target, int index);
139
140 void
141 spirv_builder_emit_stream(struct spirv_builder *b, SpvId target, int stream);
142
143 void
144 spirv_builder_emit_descriptor_set(struct spirv_builder *b, SpvId target,
145 uint32_t descriptor_set);
146
147 void
148 spirv_builder_emit_binding(struct spirv_builder *b, SpvId target,
149 uint32_t binding);
150
151 void
152 spirv_builder_emit_array_stride(struct spirv_builder *b, SpvId target,
153 uint32_t stride);
154
155 void
156 spirv_builder_emit_offset(struct spirv_builder *b, SpvId target,
157 uint32_t offset);
158
159 void
160 spirv_builder_emit_xfb_buffer(struct spirv_builder *b, SpvId target,
161 uint32_t buffer);
162
163 void
164 spirv_builder_emit_xfb_stride(struct spirv_builder *b, SpvId target,
165 uint32_t stride);
166
167 void
168 spirv_builder_emit_member_offset(struct spirv_builder *b, SpvId target,
169 uint32_t member, uint32_t offset);
170
171 void
172 spirv_builder_emit_member_builtin(struct spirv_builder *b, SpvId target,
173 uint32_t member, SpvBuiltIn builtin);
174
175 void
176 spirv_builder_emit_member_name(struct spirv_builder *b, SpvId struct_name,
177 unsigned member, const char *name);
178
179 void
180 spirv_builder_emit_entry_point(struct spirv_builder *b,
181 SpvExecutionModel exec_model, SpvId entry_point,
182 const char *name, const SpvId interfaces[],
183 size_t num_interfaces);
184 uint32_t
185 spirv_builder_emit_exec_mode_literal(struct spirv_builder *b, SpvId entry_point,
186 SpvExecutionMode exec_mode, uint32_t param);
187 void
188 spirv_builder_emit_exec_mode_literal3(struct spirv_builder *b, SpvId entry_point,
189 SpvExecutionMode exec_mode, uint32_t param[3]);
190 void
191 spirv_builder_emit_exec_mode_id3(struct spirv_builder *b, SpvId entry_point,
192 SpvExecutionMode exec_mode, SpvId param[3]);
193 void
194 spirv_builder_emit_exec_mode(struct spirv_builder *b, SpvId entry_point,
195 SpvExecutionMode exec_mode);
196
197 void
198 spirv_builder_function(struct spirv_builder *b, SpvId result,
199 SpvId return_type,
200 SpvFunctionControlMask function_control,
201 SpvId function_type);
202
203 void
204 spirv_builder_function_end(struct spirv_builder *b);
205
206 void
207 spirv_builder_label(struct spirv_builder *b, SpvId label);
208
209 void
210 spirv_builder_return(struct spirv_builder *b);
211
212 SpvId
213 spirv_builder_emit_undef(struct spirv_builder *b, SpvId result_type);
214
215 SpvId
216 spirv_builder_emit_load(struct spirv_builder *b, SpvId result_type,
217 SpvId pointer);
218
219 SpvId
220 spirv_builder_emit_load_aligned(struct spirv_builder *b, SpvId result_type, SpvId pointer, unsigned alignment, bool coherent);
221 void
222 spirv_builder_emit_atomic_store(struct spirv_builder *b, SpvId pointer, SpvScope scope,
223 SpvMemorySemanticsMask semantics, SpvId object);
224
225 void
226 spirv_builder_emit_store(struct spirv_builder *b, SpvId pointer, SpvId object);
227 void
228 spirv_builder_emit_store_aligned(struct spirv_builder *b, SpvId pointer, SpvId object, unsigned alignment, bool coherent);
229
230 SpvId
231 spirv_builder_emit_access_chain(struct spirv_builder *b, SpvId result_type,
232 SpvId base, const SpvId indexes[],
233 size_t num_indexes);
234
235 void
236 spirv_builder_emit_interlock(struct spirv_builder *b, bool end);
237
238 SpvId
239 spirv_builder_emit_unop_const(struct spirv_builder *b, SpvOp op, SpvId result_type, uint64_t operand);
240
241 SpvId
242 spirv_builder_emit_unop(struct spirv_builder *b, SpvOp op, SpvId result_type,
243 SpvId operand);
244
245 SpvId
246 spirv_builder_emit_binop(struct spirv_builder *b, SpvOp op, SpvId result_type,
247 SpvId operand0, SpvId operand1);
248
249 SpvId
250 spirv_builder_emit_triop(struct spirv_builder *b, SpvOp op, SpvId result_type,
251 SpvId operand0, SpvId operand1, SpvId operand2);
252
253 SpvId
254 spirv_builder_emit_quadop(struct spirv_builder *b, SpvOp op, SpvId result_type,
255 SpvId operand0, SpvId operand1, SpvId operand2, SpvId operand3);
256
257 SpvId
258 spirv_builder_emit_hexop(struct spirv_builder *b, SpvOp op, SpvId result_type,
259 SpvId operand0, SpvId operand1, SpvId operand2, SpvId operand3,
260 SpvId operand4, SpvId operand5);
261
262 SpvId
263 spirv_builder_emit_composite_extract(struct spirv_builder *b, SpvId result_type,
264 SpvId composite, const uint32_t indexes[],
265 size_t num_indexes);
266
267 SpvId
268 spirv_builder_emit_composite_construct(struct spirv_builder *b,
269 SpvId result_type,
270 const SpvId constituents[],
271 size_t num_constituents);
272
273 SpvId
274 spirv_builder_emit_vector_shuffle(struct spirv_builder *b, SpvId result_type,
275 SpvId vector_1, SpvId vector_2,
276 const uint32_t components[],
277 size_t num_components);
278 SpvId
279 spirv_builder_emit_vector_extract(struct spirv_builder *b, SpvId result_type,
280 SpvId vector_1,
281 uint32_t component);
282 SpvId
283 spirv_builder_emit_vector_insert(struct spirv_builder *b, SpvId result_type,
284 SpvId vector_1,
285 SpvId component,
286 uint32_t index);
287 void
288 spirv_builder_emit_branch(struct spirv_builder *b, SpvId label);
289
290 void
291 spirv_builder_emit_selection_merge(struct spirv_builder *b, SpvId merge_block,
292 SpvSelectionControlMask selection_control);
293
294 void
295 spirv_builder_loop_merge(struct spirv_builder *b, SpvId merge_block,
296 SpvId cont_target, SpvLoopControlMask loop_control);
297
298 void
299 spirv_builder_emit_branch_conditional(struct spirv_builder *b, SpvId condition,
300 SpvId true_label, SpvId false_label);
301
302 SpvId
303 spirv_builder_emit_phi(struct spirv_builder *b, SpvId result_type,
304 size_t num_vars, size_t *position);
305
306 void
307 spirv_builder_set_phi_operand(struct spirv_builder *b, size_t position,
308 size_t index, SpvId variable, SpvId parent);
309
310 void
311 spirv_builder_emit_kill(struct spirv_builder *b);
312
313 void
314 spirv_builder_emit_terminate(struct spirv_builder *b);
315
316 void
317 spirv_builder_emit_demote(struct spirv_builder *b);
318
319 SpvId
320 spirv_is_helper_invocation(struct spirv_builder *b);
321
322 SpvId
323 spirv_builder_emit_vote(struct spirv_builder *b, SpvOp op, SpvId src);
324
325 SpvId
326 spirv_builder_emit_image_sample(struct spirv_builder *b,
327 SpvId result_type,
328 SpvId sampled_image,
329 const struct spriv_tex_src *src);
330
331 SpvId
332 spirv_builder_emit_image(struct spirv_builder *b, SpvId result_type,
333 SpvId sampled_image);
334
335 SpvId
336 spirv_builder_emit_image_texel_pointer(struct spirv_builder *b,
337 SpvId result_type,
338 SpvId image,
339 SpvId coordinate,
340 SpvId sample);
341
342 SpvId
343 spirv_builder_emit_image_read(struct spirv_builder *b,
344 SpvId result_type,
345 SpvId image,
346 SpvId coordinate,
347 SpvId lod,
348 SpvId sample,
349 SpvId offset,
350 bool sparse);
351
352 void
353 spirv_builder_emit_image_write(struct spirv_builder *b,
354 SpvId image,
355 SpvId coordinate,
356 SpvId texel,
357 SpvId lod,
358 SpvId sample,
359 SpvId offset);
360
361 SpvId
362 spirv_builder_emit_image_fetch(struct spirv_builder *b,
363 SpvId result_type,
364 SpvId image,
365 const struct spriv_tex_src *src);
366 SpvId
367 spirv_builder_emit_image_gather(struct spirv_builder *b,
368 SpvId result_type,
369 SpvId image,
370 const struct spriv_tex_src *src,
371 SpvId component);
372
373 SpvId
374 spirv_builder_emit_image_query_size(struct spirv_builder *b,
375 SpvId result_type,
376 SpvId image,
377 SpvId lod);
378
379 SpvId
380 spirv_builder_emit_image_query_levels(struct spirv_builder *b,
381 SpvId result_type,
382 SpvId image);
383
384 SpvId
385 spirv_builder_emit_image_query_lod(struct spirv_builder *b,
386 SpvId result_type,
387 SpvId image,
388 SpvId coords);
389
390 SpvId
391 spirv_builder_emit_ext_inst(struct spirv_builder *b, SpvId result_type,
392 SpvId set, uint32_t instruction,
393 const SpvId args[], size_t num_args);
394
395 SpvId
396 spirv_builder_type_void(struct spirv_builder *b);
397
398 SpvId
399 spirv_builder_type_bool(struct spirv_builder *b);
400
401 SpvId
402 spirv_builder_type_int(struct spirv_builder *b, unsigned width);
403
404 SpvId
405 spirv_builder_type_uint(struct spirv_builder *b, unsigned width);
406
407 SpvId
408 spirv_builder_type_float(struct spirv_builder *b, unsigned width);
409
410 SpvId
411 spirv_builder_type_image(struct spirv_builder *b, SpvId sampled_type,
412 SpvDim dim, bool depth, bool arrayed, bool ms,
413 unsigned sampled, SpvImageFormat image_format);
414
415 SpvId
416 spirv_builder_type_sampled_image(struct spirv_builder *b, SpvId image_type);
417 SpvId
418 spirv_builder_type_sampler(struct spirv_builder *b);
419 SpvId
420 spirv_builder_emit_sampled_image(struct spirv_builder *b, SpvId result_type, SpvId image, SpvId sampler);
421
422 SpvId
423 spirv_builder_type_pointer(struct spirv_builder *b,
424 SpvStorageClass storage_class, SpvId type);
425
426 SpvId
427 spirv_builder_type_vector(struct spirv_builder *b, SpvId component_type,
428 unsigned component_count);
429
430 SpvId
431 spirv_builder_type_matrix(struct spirv_builder *b, SpvId component_type,
432 unsigned component_count);
433
434 SpvId
435 spirv_builder_type_runtime_array(struct spirv_builder *b, SpvId component_type);
436
437 SpvId
438 spirv_builder_type_array(struct spirv_builder *b, SpvId component_type,
439 SpvId length);
440
441 SpvId
442 spirv_builder_type_struct(struct spirv_builder *b, const SpvId member_types[],
443 size_t num_member_types);
444
445 SpvId
446 spirv_builder_type_function(struct spirv_builder *b, SpvId return_type,
447 const SpvId parameter_types[],
448 size_t num_parameter_types);
449
450 SpvId
451 spirv_builder_function_call(struct spirv_builder *b, SpvId result_type,
452 SpvId function, const SpvId arguments[],
453 size_t num_arguments);
454
455 SpvId
456 spirv_builder_const_bool(struct spirv_builder *b, bool val);
457
458 SpvId
459 spirv_builder_const_int(struct spirv_builder *b, int width, int64_t val);
460
461 SpvId
462 spirv_builder_const_uint(struct spirv_builder *b, int width, uint64_t val);
463
464 SpvId
465 spirv_builder_spec_const_uint(struct spirv_builder *b, int width);
466
467 SpvId
468 spirv_builder_const_float(struct spirv_builder *b, int width, double val);
469
470 SpvId
471 spirv_builder_const_composite(struct spirv_builder *b, SpvId result_type,
472 const SpvId constituents[],
473 size_t num_constituents);
474
475 SpvId
476 spirv_builder_spec_const_composite(struct spirv_builder *b, SpvId result_type,
477 const SpvId constituents[],
478 size_t num_constituents);
479
480 SpvId
481 spirv_builder_emit_var(struct spirv_builder *b, SpvId type,
482 SpvStorageClass storage_class);
483
484 void
485 spirv_builder_emit_memory_barrier(struct spirv_builder *b, SpvScope scope, SpvMemorySemanticsMask semantics);
486
487 void
488 spirv_builder_emit_control_barrier(struct spirv_builder *b, SpvScope scope, SpvScope mem_scope, SpvMemorySemanticsMask semantics);
489
490 SpvId
491 spirv_builder_import(struct spirv_builder *b, const char *name);
492
493 size_t
494 spirv_builder_get_num_words(struct spirv_builder *b);
495
496 size_t
497 spirv_builder_get_words(struct spirv_builder *b, uint32_t *words,
498 size_t num_words, uint32_t spirv_version,
499 uint32_t *tcs_vertices_out_word);
500
501 void
502 spirv_builder_emit_vertex(struct spirv_builder *b, uint32_t stream, bool multistream);
503 void
504 spirv_builder_end_primitive(struct spirv_builder *b, uint32_t stream, bool multistream);
505 void
506 spirv_builder_begin_local_vars(struct spirv_builder *b);
507 #endif
508