• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
65 static inline SpvId
spirv_builder_new_id(struct spirv_builder * b)66 spirv_builder_new_id(struct spirv_builder *b)
67 {
68    return ++b->prev_id;
69 }
70 
71 void
72 spirv_builder_emit_cap(struct spirv_builder *b, SpvCapability cap);
73 
74 void
75 spirv_builder_emit_extension(struct spirv_builder *b, const char *ext);
76 
77 void
78 spirv_builder_emit_source(struct spirv_builder *b, SpvSourceLanguage lang,
79                           uint32_t version);
80 
81 void
82 spirv_builder_emit_mem_model(struct spirv_builder *b,
83                              SpvAddressingModel addr_model,
84                              SpvMemoryModel mem_model);
85 
86 void
87 spirv_builder_emit_name(struct spirv_builder *b, SpvId target,
88                         const char *name);
89 
90 void
91 spirv_builder_emit_decoration(struct spirv_builder *b, SpvId target,
92                               SpvDecoration decoration);
93 
94 void
95 spirv_builder_emit_rounding_mode(struct spirv_builder *b, SpvId target,
96                                  SpvFPRoundingMode rounding);
97 
98 void
99 spirv_builder_emit_input_attachment_index(struct spirv_builder *b, SpvId target, uint32_t id);
100 
101 void
102 spirv_builder_emit_specid(struct spirv_builder *b, SpvId target, uint32_t id);
103 
104 void
105 spirv_builder_emit_location(struct spirv_builder *b, SpvId target,
106                             uint32_t location);
107 
108 void
109 spirv_builder_emit_component(struct spirv_builder *b, SpvId target,
110                              uint32_t component);
111 
112 void
113 spirv_builder_emit_builtin(struct spirv_builder *b, SpvId target,
114                            SpvBuiltIn builtin);
115 
116 void
117 spirv_builder_emit_index(struct spirv_builder *b, SpvId target, int index);
118 
119 void
120 spirv_builder_emit_stream(struct spirv_builder *b, SpvId target, int stream);
121 
122 void
123 spirv_builder_emit_descriptor_set(struct spirv_builder *b, SpvId target,
124                                   uint32_t descriptor_set);
125 
126 void
127 spirv_builder_emit_binding(struct spirv_builder *b, SpvId target,
128                            uint32_t binding);
129 
130 void
131 spirv_builder_emit_array_stride(struct spirv_builder *b, SpvId target,
132                                 uint32_t stride);
133 
134 void
135 spirv_builder_emit_offset(struct spirv_builder *b, SpvId target,
136                           uint32_t offset);
137 
138 void
139 spirv_builder_emit_xfb_buffer(struct spirv_builder *b, SpvId target,
140                               uint32_t buffer);
141 
142 void
143 spirv_builder_emit_xfb_stride(struct spirv_builder *b, SpvId target,
144                               uint32_t stride);
145 
146 void
147 spirv_builder_emit_member_offset(struct spirv_builder *b, SpvId target,
148                                  uint32_t member, uint32_t offset);
149 
150 void
151 spirv_builder_emit_entry_point(struct spirv_builder *b,
152                                SpvExecutionModel exec_model, SpvId entry_point,
153                                const char *name, const SpvId interfaces[],
154                                size_t num_interfaces);
155 uint32_t
156 spirv_builder_emit_exec_mode_literal(struct spirv_builder *b, SpvId entry_point,
157                                      SpvExecutionMode exec_mode, uint32_t param);
158 void
159 spirv_builder_emit_exec_mode_literal3(struct spirv_builder *b, SpvId entry_point,
160                                      SpvExecutionMode exec_mode, uint32_t param[3]);
161 void
162 spirv_builder_emit_exec_mode_id3(struct spirv_builder *b, SpvId entry_point,
163                                  SpvExecutionMode exec_mode, SpvId param[3]);
164 void
165 spirv_builder_emit_exec_mode(struct spirv_builder *b, SpvId entry_point,
166                              SpvExecutionMode exec_mode);
167 
168 void
169 spirv_builder_function(struct spirv_builder *b, SpvId result,
170                        SpvId return_type,
171                        SpvFunctionControlMask function_control,
172                        SpvId function_type);
173 
174 void
175 spirv_builder_function_end(struct spirv_builder *b);
176 
177 void
178 spirv_builder_label(struct spirv_builder *b, SpvId label);
179 
180 void
181 spirv_builder_return(struct spirv_builder *b);
182 
183 SpvId
184 spirv_builder_emit_undef(struct spirv_builder *b, SpvId result_type);
185 
186 SpvId
187 spirv_builder_emit_load(struct spirv_builder *b, SpvId result_type,
188                         SpvId pointer);
189 
190 SpvId
191 spirv_builder_emit_load_aligned(struct spirv_builder *b, SpvId result_type, SpvId pointer, unsigned alignment, bool coherent);
192 void
193 spirv_builder_emit_atomic_store(struct spirv_builder *b, SpvId pointer, SpvScope scope,
194                                 SpvMemorySemanticsMask semantics, SpvId object);
195 
196 void
197 spirv_builder_emit_store(struct spirv_builder *b, SpvId pointer, SpvId object);
198 void
199 spirv_builder_emit_store_aligned(struct spirv_builder *b, SpvId pointer, SpvId object, unsigned alignment, bool coherent);
200 
201 SpvId
202 spirv_builder_emit_access_chain(struct spirv_builder *b, SpvId result_type,
203                                 SpvId base, const SpvId indexes[],
204                                 size_t num_indexes);
205 
206 void
207 spirv_builder_emit_interlock(struct spirv_builder *b, bool end);
208 
209 SpvId
210 spirv_builder_emit_unop_const(struct spirv_builder *b, SpvOp op, SpvId result_type, uint64_t operand);
211 
212 SpvId
213 spirv_builder_emit_unop(struct spirv_builder *b, SpvOp op, SpvId result_type,
214                         SpvId operand);
215 
216 SpvId
217 spirv_builder_emit_binop(struct spirv_builder *b, SpvOp op, SpvId result_type,
218                          SpvId operand0, SpvId operand1);
219 
220 SpvId
221 spirv_builder_emit_triop(struct spirv_builder *b, SpvOp op, SpvId result_type,
222                          SpvId operand0, SpvId operand1, SpvId operand2);
223 
224 SpvId
225 spirv_builder_emit_quadop(struct spirv_builder *b, SpvOp op, SpvId result_type,
226                          SpvId operand0, SpvId operand1, SpvId operand2, SpvId operand3);
227 
228 SpvId
229 spirv_builder_emit_hexop(struct spirv_builder *b, SpvOp op, SpvId result_type,
230                          SpvId operand0, SpvId operand1, SpvId operand2, SpvId operand3,
231                          SpvId operand4, SpvId operand5);
232 
233 SpvId
234 spirv_builder_emit_composite_extract(struct spirv_builder *b, SpvId result_type,
235                                      SpvId composite, const uint32_t indexes[],
236                                      size_t num_indexes);
237 
238 SpvId
239 spirv_builder_emit_composite_construct(struct spirv_builder *b,
240                                        SpvId result_type,
241                                        const SpvId constituents[],
242                                        size_t num_constituents);
243 
244 SpvId
245 spirv_builder_emit_vector_shuffle(struct spirv_builder *b, SpvId result_type,
246                                   SpvId vector_1, SpvId vector_2,
247                                   const uint32_t components[],
248                                   size_t num_components);
249 SpvId
250 spirv_builder_emit_vector_extract(struct spirv_builder *b, SpvId result_type,
251                                   SpvId vector_1,
252                                   uint32_t component);
253 SpvId
254 spirv_builder_emit_vector_insert(struct spirv_builder *b, SpvId result_type,
255                                   SpvId vector_1,
256                                   SpvId component,
257                                   uint32_t index);
258 void
259 spirv_builder_emit_branch(struct spirv_builder *b, SpvId label);
260 
261 void
262 spirv_builder_emit_selection_merge(struct spirv_builder *b, SpvId merge_block,
263                                    SpvSelectionControlMask selection_control);
264 
265 void
266 spirv_builder_loop_merge(struct spirv_builder *b, SpvId merge_block,
267                          SpvId cont_target, SpvLoopControlMask loop_control);
268 
269 void
270 spirv_builder_emit_branch_conditional(struct spirv_builder *b, SpvId condition,
271                                       SpvId true_label, SpvId false_label);
272 
273 SpvId
274 spirv_builder_emit_phi(struct spirv_builder *b, SpvId result_type,
275                        size_t num_vars, size_t *position);
276 
277 void
278 spirv_builder_set_phi_operand(struct spirv_builder *b, size_t position,
279                               size_t index, SpvId variable, SpvId parent);
280 
281 void
282 spirv_builder_emit_kill(struct spirv_builder *b);
283 
284 void
285 spirv_builder_emit_terminate(struct spirv_builder *b);
286 
287 void
288 spirv_builder_emit_demote(struct spirv_builder *b);
289 
290 SpvId
291 spirv_is_helper_invocation(struct spirv_builder *b);
292 
293 SpvId
294 spirv_builder_emit_vote(struct spirv_builder *b, SpvOp op, SpvId src);
295 
296 SpvId
297 spirv_builder_emit_image_sample(struct spirv_builder *b,
298                                 SpvId result_type,
299                                 SpvId sampled_image,
300                                 SpvId coordinate,
301                                 bool proj,
302                                 SpvId lod,
303                                 SpvId bias,
304                                 SpvId dref,
305                                 SpvId dx,
306                                 SpvId dy,
307                                 SpvId const_offset,
308                                 SpvId offset,
309                                 SpvId min_lod,
310                                 bool sparse);
311 
312 SpvId
313 spirv_builder_emit_image(struct spirv_builder *b, SpvId result_type,
314                          SpvId sampled_image);
315 
316 SpvId
317 spirv_builder_emit_image_texel_pointer(struct spirv_builder *b,
318                                        SpvId result_type,
319                                        SpvId image,
320                                        SpvId coordinate,
321                                        SpvId sample);
322 
323 SpvId
324 spirv_builder_emit_image_read(struct spirv_builder *b,
325                               SpvId result_type,
326                               SpvId image,
327                               SpvId coordinate,
328                               SpvId lod,
329                               SpvId sample,
330                               SpvId offset,
331                               bool sparse);
332 
333 void
334 spirv_builder_emit_image_write(struct spirv_builder *b,
335                                SpvId image,
336                                SpvId coordinate,
337                                SpvId texel,
338                                SpvId lod,
339                                SpvId sample,
340                                SpvId offset);
341 
342 SpvId
343 spirv_builder_emit_image_fetch(struct spirv_builder *b,
344                                SpvId result_type,
345                                SpvId image,
346                                SpvId coordinate,
347                                SpvId lod,
348                                SpvId sample,
349                                SpvId const_offset,
350                                SpvId offset,
351                                bool sparse);
352 SpvId
353 spirv_builder_emit_image_gather(struct spirv_builder *b,
354                                SpvId result_type,
355                                SpvId image,
356                                SpvId coordinate,
357                                SpvId component,
358                                SpvId lod,
359                                SpvId sample,
360                                SpvId const_offset,
361                                SpvId offset,
362                                SpvId dref,
363                                bool sparse);
364 
365 SpvId
366 spirv_builder_emit_image_query_size(struct spirv_builder *b,
367                                     SpvId result_type,
368                                     SpvId image,
369                                     SpvId lod);
370 
371 SpvId
372 spirv_builder_emit_image_query_levels(struct spirv_builder *b,
373                                     SpvId result_type,
374                                     SpvId image);
375 
376 SpvId
377 spirv_builder_emit_image_query_lod(struct spirv_builder *b,
378                                     SpvId result_type,
379                                     SpvId image,
380                                     SpvId coords);
381 
382 SpvId
383 spirv_builder_emit_ext_inst(struct spirv_builder *b, SpvId result_type,
384                             SpvId set, uint32_t instruction,
385                             const SpvId args[], size_t num_args);
386 
387 SpvId
388 spirv_builder_type_void(struct spirv_builder *b);
389 
390 SpvId
391 spirv_builder_type_bool(struct spirv_builder *b);
392 
393 SpvId
394 spirv_builder_type_int(struct spirv_builder *b, unsigned width);
395 
396 SpvId
397 spirv_builder_type_uint(struct spirv_builder *b, unsigned width);
398 
399 SpvId
400 spirv_builder_type_float(struct spirv_builder *b, unsigned width);
401 
402 SpvId
403 spirv_builder_type_image(struct spirv_builder *b, SpvId sampled_type,
404                          SpvDim dim, bool depth, bool arrayed, bool ms,
405                          unsigned sampled, SpvImageFormat image_format);
406 
407 SpvId
408 spirv_builder_type_sampled_image(struct spirv_builder *b, SpvId image_type);
409 SpvId
410 spirv_builder_type_sampler(struct spirv_builder *b);
411 SpvId
412 spirv_builder_emit_sampled_image(struct spirv_builder *b, SpvId result_type, SpvId image, SpvId sampler);
413 
414 SpvId
415 spirv_builder_type_pointer(struct spirv_builder *b,
416                            SpvStorageClass storage_class, SpvId type);
417 
418 SpvId
419 spirv_builder_type_vector(struct spirv_builder *b, SpvId component_type,
420                           unsigned component_count);
421 
422 SpvId
423 spirv_builder_type_matrix(struct spirv_builder *b, SpvId component_type,
424                           unsigned component_count);
425 
426 SpvId
427 spirv_builder_type_runtime_array(struct spirv_builder *b, SpvId component_type);
428 
429 SpvId
430 spirv_builder_type_array(struct spirv_builder *b, SpvId component_type,
431                          SpvId length);
432 
433 SpvId
434 spirv_builder_type_struct(struct spirv_builder *b, const SpvId member_types[],
435                           size_t num_member_types);
436 
437 SpvId
438 spirv_builder_type_function(struct spirv_builder *b, SpvId return_type,
439                             const SpvId parameter_types[],
440                             size_t num_parameter_types);
441 
442 SpvId
443 spirv_builder_function_call(struct spirv_builder *b, SpvId result_type,
444                             SpvId function, const SpvId arguments[],
445                             size_t num_arguments);
446 
447 SpvId
448 spirv_builder_const_bool(struct spirv_builder *b, bool val);
449 
450 SpvId
451 spirv_builder_const_int(struct spirv_builder *b, int width, int64_t val);
452 
453 SpvId
454 spirv_builder_const_uint(struct spirv_builder *b, int width, uint64_t val);
455 
456 SpvId
457 spirv_builder_spec_const_uint(struct spirv_builder *b, int width);
458 
459 SpvId
460 spirv_builder_const_float(struct spirv_builder *b, int width, double val);
461 
462 SpvId
463 spirv_builder_const_composite(struct spirv_builder *b, SpvId result_type,
464                               const SpvId constituents[],
465                               size_t num_constituents);
466 
467 SpvId
468 spirv_builder_spec_const_composite(struct spirv_builder *b, SpvId result_type,
469                                    const SpvId constituents[],
470                                    size_t num_constituents);
471 
472 SpvId
473 spirv_builder_emit_var(struct spirv_builder *b, SpvId type,
474                        SpvStorageClass storage_class);
475 
476 void
477 spirv_builder_emit_memory_barrier(struct spirv_builder *b, SpvScope scope, SpvMemorySemanticsMask semantics);
478 
479 void
480 spirv_builder_emit_control_barrier(struct spirv_builder *b, SpvScope scope, SpvScope mem_scope, SpvMemorySemanticsMask semantics);
481 
482 SpvId
483 spirv_builder_import(struct spirv_builder *b, const char *name);
484 
485 size_t
486 spirv_builder_get_num_words(struct spirv_builder *b);
487 
488 size_t
489 spirv_builder_get_words(struct spirv_builder *b, uint32_t *words,
490                         size_t num_words, uint32_t spirv_version,
491                         uint32_t *tcs_vertices_out_word);
492 
493 void
494 spirv_builder_emit_vertex(struct spirv_builder *b, uint32_t stream, bool multistream);
495 void
496 spirv_builder_end_primitive(struct spirv_builder *b, uint32_t stream, bool multistream);
497 void
498 spirv_builder_begin_local_vars(struct spirv_builder *b);
499 #endif
500