143
144
return dvbuffer_type;
148
* Create LLVM type for struct draw_jit_texture
151
create_jit_texture_type(struct gallivm_state *gallivm, const char *struct_name)
153
LLVMTargetDataRef target = gallivm->target;
154
LLVMTypeRef texture_type;
155
LLVMTypeRef elem_types[DRAW_JIT_TEXTURE_NUM_FIELDS];
156
LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
158
elem_types[DRAW_JIT_TEXTURE_WIDTH] =
159
elem_types[DRAW_JIT_TEXTURE_HEIGHT] =
160
elem_types[DRAW_JIT_TEXTURE_DEPTH] =
161
elem_types[DRAW_JIT_TEXTURE_NUM_SAMPLES] =
162
elem_types[DRAW_JIT_TEXTURE_SAMPLE_STRIDE] =
163
elem_types[DRAW_JIT_TEXTURE_FIRST_LEVEL] =
164
elem_types[DRAW_JIT_TEXTURE_LAST_LEVEL] = int32_type;
165
elem_types[DRAW_JIT_TEXTURE_BASE] =
166
LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0);
167
elem_types[DRAW_JIT_TEXTURE_ROW_STRIDE] =
168
elem_types[DRAW_JIT_TEXTURE_IMG_STRIDE] =
169
elem_types[DRAW_JIT_TEXTURE_MIP_OFFSETS] =
170
LLVMArrayType(int32_type, PIPE_MAX_TEXTURE_LEVELS);
172
texture_type = LLVMStructTypeInContext(gallivm->context, elem_types,
173
ARRAY_SIZE(elem_types), 0);
175
(void) target; /* silence unused var warning for non-debug build */
176
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, width,
177
target, texture_type,
178
DRAW_JIT_TEXTURE_WIDTH);
179
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, height,
180
target, texture_type,
181
DRAW_JIT_TEXTURE_HEIGHT);
182
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, depth,
183
target, texture_type,
184
DRAW_JIT_TEXTURE_DEPTH);
185
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, base,
186
target, texture_type,
187
DRAW_JIT_TEXTURE_BASE);
188
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, row_stride,
189
target, texture_type,
190
DRAW_JIT_TEXTURE_ROW_STRIDE);
191
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, img_stride,
192
target, texture_type,
193
DRAW_JIT_TEXTURE_IMG_STRIDE);
194
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, first_level,
195
target, texture_type,
196
DRAW_JIT_TEXTURE_FIRST_LEVEL);
197
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, last_level,
198
target, texture_type,
199
DRAW_JIT_TEXTURE_LAST_LEVEL);
200
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, mip_offsets,
201
target, texture_type,
202
DRAW_JIT_TEXTURE_MIP_OFFSETS);
203
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, num_samples,
204
target, texture_type,
205
DRAW_JIT_TEXTURE_NUM_SAMPLES);
206
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, sample_stride,
207
target, texture_type,
208
DRAW_JIT_TEXTURE_SAMPLE_STRIDE);
210
LP_CHECK_STRUCT_SIZE(struct draw_jit_texture, target, texture_type);
217
* Create LLVM type for struct draw_jit_sampler
220
create_jit_sampler_type(struct gallivm_state *gallivm, const char *struct_name)
222
LLVMTargetDataRef target = gallivm->target;
223
LLVMTypeRef sampler_type;
224
LLVMTypeRef elem_types[DRAW_JIT_SAMPLER_NUM_FIELDS];
226
elem_types[DRAW_JIT_SAMPLER_MIN_LOD] =
227
elem_types[DRAW_JIT_SAMPLER_MAX_LOD] =
228
elem_types[DRAW_JIT_SAMPLER_LOD_BIAS] =
229
elem_types[DRAW_JIT_SAMPLER_MAX_ANISO] = LLVMFloatTypeInContext(gallivm->context);
230
elem_types[DRAW_JIT_SAMPLER_BORDER_COLOR] =
231
LLVMArrayType(LLVMFloatTypeInContext(gallivm->context), 4);
233
sampler_type = LLVMStructTypeInContext(gallivm->context, elem_types,
234
ARRAY_SIZE(elem_types), 0);
236
(void) target; /* silence unused var warning for non-debug build */
237
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, min_lod,
238
target, sampler_type,
239
DRAW_JIT_SAMPLER_MIN_LOD);
240
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, max_lod,
241
target, sampler_type,
242
DRAW_JIT_SAMPLER_MAX_LOD);
243
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, lod_bias,
244
target, sampler_type,
245
DRAW_JIT_SAMPLER_LOD_BIAS);
246
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, border_color,
247
target, sampler_type,
248
DRAW_JIT_SAMPLER_BORDER_COLOR);
249
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, max_aniso,
250
target, sampler_type,
251
DRAW_JIT_SAMPLER_MAX_ANISO);
253
LP_CHECK_STRUCT_SIZE(struct draw_jit_sampler, target, sampler_type);
260
* Create LLVM type for struct draw_jit_texture
263
create_jit_image_type(struct gallivm_state *gallivm, const char *struct_name)
265
LLVMTargetDataRef target = gallivm->target;
266
LLVMTypeRef image_type;
267
LLVMTypeRef elem_types[DRAW_JIT_IMAGE_NUM_FIELDS];
268
LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
270
elem_types[DRAW_JIT_IMAGE_WIDTH] =
271
elem_types[DRAW_JIT_IMAGE_HEIGHT] =
272
elem_types[DRAW_JIT_IMAGE_DEPTH] =
273
elem_types[DRAW_JIT_IMAGE_ROW_STRIDE] =
274
elem_types[DRAW_JIT_IMAGE_IMG_STRIDE] =
275
elem_types[DRAW_JIT_IMAGE_NUM_SAMPLES] =
276
elem_types[DRAW_JIT_IMAGE_SAMPLE_STRIDE] = int32_type;
277
elem_types[DRAW_JIT_IMAGE_BASE] =
278
LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0);
280
image_type = LLVMStructTypeInContext(gallivm->context, elem_types,
281
ARRAY_SIZE(elem_types), 0);
283
(void) target; /* silence unused var warning for non-debug build */
284
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, width,
286
DRAW_JIT_IMAGE_WIDTH);
287
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, height,
289
DRAW_JIT_IMAGE_HEIGHT);
290
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, depth,
292
DRAW_JIT_IMAGE_DEPTH);
293
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, base,
295
DRAW_JIT_IMAGE_BASE);
296
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, row_stride,
298
DRAW_JIT_IMAGE_ROW_STRIDE);
299
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, img_stride,
301
DRAW_JIT_IMAGE_IMG_STRIDE);
302
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, num_samples,
304
DRAW_JIT_IMAGE_NUM_SAMPLES);
305
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, sample_stride,
307
DRAW_JIT_IMAGE_SAMPLE_STRIDE);
309
LP_CHECK_STRUCT_SIZE(struct draw_jit_image, target, image_type);
316
148
* Create LLVM type for struct draw_jit_context
318
150
static LLVMTypeRef
319
create_jit_context_type(struct gallivm_state *gallivm, const char *struct_name)
151
create_vs_jit_context_type(struct gallivm_state *gallivm, const char *struct_name)
321
LLVMTypeRef buffer_type = lp_build_create_jit_buffer_type(gallivm);
322
LLVMTypeRef texture_type = create_jit_texture_type(gallivm, "texture");
323
LLVMTypeRef sampler_type = create_jit_sampler_type(gallivm, "sampler");
324
LLVMTypeRef image_type = create_jit_image_type(gallivm, "image");
326
153
LLVMTargetDataRef target = gallivm->target;
327
154
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
328
LLVMTypeRef elem_types[DRAW_JIT_CTX_NUM_FIELDS];
330
elem_types[DRAW_JIT_CTX_CONSTANTS] = LLVMArrayType(buffer_type, LP_MAX_TGSI_CONST_BUFFERS);
331
elem_types[DRAW_JIT_CTX_PLANES] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4), DRAW_TOTAL_CLIP_PLANES), 0);
332
elem_types[DRAW_JIT_CTX_VIEWPORT] = LLVMPointerType(float_type, 0);
333
elem_types[DRAW_JIT_CTX_TEXTURES] = LLVMArrayType(texture_type, PIPE_MAX_SHADER_SAMPLER_VIEWS);
334
elem_types[DRAW_JIT_CTX_SAMPLERS] = LLVMArrayType(sampler_type, PIPE_MAX_SAMPLERS);
335
elem_types[DRAW_JIT_CTX_IMAGES] = LLVMArrayType(image_type, PIPE_MAX_SHADER_IMAGES);
336
elem_types[DRAW_JIT_CTX_SSBOS] = LLVMArrayType(buffer_type, LP_MAX_TGSI_SHADER_BUFFERS);
337
elem_types[DRAW_JIT_CTX_ANISO_FILTER_TABLE] = LLVMPointerType(float_type, 0);
155
LLVMTypeRef elem_types[DRAW_VS_JIT_CTX_NUM_FIELDS];
157
elem_types[DRAW_VS_JIT_CTX_PLANES] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4), DRAW_TOTAL_CLIP_PLANES), 0);
158
elem_types[DRAW_VS_JIT_CTX_VIEWPORT] = LLVMPointerType(float_type, 0);
338
160
LLVMTypeRef context_type = LLVMStructTypeInContext(gallivm->context, elem_types, ARRAY_SIZE(elem_types), 0);
340
162
(void) target; /* silence unused var warning for non-debug build */
341
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, constants,
342
target, context_type, DRAW_JIT_CTX_CONSTANTS);
343
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, planes,
344
target, context_type, DRAW_JIT_CTX_PLANES);
345
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, viewports,
346
target, context_type, DRAW_JIT_CTX_VIEWPORT);
347
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, textures,
348
target, context_type,
349
DRAW_JIT_CTX_TEXTURES);
350
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, samplers,
351
target, context_type,
352
DRAW_JIT_CTX_SAMPLERS);
353
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, images,
354
target, context_type, DRAW_JIT_CTX_IMAGES);
355
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, ssbos,
356
target, context_type, DRAW_JIT_CTX_SSBOS);
357
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, aniso_filter_table,
358
target, context_type, DRAW_JIT_CTX_ANISO_FILTER_TABLE);
359
LP_CHECK_STRUCT_SIZE(struct draw_jit_context,
163
LP_CHECK_MEMBER_OFFSET(struct draw_vs_jit_context, planes,
164
target, context_type, DRAW_VS_JIT_CTX_PLANES);
165
LP_CHECK_MEMBER_OFFSET(struct draw_vs_jit_context, viewports,
166
target, context_type, DRAW_VS_JIT_CTX_VIEWPORT);
167
LP_CHECK_STRUCT_SIZE(struct draw_vs_jit_context,
360
168
target, context_type);
362
170
return context_type;
380
185
LLVMTypeRef elem_types[DRAW_GS_JIT_CTX_NUM_FIELDS];
381
186
LLVMTypeRef context_type;
383
elem_types[DRAW_GS_JIT_CTX_CONSTANTS] = LLVMArrayType(buffer_type, /* constants */
384
LP_MAX_TGSI_CONST_BUFFERS);
385
188
elem_types[DRAW_GS_JIT_CTX_PLANES] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4),
386
189
DRAW_TOTAL_CLIP_PLANES), 0);
387
190
elem_types[DRAW_GS_JIT_CTX_VIEWPORT] = LLVMPointerType(float_type, 0); /* viewports */
389
elem_types[DRAW_GS_JIT_CTX_TEXTURES] = LLVMArrayType(texture_type,
390
PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */
391
elem_types[DRAW_GS_JIT_CTX_SAMPLERS] = LLVMArrayType(sampler_type,
392
PIPE_MAX_SAMPLERS); /* samplers */
393
elem_types[DRAW_GS_JIT_CTX_IMAGES] = LLVMArrayType(image_type,
394
PIPE_MAX_SHADER_IMAGES); /* images */
395
193
elem_types[DRAW_GS_JIT_CTX_PRIM_LENGTHS] = LLVMPointerType(LLVMPointerType(int_type, 0), 0);
396
194
elem_types[DRAW_GS_JIT_CTX_EMITTED_VERTICES] = LLVMPointerType(LLVMVectorType(int_type,
397
195
vector_length), 0);
398
196
elem_types[DRAW_GS_JIT_CTX_EMITTED_PRIMS] = LLVMPointerType(LLVMVectorType(int_type,
399
197
vector_length), 0);
401
elem_types[DRAW_GS_JIT_CTX_SSBOS] = LLVMArrayType(buffer_type, /* ssbos */
402
LP_MAX_TGSI_SHADER_BUFFERS);
403
elem_types[DRAW_GS_JIT_CTX_ANISO_FILTER_TABLE] = LLVMPointerType(float_type, 0); /* aniso table */
405
199
context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
406
200
ARRAY_SIZE(elem_types), 0);
408
202
(void) target; /* silence unused var warning for non-debug build */
409
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, constants,
410
target, context_type, DRAW_GS_JIT_CTX_CONSTANTS);
411
203
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, planes,
412
204
target, context_type, DRAW_GS_JIT_CTX_PLANES);
413
205
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, viewports,
414
206
target, context_type, DRAW_GS_JIT_CTX_VIEWPORT);
415
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, textures,
416
target, context_type,
417
DRAW_GS_JIT_CTX_TEXTURES);
418
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, samplers,
419
target, context_type,
420
DRAW_GS_JIT_CTX_SAMPLERS);
421
207
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, prim_lengths,
422
208
target, context_type,
423
209
DRAW_GS_JIT_CTX_PRIM_LENGTHS);
499
* Create LLVM type for struct vertex_header;
502
create_jit_vertex_header(struct gallivm_state *gallivm, int data_elems)
504
LLVMTargetDataRef target = gallivm->target;
505
LLVMTypeRef elem_types[3];
506
LLVMTypeRef vertex_header;
507
char struct_name[24];
509
snprintf(struct_name, 23, "vertex_header%d", data_elems);
511
elem_types[DRAW_JIT_VERTEX_VERTEX_ID] = LLVMIntTypeInContext(gallivm->context, 32);
512
elem_types[DRAW_JIT_VERTEX_CLIP_POS] = LLVMArrayType(LLVMFloatTypeInContext(gallivm->context), 4);
513
elem_types[DRAW_JIT_VERTEX_DATA] = LLVMArrayType(elem_types[1], data_elems);
515
vertex_header = LLVMStructTypeInContext(gallivm->context, elem_types,
516
ARRAY_SIZE(elem_types), 0);
518
/* these are bit-fields and we can't take address of them
519
LP_CHECK_MEMBER_OFFSET(struct vertex_header, clipmask,
520
target, vertex_header,
521
DRAW_JIT_VERTEX_CLIPMASK);
522
LP_CHECK_MEMBER_OFFSET(struct vertex_header, edgeflag,
523
target, vertex_header,
524
DRAW_JIT_VERTEX_EDGEFLAG);
525
LP_CHECK_MEMBER_OFFSET(struct vertex_header, pad,
526
target, vertex_header,
527
DRAW_JIT_VERTEX_PAD);
528
LP_CHECK_MEMBER_OFFSET(struct vertex_header, vertex_id,
529
target, vertex_header,
530
DRAW_JIT_VERTEX_VERTEX_ID);
532
(void) target; /* silence unused var warning for non-debug build */
533
LP_CHECK_MEMBER_OFFSET(struct vertex_header, clip_pos,
534
target, vertex_header,
535
DRAW_JIT_VERTEX_CLIP_POS);
536
LP_CHECK_MEMBER_OFFSET(struct vertex_header, data,
537
target, vertex_header,
538
DRAW_JIT_VERTEX_DATA);
540
assert(LLVMABISizeOfType(target, vertex_header) ==
541
offsetof(struct vertex_header, data[data_elems]));
543
return vertex_header;
548
* Create LLVM type for struct draw_tcs_jit_context
551
create_tcs_jit_context_type(struct gallivm_state *gallivm,
552
unsigned vector_length,
553
LLVMTypeRef buffer_type,
554
LLVMTypeRef texture_type, LLVMTypeRef sampler_type,
555
LLVMTypeRef image_type,
556
const char *struct_name)
558
LLVMTargetDataRef target = gallivm->target;
559
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
560
LLVMTypeRef elem_types[DRAW_TCS_JIT_CTX_NUM_FIELDS];
561
LLVMTypeRef context_type;
564
elem_types[DRAW_TCS_JIT_CTX_CONSTANTS] = LLVMArrayType(buffer_type, /* constants */
565
LP_MAX_TGSI_CONST_BUFFERS);
566
elem_types[DRAW_TCS_JIT_CTX_DUMMY1] = LLVMInt32TypeInContext(gallivm->context);
567
elem_types[DRAW_TCS_JIT_CTX_DUMMY2] = LLVMInt32TypeInContext(gallivm->context);
569
elem_types[DRAW_TCS_JIT_CTX_TEXTURES] = LLVMArrayType(texture_type,
570
PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */
571
elem_types[DRAW_TCS_JIT_CTX_SAMPLERS] = LLVMArrayType(sampler_type,
572
PIPE_MAX_SAMPLERS); /* samplers */
573
elem_types[DRAW_TCS_JIT_CTX_IMAGES] = LLVMArrayType(image_type,
574
PIPE_MAX_SHADER_IMAGES); /* images */
576
elem_types[DRAW_TCS_JIT_CTX_SSBOS] = LLVMArrayType(buffer_type, /* ssbos */
577
LP_MAX_TGSI_SHADER_BUFFERS);
578
elem_types[DRAW_TCS_JIT_CTX_ANISO_FILTER_TABLE] = LLVMPointerType(float_type, 0); /* aniso table */
580
context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
581
ARRAY_SIZE(elem_types), 0);
583
(void) target; /* silence unused var warning for non-debug build */
584
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, constants,
585
target, context_type, DRAW_TCS_JIT_CTX_CONSTANTS);
586
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, textures,
587
target, context_type,
588
DRAW_TCS_JIT_CTX_TEXTURES);
589
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, samplers,
590
target, context_type,
591
DRAW_TCS_JIT_CTX_SAMPLERS);
592
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, ssbos,
593
target, context_type, DRAW_TCS_JIT_CTX_SSBOS);
594
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, images,
595
target, context_type, DRAW_TCS_JIT_CTX_IMAGES);
596
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, aniso_filter_table,
597
target, context_type, DRAW_TCS_JIT_CTX_ANISO_FILTER_TABLE);
598
LP_CHECK_STRUCT_SIZE(struct draw_tcs_jit_context,
599
target, context_type);
605
277
static LLVMTypeRef
606
278
create_tcs_jit_input_type_deref(struct gallivm_state *gallivm)
657
* Create LLVM type for struct draw_tes_jit_context
660
create_tes_jit_context_type(struct gallivm_state *gallivm,
661
unsigned vector_length,
662
LLVMTypeRef buffer_type,
663
LLVMTypeRef texture_type, LLVMTypeRef sampler_type,
664
LLVMTypeRef image_type,
665
const char *struct_name)
667
LLVMTargetDataRef target = gallivm->target;
668
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
669
LLVMTypeRef elem_types[DRAW_TES_JIT_CTX_NUM_FIELDS];
670
LLVMTypeRef context_type;
672
elem_types[DRAW_TES_JIT_CTX_CONSTANTS] = LLVMArrayType(buffer_type, /* constants */
673
LP_MAX_TGSI_CONST_BUFFERS);
674
elem_types[DRAW_TES_JIT_CTX_DUMMY1] = LLVMInt32TypeInContext(gallivm->context);
675
elem_types[DRAW_TES_JIT_CTX_DUMMY2] = LLVMInt32TypeInContext(gallivm->context);
677
elem_types[DRAW_TES_JIT_CTX_TEXTURES] = LLVMArrayType(texture_type,
678
PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */
679
elem_types[DRAW_TES_JIT_CTX_SAMPLERS] = LLVMArrayType(sampler_type,
680
PIPE_MAX_SAMPLERS); /* samplers */
681
elem_types[DRAW_TES_JIT_CTX_IMAGES] = LLVMArrayType(image_type,
682
PIPE_MAX_SHADER_IMAGES); /* images */
684
elem_types[DRAW_TES_JIT_CTX_SSBOS] = LLVMArrayType(buffer_type, /* ssbos */
685
LP_MAX_TGSI_SHADER_BUFFERS);
686
elem_types[DRAW_TES_JIT_CTX_ANISO_FILTER_TABLE] = LLVMPointerType(float_type, 0); /* aniso table */
688
context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
689
ARRAY_SIZE(elem_types), 0);
691
(void) target; /* silence unused var warning for non-debug build */
692
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, constants,
693
target, context_type, DRAW_TES_JIT_CTX_CONSTANTS);
694
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, textures,
695
target, context_type,
696
DRAW_TES_JIT_CTX_TEXTURES);
697
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, samplers,
698
target, context_type,
699
DRAW_TES_JIT_CTX_SAMPLERS);
700
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, ssbos,
701
target, context_type, DRAW_TES_JIT_CTX_SSBOS);
702
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, images,
703
target, context_type, DRAW_TES_JIT_CTX_IMAGES);
704
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, aniso_filter_table,
705
target, context_type, DRAW_TES_JIT_CTX_ANISO_FILTER_TABLE);
706
LP_CHECK_STRUCT_SIZE(struct draw_tes_jit_context,
707
target, context_type);
714
329
* Create LLVM types for various structures.
717
create_jit_types(struct draw_llvm_variant *variant)
332
create_vs_jit_types(struct draw_llvm_variant *variant)
719
334
struct gallivm_state *gallivm = variant->gallivm;
721
variant->context_type = create_jit_context_type(gallivm, "draw_jit_context");
336
variant->context_type = create_vs_jit_context_type(gallivm, "draw_vs_jit_context");
722
337
variant->context_ptr_type = LLVMPointerType(variant->context_type, 0);
339
variant->resources_type = lp_build_jit_resources_type(gallivm);
340
variant->resources_ptr_type = LLVMPointerType(variant->resources_type, 0);
724
342
variant->buffer_type = create_jit_dvbuffer_type(gallivm, "draw_vertex_buffer");
725
343
variant->buffer_ptr_type = LLVMPointerType(variant->buffer_type, 0);
2002
1645
context_ptr = LLVMGetParam(variant_func, 0);
2003
io_ptr = LLVMGetParam(variant_func, 1);
2004
vbuffers_ptr = LLVMGetParam(variant_func, 2);
2005
count = LLVMGetParam(variant_func, 3);
2006
start = LLVMGetParam(variant_func, 4);
1646
resources_ptr = LLVMGetParam(variant_func, 1);
1647
io_ptr = LLVMGetParam(variant_func, 2);
1648
vbuffers_ptr = LLVMGetParam(variant_func, 3);
1649
count = LLVMGetParam(variant_func, 4);
1650
start = LLVMGetParam(variant_func, 5);
2008
1652
* XXX: stride is actually unused. The stride we use is strictly calculated
2009
1653
* from the number of outputs (including the draw_extra outputs).
2010
1654
* Should probably fix some day (we need a new vs just because of extra
2011
1655
* outputs which the generated vs won't touch).
2013
stride = LLVMGetParam(variant_func, 5);
2014
vb_ptr = LLVMGetParam(variant_func, 6);
2015
system_values.instance_id = LLVMGetParam(variant_func, 7);
2016
vertex_id_offset = LLVMGetParam(variant_func, 8);
2017
system_values.base_instance = LLVMGetParam(variant_func, 9);
2018
fetch_elts = LLVMGetParam(variant_func, 10);
2019
system_values.draw_id = LLVMGetParam(variant_func, 11);
2020
system_values.view_index = LLVMGetParam(variant_func, 12);
1657
stride = LLVMGetParam(variant_func, 6);
1658
vb_ptr = LLVMGetParam(variant_func, 7);
1659
system_values.instance_id = LLVMGetParam(variant_func, 8);
1660
vertex_id_offset = LLVMGetParam(variant_func, 9);
1661
system_values.base_instance = LLVMGetParam(variant_func, 10);
1662
fetch_elts = LLVMGetParam(variant_func, 11);
1663
system_values.draw_id = LLVMGetParam(variant_func, 12);
1664
system_values.view_index = LLVMGetParam(variant_func, 13);
2022
1666
lp_build_name(context_ptr, "context");
1667
lp_build_name(resources_ptr, "resources");
2023
1668
lp_build_name(io_ptr, "io");
2024
1669
lp_build_name(vbuffers_ptr, "vbuffers");
2025
1670
lp_build_name(count, "count");
2600
2211
draw_llvm_set_sampler_state(struct draw_context *draw,
2601
2212
enum pipe_shader_type shader_type)
2603
switch (shader_type) {
2604
case PIPE_SHADER_VERTEX:
2605
for (unsigned i = 0; i < draw->num_samplers[PIPE_SHADER_VERTEX]; i++) {
2606
struct draw_jit_sampler *jit_sam = &draw->llvm->jit_context.samplers[i];
2608
if (draw->samplers[PIPE_SHADER_VERTEX][i]) {
2609
const struct pipe_sampler_state *s
2610
= draw->samplers[PIPE_SHADER_VERTEX][i];
2611
jit_sam->min_lod = s->min_lod;
2612
jit_sam->max_lod = s->max_lod;
2613
jit_sam->lod_bias = s->lod_bias;
2614
jit_sam->max_aniso = s->max_anisotropy;
2615
COPY_4V(jit_sam->border_color, s->border_color.f);
2619
case PIPE_SHADER_GEOMETRY:
2620
for (unsigned i = 0; i < draw->num_samplers[PIPE_SHADER_GEOMETRY]; i++) {
2621
struct draw_jit_sampler *jit_sam = &draw->llvm->gs_jit_context.samplers[i];
2623
if (draw->samplers[PIPE_SHADER_GEOMETRY][i]) {
2624
const struct pipe_sampler_state *s
2625
= draw->samplers[PIPE_SHADER_GEOMETRY][i];
2626
jit_sam->min_lod = s->min_lod;
2627
jit_sam->max_lod = s->max_lod;
2628
jit_sam->lod_bias = s->lod_bias;
2629
jit_sam->max_aniso = s->max_anisotropy;
2630
COPY_4V(jit_sam->border_color, s->border_color.f);
2634
case PIPE_SHADER_TESS_CTRL:
2635
for (unsigned i = 0; i < draw->num_samplers[PIPE_SHADER_TESS_CTRL]; i++) {
2636
struct draw_jit_sampler *jit_sam = &draw->llvm->tcs_jit_context.samplers[i];
2638
if (draw->samplers[PIPE_SHADER_TESS_CTRL][i]) {
2639
const struct pipe_sampler_state *s
2640
= draw->samplers[PIPE_SHADER_TESS_CTRL][i];
2641
jit_sam->min_lod = s->min_lod;
2642
jit_sam->max_lod = s->max_lod;
2643
jit_sam->lod_bias = s->lod_bias;
2644
jit_sam->max_aniso = s->max_anisotropy;
2645
COPY_4V(jit_sam->border_color, s->border_color.f);
2649
case PIPE_SHADER_TESS_EVAL:
2650
for (unsigned i = 0; i < draw->num_samplers[PIPE_SHADER_TESS_EVAL]; i++) {
2651
struct draw_jit_sampler *jit_sam = &draw->llvm->tes_jit_context.samplers[i];
2653
if (draw->samplers[PIPE_SHADER_TESS_EVAL][i]) {
2654
const struct pipe_sampler_state *s
2655
= draw->samplers[PIPE_SHADER_TESS_EVAL][i];
2656
jit_sam->min_lod = s->min_lod;
2657
jit_sam->max_lod = s->max_lod;
2658
jit_sam->lod_bias = s->lod_bias;
2659
jit_sam->max_aniso = s->max_anisotropy;
2660
COPY_4V(jit_sam->border_color, s->border_color.f);
2214
assert(shader_type < DRAW_MAX_SHADER_STAGE);
2215
for (unsigned i = 0; i < draw->num_samplers[shader_type]; i++) {
2216
struct lp_jit_sampler *jit_sam = &draw->llvm->jit_resources[shader_type].samplers[i];
2218
if (draw->samplers[shader_type][i]) {
2219
const struct pipe_sampler_state *s
2220
= draw->samplers[shader_type][i];
2221
jit_sam->min_lod = s->min_lod;
2222
jit_sam->max_lod = s->max_lod;
2223
jit_sam->lod_bias = s->lod_bias;
2224
jit_sam->max_aniso = s->max_anisotropy;
2225
COPY_4V(jit_sam->border_color, s->border_color.f);
3081
2642
create_tcs_jit_types(struct draw_tcs_llvm_variant *var)
3083
2644
struct gallivm_state *gallivm = var->gallivm;
3084
LLVMTypeRef texture_type, sampler_type, image_type, buffer_type;
3086
texture_type = create_jit_texture_type(gallivm, "texture");
3087
sampler_type = create_jit_sampler_type(gallivm, "sampler");
3088
image_type = create_jit_image_type(gallivm, "image");
3089
buffer_type = lp_build_create_jit_buffer_type(gallivm);
3091
var->context_type = create_tcs_jit_context_type(gallivm,
3094
texture_type, sampler_type,
3096
"draw_tcs_jit_context");
2646
var->resources_type = lp_build_jit_resources_type(gallivm);
2647
var->resources_ptr_type = LLVMPointerType(var->resources_type, 0);
3097
2648
var->input_array_type = create_tcs_jit_input_type(gallivm);
3098
2649
var->output_array_type = create_tcs_jit_output_type(gallivm);
3099
var->context_ptr_type = LLVMPointerType(var->context_type, 0);
3103
2653
static LLVMTypeRef
3104
get_tcs_context_ptr_type(struct draw_tcs_llvm_variant *variant)
2654
get_tcs_resources_ptr_type(struct draw_tcs_llvm_variant *variant)
3106
if (!variant->context_ptr_type)
2656
if (!variant->resources_ptr_type)
3107
2657
create_tcs_jit_types(variant);
3108
return variant->context_ptr_type;
2658
return variant->resources_ptr_type;
3112
2662
static LLVMValueRef
3113
2663
draw_tcs_llvm_emit_fetch_input(const struct lp_build_tcs_iface *tes_iface,
3114
2664
struct lp_build_context *bld,
3115
boolean is_vindex_indirect,
2665
bool is_vindex_indirect,
3116
2666
LLVMValueRef vertex_index,
3117
boolean is_aindex_indirect,
2667
bool is_aindex_indirect,
3118
2668
LLVMValueRef attrib_index,
3119
boolean is_sindex_indirect,
2669
bool is_sindex_indirect,
3120
2670
LLVMValueRef swizzle_index)
3122
2672
const struct draw_tcs_llvm_iface *tcs = draw_tcs_llvm_iface(tes_iface);