i915g: remove old bind_vertex/fragment_sampler_states() hooks
[mesa.git] / src / gallium / auxiliary / draw / draw_llvm.h
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
36 #include "gallivm/lp_bld_sample.h"
37 #include "gallivm/lp_bld_limits.h"
38
39 #include "pipe/p_context.h"
40 #include "util/u_simple_list.h"
41
42
43 struct draw_llvm;
44 struct llvm_vertex_shader;
45 struct llvm_geometry_shader;
46
47 struct draw_jit_texture
48 {
49 uint32_t width;
50 uint32_t height;
51 uint32_t depth;
52 uint32_t first_level;
53 uint32_t last_level;
54 const void *base;
55 uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS];
56 uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS];
57 uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS];
58 };
59
60
61 struct draw_sampler_static_state
62 {
63 /*
64 * These attributes are effectively interleaved for more sane key handling.
65 * However, there might be lots of null space if the amount of samplers and
66 * textures isn't the same.
67 */
68 struct lp_static_sampler_state sampler_state;
69 struct lp_static_texture_state texture_state;
70 };
71
72
73 struct draw_jit_sampler
74 {
75 float min_lod;
76 float max_lod;
77 float lod_bias;
78 float border_color[4];
79 };
80
81
82 enum {
83 DRAW_JIT_TEXTURE_WIDTH = 0,
84 DRAW_JIT_TEXTURE_HEIGHT,
85 DRAW_JIT_TEXTURE_DEPTH,
86 DRAW_JIT_TEXTURE_FIRST_LEVEL,
87 DRAW_JIT_TEXTURE_LAST_LEVEL,
88 DRAW_JIT_TEXTURE_BASE,
89 DRAW_JIT_TEXTURE_ROW_STRIDE,
90 DRAW_JIT_TEXTURE_IMG_STRIDE,
91 DRAW_JIT_TEXTURE_MIP_OFFSETS,
92 DRAW_JIT_TEXTURE_NUM_FIELDS /* number of fields above */
93 };
94
95
96 enum {
97 DRAW_JIT_SAMPLER_MIN_LOD,
98 DRAW_JIT_SAMPLER_MAX_LOD,
99 DRAW_JIT_SAMPLER_LOD_BIAS,
100 DRAW_JIT_SAMPLER_BORDER_COLOR,
101 DRAW_JIT_SAMPLER_NUM_FIELDS /* number of fields above */
102 };
103
104
105 enum {
106 DRAW_JIT_VERTEX_VERTEX_ID = 0,
107 DRAW_JIT_VERTEX_CLIP,
108 DRAW_JIT_VERTEX_PRE_CLIP_POS,
109 DRAW_JIT_VERTEX_DATA
110 };
111
112 /**
113 * This structure is passed directly to the generated vertex shader.
114 *
115 * It contains the derived state.
116 *
117 * Changes here must be reflected in the draw_jit_context_* macros.
118 * Changes to the ordering should be avoided.
119 *
120 * Only use types with a clear size and padding here, in particular prefer the
121 * stdint.h types to the basic integer types.
122 */
123 struct draw_jit_context
124 {
125 const float *vs_constants[LP_MAX_TGSI_CONST_BUFFERS];
126 float (*planes) [DRAW_TOTAL_CLIP_PLANES][4];
127 float *viewport;
128
129 struct draw_jit_texture textures[PIPE_MAX_SHADER_SAMPLER_VIEWS];
130 struct draw_jit_sampler samplers[PIPE_MAX_SAMPLERS];
131 };
132
133 enum {
134 DRAW_JIT_CTX_CONSTANTS = 0,
135 DRAW_JIT_CTX_PLANES = 1,
136 DRAW_JIT_CTX_VIEWPORT = 2,
137 DRAW_JIT_CTX_TEXTURES = 3,
138 DRAW_JIT_CTX_SAMPLERS = 4,
139 DRAW_JIT_CTX_NUM_FIELDS
140 };
141
142 #define draw_jit_context_vs_constants(_gallivm, _ptr) \
143 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_CONSTANTS, "vs_constants")
144
145 #define draw_jit_context_planes(_gallivm, _ptr) \
146 lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_CTX_PLANES, "planes")
147
148 #define draw_jit_context_viewport(_gallivm, _ptr) \
149 lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_CTX_VIEWPORT, "viewport")
150
151 #define draw_jit_context_textures(_gallivm, _ptr) \
152 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_TEXTURES, "textures")
153
154 #define draw_jit_context_samplers(_gallivm, _ptr) \
155 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_CTX_SAMPLERS, "samplers")
156
157 #define draw_jit_header_id(_gallivm, _ptr) \
158 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_VERTEX_ID, "id")
159
160 #define draw_jit_header_clip(_gallivm, _ptr) \
161 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_CLIP, "clip")
162
163 #define draw_jit_header_pre_clip_pos(_gallivm, _ptr) \
164 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_PRE_CLIP_POS, "pre_clip_pos")
165
166 #define draw_jit_header_data(_gallivm, _ptr) \
167 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_JIT_VERTEX_DATA, "data")
168
169
170 #define draw_jit_vbuffer_stride(_gallivm, _ptr) \
171 lp_build_struct_get(_gallivm, _ptr, 0, "stride")
172
173 #define draw_jit_vbuffer_offset(_gallivm, _ptr) \
174 lp_build_struct_get(_gallivm, _ptr, 1, "buffer_offset")
175
176 enum {
177 DRAW_JIT_DVBUFFER_MAP = 0,
178 DRAW_JIT_DVBUFFER_SIZE,
179 DRAW_JIT_DVBUFFER_NUM_FIELDS /* number of fields above */
180 };
181
182 #define draw_jit_dvbuffer_map(_gallivm, _ptr) \
183 lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_DVBUFFER_MAP, "map")
184
185 #define draw_jit_dvbuffer_size(_gallivm, _ptr) \
186 lp_build_struct_get(_gallivm, _ptr, DRAW_JIT_DVBUFFER_SIZE, "size")
187
188
189 /**
190 * This structure is passed directly to the generated geometry shader.
191 *
192 * It contains the derived state.
193 *
194 * Changes here must be reflected in the draw_gs_jit_context_* macros.
195 * Changes to the ordering should be avoided.
196 *
197 * Only use types with a clear size and padding here, in particular prefer the
198 * stdint.h types to the basic integer types.
199 */
200 struct draw_gs_jit_context
201 {
202 const float *constants[LP_MAX_TGSI_CONST_BUFFERS];
203 float (*planes) [DRAW_TOTAL_CLIP_PLANES][4];
204 float *viewport;
205
206 /* There two need to be exactly at DRAW_JIT_CTX_TEXTURES and
207 * DRAW_JIT_CTX_SAMPLERS positions in the struct */
208 struct draw_jit_texture textures[PIPE_MAX_SHADER_SAMPLER_VIEWS];
209 struct draw_jit_sampler samplers[PIPE_MAX_SAMPLERS];
210
211 int **prim_lengths;
212 int *emitted_vertices;
213 int *emitted_prims;
214 };
215
216 enum {
217 DRAW_GS_JIT_CTX_CONSTANTS = 0,
218 DRAW_GS_JIT_CTX_PLANES = 1,
219 DRAW_GS_JIT_CTX_VIEWPORT = 2,
220 /* Textures and samples are reserved for DRAW_JIT_CTX_TEXTURES
221 * and DRAW_JIT_CTX_SAMPLERS, because they both need
222 * to be at exactly the same locations as they are in the
223 * VS ctx structure for sampling to work. */
224 DRAW_GS_JIT_CTX_TEXTURES = DRAW_JIT_CTX_TEXTURES,
225 DRAW_GS_JIT_CTX_SAMPLERS = DRAW_JIT_CTX_SAMPLERS,
226 DRAW_GS_JIT_CTX_PRIM_LENGTHS = 5,
227 DRAW_GS_JIT_CTX_EMITTED_VERTICES = 6,
228 DRAW_GS_JIT_CTX_EMITTED_PRIMS = 7,
229 DRAW_GS_JIT_CTX_NUM_FIELDS = 8
230 };
231
232 #define draw_gs_jit_context_constants(_gallivm, _ptr) \
233 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_CONSTANTS, "constants")
234
235 #define draw_gs_jit_context_planes(_gallivm, _ptr) \
236 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_PLANES, "planes")
237
238 #define draw_gs_jit_context_viewport(_gallivm, _ptr) \
239 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_VIEWPORT, "viewport")
240
241 #define draw_gs_jit_context_textures(_gallivm, _ptr) \
242 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_TEXTURES, "textures")
243
244 #define draw_gs_jit_context_samplers(_gallivm, _ptr) \
245 lp_build_struct_get_ptr(_gallivm, _ptr, DRAW_GS_JIT_CTX_SAMPLERS, "samplers")
246
247 #define draw_gs_jit_prim_lengths(_gallivm, _ptr) \
248 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_PRIM_LENGTHS, "prim_lengths")
249
250 #define draw_gs_jit_emitted_vertices(_gallivm, _ptr) \
251 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_EMITTED_VERTICES, "emitted_vertices")
252
253 #define draw_gs_jit_emitted_prims(_gallivm, _ptr) \
254 lp_build_struct_get(_gallivm, _ptr, DRAW_GS_JIT_CTX_EMITTED_PRIMS, "emitted_prims")
255
256
257
258 typedef int
259 (*draw_jit_vert_func)(struct draw_jit_context *context,
260 struct vertex_header *io,
261 const struct draw_vertex_buffer vbuffers[PIPE_MAX_ATTRIBS],
262 unsigned start,
263 unsigned count,
264 unsigned stride,
265 struct pipe_vertex_buffer *vertex_buffers,
266 unsigned instance_id,
267 unsigned vertex_id_offset);
268
269
270 typedef int
271 (*draw_jit_vert_func_elts)(struct draw_jit_context *context,
272 struct vertex_header *io,
273 const struct draw_vertex_buffer vbuffers[PIPE_MAX_ATTRIBS],
274 const unsigned *fetch_elts,
275 unsigned fetch_max_elt,
276 unsigned fetch_count,
277 unsigned stride,
278 struct pipe_vertex_buffer *vertex_buffers,
279 unsigned instance_id,
280 unsigned vertex_id_offset);
281
282
283 typedef int
284 (*draw_gs_jit_func)(struct draw_gs_jit_context *context,
285 float inputs[6][PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS][TGSI_NUM_CHANNELS],
286 struct vertex_header *output,
287 unsigned num_prims,
288 unsigned instance_id,
289 int *prim_ids);
290
291 struct draw_llvm_variant_key
292 {
293 unsigned nr_vertex_elements:8;
294 unsigned nr_samplers:8;
295 unsigned nr_sampler_views:8;
296 unsigned clamp_vertex_color:1;
297 unsigned clip_xy:1;
298 unsigned clip_z:1;
299 unsigned clip_user:1;
300 unsigned clip_halfz:1;
301 unsigned bypass_viewport:1;
302 unsigned need_edgeflags:1;
303 unsigned has_gs:1;
304 unsigned num_outputs:8;
305 /*
306 * it is important there are no holes in this struct
307 * (and all padding gets zeroed).
308 */
309 unsigned ucp_enable:PIPE_MAX_CLIP_PLANES;
310 unsigned pad1:24-PIPE_MAX_CLIP_PLANES;
311
312 /* Variable number of vertex elements:
313 */
314 struct pipe_vertex_element vertex_element[1];
315
316 /* Followed by variable number of samplers:
317 */
318 /* struct draw_sampler_static_state sampler; */
319 };
320
321 struct draw_gs_llvm_variant_key
322 {
323 unsigned nr_samplers:8;
324 unsigned nr_sampler_views:8;
325 unsigned num_outputs:8;
326
327 struct draw_sampler_static_state samplers[1];
328 };
329
330 #define DRAW_LLVM_MAX_VARIANT_KEY_SIZE \
331 (sizeof(struct draw_llvm_variant_key) + \
332 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state) + \
333 (PIPE_MAX_ATTRIBS-1) * sizeof(struct pipe_vertex_element))
334
335 #define DRAW_GS_LLVM_MAX_VARIANT_KEY_SIZE \
336 (sizeof(struct draw_gs_llvm_variant_key) + \
337 PIPE_MAX_SHADER_SAMPLER_VIEWS * sizeof(struct draw_sampler_static_state))
338
339
340 static INLINE size_t
341 draw_llvm_variant_key_size(unsigned nr_vertex_elements,
342 unsigned nr_samplers)
343 {
344 return (sizeof(struct draw_llvm_variant_key) +
345 nr_samplers * sizeof(struct draw_sampler_static_state) +
346 (nr_vertex_elements - 1) * sizeof(struct pipe_vertex_element));
347 }
348
349
350 static INLINE size_t
351 draw_gs_llvm_variant_key_size(unsigned nr_samplers)
352 {
353 return (sizeof(struct draw_gs_llvm_variant_key) +
354 (nr_samplers - 1) * sizeof(struct draw_sampler_static_state));
355 }
356
357
358 static INLINE struct draw_sampler_static_state *
359 draw_llvm_variant_key_samplers(struct draw_llvm_variant_key *key)
360 {
361 return (struct draw_sampler_static_state *)
362 &key->vertex_element[key->nr_vertex_elements];
363 }
364
365
366 struct draw_llvm_variant_list_item
367 {
368 struct draw_llvm_variant *base;
369 struct draw_llvm_variant_list_item *next, *prev;
370 };
371
372 struct draw_gs_llvm_variant_list_item
373 {
374 struct draw_gs_llvm_variant *base;
375 struct draw_gs_llvm_variant_list_item *next, *prev;
376 };
377
378
379 struct draw_llvm_variant
380 {
381 struct gallivm_state *gallivm;
382
383 /* LLVM JIT builder types */
384 LLVMTypeRef context_ptr_type;
385 LLVMTypeRef buffer_ptr_type;
386 LLVMTypeRef vb_ptr_type;
387 LLVMTypeRef vertex_header_ptr_type;
388
389 LLVMValueRef function;
390 LLVMValueRef function_elts;
391 draw_jit_vert_func jit_func;
392 draw_jit_vert_func_elts jit_func_elts;
393
394 struct llvm_vertex_shader *shader;
395
396 struct draw_llvm *llvm;
397 struct draw_llvm_variant_list_item list_item_global;
398 struct draw_llvm_variant_list_item list_item_local;
399
400 /* key is variable-sized, must be last */
401 struct draw_llvm_variant_key key;
402 };
403
404
405 struct draw_gs_llvm_variant
406 {
407 struct gallivm_state *gallivm;
408
409 /* LLVM JIT builder types */
410 LLVMTypeRef context_ptr_type;
411 LLVMTypeRef vertex_header_ptr_type;
412 LLVMTypeRef input_array_type;
413
414 LLVMValueRef context_ptr;
415 LLVMValueRef io_ptr;
416 LLVMValueRef num_prims;
417 LLVMValueRef function;
418 draw_gs_jit_func jit_func;
419
420 struct llvm_geometry_shader *shader;
421
422 struct draw_llvm *llvm;
423 struct draw_gs_llvm_variant_list_item list_item_global;
424 struct draw_gs_llvm_variant_list_item list_item_local;
425
426 /* key is variable-sized, must be last */
427 struct draw_gs_llvm_variant_key key;
428 };
429
430 struct llvm_vertex_shader {
431 struct draw_vertex_shader base;
432
433 unsigned variant_key_size;
434 struct draw_llvm_variant_list_item variants;
435 unsigned variants_created;
436 unsigned variants_cached;
437 };
438
439 struct llvm_geometry_shader {
440 struct draw_geometry_shader base;
441
442 unsigned variant_key_size;
443 struct draw_gs_llvm_variant_list_item variants;
444 unsigned variants_created;
445 unsigned variants_cached;
446 };
447
448
449 struct draw_llvm {
450 struct draw_context *draw;
451
452 struct draw_jit_context jit_context;
453 struct draw_gs_jit_context gs_jit_context;
454
455 struct draw_llvm_variant_list_item vs_variants_list;
456 int nr_variants;
457
458 struct draw_gs_llvm_variant_list_item gs_variants_list;
459 int nr_gs_variants;
460 };
461
462
463 static INLINE struct llvm_vertex_shader *
464 llvm_vertex_shader(struct draw_vertex_shader *vs)
465 {
466 return (struct llvm_vertex_shader *)vs;
467 }
468
469 static INLINE struct llvm_geometry_shader *
470 llvm_geometry_shader(struct draw_geometry_shader *gs)
471 {
472 return (struct llvm_geometry_shader *)gs;
473 }
474
475
476
477
478 struct draw_llvm *
479 draw_llvm_create(struct draw_context *draw);
480
481 void
482 draw_llvm_destroy(struct draw_llvm *llvm);
483
484 struct draw_llvm_variant *
485 draw_llvm_create_variant(struct draw_llvm *llvm,
486 unsigned num_vertex_header_attribs,
487 const struct draw_llvm_variant_key *key);
488
489 void
490 draw_llvm_destroy_variant(struct draw_llvm_variant *variant);
491
492 struct draw_llvm_variant_key *
493 draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store);
494
495 void
496 draw_llvm_dump_variant_key(struct draw_llvm_variant_key *key);
497
498
499 struct draw_gs_llvm_variant *
500 draw_gs_llvm_create_variant(struct draw_llvm *llvm,
501 unsigned num_vertex_header_attribs,
502 const struct draw_gs_llvm_variant_key *key);
503
504 void
505 draw_gs_llvm_destroy_variant(struct draw_gs_llvm_variant *variant);
506
507 struct draw_gs_llvm_variant_key *
508 draw_gs_llvm_make_variant_key(struct draw_llvm *llvm, char *store);
509
510 void
511 draw_gs_llvm_dump_variant_key(struct draw_gs_llvm_variant_key *key);
512
513 struct lp_build_sampler_soa *
514 draw_llvm_sampler_soa_create(const struct draw_sampler_static_state *static_state,
515 LLVMValueRef context_ptr);
516
517 void
518 draw_llvm_set_sampler_state(struct draw_context *draw, unsigned shader_stage);
519
520 void
521 draw_llvm_set_mapped_texture(struct draw_context *draw,
522 unsigned shader_stage,
523 unsigned sview_idx,
524 uint32_t width, uint32_t height, uint32_t depth,
525 uint32_t first_level, uint32_t last_level,
526 const void *base_ptr,
527 uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
528 uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
529 uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS]);
530
531 #endif