1 /**************************************************************************
2 *
3 * Copyright 2010 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 #ifndef DRAW_LLVM_H
29 #define DRAW_LLVM_H
30
31 #include "draw/draw_private.h"
32
33 #include "draw/draw_vs.h"
34 #include "draw/draw_gs.h"
35 #include "draw/draw_tess.h"
36
37 #include "gallivm/lp_bld_sample.h"
38 #include "gallivm/lp_bld_limits.h"
39 #include "gallivm/lp_bld_jit_types.h"
40 #include "gallivm/lp_bld_jit_sample.h"
41
42 #include "pipe/p_context.h"
43 #include "util/list.h"
44
45
46 struct draw_llvm;
47 struct llvm_vertex_shader;
48 struct llvm_geometry_shader;
49 struct llvm_tess_ctrl_shader;
50 struct llvm_tess_eval_shader;
51
52 /**
53 * This structure is passed directly to the generated vertex shader.
54 *
55 * It contains the derived state.
56 *
57 * Changes here must be reflected in the draw_jit_context_* macros.
58 * Changes to the ordering should be avoided.
59 *
60 * Only use types with a clear size and padding here, in particular prefer the
61 * stdint.h types to the basic integer types.
62 */
63 struct draw_vs_jit_context
64 {
65 float (*planes) [DRAW_TOTAL_CLIP_PLANES][4];
66 struct pipe_viewport_state *viewports;
67 };
68
69 enum {
70 DRAW_VS_JIT_CTX_PLANES = 0,
71 DRAW_VS_JIT_CTX_VIEWPORT = 1,
72 DRAW_VS_JIT_CTX_NUM_FIELDS
73 };
74
75 #define draw_vs_jit_context_planes(_gallivm, _type, _ptr) \
76 lp_build_struct_get2(_gallivm, _type, _ptr, DRAW_VS_JIT_CTX_PLANES, "planes")
77
78 #define draw_vs_jit_context_viewports(_variant, _ptr) \
79 lp_build_struct_get2(_variant->gallivm, _variant->context_type, _ptr, DRAW_VS_JIT_CTX_VIEWPORT, "viewports")
80
81
82 #define draw_jit_vbuffer_offset(_gallivm, _type, _ptr) \
83 lp_build_struct_get2(_gallivm, _type, _ptr, 1, "buffer_offset")
84
85 enum {
86 DRAW_JIT_DVBUFFER_MAP = 0,
87 DRAW_JIT_DVBUFFER_SIZE,
88 DRAW_JIT_DVBUFFER_NUM_FIELDS /* number of fields above */
89 };
90
91 #define draw_jit_dvbuffer_map(_gallivm, _type, _ptr) \
92 lp_build_struct_get2(_gallivm, _type, _ptr, DRAW_JIT_DVBUFFER_MAP, "map")
93
94 #define draw_jit_dvbuffer_size(_gallivm, _type, _ptr) \
95 lp_build_struct_get2(_gallivm, _type, _ptr, DRAW_JIT_DVBUFFER_SIZE, "size")
96
97
98 /**
99 * This structure is passed directly to the generated geometry shader.
100 *
101 * It contains the derived state.
102 *
103 * Changes here must be reflected in the draw_gs_jit_context_* macros.
104 * Changes to the ordering should be avoided.
105 *
106 * Only use types with a clear size and padding here, in particular prefer the
107 * stdint.h types to the basic integer types.
108 */
109 struct draw_gs_jit_context
110 {
111 float (*planes) [DRAW_TOTAL_CLIP_PLANES][4];
112 struct pipe_viewport_state *viewports;
113
114 int **prim_lengths;
115 int *emitted_vertices;
116 int *emitted_prims;
117 };
118
119 enum {
120 DRAW_GS_JIT_CTX_PLANES = 0,
121 DRAW_GS_JIT_CTX_VIEWPORT = 1,
122 DRAW_GS_JIT_CTX_PRIM_LENGTHS = 2,
123 DRAW_GS_JIT_CTX_EMITTED_VERTICES = 3,
124 DRAW_GS_JIT_CTX_EMITTED_PRIMS = 4,
125 DRAW_GS_JIT_CTX_NUM_FIELDS = 5
126 };
127
128 #define draw_gs_jit_context_planes(_gallivm, _ptr) \
129 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_PLANES, "planes")
130
131 #define draw_gs_jit_context_viewports(_gallivm, _ptr) \
132 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_VIEWPORT, "viewports")
133
134 #define draw_gs_jit_prim_lengths(_variant, _ptr) \
135 lp_build_struct_get2(_variant->gallivm, _variant->context_type, _ptr, DRAW_GS_JIT_CTX_PRIM_LENGTHS, "prim_lengths")
136
137 #define draw_gs_jit_emitted_vertices(_variant, _ptr) \
138 lp_build_struct_get2(_variant->gallivm, _variant->context_type, _ptr, DRAW_GS_JIT_CTX_EMITTED_VERTICES, "emitted_vertices")
139
140 #define draw_gs_jit_emitted_prims(_variant, _ptr) \
141 lp_build_struct_get2(_variant->gallivm, _variant->context_type, _ptr, DRAW_GS_JIT_CTX_EMITTED_PRIMS, "emitted_prims")
142
143
144 typedef bool
145 (*draw_jit_vert_func)(struct draw_vs_jit_context *context,
146 const struct lp_jit_resources *resources,
147 struct vertex_header *io,
148 const struct draw_vertex_buffer vbuffers[PIPE_MAX_ATTRIBS],
149 unsigned count,
150 unsigned start,
151 unsigned stride,
152 struct pipe_vertex_buffer *vertex_buffers,
153 unsigned instance_id,
154 unsigned vertex_id_offset,
155 unsigned start_instance,
156 const unsigned *fetch_elts,
157 unsigned draw_id, unsigned view_id);
158
159
160 typedef int
161 (*draw_gs_jit_func)(struct draw_gs_jit_context *context,
162 const struct lp_jit_resources *resources,
163 float inputs[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS],
164 struct vertex_header **output,
165 unsigned num_prims,
166 unsigned instance_id,
167 int *prim_ids,
168 unsigned invocation_id,
169 unsigned view_id);
170
171 typedef int
172 (*draw_tcs_jit_func)(const struct lp_jit_resources *resources,
173 float inputs[32][NUM_TCS_INPUTS][TGSI_NUM_CHANNELS],
174 float outputs[32][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS],
175 uint32_t prim_id, uint32_t patch_vertices_in,
176 unsigned view_id);
177
178 typedef int
179 (*draw_tes_jit_func)(const struct lp_jit_resources *resources,
180 float inputs[32][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS],
181 struct vertex_header *io,
182 uint32_t prim_id, uint32_t num_tess_coord,
183 float *tess_coord_x, float *tess_coord_y, float *tess_outer,
184 float *tess_inner, uint32_t patch_vertices_in,
185 unsigned view_id);
186
187
188 struct draw_llvm_variant_key
189 {
190 unsigned nr_vertex_elements:8;
191 unsigned nr_samplers:8;
192 unsigned nr_sampler_views:8;
193 unsigned nr_images:8;
194 unsigned clamp_vertex_color:1;
195 unsigned clip_xy:1;
196 unsigned clip_z:1;
197 unsigned clip_user:1;
198 unsigned clip_halfz:1;
199 unsigned bypass_viewport:1;
200 unsigned need_edgeflags:1;
201 unsigned has_gs_or_tes:1;
202 unsigned num_outputs:8;
203 unsigned ucp_enable:PIPE_MAX_CLIP_PLANES;
204 /* note padding here - must use memset */
205
206 /* Variable number of vertex elements:
207 */
208 struct pipe_vertex_element vertex_element[1];
209
210 /* Followed by variable number of samplers:
211 */
212 /* struct draw_sampler_static_state sampler; */
213 /* Followed by variable number of images
214 */
215 };
216
217 struct draw_gs_llvm_variant_key
218 {
219 unsigned nr_samplers:8;
220 unsigned nr_sampler_views:8;
221 unsigned nr_images:8;
222 unsigned num_outputs:8;
223 /* note padding here - must use memset */
224 unsigned clamp_vertex_color:1;
225 struct lp_sampler_static_state samplers[1];
226 /* Followed by variable number of images.*/
227 };
228
229 struct draw_tcs_llvm_variant_key
230 {
231 unsigned nr_samplers:8;
232 unsigned nr_sampler_views:8;
233 unsigned nr_images:8;
234 struct lp_sampler_static_state samplers[1];
235 /* Followed by variable number of images.*/
236 };
237
238 struct draw_tes_llvm_variant_key
239 {
240 unsigned nr_samplers:8;
241 unsigned nr_sampler_views:8;
242 unsigned nr_images:8;
243 unsigned primid_output:7;
244 unsigned primid_needed:1;
245 unsigned clamp_vertex_color:1;
246 struct lp_sampler_static_state samplers[1];
247 /* Followed by variable number of images.*/
248 };
249
250 #define DRAW_LLVM_MAX_VARIANT_KEY_SIZE \
251 (sizeof(struct draw_llvm_variant_key) + \
252 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct lp_sampler_static_state) + \
253 PIPE_MAX_SHADER_IMAGES * sizeof(struct lp_image_static_state) + \
254 (PIPE_MAX_ATTRIBS-1) * sizeof(struct pipe_vertex_element))
255
256 #define DRAW_GS_LLVM_MAX_VARIANT_KEY_SIZE \
257 (sizeof(struct draw_gs_llvm_variant_key) + \
258 PIPE_MAX_SHADER_IMAGES * sizeof(struct lp_image_static_state) + \
259 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct lp_sampler_static_state))
260
261 #define DRAW_TCS_LLVM_MAX_VARIANT_KEY_SIZE \
262 (sizeof(struct draw_tcs_llvm_variant_key) + \
263 PIPE_MAX_SHADER_IMAGES * sizeof(struct lp_image_static_state) + \
264 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct lp_sampler_static_state))
265
266 #define DRAW_TES_LLVM_MAX_VARIANT_KEY_SIZE \
267 (sizeof(struct draw_tes_llvm_variant_key) + \
268 PIPE_MAX_SHADER_IMAGES * sizeof(struct lp_image_static_state) + \
269 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct lp_sampler_static_state))
270
271
272 static inline size_t
draw_llvm_variant_key_size(unsigned nr_vertex_elements,unsigned nr_samplers,unsigned nr_sampler_views,unsigned nr_images)273 draw_llvm_variant_key_size(unsigned nr_vertex_elements,
274 unsigned nr_samplers,
275 unsigned nr_sampler_views,
276 unsigned nr_images)
277 {
278 return (sizeof(struct draw_llvm_variant_key) +
279 (nr_vertex_elements - 1) * sizeof(struct pipe_vertex_element) +
280 MAX2(nr_samplers, nr_sampler_views) *
281 sizeof(struct lp_sampler_static_state) +
282 nr_images * sizeof(struct lp_image_static_state));
283 }
284
285
286 static inline size_t
draw_gs_llvm_variant_key_size(unsigned nr_samplers,unsigned nr_sampler_views,unsigned nr_images)287 draw_gs_llvm_variant_key_size(unsigned nr_samplers,
288 unsigned nr_sampler_views,
289 unsigned nr_images)
290 {
291 return (sizeof(struct draw_gs_llvm_variant_key) +
292 (MAX2(nr_samplers, nr_sampler_views) - 1) *
293 sizeof(struct lp_sampler_static_state) +
294 nr_images * sizeof(struct lp_sampler_static_state));
295 }
296
297 static inline size_t
draw_tcs_llvm_variant_key_size(unsigned nr_samplers,unsigned nr_sampler_views,unsigned nr_images)298 draw_tcs_llvm_variant_key_size(unsigned nr_samplers,
299 unsigned nr_sampler_views,
300 unsigned nr_images)
301 {
302 return (sizeof(struct draw_tcs_llvm_variant_key) +
303 (MAX2(nr_samplers, nr_sampler_views) - 1) *
304 sizeof(struct lp_sampler_static_state) +
305 nr_images * sizeof(struct lp_sampler_static_state));
306 }
307
308 static inline size_t
draw_tes_llvm_variant_key_size(unsigned nr_samplers,unsigned nr_sampler_views,unsigned nr_images)309 draw_tes_llvm_variant_key_size(unsigned nr_samplers,
310 unsigned nr_sampler_views,
311 unsigned nr_images)
312 {
313 return (sizeof(struct draw_tes_llvm_variant_key) +
314 (MAX2(nr_samplers, nr_sampler_views) - 1) *
315 sizeof(struct lp_sampler_static_state) +
316 nr_images * sizeof(struct lp_sampler_static_state));
317 }
318
319 static inline struct lp_sampler_static_state *
draw_llvm_variant_key_samplers(struct draw_llvm_variant_key * key)320 draw_llvm_variant_key_samplers(struct draw_llvm_variant_key *key)
321 {
322 return (struct lp_sampler_static_state *)
323 &key->vertex_element[key->nr_vertex_elements];
324 }
325
326 static inline struct lp_image_static_state *
draw_llvm_variant_key_images(struct draw_llvm_variant_key * key)327 draw_llvm_variant_key_images(struct draw_llvm_variant_key *key)
328 {
329 struct lp_sampler_static_state *samplers = (struct lp_sampler_static_state *)
330 (&key->vertex_element[key->nr_vertex_elements]);
331 return (struct lp_image_static_state *)
332 &samplers[MAX2(key->nr_samplers, key->nr_sampler_views)];
333 }
334
335 static inline struct lp_image_static_state *
draw_gs_llvm_variant_key_images(struct draw_gs_llvm_variant_key * key)336 draw_gs_llvm_variant_key_images(struct draw_gs_llvm_variant_key *key)
337 {
338 return (struct lp_image_static_state *)
339 &key->samplers[MAX2(key->nr_samplers, key->nr_sampler_views)];
340 }
341
342 static inline struct lp_image_static_state *
draw_tcs_llvm_variant_key_images(struct draw_tcs_llvm_variant_key * key)343 draw_tcs_llvm_variant_key_images(struct draw_tcs_llvm_variant_key *key)
344 {
345 return (struct lp_image_static_state *)
346 &key->samplers[MAX2(key->nr_samplers, key->nr_sampler_views)];
347 }
348
349 static inline struct lp_image_static_state *
draw_tes_llvm_variant_key_images(struct draw_tes_llvm_variant_key * key)350 draw_tes_llvm_variant_key_images(struct draw_tes_llvm_variant_key *key)
351 {
352 return (struct lp_image_static_state *)
353 &key->samplers[MAX2(key->nr_samplers, key->nr_sampler_views)];
354 }
355
356 struct draw_llvm_variant_list_item
357 {
358 struct list_head list;
359 struct draw_llvm_variant *base;
360 };
361
362 struct draw_gs_llvm_variant_list_item
363 {
364 struct list_head list;
365 struct draw_gs_llvm_variant *base;
366 };
367
368 struct draw_tcs_llvm_variant_list_item
369 {
370 struct list_head list;
371 struct draw_tcs_llvm_variant *base;
372 };
373
374 struct draw_tes_llvm_variant_list_item
375 {
376 struct list_head list;
377 struct draw_tes_llvm_variant *base;
378 };
379
380 struct draw_llvm_variant
381 {
382 struct gallivm_state *gallivm;
383
384 /* LLVM JIT builder types */
385 LLVMTypeRef context_type;
386 LLVMTypeRef context_ptr_type;
387
388 LLVMTypeRef resources_type;
389 LLVMTypeRef resources_ptr_type;
390
391 LLVMTypeRef buffer_type;
392 LLVMTypeRef buffer_ptr_type;
393
394 LLVMTypeRef vb_type;
395 LLVMTypeRef vb_ptr_type;
396
397 LLVMTypeRef vertex_header_type;
398 LLVMTypeRef vertex_header_ptr_type;
399
400 LLVMValueRef function;
401 draw_jit_vert_func jit_func;
402
403 struct llvm_vertex_shader *shader;
404
405 struct draw_llvm *llvm;
406 struct draw_llvm_variant_list_item list_item_global;
407 struct draw_llvm_variant_list_item list_item_local;
408
409 /* key is variable-sized, must be last */
410 struct draw_llvm_variant_key key;
411 };
412
413
414 struct draw_gs_llvm_variant
415 {
416 struct gallivm_state *gallivm;
417
418 /* LLVM JIT builder types */
419 LLVMTypeRef context_type;
420 LLVMTypeRef context_ptr_type;
421
422 LLVMTypeRef resources_type;
423 LLVMTypeRef resources_ptr_type;
424
425 LLVMTypeRef vertex_header_type;
426 LLVMTypeRef vertex_header_ptr_type;
427
428 LLVMTypeRef input_array_type;
429
430 LLVMValueRef context_ptr;
431 LLVMValueRef io_ptr;
432 LLVMValueRef num_prims;
433 LLVMValueRef function;
434 draw_gs_jit_func jit_func;
435
436 struct llvm_geometry_shader *shader;
437
438 struct draw_llvm *llvm;
439 struct draw_gs_llvm_variant_list_item list_item_global;
440 struct draw_gs_llvm_variant_list_item list_item_local;
441
442 /* key is variable-sized, must be last */
443 struct draw_gs_llvm_variant_key key;
444 };
445
446 struct draw_tcs_llvm_variant
447 {
448 struct gallivm_state *gallivm;
449
450 /* LLVM JIT builder types */
451 LLVMTypeRef resources_type;
452 LLVMTypeRef resources_ptr_type;
453 LLVMTypeRef input_array_type;
454 LLVMTypeRef output_array_type;
455
456 LLVMValueRef context_ptr;
457 /* LLVMValueRef io_ptr; */
458 LLVMValueRef num_prims;
459 LLVMValueRef function;
460 draw_tcs_jit_func jit_func;
461
462 struct llvm_tess_ctrl_shader *shader;
463
464 struct draw_llvm *llvm;
465 struct draw_tcs_llvm_variant_list_item list_item_global;
466 struct draw_tcs_llvm_variant_list_item list_item_local;
467
468 /* key is variable-sized, must be last */
469 struct draw_tcs_llvm_variant_key key;
470 };
471
472 struct draw_tes_llvm_variant
473 {
474 struct gallivm_state *gallivm;
475
476 /* LLVM JIT builder types */
477 LLVMTypeRef resources_type;
478 LLVMTypeRef resources_ptr_type;
479 LLVMTypeRef vertex_header_ptr_type;
480 LLVMTypeRef input_array_type;
481 LLVMTypeRef patch_input_array_type;
482
483 LLVMTypeRef input_array_deref_type;
484 LLVMTypeRef vertex_header_type;
485
486 LLVMValueRef context_ptr;
487 LLVMValueRef io_ptr;
488 LLVMValueRef num_prims;
489 LLVMValueRef function;
490 draw_tes_jit_func jit_func;
491
492 struct llvm_tess_eval_shader *shader;
493
494 struct draw_llvm *llvm;
495 struct draw_tes_llvm_variant_list_item list_item_global;
496 struct draw_tes_llvm_variant_list_item list_item_local;
497
498 /* key is variable-sized, must be last */
499 struct draw_tes_llvm_variant_key key;
500 };
501
502 struct llvm_vertex_shader {
503 struct draw_vertex_shader base;
504
505 unsigned variant_key_size;
506 struct draw_llvm_variant_list_item variants;
507 unsigned variants_created;
508 unsigned variants_cached;
509 };
510
511 struct llvm_geometry_shader {
512 struct draw_geometry_shader base;
513
514 unsigned variant_key_size;
515 struct draw_gs_llvm_variant_list_item variants;
516 unsigned variants_created;
517 unsigned variants_cached;
518 };
519
520 struct llvm_tess_ctrl_shader {
521 struct draw_tess_ctrl_shader base;
522
523 unsigned variant_key_size;
524 struct draw_tcs_llvm_variant_list_item variants;
525 unsigned variants_created;
526 unsigned variants_cached;
527 };
528
529 struct llvm_tess_eval_shader {
530 struct draw_tess_eval_shader base;
531
532 unsigned variant_key_size;
533 struct draw_tes_llvm_variant_list_item variants;
534 unsigned variants_created;
535 unsigned variants_cached;
536 };
537
538 struct draw_llvm {
539 struct draw_context *draw;
540
541 LLVMContextRef context;
542 bool context_owned;
543
544 struct draw_vs_jit_context vs_jit_context;
545 struct draw_gs_jit_context gs_jit_context;
546
547 struct lp_jit_resources jit_resources[DRAW_MAX_SHADER_STAGE];
548
549 struct draw_llvm_variant_list_item vs_variants_list;
550 int nr_variants;
551
552 struct draw_gs_llvm_variant_list_item gs_variants_list;
553 int nr_gs_variants;
554
555 struct draw_tcs_llvm_variant_list_item tcs_variants_list;
556 int nr_tcs_variants;
557
558 struct draw_tes_llvm_variant_list_item tes_variants_list;
559 int nr_tes_variants;
560 };
561
562
563 static inline struct llvm_vertex_shader *
llvm_vertex_shader(struct draw_vertex_shader * vs)564 llvm_vertex_shader(struct draw_vertex_shader *vs)
565 {
566 return (struct llvm_vertex_shader *)vs;
567 }
568
569 static inline struct llvm_geometry_shader *
llvm_geometry_shader(struct draw_geometry_shader * gs)570 llvm_geometry_shader(struct draw_geometry_shader *gs)
571 {
572 return (struct llvm_geometry_shader *)gs;
573 }
574
575 static inline struct llvm_tess_ctrl_shader *
llvm_tess_ctrl_shader(struct draw_tess_ctrl_shader * tcs)576 llvm_tess_ctrl_shader(struct draw_tess_ctrl_shader *tcs)
577 {
578 return (struct llvm_tess_ctrl_shader *)tcs;
579 }
580
581 static inline struct llvm_tess_eval_shader *
llvm_tess_eval_shader(struct draw_tess_eval_shader * tes)582 llvm_tess_eval_shader(struct draw_tess_eval_shader *tes)
583 {
584 return (struct llvm_tess_eval_shader *)tes;
585 }
586
587 struct draw_llvm *
588 draw_llvm_create(struct draw_context *draw, LLVMContextRef llvm_context);
589
590 void
591 draw_llvm_destroy(struct draw_llvm *llvm);
592
593 struct draw_llvm_variant *
594 draw_llvm_create_variant(struct draw_llvm *llvm,
595 unsigned num_vertex_header_attribs,
596 const struct draw_llvm_variant_key *key);
597
598 void
599 draw_llvm_destroy_variant(struct draw_llvm_variant *variant);
600
601 struct draw_llvm_variant_key *
602 draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store);
603
604 void
605 draw_llvm_dump_variant_key(struct draw_llvm_variant_key *key);
606
607
608 struct draw_gs_llvm_variant *
609 draw_gs_llvm_create_variant(struct draw_llvm *llvm,
610 unsigned num_vertex_header_attribs,
611 const struct draw_gs_llvm_variant_key *key);
612
613 void
614 draw_gs_llvm_destroy_variant(struct draw_gs_llvm_variant *variant);
615
616 struct draw_gs_llvm_variant_key *
617 draw_gs_llvm_make_variant_key(struct draw_llvm *llvm, char *store);
618
619 void
620 draw_gs_llvm_dump_variant_key(struct draw_gs_llvm_variant_key *key);
621
622 struct draw_tcs_llvm_variant *
623 draw_tcs_llvm_create_variant(struct draw_llvm *llvm,
624 unsigned num_vertex_header_attribs,
625 const struct draw_tcs_llvm_variant_key *key);
626
627 void
628 draw_tcs_llvm_destroy_variant(struct draw_tcs_llvm_variant *variant);
629
630 struct draw_tcs_llvm_variant_key *
631 draw_tcs_llvm_make_variant_key(struct draw_llvm *llvm, char *store);
632
633 void
634 draw_tcs_llvm_dump_variant_key(struct draw_tcs_llvm_variant_key *key);
635
636 struct draw_tes_llvm_variant *
637 draw_tes_llvm_create_variant(struct draw_llvm *llvm,
638 unsigned num_vertex_header_attribs,
639 const struct draw_tes_llvm_variant_key *key);
640
641 void
642 draw_tes_llvm_destroy_variant(struct draw_tes_llvm_variant *variant);
643
644 struct draw_tes_llvm_variant_key *
645 draw_tes_llvm_make_variant_key(struct draw_llvm *llvm, char *store);
646
647 void
648 draw_tes_llvm_dump_variant_key(struct draw_tes_llvm_variant_key *key);
649
650 void
651 draw_llvm_set_sampler_state(struct draw_context *draw,
652 enum pipe_shader_type shader_stage);
653
654 void
655 draw_llvm_set_mapped_texture(struct draw_context *draw,
656 enum pipe_shader_type shader_stage,
657 unsigned sview_idx,
658 uint32_t width, uint32_t height, uint32_t depth,
659 uint32_t first_level, uint32_t last_level,
660 uint32_t num_samples,
661 uint32_t sample_stride,
662 const void *base_ptr,
663 uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
664 uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
665 uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]);
666
667 void
668 draw_llvm_set_mapped_image(struct draw_context *draw,
669 enum pipe_shader_type shader_stage,
670 unsigned idx,
671 uint32_t width, uint32_t height, uint32_t depth,
672 const void *base_ptr,
673 uint32_t row_stride,
674 uint32_t img_stride,
675 uint32_t num_samples,
676 uint32_t sample_stride);
677
678 void
679 draw_store_aos_array(struct gallivm_state *gallivm,
680 struct lp_type soa_type,
681 LLVMTypeRef io_type,
682 LLVMValueRef io_ptr,
683 LLVMValueRef *indices,
684 LLVMValueRef* aos,
685 int attrib,
686 LLVMValueRef clipmask,
687 bool need_edgeflag,
688 bool per_prim);
689
690 #endif
691