Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/auxiliary/draw/draw_llvm.c
4565 views
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
#include "draw_llvm.h"
29
30
#include "draw_context.h"
31
#include "draw_vs.h"
32
#include "draw_gs.h"
33
34
#include "gallivm/lp_bld_arit.h"
35
#include "gallivm/lp_bld_arit_overflow.h"
36
#include "gallivm/lp_bld_bitarit.h"
37
#include "gallivm/lp_bld_gather.h"
38
#include "gallivm/lp_bld_logic.h"
39
#include "gallivm/lp_bld_const.h"
40
#include "gallivm/lp_bld_coro.h"
41
#include "gallivm/lp_bld_swizzle.h"
42
#include "gallivm/lp_bld_struct.h"
43
#include "gallivm/lp_bld_type.h"
44
#include "gallivm/lp_bld_flow.h"
45
#include "gallivm/lp_bld_debug.h"
46
#include "gallivm/lp_bld_tgsi.h"
47
#include "gallivm/lp_bld_nir.h"
48
#include "gallivm/lp_bld_printf.h"
49
#include "gallivm/lp_bld_intr.h"
50
#include "gallivm/lp_bld_init.h"
51
#include "gallivm/lp_bld_type.h"
52
#include "gallivm/lp_bld_pack.h"
53
#include "gallivm/lp_bld_format.h"
54
#include "gallivm/lp_bld_misc.h"
55
#include "tgsi/tgsi_exec.h"
56
#include "tgsi/tgsi_dump.h"
57
58
#include "util/u_math.h"
59
#include "util/u_pointer.h"
60
#include "util/u_string.h"
61
#include "util/simple_list.h"
62
#include "nir_serialize.h"
63
#include "util/mesa-sha1.h"
64
#define DEBUG_STORE 0
65
66
67
static void
68
draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *var);
69
70
71
struct draw_gs_llvm_iface {
72
struct lp_build_gs_iface base;
73
74
struct draw_gs_llvm_variant *variant;
75
LLVMValueRef input;
76
};
77
78
static inline const struct draw_gs_llvm_iface *
79
draw_gs_llvm_iface(const struct lp_build_gs_iface *iface)
80
{
81
return (const struct draw_gs_llvm_iface *)iface;
82
}
83
84
struct draw_tcs_llvm_iface {
85
struct lp_build_tcs_iface base;
86
87
struct draw_tcs_llvm_variant *variant;
88
LLVMValueRef input;
89
LLVMValueRef output;
90
};
91
92
static inline const struct draw_tcs_llvm_iface *
93
draw_tcs_llvm_iface(const struct lp_build_tcs_iface *iface)
94
{
95
return (const struct draw_tcs_llvm_iface *)iface;
96
}
97
98
struct draw_tes_llvm_iface {
99
struct lp_build_tes_iface base;
100
101
struct draw_tes_llvm_variant *variant;
102
LLVMValueRef input;
103
};
104
105
static inline const struct draw_tes_llvm_iface *
106
draw_tes_llvm_iface(const struct lp_build_tes_iface *iface)
107
{
108
return (const struct draw_tes_llvm_iface *)iface;
109
}
110
111
/**
112
* Create LLVM type for draw_vertex_buffer.
113
*/
114
static LLVMTypeRef
115
create_jit_dvbuffer_type(struct gallivm_state *gallivm,
116
const char *struct_name)
117
{
118
LLVMTargetDataRef target = gallivm->target;
119
LLVMTypeRef dvbuffer_type;
120
LLVMTypeRef elem_types[DRAW_JIT_DVBUFFER_NUM_FIELDS];
121
LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
122
123
elem_types[DRAW_JIT_DVBUFFER_MAP] =
124
LLVMPointerType(LLVMIntTypeInContext(gallivm->context, 8), 0);
125
elem_types[DRAW_JIT_DVBUFFER_SIZE] = int32_type;
126
127
dvbuffer_type = LLVMStructTypeInContext(gallivm->context, elem_types,
128
ARRAY_SIZE(elem_types), 0);
129
130
(void) target; /* silence unused var warning for non-debug build */
131
LP_CHECK_MEMBER_OFFSET(struct draw_vertex_buffer, map,
132
target, dvbuffer_type,
133
DRAW_JIT_DVBUFFER_MAP);
134
LP_CHECK_MEMBER_OFFSET(struct draw_vertex_buffer, size,
135
target, dvbuffer_type,
136
DRAW_JIT_DVBUFFER_SIZE);
137
138
return dvbuffer_type;
139
}
140
141
/**
142
* Create LLVM type for struct draw_jit_texture
143
*/
144
static LLVMTypeRef
145
create_jit_texture_type(struct gallivm_state *gallivm, const char *struct_name)
146
{
147
LLVMTargetDataRef target = gallivm->target;
148
LLVMTypeRef texture_type;
149
LLVMTypeRef elem_types[DRAW_JIT_TEXTURE_NUM_FIELDS];
150
LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
151
152
elem_types[DRAW_JIT_TEXTURE_WIDTH] =
153
elem_types[DRAW_JIT_TEXTURE_HEIGHT] =
154
elem_types[DRAW_JIT_TEXTURE_DEPTH] =
155
elem_types[DRAW_JIT_TEXTURE_NUM_SAMPLES] =
156
elem_types[DRAW_JIT_TEXTURE_SAMPLE_STRIDE] =
157
elem_types[DRAW_JIT_TEXTURE_FIRST_LEVEL] =
158
elem_types[DRAW_JIT_TEXTURE_LAST_LEVEL] = int32_type;
159
elem_types[DRAW_JIT_TEXTURE_BASE] =
160
LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0);
161
elem_types[DRAW_JIT_TEXTURE_ROW_STRIDE] =
162
elem_types[DRAW_JIT_TEXTURE_IMG_STRIDE] =
163
elem_types[DRAW_JIT_TEXTURE_MIP_OFFSETS] =
164
LLVMArrayType(int32_type, PIPE_MAX_TEXTURE_LEVELS);
165
166
texture_type = LLVMStructTypeInContext(gallivm->context, elem_types,
167
ARRAY_SIZE(elem_types), 0);
168
169
(void) target; /* silence unused var warning for non-debug build */
170
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, width,
171
target, texture_type,
172
DRAW_JIT_TEXTURE_WIDTH);
173
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, height,
174
target, texture_type,
175
DRAW_JIT_TEXTURE_HEIGHT);
176
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, depth,
177
target, texture_type,
178
DRAW_JIT_TEXTURE_DEPTH);
179
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, base,
180
target, texture_type,
181
DRAW_JIT_TEXTURE_BASE);
182
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, row_stride,
183
target, texture_type,
184
DRAW_JIT_TEXTURE_ROW_STRIDE);
185
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, img_stride,
186
target, texture_type,
187
DRAW_JIT_TEXTURE_IMG_STRIDE);
188
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, first_level,
189
target, texture_type,
190
DRAW_JIT_TEXTURE_FIRST_LEVEL);
191
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, last_level,
192
target, texture_type,
193
DRAW_JIT_TEXTURE_LAST_LEVEL);
194
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, mip_offsets,
195
target, texture_type,
196
DRAW_JIT_TEXTURE_MIP_OFFSETS);
197
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, num_samples,
198
target, texture_type,
199
DRAW_JIT_TEXTURE_NUM_SAMPLES);
200
LP_CHECK_MEMBER_OFFSET(struct draw_jit_texture, sample_stride,
201
target, texture_type,
202
DRAW_JIT_TEXTURE_SAMPLE_STRIDE);
203
204
LP_CHECK_STRUCT_SIZE(struct draw_jit_texture, target, texture_type);
205
206
return texture_type;
207
}
208
209
210
/**
211
* Create LLVM type for struct draw_jit_sampler
212
*/
213
static LLVMTypeRef
214
create_jit_sampler_type(struct gallivm_state *gallivm, const char *struct_name)
215
{
216
LLVMTargetDataRef target = gallivm->target;
217
LLVMTypeRef sampler_type;
218
LLVMTypeRef elem_types[DRAW_JIT_SAMPLER_NUM_FIELDS];
219
220
elem_types[DRAW_JIT_SAMPLER_MIN_LOD] =
221
elem_types[DRAW_JIT_SAMPLER_MAX_LOD] =
222
elem_types[DRAW_JIT_SAMPLER_LOD_BIAS] = LLVMFloatTypeInContext(gallivm->context);
223
elem_types[DRAW_JIT_SAMPLER_BORDER_COLOR] =
224
LLVMArrayType(LLVMFloatTypeInContext(gallivm->context), 4);
225
226
sampler_type = LLVMStructTypeInContext(gallivm->context, elem_types,
227
ARRAY_SIZE(elem_types), 0);
228
229
(void) target; /* silence unused var warning for non-debug build */
230
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, min_lod,
231
target, sampler_type,
232
DRAW_JIT_SAMPLER_MIN_LOD);
233
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, max_lod,
234
target, sampler_type,
235
DRAW_JIT_SAMPLER_MAX_LOD);
236
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, lod_bias,
237
target, sampler_type,
238
DRAW_JIT_SAMPLER_LOD_BIAS);
239
LP_CHECK_MEMBER_OFFSET(struct draw_jit_sampler, border_color,
240
target, sampler_type,
241
DRAW_JIT_SAMPLER_BORDER_COLOR);
242
243
LP_CHECK_STRUCT_SIZE(struct draw_jit_sampler, target, sampler_type);
244
245
return sampler_type;
246
}
247
248
/**
249
* Create LLVM type for struct draw_jit_texture
250
*/
251
static LLVMTypeRef
252
create_jit_image_type(struct gallivm_state *gallivm, const char *struct_name)
253
{
254
LLVMTargetDataRef target = gallivm->target;
255
LLVMTypeRef image_type;
256
LLVMTypeRef elem_types[DRAW_JIT_IMAGE_NUM_FIELDS];
257
LLVMTypeRef int32_type = LLVMInt32TypeInContext(gallivm->context);
258
259
elem_types[DRAW_JIT_IMAGE_WIDTH] =
260
elem_types[DRAW_JIT_IMAGE_HEIGHT] =
261
elem_types[DRAW_JIT_IMAGE_DEPTH] =
262
elem_types[DRAW_JIT_IMAGE_ROW_STRIDE] =
263
elem_types[DRAW_JIT_IMAGE_IMG_STRIDE] =
264
elem_types[DRAW_JIT_IMAGE_NUM_SAMPLES] =
265
elem_types[DRAW_JIT_IMAGE_SAMPLE_STRIDE] = int32_type;
266
elem_types[DRAW_JIT_IMAGE_BASE] =
267
LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0);
268
269
image_type = LLVMStructTypeInContext(gallivm->context, elem_types,
270
ARRAY_SIZE(elem_types), 0);
271
272
(void) target; /* silence unused var warning for non-debug build */
273
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, width,
274
target, image_type,
275
DRAW_JIT_IMAGE_WIDTH);
276
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, height,
277
target, image_type,
278
DRAW_JIT_IMAGE_HEIGHT);
279
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, depth,
280
target, image_type,
281
DRAW_JIT_IMAGE_DEPTH);
282
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, base,
283
target, image_type,
284
DRAW_JIT_IMAGE_BASE);
285
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, row_stride,
286
target, image_type,
287
DRAW_JIT_IMAGE_ROW_STRIDE);
288
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, img_stride,
289
target, image_type,
290
DRAW_JIT_IMAGE_IMG_STRIDE);
291
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, num_samples,
292
target, image_type,
293
DRAW_JIT_IMAGE_NUM_SAMPLES);
294
LP_CHECK_MEMBER_OFFSET(struct draw_jit_image, sample_stride,
295
target, image_type,
296
DRAW_JIT_IMAGE_SAMPLE_STRIDE);
297
298
LP_CHECK_STRUCT_SIZE(struct draw_jit_image, target, image_type);
299
300
return image_type;
301
}
302
303
/**
304
* Create LLVM type for struct draw_jit_context
305
*/
306
static LLVMTypeRef
307
create_jit_context_type(struct gallivm_state *gallivm,
308
LLVMTypeRef texture_type, LLVMTypeRef sampler_type,
309
LLVMTypeRef image_type,
310
const char *struct_name)
311
{
312
LLVMTargetDataRef target = gallivm->target;
313
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
314
LLVMTypeRef int_type = LLVMInt32TypeInContext(gallivm->context);
315
LLVMTypeRef elem_types[DRAW_JIT_CTX_NUM_FIELDS];
316
LLVMTypeRef context_type;
317
318
elem_types[0] = LLVMArrayType(LLVMPointerType(float_type, 0), /* vs_constants */
319
LP_MAX_TGSI_CONST_BUFFERS);
320
elem_types[1] = LLVMArrayType(int_type, /* num_vs_constants */
321
LP_MAX_TGSI_CONST_BUFFERS);
322
elem_types[2] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4),
323
DRAW_TOTAL_CLIP_PLANES), 0);
324
elem_types[3] = LLVMPointerType(float_type, 0); /* viewports */
325
elem_types[4] = LLVMArrayType(texture_type,
326
PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */
327
elem_types[5] = LLVMArrayType(sampler_type,
328
PIPE_MAX_SAMPLERS); /* samplers */
329
elem_types[6] = LLVMArrayType(image_type,
330
PIPE_MAX_SHADER_IMAGES); /* images */
331
elem_types[7] = LLVMArrayType(LLVMPointerType(int_type, 0), /* vs_ssbo */
332
LP_MAX_TGSI_SHADER_BUFFERS);
333
elem_types[8] = LLVMArrayType(int_type, /* num_vs_ssbos */
334
LP_MAX_TGSI_SHADER_BUFFERS);
335
context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
336
ARRAY_SIZE(elem_types), 0);
337
338
(void) target; /* silence unused var warning for non-debug build */
339
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, vs_constants,
340
target, context_type, DRAW_JIT_CTX_CONSTANTS);
341
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, num_vs_constants,
342
target, context_type, DRAW_JIT_CTX_NUM_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, vs_ssbos,
356
target, context_type, DRAW_JIT_CTX_SSBOS);
357
LP_CHECK_MEMBER_OFFSET(struct draw_jit_context, num_vs_ssbos,
358
target, context_type, DRAW_JIT_CTX_NUM_SSBOS);
359
LP_CHECK_STRUCT_SIZE(struct draw_jit_context,
360
target, context_type);
361
362
return context_type;
363
}
364
365
366
/**
367
* Create LLVM type for struct draw_gs_jit_context
368
*/
369
static LLVMTypeRef
370
create_gs_jit_context_type(struct gallivm_state *gallivm,
371
unsigned vector_length,
372
LLVMTypeRef texture_type, LLVMTypeRef sampler_type,
373
LLVMTypeRef image_type,
374
const char *struct_name)
375
{
376
LLVMTargetDataRef target = gallivm->target;
377
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
378
LLVMTypeRef int_type = LLVMInt32TypeInContext(gallivm->context);
379
LLVMTypeRef elem_types[DRAW_GS_JIT_CTX_NUM_FIELDS];
380
LLVMTypeRef context_type;
381
382
elem_types[0] = LLVMArrayType(LLVMPointerType(float_type, 0), /* constants */
383
LP_MAX_TGSI_CONST_BUFFERS);
384
elem_types[1] = LLVMArrayType(int_type, /* num_constants */
385
LP_MAX_TGSI_CONST_BUFFERS);
386
elem_types[2] = LLVMPointerType(LLVMArrayType(LLVMArrayType(float_type, 4),
387
DRAW_TOTAL_CLIP_PLANES), 0);
388
elem_types[3] = LLVMPointerType(float_type, 0); /* viewports */
389
390
elem_types[4] = LLVMArrayType(texture_type,
391
PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */
392
elem_types[5] = LLVMArrayType(sampler_type,
393
PIPE_MAX_SAMPLERS); /* samplers */
394
elem_types[6] = LLVMArrayType(image_type,
395
PIPE_MAX_SHADER_IMAGES); /* images */
396
elem_types[7] = LLVMPointerType(LLVMPointerType(int_type, 0), 0);
397
elem_types[8] = LLVMPointerType(LLVMVectorType(int_type,
398
vector_length), 0);
399
elem_types[9] = LLVMPointerType(LLVMVectorType(int_type,
400
vector_length), 0);
401
402
elem_types[10] = LLVMArrayType(LLVMPointerType(int_type, 0), /* ssbos */
403
LP_MAX_TGSI_SHADER_BUFFERS);
404
elem_types[11] = LLVMArrayType(int_type, /* num_ssbos */
405
LP_MAX_TGSI_SHADER_BUFFERS);
406
407
context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
408
ARRAY_SIZE(elem_types), 0);
409
410
(void) target; /* silence unused var warning for non-debug build */
411
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, constants,
412
target, context_type, DRAW_GS_JIT_CTX_CONSTANTS);
413
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, num_constants,
414
target, context_type, DRAW_GS_JIT_CTX_NUM_CONSTANTS);
415
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, planes,
416
target, context_type, DRAW_GS_JIT_CTX_PLANES);
417
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, viewports,
418
target, context_type, DRAW_GS_JIT_CTX_VIEWPORT);
419
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, textures,
420
target, context_type,
421
DRAW_GS_JIT_CTX_TEXTURES);
422
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, samplers,
423
target, context_type,
424
DRAW_GS_JIT_CTX_SAMPLERS);
425
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, prim_lengths,
426
target, context_type,
427
DRAW_GS_JIT_CTX_PRIM_LENGTHS);
428
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_vertices,
429
target, context_type,
430
DRAW_GS_JIT_CTX_EMITTED_VERTICES);
431
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, emitted_prims,
432
target, context_type,
433
DRAW_GS_JIT_CTX_EMITTED_PRIMS);
434
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, ssbos,
435
target, context_type, DRAW_GS_JIT_CTX_SSBOS);
436
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, num_ssbos,
437
target, context_type, DRAW_GS_JIT_CTX_NUM_SSBOS);
438
LP_CHECK_MEMBER_OFFSET(struct draw_gs_jit_context, images,
439
target, context_type, DRAW_GS_JIT_CTX_IMAGES);
440
LP_CHECK_STRUCT_SIZE(struct draw_gs_jit_context,
441
target, context_type);
442
443
return context_type;
444
}
445
446
447
static LLVMTypeRef
448
create_gs_jit_input_type(struct gallivm_state *gallivm)
449
{
450
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
451
LLVMTypeRef input_array;
452
453
input_array = LLVMVectorType(float_type, TGSI_NUM_CHANNELS); /* num primitives */
454
input_array = LLVMArrayType(input_array, TGSI_NUM_CHANNELS); /* num channels */
455
input_array = LLVMArrayType(input_array, PIPE_MAX_SHADER_INPUTS); /* num attrs per vertex */
456
input_array = LLVMPointerType(input_array, 0); /* num vertices per prim */
457
458
return input_array;
459
}
460
461
/**
462
* Create LLVM type for struct pipe_vertex_buffer
463
*/
464
static LLVMTypeRef
465
create_jit_vertex_buffer_type(struct gallivm_state *gallivm,
466
const char *struct_name)
467
{
468
LLVMTargetDataRef target = gallivm->target;
469
LLVMTypeRef elem_types[4];
470
LLVMTypeRef vb_type;
471
472
elem_types[0] = LLVMInt16TypeInContext(gallivm->context);
473
elem_types[1] = LLVMInt8TypeInContext(gallivm->context);
474
elem_types[2] = LLVMInt32TypeInContext(gallivm->context);
475
elem_types[3] = LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0);
476
477
vb_type = LLVMStructTypeInContext(gallivm->context, elem_types,
478
ARRAY_SIZE(elem_types), 0);
479
480
(void) target; /* silence unused var warning for non-debug build */
481
LP_CHECK_MEMBER_OFFSET(struct pipe_vertex_buffer, stride,
482
target, vb_type, 0);
483
LP_CHECK_MEMBER_OFFSET(struct pipe_vertex_buffer, is_user_buffer,
484
target, vb_type, 1);
485
LP_CHECK_MEMBER_OFFSET(struct pipe_vertex_buffer, buffer_offset,
486
target, vb_type, 2);
487
LP_CHECK_MEMBER_OFFSET(struct pipe_vertex_buffer, buffer.resource,
488
target, vb_type, 3);
489
490
LP_CHECK_STRUCT_SIZE(struct pipe_vertex_buffer, target, vb_type);
491
492
return vb_type;
493
}
494
495
496
/**
497
* Create LLVM type for struct vertex_header;
498
*/
499
static LLVMTypeRef
500
create_jit_vertex_header(struct gallivm_state *gallivm, int data_elems)
501
{
502
LLVMTargetDataRef target = gallivm->target;
503
LLVMTypeRef elem_types[3];
504
LLVMTypeRef vertex_header;
505
char struct_name[24];
506
507
snprintf(struct_name, 23, "vertex_header%d", data_elems);
508
509
elem_types[DRAW_JIT_VERTEX_VERTEX_ID] = LLVMIntTypeInContext(gallivm->context, 32);
510
elem_types[DRAW_JIT_VERTEX_CLIP_POS] = LLVMArrayType(LLVMFloatTypeInContext(gallivm->context), 4);
511
elem_types[DRAW_JIT_VERTEX_DATA] = LLVMArrayType(elem_types[1], data_elems);
512
513
vertex_header = LLVMStructTypeInContext(gallivm->context, elem_types,
514
ARRAY_SIZE(elem_types), 0);
515
516
/* these are bit-fields and we can't take address of them
517
LP_CHECK_MEMBER_OFFSET(struct vertex_header, clipmask,
518
target, vertex_header,
519
DRAW_JIT_VERTEX_CLIPMASK);
520
LP_CHECK_MEMBER_OFFSET(struct vertex_header, edgeflag,
521
target, vertex_header,
522
DRAW_JIT_VERTEX_EDGEFLAG);
523
LP_CHECK_MEMBER_OFFSET(struct vertex_header, pad,
524
target, vertex_header,
525
DRAW_JIT_VERTEX_PAD);
526
LP_CHECK_MEMBER_OFFSET(struct vertex_header, vertex_id,
527
target, vertex_header,
528
DRAW_JIT_VERTEX_VERTEX_ID);
529
*/
530
(void) target; /* silence unused var warning for non-debug build */
531
LP_CHECK_MEMBER_OFFSET(struct vertex_header, clip_pos,
532
target, vertex_header,
533
DRAW_JIT_VERTEX_CLIP_POS);
534
LP_CHECK_MEMBER_OFFSET(struct vertex_header, data,
535
target, vertex_header,
536
DRAW_JIT_VERTEX_DATA);
537
538
assert(LLVMABISizeOfType(target, vertex_header) ==
539
offsetof(struct vertex_header, data[data_elems]));
540
541
return vertex_header;
542
}
543
544
/**
545
* Create LLVM type for struct draw_tcs_jit_context
546
*/
547
static LLVMTypeRef
548
create_tcs_jit_context_type(struct gallivm_state *gallivm,
549
unsigned vector_length,
550
LLVMTypeRef texture_type, LLVMTypeRef sampler_type,
551
LLVMTypeRef image_type,
552
const char *struct_name)
553
{
554
LLVMTargetDataRef target = gallivm->target;
555
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
556
LLVMTypeRef int_type = LLVMInt32TypeInContext(gallivm->context);
557
LLVMTypeRef elem_types[DRAW_TCS_JIT_CTX_NUM_FIELDS];
558
LLVMTypeRef context_type;
559
560
elem_types[0] = LLVMArrayType(LLVMPointerType(float_type, 0), /* constants */
561
LP_MAX_TGSI_CONST_BUFFERS);
562
elem_types[1] = LLVMArrayType(int_type, /* num_constants */
563
LP_MAX_TGSI_CONST_BUFFERS);
564
elem_types[2] = LLVMInt32TypeInContext(gallivm->context);
565
elem_types[3] = LLVMInt32TypeInContext(gallivm->context);
566
567
elem_types[4] = LLVMArrayType(texture_type,
568
PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */
569
elem_types[5] = LLVMArrayType(sampler_type,
570
PIPE_MAX_SAMPLERS); /* samplers */
571
elem_types[6] = LLVMArrayType(image_type,
572
PIPE_MAX_SHADER_IMAGES); /* images */
573
574
elem_types[7] = LLVMArrayType(LLVMPointerType(int_type, 0), /* ssbos */
575
LP_MAX_TGSI_SHADER_BUFFERS);
576
elem_types[8] = LLVMArrayType(int_type, /* num_ssbos */
577
LP_MAX_TGSI_SHADER_BUFFERS);
578
579
context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
580
ARRAY_SIZE(elem_types), 0);
581
582
(void) target; /* silence unused var warning for non-debug build */
583
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, constants,
584
target, context_type, DRAW_TCS_JIT_CTX_CONSTANTS);
585
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, num_constants,
586
target, context_type, DRAW_TCS_JIT_CTX_NUM_CONSTANTS);
587
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, textures,
588
target, context_type,
589
DRAW_TCS_JIT_CTX_TEXTURES);
590
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, samplers,
591
target, context_type,
592
DRAW_TCS_JIT_CTX_SAMPLERS);
593
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, ssbos,
594
target, context_type, DRAW_TCS_JIT_CTX_SSBOS);
595
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, num_ssbos,
596
target, context_type, DRAW_TCS_JIT_CTX_NUM_SSBOS);
597
LP_CHECK_MEMBER_OFFSET(struct draw_tcs_jit_context, images,
598
target, context_type, DRAW_TCS_JIT_CTX_IMAGES);
599
LP_CHECK_STRUCT_SIZE(struct draw_tcs_jit_context,
600
target, context_type);
601
602
return context_type;
603
}
604
605
static LLVMTypeRef
606
create_tcs_jit_input_type(struct gallivm_state *gallivm)
607
{
608
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
609
LLVMTypeRef input_array;
610
611
input_array = LLVMArrayType(float_type, TGSI_NUM_CHANNELS); /* num channels */
612
input_array = LLVMArrayType(input_array, NUM_TCS_INPUTS); /* num attrs per vertex */
613
input_array = LLVMPointerType(input_array, 0); /* num vertices per prim */
614
615
return input_array;
616
}
617
618
static LLVMTypeRef
619
create_tcs_jit_output_type(struct gallivm_state *gallivm)
620
{
621
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
622
LLVMTypeRef output_array;
623
624
output_array = LLVMArrayType(float_type, TGSI_NUM_CHANNELS); /* num channels */
625
output_array = LLVMArrayType(output_array, PIPE_MAX_SHADER_INPUTS); /* num attrs per vertex */
626
output_array = LLVMPointerType(output_array, 0); /* num vertices per prim */
627
628
return output_array;
629
}
630
631
static LLVMTypeRef
632
create_tes_jit_input_type(struct gallivm_state *gallivm)
633
{
634
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
635
LLVMTypeRef input_array;
636
637
input_array = LLVMArrayType(float_type, TGSI_NUM_CHANNELS); /* num channels */
638
input_array = LLVMArrayType(input_array, PIPE_MAX_SHADER_INPUTS); /* num attrs per vertex */
639
input_array = LLVMPointerType(input_array, 0); /* num vertices per prim */
640
641
return input_array;
642
}
643
644
/**
645
* Create LLVM type for struct draw_tes_jit_context
646
*/
647
static LLVMTypeRef
648
create_tes_jit_context_type(struct gallivm_state *gallivm,
649
unsigned vector_length,
650
LLVMTypeRef texture_type, LLVMTypeRef sampler_type,
651
LLVMTypeRef image_type,
652
const char *struct_name)
653
{
654
LLVMTargetDataRef target = gallivm->target;
655
LLVMTypeRef float_type = LLVMFloatTypeInContext(gallivm->context);
656
LLVMTypeRef int_type = LLVMInt32TypeInContext(gallivm->context);
657
LLVMTypeRef elem_types[DRAW_TCS_JIT_CTX_NUM_FIELDS];
658
LLVMTypeRef context_type;
659
660
elem_types[0] = LLVMArrayType(LLVMPointerType(float_type, 0), /* constants */
661
LP_MAX_TGSI_CONST_BUFFERS);
662
elem_types[1] = LLVMArrayType(int_type, /* num_constants */
663
LP_MAX_TGSI_CONST_BUFFERS);
664
elem_types[2] = LLVMInt32TypeInContext(gallivm->context);
665
elem_types[3] = LLVMInt32TypeInContext(gallivm->context);
666
667
elem_types[4] = LLVMArrayType(texture_type,
668
PIPE_MAX_SHADER_SAMPLER_VIEWS); /* textures */
669
elem_types[5] = LLVMArrayType(sampler_type,
670
PIPE_MAX_SAMPLERS); /* samplers */
671
elem_types[6] = LLVMArrayType(image_type,
672
PIPE_MAX_SHADER_IMAGES); /* images */
673
674
elem_types[7] = LLVMArrayType(LLVMPointerType(int_type, 0), /* ssbos */
675
LP_MAX_TGSI_SHADER_BUFFERS);
676
elem_types[8] = LLVMArrayType(int_type, /* num_ssbos */
677
LP_MAX_TGSI_SHADER_BUFFERS);
678
679
context_type = LLVMStructTypeInContext(gallivm->context, elem_types,
680
ARRAY_SIZE(elem_types), 0);
681
682
(void) target; /* silence unused var warning for non-debug build */
683
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, constants,
684
target, context_type, DRAW_TCS_JIT_CTX_CONSTANTS);
685
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, num_constants,
686
target, context_type, DRAW_TCS_JIT_CTX_NUM_CONSTANTS);
687
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, textures,
688
target, context_type,
689
DRAW_TCS_JIT_CTX_TEXTURES);
690
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, samplers,
691
target, context_type,
692
DRAW_TCS_JIT_CTX_SAMPLERS);
693
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, ssbos,
694
target, context_type, DRAW_TCS_JIT_CTX_SSBOS);
695
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, num_ssbos,
696
target, context_type, DRAW_TCS_JIT_CTX_NUM_SSBOS);
697
LP_CHECK_MEMBER_OFFSET(struct draw_tes_jit_context, images,
698
target, context_type, DRAW_TCS_JIT_CTX_IMAGES);
699
LP_CHECK_STRUCT_SIZE(struct draw_tes_jit_context,
700
target, context_type);
701
702
return context_type;
703
}
704
705
/**
706
* Create LLVM types for various structures.
707
*/
708
static void
709
create_jit_types(struct draw_llvm_variant *variant)
710
{
711
struct gallivm_state *gallivm = variant->gallivm;
712
LLVMTypeRef texture_type, sampler_type, context_type, buffer_type,
713
vb_type, image_type;
714
715
texture_type = create_jit_texture_type(gallivm, "texture");
716
sampler_type = create_jit_sampler_type(gallivm, "sampler");
717
image_type = create_jit_image_type(gallivm, "image");
718
719
context_type = create_jit_context_type(gallivm, texture_type, sampler_type,
720
image_type,
721
"draw_jit_context");
722
variant->context_ptr_type = LLVMPointerType(context_type, 0);
723
724
buffer_type = create_jit_dvbuffer_type(gallivm, "draw_vertex_buffer");
725
variant->buffer_ptr_type = LLVMPointerType(buffer_type, 0);
726
727
vb_type = create_jit_vertex_buffer_type(gallivm, "pipe_vertex_buffer");
728
variant->vb_ptr_type = LLVMPointerType(vb_type, 0);
729
}
730
731
732
static LLVMTypeRef
733
get_context_ptr_type(struct draw_llvm_variant *variant)
734
{
735
if (!variant->context_ptr_type)
736
create_jit_types(variant);
737
return variant->context_ptr_type;
738
}
739
740
741
static LLVMTypeRef
742
get_buffer_ptr_type(struct draw_llvm_variant *variant)
743
{
744
if (!variant->buffer_ptr_type)
745
create_jit_types(variant);
746
return variant->buffer_ptr_type;
747
}
748
749
750
static LLVMTypeRef
751
get_vb_ptr_type(struct draw_llvm_variant *variant)
752
{
753
if (!variant->vb_ptr_type)
754
create_jit_types(variant);
755
return variant->vb_ptr_type;
756
}
757
758
static LLVMTypeRef
759
get_vertex_header_ptr_type(struct draw_llvm_variant *variant)
760
{
761
if (!variant->vertex_header_ptr_type)
762
create_jit_types(variant);
763
return variant->vertex_header_ptr_type;
764
}
765
766
767
/**
768
* Create per-context LLVM info.
769
*/
770
struct draw_llvm *
771
draw_llvm_create(struct draw_context *draw, LLVMContextRef context)
772
{
773
struct draw_llvm *llvm;
774
775
if (!lp_build_init())
776
return NULL;
777
778
llvm = CALLOC_STRUCT( draw_llvm );
779
if (!llvm)
780
return NULL;
781
782
llvm->draw = draw;
783
784
llvm->context = context;
785
if (!llvm->context) {
786
llvm->context = LLVMContextCreate();
787
llvm->context_owned = true;
788
}
789
if (!llvm->context)
790
goto fail;
791
792
llvm->nr_variants = 0;
793
make_empty_list(&llvm->vs_variants_list);
794
795
llvm->nr_gs_variants = 0;
796
make_empty_list(&llvm->gs_variants_list);
797
798
llvm->nr_tcs_variants = 0;
799
make_empty_list(&llvm->tcs_variants_list);
800
801
llvm->nr_tes_variants = 0;
802
make_empty_list(&llvm->tes_variants_list);
803
804
return llvm;
805
806
fail:
807
draw_llvm_destroy(llvm);
808
return NULL;
809
}
810
811
812
/**
813
* Free per-context LLVM info.
814
*/
815
void
816
draw_llvm_destroy(struct draw_llvm *llvm)
817
{
818
if (llvm->context_owned)
819
LLVMContextDispose(llvm->context);
820
llvm->context = NULL;
821
822
/* XXX free other draw_llvm data? */
823
FREE(llvm);
824
}
825
826
static void
827
draw_get_ir_cache_key(struct nir_shader *nir,
828
const void *key, size_t key_size,
829
uint32_t val_32bit,
830
unsigned char ir_sha1_cache_key[20])
831
{
832
struct blob blob = { 0 };
833
unsigned ir_size;
834
void *ir_binary;
835
836
blob_init(&blob);
837
nir_serialize(&blob, nir, true);
838
ir_binary = blob.data;
839
ir_size = blob.size;
840
841
struct mesa_sha1 ctx;
842
_mesa_sha1_init(&ctx);
843
_mesa_sha1_update(&ctx, key, key_size);
844
_mesa_sha1_update(&ctx, ir_binary, ir_size);
845
_mesa_sha1_update(&ctx, &val_32bit, 4);
846
_mesa_sha1_final(&ctx, ir_sha1_cache_key);
847
848
blob_finish(&blob);
849
}
850
851
/**
852
* Create LLVM-generated code for a vertex shader.
853
*/
854
struct draw_llvm_variant *
855
draw_llvm_create_variant(struct draw_llvm *llvm,
856
unsigned num_inputs,
857
const struct draw_llvm_variant_key *key)
858
{
859
struct draw_llvm_variant *variant;
860
struct llvm_vertex_shader *shader =
861
llvm_vertex_shader(llvm->draw->vs.vertex_shader);
862
LLVMTypeRef vertex_header;
863
char module_name[64];
864
unsigned char ir_sha1_cache_key[20];
865
struct lp_cached_code cached = { 0 };
866
bool needs_caching = false;
867
variant = MALLOC(sizeof *variant +
868
shader->variant_key_size -
869
sizeof variant->key);
870
if (!variant)
871
return NULL;
872
873
variant->llvm = llvm;
874
variant->shader = shader;
875
memcpy(&variant->key, key, shader->variant_key_size);
876
877
snprintf(module_name, sizeof(module_name), "draw_llvm_vs_variant%u",
878
variant->shader->variants_cached);
879
880
if (shader->base.state.ir.nir && llvm->draw->disk_cache_cookie) {
881
draw_get_ir_cache_key(shader->base.state.ir.nir,
882
key,
883
shader->variant_key_size,
884
num_inputs,
885
ir_sha1_cache_key);
886
887
llvm->draw->disk_cache_find_shader(llvm->draw->disk_cache_cookie,
888
&cached,
889
ir_sha1_cache_key);
890
if (!cached.data_size)
891
needs_caching = true;
892
}
893
variant->gallivm = gallivm_create(module_name, llvm->context, &cached);
894
895
create_jit_types(variant);
896
897
if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
898
if (llvm->draw->vs.vertex_shader->state.type == PIPE_SHADER_IR_TGSI)
899
tgsi_dump(llvm->draw->vs.vertex_shader->state.tokens, 0);
900
else
901
nir_print_shader(llvm->draw->vs.vertex_shader->state.ir.nir, stderr);
902
draw_llvm_dump_variant_key(&variant->key);
903
}
904
905
vertex_header = create_jit_vertex_header(variant->gallivm, num_inputs);
906
907
variant->vertex_header_ptr_type = LLVMPointerType(vertex_header, 0);
908
909
draw_llvm_generate(llvm, variant);
910
911
gallivm_compile_module(variant->gallivm);
912
913
variant->jit_func = (draw_jit_vert_func)
914
gallivm_jit_function(variant->gallivm, variant->function);
915
916
if (needs_caching)
917
llvm->draw->disk_cache_insert_shader(llvm->draw->disk_cache_cookie,
918
&cached,
919
ir_sha1_cache_key);
920
gallivm_free_ir(variant->gallivm);
921
922
variant->list_item_global.base = variant;
923
variant->list_item_local.base = variant;
924
/*variant->no = */shader->variants_created++;
925
variant->list_item_global.base = variant;
926
927
return variant;
928
}
929
930
931
static void
932
generate_vs(struct draw_llvm_variant *variant,
933
LLVMBuilderRef builder,
934
struct lp_type vs_type,
935
LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS],
936
const LLVMValueRef (*inputs)[TGSI_NUM_CHANNELS],
937
const struct lp_bld_tgsi_system_values *system_values,
938
LLVMValueRef context_ptr,
939
const struct lp_build_sampler_soa *draw_sampler,
940
const struct lp_build_image_soa *draw_image,
941
boolean clamp_vertex_color,
942
struct lp_build_mask_context *bld_mask)
943
{
944
struct draw_llvm *llvm = variant->llvm;
945
const struct tgsi_token *tokens = llvm->draw->vs.vertex_shader->state.tokens;
946
LLVMValueRef consts_ptr =
947
draw_jit_context_vs_constants(variant->gallivm, context_ptr);
948
LLVMValueRef num_consts_ptr =
949
draw_jit_context_num_vs_constants(variant->gallivm, context_ptr);
950
LLVMValueRef ssbos_ptr =
951
draw_jit_context_vs_ssbos(variant->gallivm, context_ptr);
952
LLVMValueRef num_ssbos_ptr =
953
draw_jit_context_num_vs_ssbos(variant->gallivm, context_ptr);
954
955
struct lp_build_tgsi_params params;
956
memset(&params, 0, sizeof(params));
957
958
params.type = vs_type;
959
params.mask = bld_mask;
960
params.consts_ptr = consts_ptr;
961
params.const_sizes_ptr = num_consts_ptr;
962
params.system_values = system_values;
963
params.inputs = inputs;
964
params.context_ptr = context_ptr;
965
params.sampler = draw_sampler;
966
params.info = &llvm->draw->vs.vertex_shader->info;
967
params.ssbo_ptr = ssbos_ptr;
968
params.ssbo_sizes_ptr = num_ssbos_ptr;
969
params.image = draw_image;
970
971
if (llvm->draw->vs.vertex_shader->state.ir.nir &&
972
llvm->draw->vs.vertex_shader->state.type == PIPE_SHADER_IR_NIR)
973
lp_build_nir_soa(variant->gallivm,
974
llvm->draw->vs.vertex_shader->state.ir.nir,
975
&params,
976
outputs);
977
else
978
lp_build_tgsi_soa(variant->gallivm,
979
tokens,
980
&params,
981
outputs);
982
983
{
984
LLVMValueRef out;
985
unsigned chan, attrib;
986
struct lp_build_context bld;
987
struct tgsi_shader_info* info = &llvm->draw->vs.vertex_shader->info;
988
lp_build_context_init(&bld, variant->gallivm, vs_type);
989
990
for (attrib = 0; attrib < info->num_outputs; ++attrib) {
991
for (chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) {
992
if (outputs[attrib][chan]) {
993
switch (info->output_semantic_name[attrib]) {
994
case TGSI_SEMANTIC_COLOR:
995
case TGSI_SEMANTIC_BCOLOR:
996
if (clamp_vertex_color) {
997
out = LLVMBuildLoad(builder, outputs[attrib][chan], "");
998
out = lp_build_clamp(&bld, out, bld.zero, bld.one);
999
LLVMBuildStore(builder, out, outputs[attrib][chan]);
1000
}
1001
break;
1002
}
1003
}
1004
}
1005
}
1006
}
1007
}
1008
1009
1010
static void
1011
fetch_instanced(struct gallivm_state *gallivm,
1012
const struct util_format_description *format_desc,
1013
struct lp_type vs_type,
1014
LLVMValueRef vb_stride,
1015
LLVMValueRef map_ptr,
1016
LLVMValueRef buffer_size_adj,
1017
LLVMValueRef *inputs,
1018
LLVMValueRef index)
1019
{
1020
LLVMTypeRef i32_t = LLVMInt32TypeInContext(gallivm->context);
1021
LLVMTypeRef aosf_t, aosi_t;
1022
LLVMValueRef zero = LLVMConstNull(i32_t);
1023
LLVMBuilderRef builder = gallivm->builder;
1024
LLVMValueRef stride, buffer_overflowed, aos, index_valid;
1025
unsigned i;
1026
1027
aosf_t = lp_build_vec_type(gallivm, lp_float32_vec4_type());
1028
aosi_t = lp_build_vec_type(gallivm, lp_int32_vec4_type());
1029
1030
/* This mul can overflow. Wraparound is ok. */
1031
stride = LLVMBuildMul(builder, vb_stride, index, "");
1032
1033
buffer_overflowed = LLVMBuildICmp(builder, LLVMIntUGE,
1034
stride, buffer_size_adj,
1035
"buffer_overflowed");
1036
1037
if (0) {
1038
lp_build_print_value(gallivm, " instance index = ", index);
1039
lp_build_print_value(gallivm, " buffer overflowed = ", buffer_overflowed);
1040
}
1041
1042
index_valid = LLVMBuildNot(builder, buffer_overflowed, "");
1043
index_valid = LLVMBuildSExt(builder, index_valid, i32_t, "");
1044
stride = LLVMBuildAnd(builder, stride, index_valid, "");
1045
1046
aos = lp_build_fetch_rgba_aos(gallivm,
1047
format_desc,
1048
lp_float32_vec4_type(),
1049
FALSE,
1050
map_ptr,
1051
stride, zero, zero,
1052
NULL);
1053
1054
index_valid = lp_build_broadcast(gallivm, aosi_t, index_valid);
1055
aos = LLVMBuildBitCast(builder, aos, aosi_t, "");
1056
aos = LLVMBuildAnd(builder, aos, index_valid, "");
1057
aos = LLVMBuildBitCast(builder, aos, aosf_t, "");
1058
1059
for (i = 0; i < TGSI_NUM_CHANNELS; i++) {
1060
LLVMValueRef index = lp_build_const_int32(gallivm, i);
1061
inputs[i] = lp_build_extract_broadcast(gallivm,
1062
lp_float32_vec4_type(),
1063
vs_type, aos, index);
1064
}
1065
}
1066
1067
1068
static void
1069
fetch_vector(struct gallivm_state *gallivm,
1070
const struct util_format_description *format_desc,
1071
struct lp_type vs_type,
1072
LLVMValueRef vb_stride,
1073
LLVMValueRef map_ptr,
1074
LLVMValueRef buffer_size_adj,
1075
LLVMValueRef *inputs,
1076
LLVMValueRef indices)
1077
{
1078
LLVMBuilderRef builder = gallivm->builder;
1079
struct lp_build_context blduivec;
1080
struct lp_type fetch_type = vs_type;
1081
LLVMValueRef offset, valid_mask;
1082
unsigned i;
1083
1084
lp_build_context_init(&blduivec, gallivm, lp_uint_type(vs_type));
1085
1086
vb_stride = lp_build_broadcast_scalar(&blduivec, vb_stride);
1087
buffer_size_adj = lp_build_broadcast_scalar(&blduivec, buffer_size_adj);
1088
1089
/* This mul can overflow. Wraparound is ok. */
1090
offset = lp_build_mul(&blduivec, vb_stride, indices);
1091
1092
valid_mask = lp_build_compare(gallivm, blduivec.type,
1093
PIPE_FUNC_LESS, offset, buffer_size_adj);
1094
1095
/* not valid elements use offset 0 */
1096
offset = LLVMBuildAnd(builder, offset, valid_mask, "");
1097
1098
if (0) {
1099
lp_build_print_value(gallivm, " indices = ", indices);
1100
lp_build_print_value(gallivm, " offsets = ", offset);
1101
lp_build_print_value(gallivm, " valid_mask = ", valid_mask);
1102
}
1103
1104
/*
1105
* Unlike fetch_instanced, use SoA fetch instead of multiple AoS fetches.
1106
* This should always produce better code.
1107
*/
1108
1109
/* The type handling is annoying here... */
1110
if (format_desc->colorspace == UTIL_FORMAT_COLORSPACE_RGB &&
1111
format_desc->channel[0].pure_integer) {
1112
if (format_desc->channel[0].type == UTIL_FORMAT_TYPE_SIGNED) {
1113
fetch_type = lp_type_int_vec(vs_type.width, vs_type.width * vs_type.length);
1114
}
1115
else if (format_desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED) {
1116
fetch_type = lp_type_uint_vec(vs_type.width, vs_type.width * vs_type.length);
1117
}
1118
}
1119
1120
lp_build_fetch_rgba_soa(gallivm, format_desc,
1121
fetch_type, FALSE, map_ptr, offset,
1122
blduivec.zero, blduivec.zero,
1123
NULL, inputs);
1124
1125
for (i = 0; i < TGSI_NUM_CHANNELS; i++) {
1126
inputs[i] = LLVMBuildBitCast(builder, inputs[i],
1127
lp_build_vec_type(gallivm, vs_type), "");
1128
}
1129
1130
/* out-of-bound fetches return all zeros */
1131
for (i = 0; i < format_desc->nr_channels; i++) {
1132
inputs[i] = LLVMBuildBitCast(builder, inputs[i], blduivec.vec_type, "");
1133
inputs[i] = LLVMBuildAnd(builder, inputs[i], valid_mask, "");
1134
inputs[i] = LLVMBuildBitCast(builder, inputs[i],
1135
lp_build_vec_type(gallivm, vs_type), "");
1136
}
1137
}
1138
1139
1140
static void
1141
store_aos(struct gallivm_state *gallivm,
1142
LLVMValueRef io_ptr,
1143
LLVMValueRef index,
1144
LLVMValueRef value)
1145
{
1146
LLVMTypeRef data_ptr_type = LLVMPointerType(lp_build_vec_type(gallivm, lp_float32_vec4_type()), 0);
1147
LLVMBuilderRef builder = gallivm->builder;
1148
LLVMValueRef data_ptr = draw_jit_header_data(gallivm, io_ptr);
1149
LLVMValueRef indices[3];
1150
1151
indices[0] = lp_build_const_int32(gallivm, 0);
1152
indices[1] = index;
1153
indices[2] = lp_build_const_int32(gallivm, 0);
1154
1155
data_ptr = LLVMBuildGEP(builder, data_ptr, indices, 3, "");
1156
data_ptr = LLVMBuildPointerCast(builder, data_ptr, data_ptr_type, "");
1157
1158
#if DEBUG_STORE
1159
lp_build_printf(gallivm, " ---- %p storing attribute %d (io = %p)\n", data_ptr, index, io_ptr);
1160
#endif
1161
1162
/* Unaligned store due to the vertex header */
1163
LLVMSetAlignment(LLVMBuildStore(builder, value, data_ptr), sizeof(float));
1164
}
1165
1166
/**
1167
* Adjust the mask to architecture endianess. The mask will the store in struct:
1168
*
1169
* struct vertex_header {
1170
* unsigned clipmask:DRAW_TOTAL_CLIP_PLANES;
1171
* unsigned edgeflag:1;
1172
* unsigned pad:1;
1173
* unsigned vertex_id:16;
1174
* [...]
1175
* }
1176
*
1177
* On little-endian machine nothing needs to done, however on bit-endian machine
1178
* the mask's fields need to be adjusted with the algorithm:
1179
*
1180
* uint32_t reverse (uint32_t x)
1181
* {
1182
* return (x >> 16) | // vertex_id
1183
* ((x & 0x3fff) << 18) | // clipmask
1184
* ((x & 0x4000) << 3) | // edgeflag
1185
* ((x & 0x8000) << 1); // pad
1186
* }
1187
*/
1188
static LLVMValueRef
1189
adjust_mask(struct gallivm_state *gallivm,
1190
LLVMValueRef mask)
1191
{
1192
#if UTIL_ARCH_BIG_ENDIAN
1193
LLVMBuilderRef builder = gallivm->builder;
1194
LLVMValueRef vertex_id;
1195
LLVMValueRef clipmask;
1196
LLVMValueRef pad;
1197
LLVMValueRef edgeflag;
1198
1199
vertex_id = LLVMBuildLShr(builder, mask, lp_build_const_int32(gallivm, 16), "");
1200
clipmask = LLVMBuildAnd(builder, mask, lp_build_const_int32(gallivm, 0x3fff), "");
1201
clipmask = LLVMBuildShl(builder, clipmask, lp_build_const_int32(gallivm, 18), "");
1202
if (0) {
1203
pad = LLVMBuildAnd(builder, mask, lp_build_const_int32(gallivm, 0x8000), "");
1204
pad = LLVMBuildShl(builder, pad, lp_build_const_int32(gallivm, 1), "");
1205
}
1206
edgeflag = LLVMBuildAnd(builder, mask, lp_build_const_int32(gallivm, 0x4000), "");
1207
edgeflag = LLVMBuildShl(builder, edgeflag, lp_build_const_int32(gallivm, 3), "");
1208
1209
mask = LLVMBuildOr(builder, vertex_id, clipmask, "");
1210
if (0) {
1211
mask = LLVMBuildOr(builder, mask, pad, "");
1212
}
1213
mask = LLVMBuildOr(builder, mask, edgeflag, "");
1214
#endif
1215
return mask;
1216
}
1217
1218
static void
1219
store_aos_array(struct gallivm_state *gallivm,
1220
struct lp_type soa_type,
1221
LLVMValueRef io_ptr,
1222
LLVMValueRef *indices,
1223
LLVMValueRef* aos,
1224
int attrib,
1225
int num_outputs,
1226
LLVMValueRef clipmask,
1227
boolean need_edgeflag)
1228
{
1229
LLVMBuilderRef builder = gallivm->builder;
1230
LLVMValueRef attr_index = lp_build_const_int32(gallivm, attrib);
1231
LLVMValueRef inds[LP_MAX_VECTOR_WIDTH / 32];
1232
LLVMValueRef linear_inds[LP_MAX_VECTOR_WIDTH / 32];
1233
LLVMValueRef io_ptrs[LP_MAX_VECTOR_WIDTH / 32];
1234
int vector_length = soa_type.length;
1235
int i;
1236
1237
debug_assert(TGSI_NUM_CHANNELS == 4);
1238
1239
for (i = 0; i < vector_length; i++) {
1240
linear_inds[i] = lp_build_const_int32(gallivm, i);
1241
if (indices) {
1242
inds[i] = indices[i];
1243
} else {
1244
inds[i] = linear_inds[i];
1245
}
1246
io_ptrs[i] = LLVMBuildGEP(builder, io_ptr, &inds[i], 1, "");
1247
}
1248
1249
if (attrib == 0) {
1250
/* store vertex header for each of the n vertices */
1251
LLVMValueRef val, cliptmp;
1252
int vertex_id_pad_edgeflag;
1253
1254
/* If this assertion fails, it means we need to update the bit twidding
1255
* code here. See struct vertex_header in draw_private.h.
1256
*/
1257
assert(DRAW_TOTAL_CLIP_PLANES==14);
1258
/* initialize vertex id:16 = 0xffff, pad:1 = 0, edgeflag:1 = 1 */
1259
if (!need_edgeflag) {
1260
vertex_id_pad_edgeflag = (0xffff << 16) | (1 << DRAW_TOTAL_CLIP_PLANES);
1261
}
1262
else {
1263
vertex_id_pad_edgeflag = (0xffff << 16);
1264
}
1265
val = lp_build_const_int_vec(gallivm, lp_int_type(soa_type),
1266
vertex_id_pad_edgeflag);
1267
/* OR with the clipmask */
1268
cliptmp = LLVMBuildOr(builder, val, clipmask, "");
1269
for (i = 0; i < vector_length; i++) {
1270
LLVMValueRef id_ptr = draw_jit_header_id(gallivm, io_ptrs[i]);
1271
val = LLVMBuildExtractElement(builder, cliptmp, linear_inds[i], "");
1272
val = adjust_mask(gallivm, val);
1273
#if DEBUG_STORE
1274
lp_build_printf(gallivm, "io = %p, index %d, clipmask = %x\n",
1275
io_ptrs[i], inds[i], val);
1276
#endif
1277
LLVMBuildStore(builder, val, id_ptr);
1278
}
1279
}
1280
1281
/* store for each of the n vertices */
1282
for (i = 0; i < vector_length; i++) {
1283
store_aos(gallivm, io_ptrs[i], attr_index, aos[i]);
1284
}
1285
}
1286
1287
1288
static void
1289
convert_to_aos(struct gallivm_state *gallivm,
1290
LLVMValueRef io,
1291
LLVMValueRef *indices,
1292
LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS],
1293
LLVMValueRef clipmask,
1294
int num_outputs,
1295
struct lp_type soa_type,
1296
boolean need_edgeflag)
1297
{
1298
LLVMBuilderRef builder = gallivm->builder;
1299
unsigned chan, attrib, i;
1300
1301
#if DEBUG_STORE
1302
lp_build_printf(gallivm, " # storing begin\n");
1303
#endif
1304
for (attrib = 0; attrib < num_outputs; ++attrib) {
1305
LLVMValueRef soa[TGSI_NUM_CHANNELS];
1306
LLVMValueRef aos[LP_MAX_VECTOR_WIDTH / 32];
1307
for (chan = 0; chan < TGSI_NUM_CHANNELS; ++chan) {
1308
if (outputs[attrib][chan]) {
1309
LLVMValueRef out = LLVMBuildLoad(builder, outputs[attrib][chan], "");
1310
lp_build_name(out, "output%u.%c", attrib, "xyzw"[chan]);
1311
#if DEBUG_STORE
1312
lp_build_printf(gallivm, "output %d : %d ",
1313
LLVMConstInt(LLVMInt32TypeInContext(gallivm->context),
1314
attrib, 0),
1315
LLVMConstInt(LLVMInt32TypeInContext(gallivm->context),
1316
chan, 0));
1317
lp_build_print_value(gallivm, "val = ", out);
1318
{
1319
LLVMValueRef iv =
1320
LLVMBuildBitCast(builder, out, lp_build_int_vec_type(gallivm, soa_type), "");
1321
1322
lp_build_print_value(gallivm, " ival = ", iv);
1323
}
1324
#endif
1325
soa[chan] = out;
1326
}
1327
else {
1328
soa[chan] = 0;
1329
}
1330
}
1331
1332
1333
if (soa_type.length == TGSI_NUM_CHANNELS) {
1334
lp_build_transpose_aos(gallivm, soa_type, soa, aos);
1335
} else {
1336
lp_build_transpose_aos(gallivm, soa_type, soa, soa);
1337
1338
for (i = 0; i < soa_type.length; ++i) {
1339
aos[i] = lp_build_extract_range(gallivm,
1340
soa[i % TGSI_NUM_CHANNELS],
1341
(i / TGSI_NUM_CHANNELS) * TGSI_NUM_CHANNELS,
1342
TGSI_NUM_CHANNELS);
1343
}
1344
}
1345
1346
store_aos_array(gallivm,
1347
soa_type,
1348
io, indices,
1349
aos,
1350
attrib,
1351
num_outputs,
1352
clipmask,
1353
need_edgeflag);
1354
}
1355
#if DEBUG_STORE
1356
lp_build_printf(gallivm, " # storing end\n");
1357
#endif
1358
}
1359
1360
1361
/**
1362
* Stores original vertex positions in clip coordinates
1363
*/
1364
static void
1365
store_clip(struct gallivm_state *gallivm,
1366
const struct lp_type vs_type,
1367
LLVMValueRef io_ptr,
1368
LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS],
1369
int idx)
1370
{
1371
LLVMBuilderRef builder = gallivm->builder;
1372
LLVMValueRef soa[4];
1373
LLVMValueRef aos[LP_MAX_VECTOR_LENGTH];
1374
LLVMValueRef indices[2];
1375
LLVMValueRef io_ptrs[LP_MAX_VECTOR_WIDTH / 32];
1376
LLVMValueRef inds[LP_MAX_VECTOR_WIDTH / 32];
1377
LLVMValueRef clip_ptrs[LP_MAX_VECTOR_WIDTH / 32];
1378
LLVMTypeRef clip_ptr_type =
1379
LLVMPointerType(LLVMVectorType(LLVMFloatTypeInContext(gallivm->context),
1380
4), 0);
1381
int i, j;
1382
1383
indices[0] =
1384
indices[1] = lp_build_const_int32(gallivm, 0);
1385
1386
for (i = 0; i < vs_type.length; i++) {
1387
inds[i] = lp_build_const_int32(gallivm, i);
1388
io_ptrs[i] = LLVMBuildGEP(builder, io_ptr, &inds[i], 1, "");
1389
}
1390
1391
soa[0] = LLVMBuildLoad(builder, outputs[idx][0], ""); /*x0 x1 .. xn*/
1392
soa[1] = LLVMBuildLoad(builder, outputs[idx][1], ""); /*y0 y1 .. yn*/
1393
soa[2] = LLVMBuildLoad(builder, outputs[idx][2], ""); /*z0 z1 .. zn*/
1394
soa[3] = LLVMBuildLoad(builder, outputs[idx][3], ""); /*w0 w1 .. wn*/
1395
1396
for (i = 0; i < vs_type.length; i++) {
1397
clip_ptrs[i] = draw_jit_header_clip_pos(gallivm, io_ptrs[i]);
1398
}
1399
1400
lp_build_transpose_aos(gallivm, vs_type, soa, soa);
1401
for (i = 0; i < vs_type.length; ++i) {
1402
aos[i] = lp_build_extract_range(gallivm,
1403
soa[i % TGSI_NUM_CHANNELS],
1404
(i / TGSI_NUM_CHANNELS) * TGSI_NUM_CHANNELS,
1405
TGSI_NUM_CHANNELS);
1406
}
1407
1408
for (j = 0; j < vs_type.length; j++) {
1409
LLVMValueRef clip_ptr;
1410
1411
clip_ptr = LLVMBuildGEP(builder, clip_ptrs[j], indices, 2, "clipo");
1412
clip_ptr = LLVMBuildPointerCast(builder, clip_ptr, clip_ptr_type, "");
1413
1414
/* Unaligned store */
1415
LLVMSetAlignment(LLVMBuildStore(builder, aos[j], clip_ptr), sizeof(float));
1416
}
1417
}
1418
1419
1420
/**
1421
* Transforms the outputs for viewport mapping
1422
*/
1423
static void
1424
generate_viewport(struct draw_llvm_variant *variant,
1425
LLVMBuilderRef builder,
1426
struct lp_type vs_type,
1427
LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS],
1428
LLVMValueRef context_ptr)
1429
{
1430
int i;
1431
struct gallivm_state *gallivm = variant->gallivm;
1432
struct lp_type f32_type = vs_type;
1433
const unsigned pos = variant->llvm->draw->vs.position_output;
1434
LLVMTypeRef vs_type_llvm = lp_build_vec_type(gallivm, vs_type);
1435
LLVMValueRef out3 = LLVMBuildLoad(builder, outputs[pos][3], ""); /*w0 w1 .. wn*/
1436
LLVMValueRef const1 = lp_build_const_vec(gallivm, f32_type, 1.0); /*1.0 1.0 1.0 1.0*/
1437
LLVMValueRef vp_ptr = draw_jit_context_viewports(gallivm, context_ptr);
1438
1439
/* We treat pipe_viewport_state as a float array */
1440
const int scale_index_offset = offsetof(struct pipe_viewport_state, scale) / sizeof(float);
1441
const int trans_index_offset = offsetof(struct pipe_viewport_state, translate) / sizeof(float);
1442
1443
/* for 1/w convention*/
1444
out3 = LLVMBuildFDiv(builder, const1, out3, "");
1445
LLVMBuildStore(builder, out3, outputs[pos][3]);
1446
1447
/* Viewport Mapping */
1448
for (i=0; i<3; i++) {
1449
LLVMValueRef out = LLVMBuildLoad(builder, outputs[pos][i], ""); /*x0 x1 .. xn*/
1450
LLVMValueRef scale;
1451
LLVMValueRef trans;
1452
LLVMValueRef scale_i;
1453
LLVMValueRef trans_i;
1454
LLVMValueRef index;
1455
1456
index = lp_build_const_int32(gallivm, i + scale_index_offset);
1457
scale_i = LLVMBuildGEP(builder, vp_ptr, &index, 1, "");
1458
1459
index = lp_build_const_int32(gallivm, i + trans_index_offset);
1460
trans_i = LLVMBuildGEP(builder, vp_ptr, &index, 1, "");
1461
1462
scale = lp_build_broadcast(gallivm, vs_type_llvm,
1463
LLVMBuildLoad(builder, scale_i, "scale"));
1464
trans = lp_build_broadcast(gallivm, vs_type_llvm,
1465
LLVMBuildLoad(builder, trans_i, "trans"));
1466
1467
/* divide by w */
1468
out = LLVMBuildFMul(builder, out, out3, "");
1469
/* mult by scale, add translation */
1470
out = lp_build_fmuladd(builder, out, scale, trans);
1471
1472
/* store transformed outputs */
1473
LLVMBuildStore(builder, out, outputs[pos][i]);
1474
}
1475
1476
}
1477
1478
1479
/**
1480
* Returns clipmask as nxi32 bitmask for the n vertices
1481
*/
1482
static LLVMValueRef
1483
generate_clipmask(struct draw_llvm *llvm,
1484
struct gallivm_state *gallivm,
1485
struct lp_type vs_type,
1486
LLVMValueRef (*outputs)[TGSI_NUM_CHANNELS],
1487
struct draw_llvm_variant_key *key,
1488
LLVMValueRef context_ptr,
1489
boolean *have_clipdist)
1490
{
1491
LLVMBuilderRef builder = gallivm->builder;
1492
LLVMValueRef mask; /* stores the <nxi32> clipmasks */
1493
LLVMValueRef test, temp;
1494
LLVMValueRef zero, shift;
1495
LLVMValueRef pos_x, pos_y, pos_z, pos_w;
1496
LLVMValueRef cv_x, cv_y, cv_z, cv_w;
1497
LLVMValueRef plane1, planes, plane_ptr, sum;
1498
struct lp_type f32_type = vs_type;
1499
struct lp_type i32_type = lp_int_type(vs_type);
1500
const unsigned pos = llvm->draw->vs.position_output;
1501
const unsigned cv = llvm->draw->vs.clipvertex_output;
1502
int num_written_clipdistance = llvm->draw->vs.vertex_shader->info.num_written_clipdistance;
1503
boolean have_cd = false;
1504
boolean clip_user = key->clip_user;
1505
unsigned ucp_enable = key->ucp_enable;
1506
unsigned cd[2];
1507
1508
cd[0] = llvm->draw->vs.ccdistance_output[0];
1509
cd[1] = llvm->draw->vs.ccdistance_output[1];
1510
1511
if (cd[0] != pos || cd[1] != pos)
1512
have_cd = true;
1513
1514
if (num_written_clipdistance && !clip_user) {
1515
clip_user = true;
1516
ucp_enable = (1 << num_written_clipdistance) - 1;
1517
}
1518
1519
mask = lp_build_const_int_vec(gallivm, i32_type, 0);
1520
temp = lp_build_const_int_vec(gallivm, i32_type, 0);
1521
zero = lp_build_const_vec(gallivm, f32_type, 0); /* 0.0f 0.0f 0.0f 0.0f */
1522
shift = lp_build_const_int_vec(gallivm, i32_type, 1); /* 1 1 1 1 */
1523
1524
/*
1525
* load clipvertex and position from correct locations.
1526
* if they are the same just load them once.
1527
*/
1528
pos_x = LLVMBuildLoad(builder, outputs[pos][0], ""); /*x0 x1 .. xn */
1529
pos_y = LLVMBuildLoad(builder, outputs[pos][1], ""); /*y0 y1 .. yn */
1530
pos_z = LLVMBuildLoad(builder, outputs[pos][2], ""); /*z0 z1 .. zn */
1531
pos_w = LLVMBuildLoad(builder, outputs[pos][3], ""); /*w0 w1 .. wn */
1532
1533
if (clip_user && cv != pos) {
1534
cv_x = LLVMBuildLoad(builder, outputs[cv][0], ""); /*x0 x1 .. xn */
1535
cv_y = LLVMBuildLoad(builder, outputs[cv][1], ""); /*y0 y1 .. yn */
1536
cv_z = LLVMBuildLoad(builder, outputs[cv][2], ""); /*z0 z1 .. zn */
1537
cv_w = LLVMBuildLoad(builder, outputs[cv][3], ""); /*w0 w1 .. wn */
1538
} else {
1539
cv_x = pos_x;
1540
cv_y = pos_y;
1541
cv_z = pos_z;
1542
cv_w = pos_w;
1543
}
1544
1545
/*
1546
* Be careful with the comparisons and NaNs (using llvm's unordered
1547
* comparisons here).
1548
*/
1549
/* Cliptest, for hardwired planes */
1550
/*
1551
* XXX should take guardband into account (currently not in key).
1552
* Otherwise might run the draw pipeline stages for nothing.
1553
*/
1554
if (key->clip_xy) {
1555
/* plane 1 */
1556
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, pos_x , pos_w);
1557
temp = shift;
1558
test = LLVMBuildAnd(builder, test, temp, "");
1559
mask = test;
1560
1561
/* plane 2 */
1562
test = LLVMBuildFAdd(builder, pos_x, pos_w, "");
1563
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, test);
1564
temp = LLVMBuildShl(builder, temp, shift, "");
1565
test = LLVMBuildAnd(builder, test, temp, "");
1566
mask = LLVMBuildOr(builder, mask, test, "");
1567
1568
/* plane 3 */
1569
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, pos_y, pos_w);
1570
temp = LLVMBuildShl(builder, temp, shift, "");
1571
test = LLVMBuildAnd(builder, test, temp, "");
1572
mask = LLVMBuildOr(builder, mask, test, "");
1573
1574
/* plane 4 */
1575
test = LLVMBuildFAdd(builder, pos_y, pos_w, "");
1576
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, test);
1577
temp = LLVMBuildShl(builder, temp, shift, "");
1578
test = LLVMBuildAnd(builder, test, temp, "");
1579
mask = LLVMBuildOr(builder, mask, test, "");
1580
}
1581
1582
if (key->clip_z) {
1583
temp = lp_build_const_int_vec(gallivm, i32_type, 16);
1584
if (key->clip_halfz) {
1585
/* plane 5 */
1586
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, pos_z);
1587
test = LLVMBuildAnd(builder, test, temp, "");
1588
mask = LLVMBuildOr(builder, mask, test, "");
1589
}
1590
else {
1591
/* plane 5 */
1592
test = LLVMBuildFAdd(builder, pos_z, pos_w, "");
1593
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, test);
1594
test = LLVMBuildAnd(builder, test, temp, "");
1595
mask = LLVMBuildOr(builder, mask, test, "");
1596
}
1597
/* plane 6 */
1598
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, pos_z, pos_w);
1599
temp = LLVMBuildShl(builder, temp, shift, "");
1600
test = LLVMBuildAnd(builder, test, temp, "");
1601
mask = LLVMBuildOr(builder, mask, test, "");
1602
}
1603
1604
if (clip_user) {
1605
LLVMValueRef planes_ptr = draw_jit_context_planes(gallivm, context_ptr);
1606
LLVMValueRef indices[3];
1607
LLVMValueRef is_nan_or_inf;
1608
1609
/* userclip planes */
1610
while (ucp_enable) {
1611
unsigned plane_idx = ffs(ucp_enable)-1;
1612
ucp_enable &= ~(1 << plane_idx);
1613
plane_idx += 6;
1614
1615
if (have_cd && num_written_clipdistance) {
1616
LLVMValueRef clipdist;
1617
int i;
1618
i = plane_idx - 6;
1619
1620
*have_clipdist = TRUE;
1621
if (i < 4) {
1622
clipdist = LLVMBuildLoad(builder, outputs[cd[0]][i], "");
1623
} else {
1624
clipdist = LLVMBuildLoad(builder, outputs[cd[1]][i-4], "");
1625
}
1626
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, clipdist);
1627
is_nan_or_inf = lp_build_is_inf_or_nan(gallivm, vs_type, clipdist);
1628
test = LLVMBuildOr(builder, test, is_nan_or_inf, "");
1629
temp = lp_build_const_int_vec(gallivm, i32_type, 1LL << plane_idx);
1630
test = LLVMBuildAnd(builder, test, temp, "");
1631
mask = LLVMBuildOr(builder, mask, test, "");
1632
} else {
1633
LLVMTypeRef vs_type_llvm = lp_build_vec_type(gallivm, vs_type);
1634
indices[0] = lp_build_const_int32(gallivm, 0);
1635
indices[1] = lp_build_const_int32(gallivm, plane_idx);
1636
1637
indices[2] = lp_build_const_int32(gallivm, 0);
1638
plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, "");
1639
plane1 = LLVMBuildLoad(builder, plane_ptr, "plane_x");
1640
planes = lp_build_broadcast(gallivm, vs_type_llvm, plane1);
1641
sum = LLVMBuildFMul(builder, planes, cv_x, "");
1642
1643
indices[2] = lp_build_const_int32(gallivm, 1);
1644
plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, "");
1645
plane1 = LLVMBuildLoad(builder, plane_ptr, "plane_y");
1646
planes = lp_build_broadcast(gallivm, vs_type_llvm, plane1);
1647
sum = lp_build_fmuladd(builder, planes, cv_y, sum);
1648
1649
indices[2] = lp_build_const_int32(gallivm, 2);
1650
plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, "");
1651
plane1 = LLVMBuildLoad(builder, plane_ptr, "plane_z");
1652
planes = lp_build_broadcast(gallivm, vs_type_llvm, plane1);
1653
sum = lp_build_fmuladd(builder, planes, cv_z, sum);
1654
1655
indices[2] = lp_build_const_int32(gallivm, 3);
1656
plane_ptr = LLVMBuildGEP(builder, planes_ptr, indices, 3, "");
1657
plane1 = LLVMBuildLoad(builder, plane_ptr, "plane_w");
1658
planes = lp_build_broadcast(gallivm, vs_type_llvm, plane1);
1659
sum = lp_build_fmuladd(builder, planes, cv_w, sum);
1660
1661
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_GREATER, zero, sum);
1662
temp = lp_build_const_int_vec(gallivm, i32_type, 1LL << plane_idx);
1663
test = LLVMBuildAnd(builder, test, temp, "");
1664
mask = LLVMBuildOr(builder, mask, test, "");
1665
}
1666
}
1667
}
1668
if (key->need_edgeflags) {
1669
/*
1670
* This isn't really part of clipmask but stored the same in vertex
1671
* header later, so do it here.
1672
*/
1673
unsigned edge_attr = llvm->draw->vs.edgeflag_output;
1674
LLVMValueRef one = lp_build_const_vec(gallivm, f32_type, 1.0);
1675
LLVMValueRef edgeflag = LLVMBuildLoad(builder, outputs[edge_attr][0], "");
1676
test = lp_build_compare(gallivm, f32_type, PIPE_FUNC_EQUAL, one, edgeflag);
1677
temp = lp_build_const_int_vec(gallivm, i32_type,
1678
1LL << DRAW_TOTAL_CLIP_PLANES);
1679
test = LLVMBuildAnd(builder, test, temp, "");
1680
mask = LLVMBuildOr(builder, mask, test, "");
1681
}
1682
return mask;
1683
}
1684
1685
1686
/**
1687
* Returns boolean if any clipping has occurred
1688
* Used zero/one i8 value to represent boolean
1689
*/
1690
static LLVMValueRef
1691
clipmask_booli8(struct gallivm_state *gallivm,
1692
const struct lp_type vs_type,
1693
LLVMValueRef clipmask_bool_ptr,
1694
boolean edgeflag_in_clipmask)
1695
{
1696
LLVMBuilderRef builder = gallivm->builder;
1697
LLVMTypeRef int8_type = LLVMInt8TypeInContext(gallivm->context);
1698
LLVMValueRef clipmask_bool = LLVMBuildLoad(builder, clipmask_bool_ptr, "");
1699
LLVMValueRef ret;
1700
struct lp_build_context bldivec;
1701
1702
lp_build_context_init(&bldivec, gallivm, lp_int_type(vs_type));
1703
1704
/*
1705
* We need to invert the edgeflag bit from the clipmask here
1706
* (because the result is really if we want to run the pipeline or not
1707
* and we (may) need it if edgeflag was 0).
1708
*/
1709
if (edgeflag_in_clipmask) {
1710
LLVMValueRef edge = lp_build_const_int_vec(gallivm, bldivec.type,
1711
1LL << DRAW_TOTAL_CLIP_PLANES);
1712
clipmask_bool = LLVMBuildXor(builder, clipmask_bool, edge, "");
1713
}
1714
1715
/*
1716
* XXX: probably should mask off bits from the mask which come from
1717
* vertices which were beyond the count (i.e. indices_valid for
1718
* linear fetches, for elts ones we don't have the correct mask
1719
* right now). Otherwise might run the pipeline for nothing,
1720
* though everything should still work.
1721
*/
1722
ret = lp_build_any_true_range(&bldivec, vs_type.length, clipmask_bool);
1723
ret = LLVMBuildZExt(builder, ret, int8_type, "");
1724
return ret;
1725
}
1726
1727
static LLVMValueRef
1728
draw_gs_llvm_fetch_input(const struct lp_build_gs_iface *gs_iface,
1729
struct lp_build_context * bld,
1730
boolean is_vindex_indirect,
1731
LLVMValueRef vertex_index,
1732
boolean is_aindex_indirect,
1733
LLVMValueRef attrib_index,
1734
LLVMValueRef swizzle_index)
1735
{
1736
const struct draw_gs_llvm_iface *gs = draw_gs_llvm_iface(gs_iface);
1737
struct gallivm_state *gallivm = bld->gallivm;
1738
LLVMBuilderRef builder = gallivm->builder;
1739
LLVMValueRef indices[3];
1740
LLVMValueRef res;
1741
struct lp_type type = bld->type;
1742
1743
if (is_vindex_indirect || is_aindex_indirect) {
1744
int i;
1745
res = bld->zero;
1746
for (i = 0; i < type.length; ++i) {
1747
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
1748
LLVMValueRef vert_chan_index = vertex_index;
1749
LLVMValueRef attr_chan_index = attrib_index;
1750
LLVMValueRef channel_vec, value;
1751
1752
if (is_vindex_indirect) {
1753
vert_chan_index = LLVMBuildExtractElement(builder,
1754
vertex_index, idx, "");
1755
}
1756
if (is_aindex_indirect) {
1757
attr_chan_index = LLVMBuildExtractElement(builder,
1758
attrib_index, idx, "");
1759
}
1760
1761
indices[0] = vert_chan_index;
1762
indices[1] = attr_chan_index;
1763
indices[2] = swizzle_index;
1764
1765
channel_vec = LLVMBuildGEP(builder, gs->input, indices, 3, "");
1766
channel_vec = LLVMBuildLoad(builder, channel_vec, "");
1767
value = LLVMBuildExtractElement(builder, channel_vec, idx, "");
1768
1769
res = LLVMBuildInsertElement(builder, res, value, idx, "");
1770
}
1771
} else {
1772
indices[0] = vertex_index;
1773
indices[1] = attrib_index;
1774
indices[2] = swizzle_index;
1775
1776
res = LLVMBuildGEP(builder, gs->input, indices, 3, "");
1777
res = LLVMBuildLoad(builder, res, "");
1778
}
1779
1780
return res;
1781
}
1782
1783
static void
1784
draw_gs_llvm_emit_vertex(const struct lp_build_gs_iface *gs_base,
1785
struct lp_build_context * bld,
1786
LLVMValueRef (*outputs)[4],
1787
LLVMValueRef emitted_vertices_vec,
1788
LLVMValueRef mask_vec, LLVMValueRef stream_id)
1789
{
1790
const struct draw_gs_llvm_iface *gs_iface = draw_gs_llvm_iface(gs_base);
1791
struct draw_gs_llvm_variant *variant = gs_iface->variant;
1792
struct gallivm_state *gallivm = variant->gallivm;
1793
LLVMBuilderRef builder = gallivm->builder;
1794
struct lp_type gs_type = bld->type;
1795
LLVMValueRef clipmask = lp_build_const_int_vec(gallivm,
1796
lp_int_type(gs_type), 0);
1797
LLVMValueRef indices[LP_MAX_VECTOR_LENGTH];
1798
LLVMValueRef next_prim_offset =
1799
lp_build_const_int32(gallivm, variant->shader->base.primitive_boundary);
1800
LLVMValueRef io = variant->io_ptr;
1801
unsigned i;
1802
const struct tgsi_shader_info *gs_info = &variant->shader->base.info;
1803
1804
LLVMValueRef cond = LLVMBuildICmp(gallivm->builder, LLVMIntNE, mask_vec, lp_build_const_int_vec(gallivm, bld->type, 0), "");
1805
for (i = 0; i < gs_type.length; ++i) {
1806
LLVMValueRef ind = lp_build_const_int32(gallivm, i);
1807
LLVMValueRef currently_emitted =
1808
LLVMBuildExtractElement(builder, emitted_vertices_vec, ind, "");
1809
indices[i] = LLVMBuildMul(builder, ind, next_prim_offset, "");
1810
indices[i] = LLVMBuildAdd(builder, indices[i], currently_emitted, "");
1811
indices[i] = LLVMBuildSelect(builder, LLVMBuildExtractElement(builder, cond, ind, ""), indices[i],
1812
lp_build_const_int32(gallivm, variant->shader->base.primitive_boundary - 1), "");
1813
}
1814
1815
LLVMValueRef stream_idx = LLVMBuildExtractElement(builder, stream_id, lp_build_const_int32(gallivm, 0), "");
1816
LLVMValueRef cnd = LLVMBuildICmp(builder, LLVMIntULT, stream_idx, lp_build_const_int32(gallivm, variant->shader->base.num_vertex_streams), "");
1817
struct lp_build_if_state if_ctx;
1818
lp_build_if(&if_ctx, gallivm, cnd);
1819
io = lp_build_pointer_get(builder, io, LLVMBuildExtractElement(builder, stream_id, lp_build_const_int32(gallivm, 0), ""));
1820
1821
convert_to_aos(gallivm, io, indices,
1822
outputs, clipmask,
1823
gs_info->num_outputs, gs_type,
1824
FALSE);
1825
lp_build_endif(&if_ctx);
1826
}
1827
1828
static void
1829
draw_gs_llvm_end_primitive(const struct lp_build_gs_iface *gs_base,
1830
struct lp_build_context * bld,
1831
LLVMValueRef total_emitted_vertices_vec_ptr,
1832
LLVMValueRef verts_per_prim_vec,
1833
LLVMValueRef emitted_prims_vec,
1834
LLVMValueRef mask_vec, unsigned stream)
1835
{
1836
const struct draw_gs_llvm_iface *gs_iface = draw_gs_llvm_iface(gs_base);
1837
struct draw_gs_llvm_variant *variant = gs_iface->variant;
1838
struct gallivm_state *gallivm = variant->gallivm;
1839
LLVMBuilderRef builder = gallivm->builder;
1840
LLVMValueRef prim_lengts_ptr =
1841
draw_gs_jit_prim_lengths(variant->gallivm, variant->context_ptr);
1842
unsigned i;
1843
1844
LLVMValueRef cond = LLVMBuildICmp(gallivm->builder, LLVMIntNE, mask_vec, lp_build_const_int_vec(gallivm, bld->type, 0), "");
1845
for (i = 0; i < bld->type.length; ++i) {
1846
LLVMValueRef ind = lp_build_const_int32(gallivm, i);
1847
LLVMValueRef prims_emitted =
1848
LLVMBuildExtractElement(builder, emitted_prims_vec, ind, "");
1849
LLVMValueRef store_ptr;
1850
LLVMValueRef num_vertices =
1851
LLVMBuildExtractElement(builder, verts_per_prim_vec, ind, "");
1852
1853
LLVMValueRef this_cond = LLVMBuildExtractElement(gallivm->builder, cond, ind, "");
1854
struct lp_build_if_state ifthen;
1855
lp_build_if(&ifthen, gallivm, this_cond);
1856
prims_emitted = LLVMBuildMul(gallivm->builder, prims_emitted, lp_build_const_int32(gallivm, variant->shader->base.num_vertex_streams), "");
1857
prims_emitted = LLVMBuildAdd(gallivm->builder, prims_emitted, lp_build_const_int32(gallivm, stream), "");
1858
store_ptr = LLVMBuildGEP(builder, prim_lengts_ptr, &prims_emitted, 1, "");
1859
store_ptr = LLVMBuildLoad(builder, store_ptr, "");
1860
store_ptr = LLVMBuildGEP(builder, store_ptr, &ind, 1, "");
1861
LLVMBuildStore(builder, num_vertices, store_ptr);
1862
lp_build_endif(&ifthen);
1863
}
1864
}
1865
1866
static void
1867
draw_gs_llvm_epilogue(const struct lp_build_gs_iface *gs_base,
1868
LLVMValueRef total_emitted_vertices_vec,
1869
LLVMValueRef emitted_prims_vec, unsigned stream)
1870
{
1871
const struct draw_gs_llvm_iface *gs_iface = draw_gs_llvm_iface(gs_base);
1872
struct draw_gs_llvm_variant *variant = gs_iface->variant;
1873
struct gallivm_state *gallivm = variant->gallivm;
1874
LLVMBuilderRef builder = gallivm->builder;
1875
LLVMValueRef emitted_verts_ptr =
1876
draw_gs_jit_emitted_vertices(gallivm, variant->context_ptr);
1877
LLVMValueRef emitted_prims_ptr =
1878
draw_gs_jit_emitted_prims(gallivm, variant->context_ptr);
1879
LLVMValueRef stream_val = lp_build_const_int32(gallivm, stream);
1880
1881
emitted_verts_ptr = LLVMBuildGEP(builder, emitted_verts_ptr, &stream_val, 1, "");
1882
emitted_prims_ptr = LLVMBuildGEP(builder, emitted_prims_ptr, &stream_val, 1, "");
1883
1884
LLVMBuildStore(builder, total_emitted_vertices_vec, emitted_verts_ptr);
1885
LLVMBuildStore(builder, emitted_prims_vec, emitted_prims_ptr);
1886
}
1887
1888
static void
1889
draw_llvm_generate(struct draw_llvm *llvm, struct draw_llvm_variant *variant)
1890
{
1891
struct gallivm_state *gallivm = variant->gallivm;
1892
LLVMContextRef context = gallivm->context;
1893
LLVMTypeRef int32_type = LLVMInt32TypeInContext(context);
1894
LLVMTypeRef arg_types[13];
1895
unsigned num_arg_types = ARRAY_SIZE(arg_types);
1896
LLVMTypeRef func_type;
1897
LLVMValueRef context_ptr;
1898
LLVMBasicBlockRef block;
1899
LLVMBuilderRef builder;
1900
char func_name[64];
1901
struct lp_type vs_type;
1902
LLVMValueRef count, fetch_elts, start_or_maxelt;
1903
LLVMValueRef vertex_id_offset;
1904
LLVMValueRef stride, step, io_itr;
1905
LLVMValueRef ind_vec, start_vec, have_elts, fetch_max, tmp;
1906
LLVMValueRef io_ptr, vbuffers_ptr, vb_ptr;
1907
LLVMValueRef vb_stride[PIPE_MAX_ATTRIBS];
1908
LLVMValueRef map_ptr[PIPE_MAX_ATTRIBS];
1909
LLVMValueRef buffer_size_adj[PIPE_MAX_ATTRIBS];
1910
LLVMValueRef instance_index[PIPE_MAX_ATTRIBS];
1911
LLVMValueRef fake_buf_ptr, fake_buf;
1912
1913
struct draw_context *draw = llvm->draw;
1914
const struct tgsi_shader_info *vs_info = &draw->vs.vertex_shader->info;
1915
unsigned i, j;
1916
struct lp_build_context bld, blduivec;
1917
struct lp_build_loop_state lp_loop;
1918
struct lp_build_if_state if_ctx;
1919
const int vector_length = lp_native_vector_width / 32;
1920
LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][TGSI_NUM_CHANNELS];
1921
struct lp_build_sampler_soa *sampler = 0;
1922
struct lp_build_image_soa *image = NULL;
1923
LLVMValueRef ret, clipmask_bool_ptr;
1924
struct draw_llvm_variant_key *key = &variant->key;
1925
/* If geometry shader is present we need to skip both the viewport
1926
* transformation and clipping otherwise the inputs to the geometry
1927
* shader will be incorrect.
1928
* The code can't handle vp transform when vs writes vp index neither
1929
* (though this would be fixable here, but couldn't just broadcast
1930
* the values).
1931
*/
1932
const boolean bypass_viewport = key->has_gs_or_tes || key->bypass_viewport ||
1933
vs_info->writes_viewport_index;
1934
const boolean enable_cliptest = !key->has_gs_or_tes && (key->clip_xy ||
1935
key->clip_z ||
1936
key->clip_user ||
1937
key->need_edgeflags);
1938
LLVMValueRef variant_func;
1939
const unsigned pos = draw->vs.position_output;
1940
const unsigned cv = draw->vs.clipvertex_output;
1941
boolean have_clipdist = FALSE;
1942
struct lp_bld_tgsi_system_values system_values;
1943
1944
memset(&system_values, 0, sizeof(system_values));
1945
memset(&outputs, 0, sizeof(outputs));
1946
snprintf(func_name, sizeof(func_name), "draw_llvm_vs_variant");
1947
1948
i = 0;
1949
arg_types[i++] = get_context_ptr_type(variant); /* context */
1950
arg_types[i++] = get_vertex_header_ptr_type(variant); /* vertex_header */
1951
arg_types[i++] = get_buffer_ptr_type(variant); /* vbuffers */
1952
arg_types[i++] = int32_type; /* count */
1953
arg_types[i++] = int32_type; /* start/fetch_elt_max */
1954
arg_types[i++] = int32_type; /* stride */
1955
arg_types[i++] = get_vb_ptr_type(variant); /* pipe_vertex_buffer's */
1956
arg_types[i++] = int32_type; /* instance_id */
1957
arg_types[i++] = int32_type; /* vertex_id_offset */
1958
arg_types[i++] = int32_type; /* start_instance */
1959
arg_types[i++] = LLVMPointerType(int32_type, 0); /* fetch_elts */
1960
arg_types[i++] = int32_type; /* draw_id */
1961
arg_types[i++] = int32_type; /* view_id */
1962
1963
func_type = LLVMFunctionType(LLVMInt8TypeInContext(context),
1964
arg_types, num_arg_types, 0);
1965
1966
variant_func = LLVMAddFunction(gallivm->module, func_name, func_type);
1967
variant->function = variant_func;
1968
1969
LLVMSetFunctionCallConv(variant_func, LLVMCCallConv);
1970
for (i = 0; i < num_arg_types; ++i)
1971
if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
1972
lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS);
1973
1974
if (gallivm->cache && gallivm->cache->data_size)
1975
return;
1976
context_ptr = LLVMGetParam(variant_func, 0);
1977
io_ptr = LLVMGetParam(variant_func, 1);
1978
vbuffers_ptr = LLVMGetParam(variant_func, 2);
1979
count = LLVMGetParam(variant_func, 3);
1980
/*
1981
* XXX: the maxelt part is unused. Not really useful, since we cannot
1982
* get index buffer overflows due to vsplit (which provides its own
1983
* elts buffer, with a different size than what's passed in here).
1984
*/
1985
start_or_maxelt = LLVMGetParam(variant_func, 4);
1986
/*
1987
* XXX: stride is actually unused. The stride we use is strictly calculated
1988
* from the number of outputs (including the draw_extra outputs).
1989
* Should probably fix some day (we need a new vs just because of extra
1990
* outputs which the generated vs won't touch).
1991
*/
1992
stride = LLVMGetParam(variant_func, 5);
1993
vb_ptr = LLVMGetParam(variant_func, 6);
1994
system_values.instance_id = LLVMGetParam(variant_func, 7);
1995
vertex_id_offset = LLVMGetParam(variant_func, 8);
1996
system_values.base_instance = LLVMGetParam(variant_func, 9);
1997
fetch_elts = LLVMGetParam(variant_func, 10);
1998
system_values.draw_id = LLVMGetParam(variant_func, 11);
1999
system_values.view_index = LLVMGetParam(variant_func, 12);
2000
2001
lp_build_name(context_ptr, "context");
2002
lp_build_name(io_ptr, "io");
2003
lp_build_name(vbuffers_ptr, "vbuffers");
2004
lp_build_name(count, "count");
2005
lp_build_name(start_or_maxelt, "start_or_maxelt");
2006
lp_build_name(stride, "stride");
2007
lp_build_name(vb_ptr, "vb");
2008
lp_build_name(system_values.instance_id, "instance_id");
2009
lp_build_name(vertex_id_offset, "vertex_id_offset");
2010
lp_build_name(system_values.base_instance, "start_instance");
2011
lp_build_name(fetch_elts, "fetch_elts");
2012
lp_build_name(system_values.draw_id, "draw_id");
2013
2014
/*
2015
* Function body
2016
*/
2017
2018
block = LLVMAppendBasicBlockInContext(gallivm->context, variant_func, "entry");
2019
builder = gallivm->builder;
2020
LLVMPositionBuilderAtEnd(builder, block);
2021
2022
memset(&vs_type, 0, sizeof vs_type);
2023
vs_type.floating = TRUE; /* floating point values */
2024
vs_type.sign = TRUE; /* values are signed */
2025
vs_type.norm = FALSE; /* values are not limited to [0,1] or [-1,1] */
2026
vs_type.width = 32; /* 32-bit float */
2027
vs_type.length = vector_length;
2028
2029
lp_build_context_init(&bld, gallivm, lp_type_uint(32));
2030
lp_build_context_init(&blduivec, gallivm, lp_uint_type(vs_type));
2031
2032
/* hold temporary "bool" clipmask */
2033
clipmask_bool_ptr = lp_build_alloca(gallivm, blduivec.vec_type, "");
2034
2035
fake_buf = lp_build_alloca_undef(gallivm,
2036
LLVMVectorType(LLVMInt64TypeInContext(context), 4), "");
2037
fake_buf = LLVMBuildBitCast(builder, fake_buf,
2038
LLVMPointerType(LLVMInt8TypeInContext(context), 0), "");
2039
fake_buf_ptr = LLVMBuildGEP(builder, fake_buf, &bld.zero, 1, "");
2040
2041
/* code generated texture sampling */
2042
sampler = draw_llvm_sampler_soa_create(draw_llvm_variant_key_samplers(key), key->nr_samplers);
2043
2044
image = draw_llvm_image_soa_create(draw_llvm_variant_key_images(key),
2045
key->nr_images);
2046
2047
step = lp_build_const_int32(gallivm, vector_length);
2048
2049
ind_vec = blduivec.undef;
2050
for (i = 0; i < vs_type.length; i++) {
2051
LLVMValueRef index = lp_build_const_int32(gallivm, i);
2052
ind_vec = LLVMBuildInsertElement(builder, ind_vec, index, index, "");
2053
}
2054
2055
have_elts = LLVMBuildICmp(builder, LLVMIntNE,
2056
LLVMConstPointerNull(arg_types[10]), fetch_elts, "");
2057
2058
fetch_max = LLVMBuildSub(builder, count, bld.one, "fetch_max");
2059
fetch_max = lp_build_broadcast_scalar(&blduivec, fetch_max);
2060
/*
2061
* Only needed for non-indexed path.
2062
*/
2063
start_vec = lp_build_broadcast_scalar(&blduivec, start_or_maxelt);
2064
2065
/*
2066
* Pre-calculate everything which is constant per shader invocation.
2067
*/
2068
for (j = 0; j < key->nr_vertex_elements; ++j) {
2069
LLVMValueRef vb_buffer_offset, buffer_size, temp_ptr;
2070
LLVMValueRef vb_info, vbuffer_ptr, buf_offset, ofbit;
2071
struct pipe_vertex_element *velem = &key->vertex_element[j];
2072
LLVMValueRef vb_index =
2073
lp_build_const_int32(gallivm, velem->vertex_buffer_index);
2074
LLVMValueRef bsize = lp_build_const_int32(gallivm,
2075
util_format_get_blocksize(velem->src_format));
2076
LLVMValueRef src_offset = lp_build_const_int32(gallivm,
2077
velem->src_offset);
2078
struct lp_build_if_state if_ctx;
2079
2080
if (velem->src_format != PIPE_FORMAT_NONE) {
2081
vbuffer_ptr = LLVMBuildGEP(builder, vbuffers_ptr, &vb_index, 1, "");
2082
vb_info = LLVMBuildGEP(builder, vb_ptr, &vb_index, 1, "");
2083
vb_stride[j] = draw_jit_vbuffer_stride(gallivm, vb_info);
2084
vb_stride[j] = LLVMBuildZExt(gallivm->builder, vb_stride[j],
2085
LLVMInt32TypeInContext(context), "");
2086
vb_buffer_offset = draw_jit_vbuffer_offset(gallivm, vb_info);
2087
map_ptr[j] = draw_jit_dvbuffer_map(gallivm, vbuffer_ptr);
2088
buffer_size = draw_jit_dvbuffer_size(gallivm, vbuffer_ptr);
2089
2090
ofbit = NULL;
2091
/*
2092
* We'll set buffer_size_adj to zero if we have of, so it will
2093
* always overflow later automatically without having to keep ofbit.
2094
* Overflows (with normal wraparound) doing the actual offset
2095
* calculation should be ok, just not for the buffer size calc.
2096
* It would also be possible to detect such overflows and return
2097
* zeros if that happens, but this would be more complex.
2098
*/
2099
buf_offset = lp_build_add(&bld, vb_buffer_offset, src_offset);
2100
tmp = lp_build_sub(&bld, bsize, bld.one);
2101
buffer_size_adj[j] = lp_build_usub_overflow(gallivm, buffer_size, tmp,
2102
&ofbit);
2103
buffer_size_adj[j] = lp_build_usub_overflow(gallivm, buffer_size_adj[j],
2104
buf_offset, &ofbit);
2105
2106
/*
2107
* We can't easily set fake vertex buffers outside the generated code.
2108
* Hence, set fake vertex buffers here instead basically, so fetch
2109
* code can always fetch using offset 0, eliminating all control flow
2110
* inside the main loop.
2111
* (Alternatively, could have control flow per vector skipping fetch
2112
* if ofbit is true.)
2113
*/
2114
if (velem->instance_divisor) {
2115
/*
2116
* Index is equal to the start instance plus the number of current
2117
* instance divided by the divisor. In this case we compute it as:
2118
* index = start_instance + (instance_id / divisor).
2119
* Note we could actually do the fetch here, outside the loop -
2120
* it's all constant, hopefully llvm recognizes this.
2121
*/
2122
LLVMValueRef current_instance;
2123
current_instance = LLVMBuildUDiv(builder, system_values.instance_id,
2124
lp_build_const_int32(gallivm,
2125
velem->instance_divisor),
2126
"instance_divisor");
2127
instance_index[j] = lp_build_uadd_overflow(gallivm, system_values.base_instance,
2128
current_instance, &ofbit);
2129
}
2130
2131
buffer_size_adj[j] = LLVMBuildSelect(builder, ofbit, bld.zero,
2132
buffer_size_adj[j], "");
2133
2134
temp_ptr = lp_build_alloca_undef(gallivm,
2135
LLVMPointerType(LLVMInt8TypeInContext(context), 0), "");
2136
2137
lp_build_if(&if_ctx, gallivm, ofbit);
2138
{
2139
LLVMBuildStore(builder, fake_buf_ptr, temp_ptr);
2140
}
2141
lp_build_else(&if_ctx);
2142
{
2143
map_ptr[j] = LLVMBuildGEP(builder, map_ptr[j], &buf_offset, 1, "");
2144
LLVMBuildStore(builder, map_ptr[j], temp_ptr);
2145
}
2146
lp_build_endif(&if_ctx);
2147
map_ptr[j] = LLVMBuildLoad(builder, temp_ptr, "map_ptr");
2148
2149
if (0) {
2150
lp_build_printf(gallivm, "velem %d, vbuf index = %u, vb_stride = %u\n",
2151
lp_build_const_int32(gallivm, j),
2152
vb_index, vb_stride[j]);
2153
lp_build_printf(gallivm,
2154
" vb_buffer_offset = %u, src_offset = %u, buf_offset = %u\n",
2155
vb_buffer_offset, src_offset, buf_offset);
2156
lp_build_printf(gallivm, " buffer size = %u, blocksize = %u\n",
2157
buffer_size, bsize);
2158
lp_build_printf(gallivm, " instance_id = %u\n", system_values.instance_id);
2159
}
2160
}
2161
}
2162
2163
lp_build_loop_begin(&lp_loop, gallivm, bld.zero);
2164
{
2165
LLVMValueRef inputs[PIPE_MAX_SHADER_INPUTS][TGSI_NUM_CHANNELS];
2166
LLVMValueRef io;
2167
LLVMValueRef clipmask; /* holds the clipmask value */
2168
LLVMValueRef true_index_array, index_store;
2169
const LLVMValueRef (*ptr_aos)[TGSI_NUM_CHANNELS];
2170
2171
io_itr = lp_loop.counter;
2172
2173
io = LLVMBuildGEP(builder, io_ptr, &io_itr, 1, "");
2174
#if DEBUG_STORE
2175
lp_build_printf(gallivm, " --- io %d = %p, loop counter %d\n",
2176
io_itr, io, lp_loop.counter);
2177
#endif
2178
2179
true_index_array = lp_build_broadcast_scalar(&blduivec, lp_loop.counter);
2180
true_index_array = LLVMBuildAdd(builder, true_index_array, ind_vec, "");
2181
2182
LLVMValueRef exec_mask = lp_build_cmp(&blduivec, PIPE_FUNC_LEQUAL, true_index_array, fetch_max);
2183
/*
2184
* Limit indices to fetch_max, otherwise might try to access indices
2185
* beyond index buffer (or rather vsplit elt buffer) size.
2186
* Could probably safely (?) skip this for non-indexed draws and
2187
* simplify things minimally (by removing it could combine the ind_vec
2188
* and start_vec adds). I think the only effect for non-indexed draws will
2189
* be that for the invalid elements they will be all fetched from the
2190
* same location as the last valid one, but noone should really care.
2191
*/
2192
true_index_array = lp_build_min(&blduivec, true_index_array, fetch_max);
2193
2194
index_store = lp_build_alloca_undef(gallivm, blduivec.vec_type, "index_store");
2195
2196
lp_build_if(&if_ctx, gallivm, have_elts);
2197
{
2198
/*
2199
* Note: you'd expect some comparison/clamp against fetch_elt_max
2200
* here.
2201
* There used to be one here but it was incorrect: overflow was
2202
* detected if index > fetch_elt_max - but the correct condition
2203
* would be index >= fetch_elt_max (since this is just size of elts
2204
* buffer / element size).
2205
* Using the correct condition however will cause failures - due to
2206
* vsplit/vcache code which rebases indices. So, as an example, if
2207
* fetch_elt_max is just 1 and fetch_count 2, vsplit cache will
2208
* replace all invalid indices with 0 - which in case of elt_bias
2209
* not being zero will get a different fetch index than the valid
2210
* index 0. So, just rely on vsplit code preventing out-of-bounds
2211
* fetches. This is also why it's safe to do elts fetch even if there
2212
* was no index buffer bound - the real buffer is never seen here, at
2213
* least not if there are index buffer overflows...
2214
*/
2215
2216
/*
2217
* XXX should not have to do this, as scale can be handled
2218
* natively by loads (hits asserts though).
2219
*/
2220
tmp = lp_build_shl_imm(&blduivec, true_index_array, 2);
2221
fetch_elts = LLVMBuildBitCast(builder, fetch_elts,
2222
LLVMPointerType(LLVMInt8TypeInContext(context),
2223
0), "");
2224
tmp = lp_build_gather(gallivm, vs_type.length,
2225
32, bld.type, TRUE,
2226
fetch_elts, tmp, FALSE);
2227
LLVMBuildStore(builder, tmp, index_store);
2228
}
2229
lp_build_else(&if_ctx);
2230
{
2231
tmp = LLVMBuildAdd(builder, true_index_array, start_vec, "");
2232
LLVMBuildStore(builder, tmp, index_store);
2233
}
2234
lp_build_endif(&if_ctx);
2235
2236
true_index_array = LLVMBuildLoad(builder, index_store, "");
2237
2238
for (j = 0; j < key->nr_vertex_elements; ++j) {
2239
struct pipe_vertex_element *velem = &key->vertex_element[j];
2240
const struct util_format_description *format_desc =
2241
util_format_description(velem->src_format);
2242
2243
if (format_desc->format == PIPE_FORMAT_NONE) {
2244
for (i = 0; i < TGSI_NUM_CHANNELS; i++) {
2245
inputs[j][i] = lp_build_zero(gallivm, vs_type);
2246
}
2247
}
2248
else if (velem->instance_divisor) {
2249
fetch_instanced(gallivm, format_desc, vs_type,
2250
vb_stride[j], map_ptr[j],
2251
buffer_size_adj[j],
2252
inputs[j], instance_index[j]);
2253
}
2254
else {
2255
fetch_vector(gallivm, format_desc, vs_type,
2256
vb_stride[j], map_ptr[j],
2257
buffer_size_adj[j],
2258
inputs[j], true_index_array);
2259
}
2260
}
2261
2262
struct lp_build_mask_context mask;
2263
2264
lp_build_mask_begin(&mask, gallivm, vs_type, exec_mask);
2265
/* In the paths with elts vertex id has to be unaffected by the
2266
* index bias and because indices inside our elements array have
2267
* already had index bias applied we need to subtract it here to
2268
* get back to the original index.
2269
* in the linear paths vertex id has to be unaffected by the
2270
* original start index and because we abuse the 'start' variable
2271
* to either represent the actual start index or the index at which
2272
* the primitive was split (we split rendering into chunks of at
2273
* most 4095-vertices) we need to back out the original start
2274
* index out of our vertex id here.
2275
* for ARB_shader_draw_parameters, base_vertex should be 0 for non-indexed draws.
2276
*/
2277
LLVMValueRef base_vertex = lp_build_select(&bld, have_elts, vertex_id_offset, lp_build_const_int32(gallivm, 0));
2278
system_values.basevertex = lp_build_broadcast_scalar(&blduivec, base_vertex);
2279
/* first vertex is for Vulkan base vertex support */
2280
LLVMValueRef first_vertex = lp_build_select(&bld, have_elts, vertex_id_offset, start_or_maxelt);
2281
system_values.firstvertex = lp_build_broadcast_scalar(&blduivec, first_vertex);
2282
system_values.vertex_id = true_index_array;
2283
system_values.vertex_id_nobase = LLVMBuildSub(builder, true_index_array,
2284
lp_build_broadcast_scalar(&blduivec, vertex_id_offset), "");
2285
2286
ptr_aos = (const LLVMValueRef (*)[TGSI_NUM_CHANNELS]) inputs;
2287
generate_vs(variant,
2288
builder,
2289
vs_type,
2290
outputs,
2291
ptr_aos,
2292
&system_values,
2293
context_ptr,
2294
sampler,
2295
image,
2296
key->clamp_vertex_color,
2297
&mask);
2298
2299
lp_build_mask_end(&mask);
2300
if (pos != -1 && cv != -1) {
2301
/* store original positions in clip before further manipulation */
2302
store_clip(gallivm, vs_type, io, outputs, pos);
2303
2304
/* do cliptest */
2305
if (enable_cliptest) {
2306
LLVMValueRef temp = LLVMBuildLoad(builder, clipmask_bool_ptr, "");
2307
/* allocate clipmask, assign it integer type */
2308
clipmask = generate_clipmask(llvm,
2309
gallivm,
2310
vs_type,
2311
outputs,
2312
key,
2313
context_ptr, &have_clipdist);
2314
temp = LLVMBuildOr(builder, clipmask, temp, "");
2315
/* store temporary clipping boolean value */
2316
LLVMBuildStore(builder, temp, clipmask_bool_ptr);
2317
}
2318
else {
2319
clipmask = blduivec.zero;
2320
}
2321
2322
/* do viewport mapping */
2323
if (!bypass_viewport) {
2324
generate_viewport(variant, builder, vs_type, outputs, context_ptr);
2325
}
2326
}
2327
else {
2328
clipmask = blduivec.zero;
2329
}
2330
2331
/* store clipmask in vertex header,
2332
* original positions in clip
2333
* and transformed positions in data
2334
*/
2335
convert_to_aos(gallivm, io, NULL, outputs, clipmask,
2336
vs_info->num_outputs, vs_type,
2337
enable_cliptest && key->need_edgeflags);
2338
}
2339
lp_build_loop_end_cond(&lp_loop, count, step, LLVMIntUGE);
2340
2341
sampler->destroy(sampler);
2342
image->destroy(image);
2343
2344
/* return clipping boolean value for function */
2345
ret = clipmask_booli8(gallivm, vs_type, clipmask_bool_ptr,
2346
enable_cliptest && key->need_edgeflags);
2347
2348
LLVMBuildRet(builder, ret);
2349
2350
gallivm_verify_function(gallivm, variant_func);
2351
}
2352
2353
2354
struct draw_llvm_variant_key *
2355
draw_llvm_make_variant_key(struct draw_llvm *llvm, char *store)
2356
{
2357
unsigned i;
2358
struct draw_llvm_variant_key *key;
2359
struct draw_sampler_static_state *draw_sampler;
2360
struct draw_image_static_state *draw_image;
2361
2362
key = (struct draw_llvm_variant_key *)store;
2363
2364
memset(key, 0, offsetof(struct draw_llvm_variant_key, vertex_element[0]));
2365
2366
key->clamp_vertex_color = llvm->draw->rasterizer->clamp_vertex_color; /**/
2367
2368
/* will have to rig this up properly later */
2369
key->clip_xy = llvm->draw->clip_xy;
2370
key->clip_z = llvm->draw->clip_z;
2371
key->clip_user = llvm->draw->clip_user;
2372
key->bypass_viewport = llvm->draw->bypass_viewport;
2373
key->clip_halfz = llvm->draw->rasterizer->clip_halfz;
2374
/* XXX assumes edgeflag output not at 0 */
2375
key->need_edgeflags = (llvm->draw->vs.edgeflag_output ? TRUE : FALSE);
2376
key->ucp_enable = llvm->draw->rasterizer->clip_plane_enable;
2377
key->has_gs_or_tes = llvm->draw->gs.geometry_shader != NULL || llvm->draw->tes.tess_eval_shader != NULL;
2378
key->num_outputs = draw_total_vs_outputs(llvm->draw);
2379
2380
/* All variants of this shader will have the same value for
2381
* nr_samplers. Not yet trying to compact away holes in the
2382
* sampler array.
2383
*/
2384
key->nr_samplers = llvm->draw->vs.vertex_shader->info.file_max[TGSI_FILE_SAMPLER] + 1;
2385
if (llvm->draw->vs.vertex_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] != -1) {
2386
key->nr_sampler_views =
2387
llvm->draw->vs.vertex_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] + 1;
2388
}
2389
else {
2390
key->nr_sampler_views = key->nr_samplers;
2391
}
2392
2393
key->nr_images = llvm->draw->vs.vertex_shader->info.file_max[TGSI_FILE_IMAGE] + 1;
2394
2395
/* Presumably all variants of the shader should have the same
2396
* number of vertex elements - ie the number of shader inputs.
2397
* NOTE: we NEED to store the needed number of needed inputs
2398
* here, not the number of provided elements to match keysize
2399
* (and the offset of sampler state in the key).
2400
* If we have excess number of vertex elements, this is valid,
2401
* but the excess ones don't matter.
2402
* If we don't have enough vertex elements (which looks not really
2403
* valid but we'll handle it gracefully) fill out missing ones with
2404
* zero (we'll recognize these later by PIPE_FORMAT_NONE).
2405
*/
2406
key->nr_vertex_elements =
2407
llvm->draw->vs.vertex_shader->info.file_max[TGSI_FILE_INPUT] + 1;
2408
2409
if (llvm->draw->pt.nr_vertex_elements < key->nr_vertex_elements) {
2410
debug_printf("draw: vs with %d inputs but only have %d vertex elements\n",
2411
key->nr_vertex_elements, llvm->draw->pt.nr_vertex_elements);
2412
memset(key->vertex_element, 0,
2413
sizeof(struct pipe_vertex_element) * key->nr_vertex_elements);
2414
}
2415
memcpy(key->vertex_element,
2416
llvm->draw->pt.vertex_element,
2417
sizeof(struct pipe_vertex_element) *
2418
MIN2(key->nr_vertex_elements, llvm->draw->pt.nr_vertex_elements));
2419
2420
draw_sampler = draw_llvm_variant_key_samplers(key);
2421
memset(draw_sampler, 0,
2422
MAX2(key->nr_samplers, key->nr_sampler_views) * sizeof *draw_sampler);
2423
2424
for (i = 0 ; i < key->nr_samplers; i++) {
2425
lp_sampler_static_sampler_state(&draw_sampler[i].sampler_state,
2426
llvm->draw->samplers[PIPE_SHADER_VERTEX][i]);
2427
}
2428
for (i = 0 ; i < key->nr_sampler_views; i++) {
2429
lp_sampler_static_texture_state(&draw_sampler[i].texture_state,
2430
llvm->draw->sampler_views[PIPE_SHADER_VERTEX][i]);
2431
}
2432
2433
draw_image = draw_llvm_variant_key_images(key);
2434
memset(draw_image, 0,
2435
key->nr_images * sizeof *draw_image);
2436
for (i = 0; i < key->nr_images; i++) {
2437
lp_sampler_static_texture_state_image(&draw_image[i].image_state,
2438
llvm->draw->images[PIPE_SHADER_VERTEX][i]);
2439
}
2440
return key;
2441
}
2442
2443
2444
void
2445
draw_llvm_dump_variant_key(struct draw_llvm_variant_key *key)
2446
{
2447
unsigned i;
2448
struct draw_sampler_static_state *sampler = draw_llvm_variant_key_samplers(key);
2449
struct draw_image_static_state *image = draw_llvm_variant_key_images(key);
2450
debug_printf("clamp_vertex_color = %u\n", key->clamp_vertex_color);
2451
debug_printf("clip_xy = %u\n", key->clip_xy);
2452
debug_printf("clip_z = %u\n", key->clip_z);
2453
debug_printf("clip_user = %u\n", key->clip_user);
2454
debug_printf("bypass_viewport = %u\n", key->bypass_viewport);
2455
debug_printf("clip_halfz = %u\n", key->clip_halfz);
2456
debug_printf("need_edgeflags = %u\n", key->need_edgeflags);
2457
debug_printf("has_gs_or_tes = %u\n", key->has_gs_or_tes);
2458
debug_printf("ucp_enable = %u\n", key->ucp_enable);
2459
2460
for (i = 0 ; i < key->nr_vertex_elements; i++) {
2461
debug_printf("vertex_element[%i].src_offset = %u\n", i, key->vertex_element[i].src_offset);
2462
debug_printf("vertex_element[%i].instance_divisor = %u\n", i, key->vertex_element[i].instance_divisor);
2463
debug_printf("vertex_element[%i].vertex_buffer_index = %u\n", i, key->vertex_element[i].vertex_buffer_index);
2464
debug_printf("vertex_element[%i].src_format = %s\n", i, util_format_name(key->vertex_element[i].src_format));
2465
}
2466
2467
for (i = 0 ; i < key->nr_sampler_views; i++) {
2468
debug_printf("sampler[%i].src_format = %s\n", i, util_format_name(sampler[i].texture_state.format));
2469
}
2470
2471
for (i = 0 ; i < key->nr_images; i++)
2472
debug_printf("images[%i].format = %s\n", i, util_format_name(image[i].image_state.format));
2473
}
2474
2475
2476
void
2477
draw_llvm_set_mapped_texture(struct draw_context *draw,
2478
enum pipe_shader_type shader_stage,
2479
unsigned sview_idx,
2480
uint32_t width, uint32_t height, uint32_t depth,
2481
uint32_t first_level, uint32_t last_level,
2482
uint32_t num_samples,
2483
uint32_t sample_stride,
2484
const void *base_ptr,
2485
uint32_t row_stride[PIPE_MAX_TEXTURE_LEVELS],
2486
uint32_t img_stride[PIPE_MAX_TEXTURE_LEVELS],
2487
uint32_t mip_offsets[PIPE_MAX_TEXTURE_LEVELS])
2488
{
2489
unsigned j;
2490
struct draw_jit_texture *jit_tex;
2491
2492
switch (shader_stage) {
2493
case PIPE_SHADER_VERTEX:
2494
assert(sview_idx < ARRAY_SIZE(draw->llvm->jit_context.textures));
2495
jit_tex = &draw->llvm->jit_context.textures[sview_idx];
2496
break;
2497
case PIPE_SHADER_GEOMETRY:
2498
assert(sview_idx < ARRAY_SIZE(draw->llvm->gs_jit_context.textures));
2499
jit_tex = &draw->llvm->gs_jit_context.textures[sview_idx];
2500
break;
2501
case PIPE_SHADER_TESS_CTRL:
2502
assert(sview_idx < ARRAY_SIZE(draw->llvm->tcs_jit_context.textures));
2503
jit_tex = &draw->llvm->tcs_jit_context.textures[sview_idx];
2504
break;
2505
case PIPE_SHADER_TESS_EVAL:
2506
assert(sview_idx < ARRAY_SIZE(draw->llvm->tes_jit_context.textures));
2507
jit_tex = &draw->llvm->tes_jit_context.textures[sview_idx];
2508
break;
2509
default:
2510
assert(0);
2511
return;
2512
}
2513
2514
jit_tex->width = width;
2515
jit_tex->height = height;
2516
jit_tex->depth = depth;
2517
jit_tex->first_level = first_level;
2518
jit_tex->last_level = last_level;
2519
jit_tex->base = base_ptr;
2520
jit_tex->num_samples = num_samples;
2521
jit_tex->sample_stride = sample_stride;
2522
2523
for (j = first_level; j <= last_level; j++) {
2524
jit_tex->mip_offsets[j] = mip_offsets[j];
2525
jit_tex->row_stride[j] = row_stride[j];
2526
jit_tex->img_stride[j] = img_stride[j];
2527
}
2528
}
2529
2530
void
2531
draw_llvm_set_mapped_image(struct draw_context *draw,
2532
enum pipe_shader_type shader_stage,
2533
unsigned idx,
2534
uint32_t width, uint32_t height, uint32_t depth,
2535
const void *base_ptr,
2536
uint32_t row_stride,
2537
uint32_t img_stride,
2538
uint32_t num_samples,
2539
uint32_t sample_stride)
2540
{
2541
struct draw_jit_image *jit_image;
2542
2543
switch (shader_stage) {
2544
case PIPE_SHADER_VERTEX:
2545
assert(idx < ARRAY_SIZE(draw->llvm->jit_context.images));
2546
jit_image = &draw->llvm->jit_context.images[idx];
2547
break;
2548
case PIPE_SHADER_GEOMETRY:
2549
assert(idx < ARRAY_SIZE(draw->llvm->gs_jit_context.images));
2550
jit_image = &draw->llvm->gs_jit_context.images[idx];
2551
break;
2552
case PIPE_SHADER_TESS_CTRL:
2553
assert(idx < ARRAY_SIZE(draw->llvm->tcs_jit_context.images));
2554
jit_image = &draw->llvm->tcs_jit_context.images[idx];
2555
break;
2556
case PIPE_SHADER_TESS_EVAL:
2557
assert(idx < ARRAY_SIZE(draw->llvm->tes_jit_context.images));
2558
jit_image = &draw->llvm->tes_jit_context.images[idx];
2559
break;
2560
default:
2561
assert(0);
2562
return;
2563
}
2564
2565
jit_image->width = width;
2566
jit_image->height = height;
2567
jit_image->depth = depth;
2568
jit_image->base = base_ptr;
2569
2570
jit_image->row_stride = row_stride;
2571
jit_image->img_stride = img_stride;
2572
jit_image->num_samples = num_samples;
2573
jit_image->sample_stride = sample_stride;
2574
}
2575
2576
2577
void
2578
draw_llvm_set_sampler_state(struct draw_context *draw,
2579
enum pipe_shader_type shader_type)
2580
{
2581
unsigned i;
2582
2583
switch (shader_type) {
2584
case PIPE_SHADER_VERTEX:
2585
for (i = 0; i < draw->num_samplers[PIPE_SHADER_VERTEX]; i++) {
2586
struct draw_jit_sampler *jit_sam = &draw->llvm->jit_context.samplers[i];
2587
2588
if (draw->samplers[PIPE_SHADER_VERTEX][i]) {
2589
const struct pipe_sampler_state *s
2590
= draw->samplers[PIPE_SHADER_VERTEX][i];
2591
jit_sam->min_lod = s->min_lod;
2592
jit_sam->max_lod = s->max_lod;
2593
jit_sam->lod_bias = s->lod_bias;
2594
COPY_4V(jit_sam->border_color, s->border_color.f);
2595
}
2596
}
2597
break;
2598
case PIPE_SHADER_GEOMETRY:
2599
for (i = 0; i < draw->num_samplers[PIPE_SHADER_GEOMETRY]; i++) {
2600
struct draw_jit_sampler *jit_sam = &draw->llvm->gs_jit_context.samplers[i];
2601
2602
if (draw->samplers[PIPE_SHADER_GEOMETRY][i]) {
2603
const struct pipe_sampler_state *s
2604
= draw->samplers[PIPE_SHADER_GEOMETRY][i];
2605
jit_sam->min_lod = s->min_lod;
2606
jit_sam->max_lod = s->max_lod;
2607
jit_sam->lod_bias = s->lod_bias;
2608
COPY_4V(jit_sam->border_color, s->border_color.f);
2609
}
2610
}
2611
break;
2612
case PIPE_SHADER_TESS_CTRL:
2613
for (i = 0; i < draw->num_samplers[PIPE_SHADER_TESS_CTRL]; i++) {
2614
struct draw_jit_sampler *jit_sam = &draw->llvm->tcs_jit_context.samplers[i];
2615
2616
if (draw->samplers[PIPE_SHADER_TESS_CTRL][i]) {
2617
const struct pipe_sampler_state *s
2618
= draw->samplers[PIPE_SHADER_TESS_CTRL][i];
2619
jit_sam->min_lod = s->min_lod;
2620
jit_sam->max_lod = s->max_lod;
2621
jit_sam->lod_bias = s->lod_bias;
2622
COPY_4V(jit_sam->border_color, s->border_color.f);
2623
}
2624
}
2625
break;
2626
case PIPE_SHADER_TESS_EVAL:
2627
for (i = 0; i < draw->num_samplers[PIPE_SHADER_TESS_EVAL]; i++) {
2628
struct draw_jit_sampler *jit_sam = &draw->llvm->tes_jit_context.samplers[i];
2629
2630
if (draw->samplers[PIPE_SHADER_TESS_EVAL][i]) {
2631
const struct pipe_sampler_state *s
2632
= draw->samplers[PIPE_SHADER_TESS_EVAL][i];
2633
jit_sam->min_lod = s->min_lod;
2634
jit_sam->max_lod = s->max_lod;
2635
jit_sam->lod_bias = s->lod_bias;
2636
COPY_4V(jit_sam->border_color, s->border_color.f);
2637
}
2638
}
2639
break;
2640
default:
2641
assert(0);
2642
break;
2643
}
2644
}
2645
2646
2647
void
2648
draw_llvm_destroy_variant(struct draw_llvm_variant *variant)
2649
{
2650
struct draw_llvm *llvm = variant->llvm;
2651
2652
if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
2653
debug_printf("Deleting VS variant: %u vs variants,\t%u total variants\n",
2654
variant->shader->variants_cached, llvm->nr_variants);
2655
}
2656
2657
gallivm_destroy(variant->gallivm);
2658
2659
remove_from_list(&variant->list_item_local);
2660
variant->shader->variants_cached--;
2661
remove_from_list(&variant->list_item_global);
2662
llvm->nr_variants--;
2663
FREE(variant);
2664
}
2665
2666
2667
/**
2668
* Create LLVM types for various structures.
2669
*/
2670
static void
2671
create_gs_jit_types(struct draw_gs_llvm_variant *var)
2672
{
2673
struct gallivm_state *gallivm = var->gallivm;
2674
LLVMTypeRef texture_type, sampler_type, image_type, context_type;
2675
2676
texture_type = create_jit_texture_type(gallivm, "texture");
2677
sampler_type = create_jit_sampler_type(gallivm, "sampler");
2678
image_type = create_jit_image_type(gallivm, "image");
2679
2680
context_type = create_gs_jit_context_type(gallivm,
2681
var->shader->base.vector_length,
2682
texture_type, sampler_type,
2683
image_type,
2684
"draw_gs_jit_context");
2685
var->context_ptr_type = LLVMPointerType(context_type, 0);
2686
2687
var->input_array_type = create_gs_jit_input_type(gallivm);
2688
}
2689
2690
static LLVMTypeRef
2691
get_gs_context_ptr_type(struct draw_gs_llvm_variant *variant)
2692
{
2693
if (!variant->context_ptr_type)
2694
create_gs_jit_types(variant);
2695
return variant->context_ptr_type;
2696
}
2697
2698
static LLVMValueRef
2699
generate_mask_value(struct draw_gs_llvm_variant *variant,
2700
struct lp_type gs_type)
2701
{
2702
struct gallivm_state *gallivm = variant->gallivm;
2703
LLVMBuilderRef builder = gallivm->builder;
2704
struct lp_type mask_type = lp_int_type(gs_type);
2705
LLVMValueRef num_prims;
2706
LLVMValueRef mask_val = lp_build_const_vec(gallivm, mask_type, 0);
2707
unsigned i;
2708
2709
num_prims = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, mask_type),
2710
variant->num_prims);
2711
for (i = 0; i < gs_type.length; i++) {
2712
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
2713
mask_val = LLVMBuildInsertElement(builder, mask_val, idx, idx, "");
2714
}
2715
mask_val = lp_build_compare(gallivm, mask_type,
2716
PIPE_FUNC_GREATER, num_prims, mask_val);
2717
2718
return mask_val;
2719
}
2720
2721
static void
2722
draw_gs_llvm_generate(struct draw_llvm *llvm,
2723
struct draw_gs_llvm_variant *variant)
2724
{
2725
struct gallivm_state *gallivm = variant->gallivm;
2726
LLVMContextRef context = gallivm->context;
2727
LLVMTypeRef int32_type = LLVMInt32TypeInContext(context);
2728
LLVMTypeRef arg_types[8];
2729
LLVMTypeRef func_type;
2730
LLVMValueRef variant_func;
2731
LLVMValueRef context_ptr;
2732
LLVMValueRef prim_id_ptr;
2733
LLVMBasicBlockRef block;
2734
LLVMBuilderRef builder;
2735
LLVMValueRef io_ptr, input_array, num_prims, mask_val;
2736
struct lp_build_sampler_soa *sampler = 0;
2737
struct lp_build_image_soa *image = NULL;
2738
struct lp_build_context bld;
2739
struct lp_bld_tgsi_system_values system_values;
2740
char func_name[64];
2741
struct lp_type gs_type;
2742
unsigned i;
2743
struct draw_gs_llvm_iface gs_iface;
2744
const struct tgsi_token *tokens = variant->shader->base.state.tokens;
2745
LLVMValueRef consts_ptr, num_consts_ptr;
2746
LLVMValueRef ssbos_ptr, num_ssbos_ptr;
2747
LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][TGSI_NUM_CHANNELS];
2748
struct lp_build_mask_context mask;
2749
const struct tgsi_shader_info *gs_info = &variant->shader->base.info;
2750
unsigned vector_length = variant->shader->base.vector_length;
2751
2752
memset(&system_values, 0, sizeof(system_values));
2753
memset(&outputs, 0, sizeof(outputs));
2754
2755
snprintf(func_name, sizeof(func_name), "draw_llvm_gs_variant");
2756
2757
assert(variant->vertex_header_ptr_type);
2758
2759
arg_types[0] = get_gs_context_ptr_type(variant); /* context */
2760
arg_types[1] = variant->input_array_type; /* input */
2761
arg_types[2] = LLVMPointerType(variant->vertex_header_ptr_type, 0); /* vertex_header */
2762
arg_types[3] = int32_type; /* num_prims */
2763
arg_types[4] = int32_type; /* instance_id */
2764
arg_types[5] = LLVMPointerType(
2765
LLVMVectorType(int32_type, vector_length), 0); /* prim_id_ptr */
2766
arg_types[6] = int32_type;
2767
arg_types[7] = int32_type;
2768
2769
func_type = LLVMFunctionType(int32_type, arg_types, ARRAY_SIZE(arg_types), 0);
2770
2771
variant_func = LLVMAddFunction(gallivm->module, func_name, func_type);
2772
2773
variant->function = variant_func;
2774
2775
LLVMSetFunctionCallConv(variant_func, LLVMCCallConv);
2776
2777
for (i = 0; i < ARRAY_SIZE(arg_types); ++i)
2778
if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
2779
lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS);
2780
2781
if (gallivm->cache && gallivm->cache->data_size)
2782
return;
2783
context_ptr = LLVMGetParam(variant_func, 0);
2784
input_array = LLVMGetParam(variant_func, 1);
2785
io_ptr = LLVMGetParam(variant_func, 2);
2786
num_prims = LLVMGetParam(variant_func, 3);
2787
system_values.instance_id = LLVMGetParam(variant_func, 4);
2788
prim_id_ptr = LLVMGetParam(variant_func, 5);
2789
system_values.invocation_id = LLVMGetParam(variant_func, 6);
2790
system_values.view_index = LLVMGetParam(variant_func, 7);
2791
2792
lp_build_name(context_ptr, "context");
2793
lp_build_name(input_array, "input");
2794
lp_build_name(io_ptr, "io");
2795
lp_build_name(num_prims, "num_prims");
2796
lp_build_name(system_values.instance_id, "instance_id");
2797
lp_build_name(prim_id_ptr, "prim_id_ptr");
2798
lp_build_name(system_values.invocation_id, "invocation_id");
2799
lp_build_name(system_values.view_index, "view_index");
2800
2801
variant->context_ptr = context_ptr;
2802
variant->io_ptr = io_ptr;
2803
variant->num_prims = num_prims;
2804
2805
gs_iface.base.fetch_input = draw_gs_llvm_fetch_input;
2806
gs_iface.base.emit_vertex = draw_gs_llvm_emit_vertex;
2807
gs_iface.base.end_primitive = draw_gs_llvm_end_primitive;
2808
gs_iface.base.gs_epilogue = draw_gs_llvm_epilogue;
2809
gs_iface.input = input_array;
2810
gs_iface.variant = variant;
2811
2812
/*
2813
* Function body
2814
*/
2815
2816
block = LLVMAppendBasicBlockInContext(gallivm->context, variant_func, "entry");
2817
builder = gallivm->builder;
2818
LLVMPositionBuilderAtEnd(builder, block);
2819
2820
lp_build_context_init(&bld, gallivm, lp_type_int(32));
2821
2822
memset(&gs_type, 0, sizeof gs_type);
2823
gs_type.floating = TRUE; /* floating point values */
2824
gs_type.sign = TRUE; /* values are signed */
2825
gs_type.norm = FALSE; /* values are not limited to [0,1] or [-1,1] */
2826
gs_type.width = 32; /* 32-bit float */
2827
gs_type.length = vector_length;
2828
2829
consts_ptr = draw_gs_jit_context_constants(variant->gallivm, context_ptr);
2830
num_consts_ptr =
2831
draw_gs_jit_context_num_constants(variant->gallivm, context_ptr);
2832
2833
ssbos_ptr = draw_gs_jit_context_ssbos(variant->gallivm, context_ptr);
2834
num_ssbos_ptr =
2835
draw_gs_jit_context_num_ssbos(variant->gallivm, context_ptr);
2836
2837
/* code generated texture sampling */
2838
sampler = draw_llvm_sampler_soa_create(variant->key.samplers, variant->key.nr_samplers);
2839
image = draw_llvm_image_soa_create(draw_gs_llvm_variant_key_images(&variant->key),
2840
variant->key.nr_images);
2841
mask_val = generate_mask_value(variant, gs_type);
2842
lp_build_mask_begin(&mask, gallivm, gs_type, mask_val);
2843
2844
if (gs_info->uses_primid) {
2845
system_values.prim_id = LLVMBuildLoad(builder, prim_id_ptr, "prim_id");
2846
}
2847
2848
if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
2849
if (llvm->draw->gs.geometry_shader->state.type == PIPE_SHADER_IR_TGSI)
2850
tgsi_dump(tokens, 0);
2851
else
2852
nir_print_shader(llvm->draw->gs.geometry_shader->state.ir.nir, stderr);
2853
draw_gs_llvm_dump_variant_key(&variant->key);
2854
}
2855
2856
struct lp_build_tgsi_params params;
2857
memset(&params, 0, sizeof(params));
2858
2859
params.type = gs_type;
2860
params.mask = &mask;
2861
params.consts_ptr = consts_ptr;
2862
params.const_sizes_ptr = num_consts_ptr;
2863
params.system_values = &system_values;
2864
params.context_ptr = context_ptr;
2865
params.sampler = sampler;
2866
params.info = &llvm->draw->gs.geometry_shader->info;
2867
params.gs_iface = (const struct lp_build_gs_iface *)&gs_iface;
2868
params.ssbo_ptr = ssbos_ptr;
2869
params.ssbo_sizes_ptr = num_ssbos_ptr;
2870
params.image = image;
2871
params.gs_vertex_streams = variant->shader->base.num_vertex_streams;
2872
2873
if (llvm->draw->gs.geometry_shader->state.type == PIPE_SHADER_IR_TGSI)
2874
lp_build_tgsi_soa(variant->gallivm,
2875
tokens,
2876
&params,
2877
outputs);
2878
else
2879
lp_build_nir_soa(variant->gallivm,
2880
llvm->draw->gs.geometry_shader->state.ir.nir,
2881
&params,
2882
outputs);
2883
2884
sampler->destroy(sampler);
2885
image->destroy(image);
2886
2887
lp_build_mask_end(&mask);
2888
2889
LLVMBuildRet(builder, lp_build_zero(gallivm, lp_type_uint(32)));
2890
2891
gallivm_verify_function(gallivm, variant_func);
2892
}
2893
2894
struct draw_gs_llvm_variant *
2895
draw_gs_llvm_create_variant(struct draw_llvm *llvm,
2896
unsigned num_outputs,
2897
const struct draw_gs_llvm_variant_key *key)
2898
{
2899
struct draw_gs_llvm_variant *variant;
2900
struct llvm_geometry_shader *shader =
2901
llvm_geometry_shader(llvm->draw->gs.geometry_shader);
2902
LLVMTypeRef vertex_header;
2903
char module_name[64];
2904
unsigned char ir_sha1_cache_key[20];
2905
struct lp_cached_code cached = { 0 };
2906
bool needs_caching = false;
2907
2908
variant = MALLOC(sizeof *variant +
2909
shader->variant_key_size -
2910
sizeof variant->key);
2911
if (!variant)
2912
return NULL;
2913
2914
variant->llvm = llvm;
2915
variant->shader = shader;
2916
2917
snprintf(module_name, sizeof(module_name), "draw_llvm_gs_variant%u",
2918
variant->shader->variants_cached);
2919
2920
memcpy(&variant->key, key, shader->variant_key_size);
2921
2922
if (shader->base.state.ir.nir && llvm->draw->disk_cache_cookie) {
2923
draw_get_ir_cache_key(shader->base.state.ir.nir,
2924
key,
2925
shader->variant_key_size,
2926
num_outputs,
2927
ir_sha1_cache_key);
2928
2929
llvm->draw->disk_cache_find_shader(llvm->draw->disk_cache_cookie,
2930
&cached,
2931
ir_sha1_cache_key);
2932
if (!cached.data_size)
2933
needs_caching = true;
2934
}
2935
variant->gallivm = gallivm_create(module_name, llvm->context, &cached);
2936
2937
create_gs_jit_types(variant);
2938
2939
vertex_header = create_jit_vertex_header(variant->gallivm, num_outputs);
2940
2941
variant->vertex_header_ptr_type = LLVMPointerType(vertex_header, 0);
2942
2943
draw_gs_llvm_generate(llvm, variant);
2944
2945
gallivm_compile_module(variant->gallivm);
2946
2947
variant->jit_func = (draw_gs_jit_func)
2948
gallivm_jit_function(variant->gallivm, variant->function);
2949
2950
if (needs_caching)
2951
llvm->draw->disk_cache_insert_shader(llvm->draw->disk_cache_cookie,
2952
&cached,
2953
ir_sha1_cache_key);
2954
gallivm_free_ir(variant->gallivm);
2955
2956
variant->list_item_global.base = variant;
2957
variant->list_item_local.base = variant;
2958
/*variant->no = */shader->variants_created++;
2959
variant->list_item_global.base = variant;
2960
2961
return variant;
2962
}
2963
2964
void
2965
draw_gs_llvm_destroy_variant(struct draw_gs_llvm_variant *variant)
2966
{
2967
struct draw_llvm *llvm = variant->llvm;
2968
2969
if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
2970
debug_printf("Deleting GS variant: %u gs variants,\t%u total variants\n",
2971
variant->shader->variants_cached, llvm->nr_gs_variants);
2972
}
2973
2974
gallivm_destroy(variant->gallivm);
2975
2976
remove_from_list(&variant->list_item_local);
2977
variant->shader->variants_cached--;
2978
remove_from_list(&variant->list_item_global);
2979
llvm->nr_gs_variants--;
2980
FREE(variant);
2981
}
2982
2983
struct draw_gs_llvm_variant_key *
2984
draw_gs_llvm_make_variant_key(struct draw_llvm *llvm, char *store)
2985
{
2986
unsigned i;
2987
struct draw_gs_llvm_variant_key *key;
2988
struct draw_sampler_static_state *draw_sampler;
2989
struct draw_image_static_state *draw_image;
2990
2991
key = (struct draw_gs_llvm_variant_key *)store;
2992
2993
memset(key, 0, offsetof(struct draw_gs_llvm_variant_key, samplers[0]));
2994
2995
key->num_outputs = draw_total_gs_outputs(llvm->draw);
2996
2997
/* All variants of this shader will have the same value for
2998
* nr_samplers. Not yet trying to compact away holes in the
2999
* sampler array.
3000
*/
3001
key->nr_samplers = llvm->draw->gs.geometry_shader->info.file_max[TGSI_FILE_SAMPLER] + 1;
3002
if (llvm->draw->gs.geometry_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] != -1) {
3003
key->nr_sampler_views =
3004
llvm->draw->gs.geometry_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] + 1;
3005
}
3006
else {
3007
key->nr_sampler_views = key->nr_samplers;
3008
}
3009
3010
key->nr_images = llvm->draw->gs.geometry_shader->info.file_max[TGSI_FILE_IMAGE] + 1;
3011
3012
draw_sampler = key->samplers;
3013
3014
memset(draw_sampler, 0, MAX2(key->nr_samplers, key->nr_sampler_views) * sizeof *draw_sampler);
3015
3016
for (i = 0 ; i < key->nr_samplers; i++) {
3017
lp_sampler_static_sampler_state(&draw_sampler[i].sampler_state,
3018
llvm->draw->samplers[PIPE_SHADER_GEOMETRY][i]);
3019
}
3020
for (i = 0 ; i < key->nr_sampler_views; i++) {
3021
lp_sampler_static_texture_state(&draw_sampler[i].texture_state,
3022
llvm->draw->sampler_views[PIPE_SHADER_GEOMETRY][i]);
3023
}
3024
3025
draw_image = draw_gs_llvm_variant_key_images(key);
3026
memset(draw_image, 0,
3027
key->nr_images * sizeof *draw_image);
3028
for (i = 0; i < key->nr_images; i++) {
3029
lp_sampler_static_texture_state_image(&draw_image[i].image_state,
3030
llvm->draw->images[PIPE_SHADER_GEOMETRY][i]);
3031
}
3032
return key;
3033
}
3034
3035
void
3036
draw_gs_llvm_dump_variant_key(struct draw_gs_llvm_variant_key *key)
3037
{
3038
unsigned i;
3039
struct draw_sampler_static_state *sampler = key->samplers;
3040
struct draw_image_static_state *image = draw_gs_llvm_variant_key_images(key);
3041
for (i = 0 ; i < key->nr_sampler_views; i++) {
3042
debug_printf("sampler[%i].src_format = %s\n", i,
3043
util_format_name(sampler[i].texture_state.format));
3044
}
3045
3046
for (i = 0 ; i < key->nr_images; i++)
3047
debug_printf("images[%i].format = %s\n", i, util_format_name(image[i].image_state.format));
3048
3049
}
3050
3051
static void
3052
create_tcs_jit_types(struct draw_tcs_llvm_variant *var)
3053
{
3054
struct gallivm_state *gallivm = var->gallivm;
3055
LLVMTypeRef texture_type, sampler_type, image_type, context_type;
3056
3057
texture_type = create_jit_texture_type(gallivm, "texture");
3058
sampler_type = create_jit_sampler_type(gallivm, "sampler");
3059
image_type = create_jit_image_type(gallivm, "image");
3060
3061
context_type = create_tcs_jit_context_type(gallivm,
3062
0,
3063
texture_type, sampler_type,
3064
image_type,
3065
"draw_tcs_jit_context");
3066
var->input_array_type = create_tcs_jit_input_type(gallivm);
3067
var->output_array_type = create_tcs_jit_output_type(gallivm);
3068
var->context_ptr_type = LLVMPointerType(context_type, 0);
3069
}
3070
3071
static LLVMTypeRef
3072
get_tcs_context_ptr_type(struct draw_tcs_llvm_variant *variant)
3073
{
3074
if (!variant->context_ptr_type)
3075
create_tcs_jit_types(variant);
3076
return variant->context_ptr_type;
3077
}
3078
3079
static LLVMValueRef
3080
draw_tcs_llvm_emit_fetch_input(const struct lp_build_tcs_iface *tes_iface,
3081
struct lp_build_context *bld,
3082
boolean is_vindex_indirect,
3083
LLVMValueRef vertex_index,
3084
boolean is_aindex_indirect,
3085
LLVMValueRef attrib_index,
3086
boolean is_sindex_indirect,
3087
LLVMValueRef swizzle_index)
3088
{
3089
const struct draw_tcs_llvm_iface *tcs = draw_tcs_llvm_iface(tes_iface);
3090
struct gallivm_state *gallivm = bld->gallivm;
3091
LLVMBuilderRef builder = gallivm->builder;
3092
LLVMValueRef indices[3];
3093
LLVMValueRef res;
3094
struct lp_type type = bld->type;
3095
3096
if (is_vindex_indirect || is_aindex_indirect || is_sindex_indirect) {
3097
int i;
3098
3099
res = bld->zero;
3100
for (i = 0; i < type.length; ++i) {
3101
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
3102
LLVMValueRef vert_chan_index = vertex_index;
3103
LLVMValueRef attr_chan_index = attrib_index;
3104
LLVMValueRef swiz_chan_index = swizzle_index;
3105
LLVMValueRef channel_vec;
3106
3107
if (is_vindex_indirect) {
3108
vert_chan_index = LLVMBuildExtractElement(builder,
3109
vertex_index, idx, "");
3110
}
3111
if (is_aindex_indirect) {
3112
attr_chan_index = LLVMBuildExtractElement(builder,
3113
attrib_index, idx, "");
3114
}
3115
if (is_sindex_indirect) {
3116
swiz_chan_index = LLVMBuildExtractElement(builder,
3117
swizzle_index, idx, "");
3118
}
3119
3120
indices[0] = vert_chan_index;
3121
indices[1] = attr_chan_index;
3122
indices[2] = swiz_chan_index;
3123
3124
channel_vec = LLVMBuildGEP(builder, tcs->input, indices, 3, "");
3125
channel_vec = LLVMBuildLoad(builder, channel_vec, "");
3126
3127
res = LLVMBuildInsertElement(builder, res, channel_vec, idx, "");
3128
}
3129
} else {
3130
indices[0] = vertex_index;
3131
indices[1] = attrib_index;
3132
indices[2] = swizzle_index;
3133
3134
res = LLVMBuildGEP(builder, tcs->input, indices, 3, "");
3135
res = LLVMBuildLoad(builder, res, "");
3136
res = lp_build_broadcast_scalar(bld, res);
3137
}
3138
return res;
3139
}
3140
3141
static LLVMValueRef
3142
draw_tcs_llvm_emit_fetch_output(const struct lp_build_tcs_iface *tes_iface,
3143
struct lp_build_context *bld,
3144
boolean is_vindex_indirect,
3145
LLVMValueRef vertex_index,
3146
boolean is_aindex_indirect,
3147
LLVMValueRef attrib_index,
3148
boolean is_sindex_indirect,
3149
LLVMValueRef swizzle_index,
3150
uint32_t name)
3151
{
3152
const struct draw_tcs_llvm_iface *tcs = draw_tcs_llvm_iface(tes_iface);
3153
struct gallivm_state *gallivm = bld->gallivm;
3154
LLVMBuilderRef builder = gallivm->builder;
3155
LLVMValueRef indices[3];
3156
LLVMValueRef res;
3157
struct lp_type type = bld->type;
3158
3159
if (is_vindex_indirect || is_aindex_indirect || is_sindex_indirect) {
3160
int i;
3161
3162
res = bld->zero;
3163
for (i = 0; i < type.length; ++i) {
3164
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
3165
LLVMValueRef vert_chan_index = vertex_index;
3166
LLVMValueRef attr_chan_index = attrib_index;
3167
LLVMValueRef swiz_chan_index = swizzle_index;
3168
LLVMValueRef channel_vec;
3169
3170
if (is_vindex_indirect) {
3171
vert_chan_index = LLVMBuildExtractElement(builder,
3172
vertex_index, idx, "");
3173
}
3174
if (is_aindex_indirect) {
3175
attr_chan_index = LLVMBuildExtractElement(builder,
3176
attrib_index, idx, "");
3177
}
3178
if (is_sindex_indirect) {
3179
swiz_chan_index = LLVMBuildExtractElement(builder,
3180
swizzle_index, idx, "");
3181
}
3182
3183
indices[0] = vert_chan_index;
3184
indices[1] = attr_chan_index;
3185
indices[2] = swiz_chan_index;
3186
3187
channel_vec = LLVMBuildGEP(builder, tcs->output, indices, 3, "");
3188
channel_vec = LLVMBuildLoad(builder, channel_vec, "");
3189
3190
res = LLVMBuildInsertElement(builder, res, channel_vec, idx, "");
3191
}
3192
} else {
3193
indices[0] = vertex_index ? vertex_index : lp_build_const_int32(gallivm, 0);
3194
indices[1] = attrib_index;
3195
indices[2] = swizzle_index;
3196
3197
res = LLVMBuildGEP(builder, tcs->output, indices, 3, "");
3198
res = LLVMBuildLoad(builder, res, "");
3199
res = lp_build_broadcast_scalar(bld, res);
3200
}
3201
return res;
3202
}
3203
3204
static void
3205
draw_tcs_llvm_emit_store_output(const struct lp_build_tcs_iface *tes_iface,
3206
struct lp_build_context *bld,
3207
unsigned name,
3208
boolean is_vindex_indirect,
3209
LLVMValueRef vertex_index,
3210
boolean is_aindex_indirect,
3211
LLVMValueRef attrib_index,
3212
boolean is_sindex_indirect,
3213
LLVMValueRef swizzle_index,
3214
LLVMValueRef value,
3215
LLVMValueRef mask_vec)
3216
{
3217
const struct draw_tcs_llvm_iface *tcs = draw_tcs_llvm_iface(tes_iface);
3218
struct gallivm_state *gallivm = bld->gallivm;
3219
LLVMBuilderRef builder = gallivm->builder;
3220
LLVMValueRef indices[3];
3221
LLVMValueRef res;
3222
struct lp_type type = bld->type;
3223
3224
if (is_vindex_indirect || is_aindex_indirect || is_sindex_indirect) {
3225
int i;
3226
3227
for (i = 0; i < type.length; ++i) {
3228
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
3229
LLVMValueRef vert_chan_index = vertex_index ? vertex_index : lp_build_const_int32(gallivm, 0);
3230
LLVMValueRef attr_chan_index = attrib_index;
3231
LLVMValueRef swiz_chan_index = swizzle_index;
3232
LLVMValueRef channel_vec;
3233
3234
if (is_vindex_indirect) {
3235
vert_chan_index = LLVMBuildExtractElement(builder,
3236
vertex_index, idx, "");
3237
}
3238
if (is_aindex_indirect) {
3239
attr_chan_index = LLVMBuildExtractElement(builder,
3240
attrib_index, idx, "");
3241
}
3242
3243
if (is_sindex_indirect) {
3244
swiz_chan_index = LLVMBuildExtractElement(builder,
3245
swizzle_index, idx, "");
3246
}
3247
3248
indices[0] = vert_chan_index;
3249
indices[1] = attr_chan_index;
3250
indices[2] = swiz_chan_index;
3251
3252
channel_vec = LLVMBuildGEP(builder, tcs->output, indices, 3, "");
3253
3254
res = LLVMBuildExtractElement(builder, value, idx, "");
3255
3256
struct lp_build_if_state ifthen;
3257
LLVMValueRef cond = LLVMBuildICmp(gallivm->builder, LLVMIntNE, mask_vec, lp_build_const_int_vec(gallivm, bld->type, 0), "");
3258
cond = LLVMBuildExtractElement(gallivm->builder, cond, idx, "");
3259
lp_build_if(&ifthen, gallivm, cond);
3260
LLVMBuildStore(builder, res, channel_vec);
3261
lp_build_endif(&ifthen);
3262
}
3263
} else {
3264
indices[0] = vertex_index ? vertex_index : lp_build_const_int32(gallivm, 0);
3265
indices[1] = attrib_index;
3266
indices[2] = swizzle_index;
3267
3268
res = LLVMBuildGEP(builder, tcs->output, indices, 3, "");
3269
for (unsigned i = 0; i < type.length; ++i) {
3270
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
3271
LLVMValueRef val = LLVMBuildExtractElement(builder, value, idx, "");
3272
3273
struct lp_build_if_state ifthen;
3274
LLVMValueRef cond = LLVMBuildICmp(gallivm->builder, LLVMIntNE, mask_vec, lp_build_const_int_vec(gallivm, bld->type, 0), "");
3275
cond = LLVMBuildExtractElement(gallivm->builder, cond, idx, "");
3276
lp_build_if(&ifthen, gallivm, cond);
3277
LLVMBuildStore(builder, val, res);
3278
lp_build_endif(&ifthen);
3279
}
3280
}
3281
}
3282
3283
3284
static LLVMValueRef
3285
generate_tcs_mask_value(struct draw_tcs_llvm_variant *variant,
3286
struct lp_type tcs_type, LLVMValueRef limit, LLVMValueRef loop_counter)
3287
{
3288
struct gallivm_state *gallivm = variant->gallivm;
3289
LLVMBuilderRef builder = gallivm->builder;
3290
struct lp_type mask_type = lp_int_type(tcs_type);
3291
LLVMValueRef num_vecs;
3292
LLVMValueRef mask_val = lp_build_const_vec(gallivm, mask_type, 0);
3293
unsigned i;
3294
3295
num_vecs = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, mask_type), limit);
3296
for (i = 0; i < tcs_type.length; i++) {
3297
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
3298
mask_val = LLVMBuildInsertElement(builder, mask_val, LLVMBuildAdd(builder, loop_counter, idx, ""), idx, "");
3299
}
3300
mask_val = lp_build_compare(gallivm, mask_type,
3301
PIPE_FUNC_GREATER, num_vecs, mask_val);
3302
3303
return mask_val;
3304
}
3305
3306
static void
3307
draw_tcs_llvm_generate(struct draw_llvm *llvm,
3308
struct draw_tcs_llvm_variant *variant)
3309
{
3310
struct gallivm_state *gallivm = variant->gallivm;
3311
LLVMContextRef context = gallivm->context;
3312
LLVMTypeRef int32_type = LLVMInt32TypeInContext(context);
3313
LLVMTypeRef arg_types[7];
3314
LLVMTypeRef func_type, coro_func_type;
3315
LLVMValueRef variant_func, variant_coro;
3316
LLVMValueRef context_ptr;
3317
LLVMValueRef view_index;
3318
LLVMValueRef input_array, output_array, prim_id, patch_vertices_in;
3319
LLVMValueRef mask_val;
3320
LLVMBasicBlockRef block;
3321
LLVMBuilderRef builder;
3322
struct lp_build_context bld, bldvec;
3323
struct lp_build_sampler_soa *sampler = 0;
3324
struct lp_build_image_soa *image = NULL;
3325
struct lp_bld_tgsi_system_values system_values;
3326
char func_name[64], func_name_coro[64];
3327
unsigned i;
3328
struct draw_tcs_llvm_iface tcs_iface;
3329
struct lp_build_mask_context mask;
3330
LLVMValueRef consts_ptr, num_consts_ptr;
3331
LLVMValueRef ssbos_ptr, num_ssbos_ptr;
3332
struct lp_type tcs_type;
3333
unsigned vector_length = variant->shader->base.vector_length;
3334
3335
memset(&system_values, 0, sizeof(system_values));
3336
3337
snprintf(func_name, sizeof(func_name), "draw_llvm_tcs_variant");
3338
3339
snprintf(func_name_coro, sizeof(func_name_coro), "draw_llvm_tcs_coro_variant");
3340
3341
arg_types[0] = get_tcs_context_ptr_type(variant); /* context */
3342
arg_types[1] = variant->input_array_type; /* input */
3343
arg_types[2] = variant->output_array_type;
3344
arg_types[3] = int32_type;
3345
arg_types[4] = int32_type;
3346
arg_types[5] = int32_type;
3347
arg_types[6] = int32_type; /* coroutine only */
3348
3349
func_type = LLVMFunctionType(int32_type, arg_types, ARRAY_SIZE(arg_types) - 1, 0);
3350
3351
coro_func_type = LLVMFunctionType(LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0), arg_types, ARRAY_SIZE(arg_types), 0);
3352
3353
variant_func = LLVMAddFunction(gallivm->module, func_name, func_type);
3354
3355
variant_coro = LLVMAddFunction(gallivm->module, func_name_coro, coro_func_type);
3356
3357
variant->function = variant_func;
3358
LLVMSetFunctionCallConv(variant_func, LLVMCCallConv);
3359
3360
LLVMSetFunctionCallConv(variant_coro, LLVMCCallConv);
3361
3362
for (i = 0; i < ARRAY_SIZE(arg_types); ++i) {
3363
if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind) {
3364
lp_add_function_attr(variant_coro, i + 1, LP_FUNC_ATTR_NOALIAS);
3365
lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS);
3366
}
3367
}
3368
3369
if (gallivm->cache && gallivm->cache->data_size)
3370
return;
3371
context_ptr = LLVMGetParam(variant_func, 0);
3372
input_array = LLVMGetParam(variant_func, 1);
3373
output_array = LLVMGetParam(variant_func, 2);
3374
prim_id = LLVMGetParam(variant_func, 3);
3375
patch_vertices_in = LLVMGetParam(variant_func, 4);
3376
view_index = LLVMGetParam(variant_func, 5);
3377
3378
lp_build_name(context_ptr, "context");
3379
lp_build_name(input_array, "input");
3380
lp_build_name(output_array, "output");
3381
lp_build_name(prim_id, "prim_id");
3382
lp_build_name(patch_vertices_in, "patch_vertices_in");
3383
lp_build_name(view_index, "view_index");
3384
3385
block = LLVMAppendBasicBlockInContext(gallivm->context, variant_func, "entry");
3386
builder = gallivm->builder;
3387
LLVMPositionBuilderAtEnd(builder, block);
3388
3389
lp_build_context_init(&bld, gallivm, lp_type_int(32));
3390
3391
memset(&tcs_type, 0, sizeof tcs_type);
3392
tcs_type.floating = TRUE; /* floating point values */
3393
tcs_type.sign = TRUE; /* values are signed */
3394
tcs_type.norm = FALSE; /* values are not limited to [0,1] or [-1,1] */
3395
tcs_type.width = 32; /* 32-bit float */
3396
tcs_type.length = vector_length;
3397
3398
lp_build_context_init(&bldvec, variant->gallivm, lp_int_type(tcs_type));
3399
3400
LLVMValueRef count = lp_build_const_int32(gallivm, variant->shader->base.vertices_out);
3401
LLVMValueRef step = lp_build_const_int32(gallivm, vector_length);
3402
3403
struct lp_build_loop_state loop_state[2];
3404
LLVMValueRef num_inner_loop;
3405
unsigned count_align = util_align_npot(variant->shader->base.vertices_out, tcs_type.length);
3406
num_inner_loop = lp_build_const_int32(gallivm, count_align / tcs_type.length);
3407
LLVMTypeRef hdl_ptr_type = LLVMPointerType(LLVMInt8TypeInContext(gallivm->context), 0);
3408
LLVMValueRef coro_hdls = LLVMBuildArrayAlloca(gallivm->builder, hdl_ptr_type, num_inner_loop, "coro_hdls");
3409
unsigned end_coroutine = INT_MAX;
3410
lp_build_loop_begin(&loop_state[1], gallivm,
3411
lp_build_const_int32(gallivm, 0)); /* coroutine reentry loop */
3412
lp_build_loop_begin(&loop_state[0], gallivm,
3413
lp_build_const_int32(gallivm, 0)); /* inner loop */
3414
{
3415
LLVMValueRef args[7];
3416
args[0] = context_ptr;
3417
args[1] = input_array;
3418
args[2] = output_array;
3419
args[3] = prim_id;
3420
args[4] = patch_vertices_in;
3421
args[5] = view_index;
3422
args[6] = loop_state[0].counter;
3423
LLVMValueRef coro_entry = LLVMBuildGEP(builder, coro_hdls, &loop_state[0].counter, 1, "");
3424
LLVMValueRef coro_hdl = LLVMBuildLoad(builder, coro_entry, "coro_hdl");
3425
3426
struct lp_build_if_state ifstate;
3427
LLVMValueRef cmp = LLVMBuildICmp(builder, LLVMIntEQ, loop_state[1].counter,
3428
lp_build_const_int32(gallivm, 0), "");
3429
/* first time here - call the coroutine function entry point */
3430
lp_build_if(&ifstate, gallivm, cmp);
3431
LLVMValueRef coro_ret = LLVMBuildCall(builder, variant_coro, args, 7, "");
3432
LLVMBuildStore(builder, coro_ret, coro_entry);
3433
lp_build_else(&ifstate);
3434
/* subsequent calls for this invocation - check if done. */
3435
LLVMValueRef coro_done = lp_build_coro_done(gallivm, coro_hdl);
3436
struct lp_build_if_state ifstate2;
3437
lp_build_if(&ifstate2, gallivm, coro_done);
3438
/* if done destroy and force loop exit */
3439
lp_build_coro_destroy(gallivm, coro_hdl);
3440
lp_build_loop_force_set_counter(&loop_state[1], lp_build_const_int32(gallivm, end_coroutine - 1));
3441
lp_build_else(&ifstate2);
3442
/* otherwise resume the coroutine */
3443
lp_build_coro_resume(gallivm, coro_hdl);
3444
lp_build_endif(&ifstate2);
3445
lp_build_endif(&ifstate);
3446
lp_build_loop_force_reload_counter(&loop_state[1]);
3447
}
3448
lp_build_loop_end_cond(&loop_state[0],
3449
num_inner_loop,
3450
NULL, LLVMIntUGE);
3451
lp_build_loop_end_cond(&loop_state[1],
3452
lp_build_const_int32(gallivm, end_coroutine),
3453
NULL, LLVMIntEQ);
3454
LLVMBuildRet(builder, lp_build_zero(gallivm, lp_type_uint(32)));
3455
3456
block = LLVMAppendBasicBlockInContext(gallivm->context, variant_coro, "entry");
3457
LLVMPositionBuilderAtEnd(builder, block);
3458
3459
context_ptr = LLVMGetParam(variant_coro, 0);
3460
input_array = LLVMGetParam(variant_coro, 1);
3461
output_array = LLVMGetParam(variant_coro, 2);
3462
prim_id = LLVMGetParam(variant_coro, 3);
3463
patch_vertices_in = LLVMGetParam(variant_coro, 4);
3464
view_index = LLVMGetParam(variant_coro, 5);
3465
3466
consts_ptr = draw_tcs_jit_context_constants(variant->gallivm, context_ptr);
3467
num_consts_ptr =
3468
draw_tcs_jit_context_num_constants(variant->gallivm, context_ptr);
3469
3470
ssbos_ptr = draw_tcs_jit_context_ssbos(variant->gallivm, context_ptr);
3471
num_ssbos_ptr =
3472
draw_tcs_jit_context_num_ssbos(variant->gallivm, context_ptr);
3473
sampler = draw_llvm_sampler_soa_create(variant->key.samplers, variant->key.nr_samplers);
3474
image = draw_llvm_image_soa_create(draw_tcs_llvm_variant_key_images(&variant->key),
3475
variant->key.nr_images);
3476
3477
LLVMValueRef counter = LLVMGetParam(variant_coro, 6);
3478
LLVMValueRef invocvec = LLVMGetUndef(LLVMVectorType(int32_type, vector_length));
3479
for (i = 0; i < vector_length; i++) {
3480
LLVMValueRef idx = LLVMBuildAdd(builder, LLVMBuildMul(builder, counter, step, ""), lp_build_const_int32(gallivm, i), "");
3481
invocvec = LLVMBuildInsertElement(builder, invocvec, idx, idx, "");
3482
}
3483
3484
system_values.invocation_id = invocvec;
3485
system_values.prim_id = lp_build_broadcast_scalar(&bldvec, prim_id);
3486
system_values.view_index = view_index;
3487
system_values.vertices_in = lp_build_broadcast_scalar(&bldvec, patch_vertices_in);
3488
tcs_iface.input = input_array;
3489
tcs_iface.output = output_array;
3490
tcs_iface.base.emit_fetch_input = draw_tcs_llvm_emit_fetch_input;
3491
tcs_iface.base.emit_fetch_output = draw_tcs_llvm_emit_fetch_output;
3492
tcs_iface.base.emit_store_output = draw_tcs_llvm_emit_store_output;
3493
3494
3495
{
3496
LLVMValueRef coro_id = lp_build_coro_id(gallivm);
3497
LLVMValueRef coro_hdl = lp_build_coro_begin_alloc_mem(gallivm, coro_id);
3498
3499
mask_val = generate_tcs_mask_value(variant, tcs_type, count, LLVMBuildMul(builder, counter, step, ""));
3500
lp_build_mask_begin(&mask, gallivm, tcs_type, mask_val);
3501
3502
struct lp_build_coro_suspend_info coro_info;
3503
3504
LLVMBasicBlockRef sus_block = LLVMAppendBasicBlockInContext(gallivm->context, variant_coro, "suspend");
3505
LLVMBasicBlockRef clean_block = LLVMAppendBasicBlockInContext(gallivm->context, variant_coro, "cleanup");
3506
3507
coro_info.suspend = sus_block;
3508
coro_info.cleanup = clean_block;
3509
3510
struct lp_build_tgsi_params params;
3511
memset(&params, 0, sizeof(params));
3512
3513
params.type = tcs_type;
3514
params.mask = &mask;
3515
params.consts_ptr = consts_ptr;
3516
params.const_sizes_ptr = num_consts_ptr;
3517
params.system_values = &system_values;
3518
params.context_ptr = context_ptr;
3519
params.sampler = sampler;
3520
params.info = &llvm->draw->tcs.tess_ctrl_shader->info;
3521
params.ssbo_ptr = ssbos_ptr;
3522
params.ssbo_sizes_ptr = num_ssbos_ptr;
3523
params.image = image;
3524
params.coro = &coro_info;
3525
params.tcs_iface = &tcs_iface.base;
3526
3527
lp_build_nir_soa(variant->gallivm,
3528
llvm->draw->tcs.tess_ctrl_shader->state.ir.nir,
3529
&params, NULL);
3530
3531
lp_build_mask_end(&mask);
3532
3533
lp_build_coro_suspend_switch(gallivm, &coro_info, NULL, true);
3534
LLVMPositionBuilderAtEnd(builder, clean_block);
3535
3536
lp_build_coro_free_mem(gallivm, coro_id, coro_hdl);
3537
3538
LLVMBuildBr(builder, sus_block);
3539
LLVMPositionBuilderAtEnd(builder, sus_block);
3540
3541
lp_build_coro_end(gallivm, coro_hdl);
3542
LLVMBuildRet(builder, coro_hdl);
3543
}
3544
3545
sampler->destroy(sampler);
3546
image->destroy(image);
3547
gallivm_verify_function(gallivm, variant_func);
3548
gallivm_verify_function(gallivm, variant_coro);
3549
}
3550
3551
struct draw_tcs_llvm_variant *
3552
draw_tcs_llvm_create_variant(struct draw_llvm *llvm,
3553
unsigned num_outputs,
3554
const struct draw_tcs_llvm_variant_key *key)
3555
{
3556
struct draw_tcs_llvm_variant *variant;
3557
struct llvm_tess_ctrl_shader *shader = llvm_tess_ctrl_shader(llvm->draw->tcs.tess_ctrl_shader);
3558
char module_name[64];
3559
unsigned char ir_sha1_cache_key[20];
3560
struct lp_cached_code cached = { 0 };
3561
bool needs_caching = false;
3562
3563
variant = MALLOC(sizeof *variant +
3564
shader->variant_key_size - sizeof variant->key);
3565
if (!variant)
3566
return NULL;
3567
3568
variant->llvm = llvm;
3569
variant->shader = shader;
3570
3571
snprintf(module_name, sizeof(module_name), "draw_llvm_tcs_variant%u",
3572
variant->shader->variants_cached);
3573
3574
memcpy(&variant->key, key, shader->variant_key_size);
3575
3576
if (shader->base.state.ir.nir && llvm->draw->disk_cache_cookie) {
3577
draw_get_ir_cache_key(shader->base.state.ir.nir,
3578
key,
3579
shader->variant_key_size,
3580
num_outputs,
3581
ir_sha1_cache_key);
3582
3583
llvm->draw->disk_cache_find_shader(llvm->draw->disk_cache_cookie,
3584
&cached,
3585
ir_sha1_cache_key);
3586
if (!cached.data_size)
3587
needs_caching = true;
3588
}
3589
3590
variant->gallivm = gallivm_create(module_name, llvm->context, &cached);
3591
3592
create_tcs_jit_types(variant);
3593
3594
if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
3595
nir_print_shader(llvm->draw->tcs.tess_ctrl_shader->state.ir.nir, stderr);
3596
draw_tcs_llvm_dump_variant_key(&variant->key);
3597
}
3598
3599
lp_build_coro_declare_malloc_hooks(variant->gallivm);
3600
draw_tcs_llvm_generate(llvm, variant);
3601
3602
gallivm_compile_module(variant->gallivm);
3603
3604
lp_build_coro_add_malloc_hooks(variant->gallivm);
3605
variant->jit_func = (draw_tcs_jit_func)
3606
gallivm_jit_function(variant->gallivm, variant->function);
3607
3608
if (needs_caching)
3609
llvm->draw->disk_cache_insert_shader(llvm->draw->disk_cache_cookie,
3610
&cached,
3611
ir_sha1_cache_key);
3612
gallivm_free_ir(variant->gallivm);
3613
3614
variant->list_item_global.base = variant;
3615
variant->list_item_local.base = variant;
3616
/*variant->no = */shader->variants_created++;
3617
variant->list_item_global.base = variant;
3618
3619
return variant;
3620
}
3621
3622
void
3623
draw_tcs_llvm_destroy_variant(struct draw_tcs_llvm_variant *variant)
3624
{
3625
struct draw_llvm *llvm = variant->llvm;
3626
3627
if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
3628
debug_printf("Deleting TCS variant: %u tcs variants,\t%u total variants\n",
3629
variant->shader->variants_cached, llvm->nr_tcs_variants);
3630
}
3631
3632
gallivm_destroy(variant->gallivm);
3633
3634
remove_from_list(&variant->list_item_local);
3635
variant->shader->variants_cached--;
3636
remove_from_list(&variant->list_item_global);
3637
llvm->nr_tcs_variants--;
3638
FREE(variant);
3639
}
3640
3641
struct draw_tcs_llvm_variant_key *
3642
draw_tcs_llvm_make_variant_key(struct draw_llvm *llvm, char *store)
3643
{
3644
unsigned i;
3645
struct draw_tcs_llvm_variant_key *key;
3646
struct draw_sampler_static_state *draw_sampler;
3647
struct draw_image_static_state *draw_image;
3648
3649
key = (struct draw_tcs_llvm_variant_key *)store;
3650
3651
memset(key, 0, offsetof(struct draw_tcs_llvm_variant_key, samplers[0]));
3652
3653
/* All variants of this shader will have the same value for
3654
* nr_samplers. Not yet trying to compact away holes in the
3655
* sampler array.
3656
*/
3657
key->nr_samplers = llvm->draw->tcs.tess_ctrl_shader->info.file_max[TGSI_FILE_SAMPLER] + 1;
3658
if (llvm->draw->tcs.tess_ctrl_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] != -1) {
3659
key->nr_sampler_views =
3660
llvm->draw->tcs.tess_ctrl_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] + 1;
3661
}
3662
else {
3663
key->nr_sampler_views = key->nr_samplers;
3664
}
3665
3666
key->nr_images = llvm->draw->tcs.tess_ctrl_shader->info.file_max[TGSI_FILE_IMAGE] + 1;
3667
3668
draw_sampler = key->samplers;
3669
3670
memset(draw_sampler, 0, MAX2(key->nr_samplers, key->nr_sampler_views) * sizeof *draw_sampler);
3671
3672
for (i = 0 ; i < key->nr_samplers; i++) {
3673
lp_sampler_static_sampler_state(&draw_sampler[i].sampler_state,
3674
llvm->draw->samplers[PIPE_SHADER_TESS_CTRL][i]);
3675
}
3676
for (i = 0 ; i < key->nr_sampler_views; i++) {
3677
lp_sampler_static_texture_state(&draw_sampler[i].texture_state,
3678
llvm->draw->sampler_views[PIPE_SHADER_TESS_CTRL][i]);
3679
}
3680
3681
draw_image = draw_tcs_llvm_variant_key_images(key);
3682
memset(draw_image, 0,
3683
key->nr_images * sizeof *draw_image);
3684
for (i = 0; i < key->nr_images; i++) {
3685
lp_sampler_static_texture_state_image(&draw_image[i].image_state,
3686
llvm->draw->images[PIPE_SHADER_TESS_CTRL][i]);
3687
}
3688
return key;
3689
}
3690
3691
void
3692
draw_tcs_llvm_dump_variant_key(struct draw_tcs_llvm_variant_key *key)
3693
{
3694
unsigned i;
3695
struct draw_sampler_static_state *sampler = key->samplers;
3696
struct draw_image_static_state *image = draw_tcs_llvm_variant_key_images(key);
3697
for (i = 0 ; i < key->nr_sampler_views; i++) {
3698
debug_printf("sampler[%i].src_format = %s\n", i,
3699
util_format_name(sampler[i].texture_state.format));
3700
}
3701
3702
for (i = 0 ; i < key->nr_images; i++)
3703
debug_printf("images[%i].format = %s\n", i, util_format_name(image[i].image_state.format));
3704
3705
}
3706
3707
static void
3708
create_tes_jit_types(struct draw_tes_llvm_variant *var)
3709
{
3710
struct gallivm_state *gallivm = var->gallivm;
3711
LLVMTypeRef texture_type, sampler_type, image_type, context_type;
3712
3713
texture_type = create_jit_texture_type(gallivm, "texture");
3714
sampler_type = create_jit_sampler_type(gallivm, "sampler");
3715
image_type = create_jit_image_type(gallivm, "image");
3716
3717
context_type = create_tes_jit_context_type(gallivm,
3718
0,
3719
texture_type, sampler_type,
3720
image_type,
3721
"draw_tes_jit_context");
3722
var->context_ptr_type = LLVMPointerType(context_type, 0);
3723
3724
var->input_array_type = create_tes_jit_input_type(gallivm);
3725
}
3726
3727
static LLVMTypeRef
3728
get_tes_context_ptr_type(struct draw_tes_llvm_variant *variant)
3729
{
3730
if (!variant->context_ptr_type)
3731
create_tes_jit_types(variant);
3732
return variant->context_ptr_type;
3733
}
3734
3735
static LLVMValueRef
3736
generate_tes_mask_value(struct draw_tes_llvm_variant *variant,
3737
struct lp_type tes_type, LLVMValueRef limit, LLVMValueRef loop_counter)
3738
{
3739
struct gallivm_state *gallivm = variant->gallivm;
3740
LLVMBuilderRef builder = gallivm->builder;
3741
struct lp_type mask_type = lp_int_type(tes_type);
3742
LLVMValueRef num_prims;
3743
LLVMValueRef mask_val = lp_build_const_vec(gallivm, mask_type, 0);
3744
unsigned i;
3745
3746
num_prims = lp_build_broadcast(gallivm, lp_build_vec_type(gallivm, mask_type), limit);
3747
for (i = 0; i < tes_type.length; i++) {
3748
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
3749
mask_val = LLVMBuildInsertElement(builder, mask_val, LLVMBuildAdd(builder, loop_counter, idx, ""), idx, "");
3750
}
3751
mask_val = lp_build_compare(gallivm, mask_type,
3752
PIPE_FUNC_GREATER, num_prims, mask_val);
3753
3754
return mask_val;
3755
}
3756
3757
static LLVMValueRef
3758
draw_tes_llvm_fetch_vertex_input(const struct lp_build_tes_iface *tes_iface,
3759
struct lp_build_context *bld,
3760
boolean is_vindex_indirect,
3761
LLVMValueRef vertex_index,
3762
boolean is_aindex_indirect,
3763
LLVMValueRef attrib_index,
3764
boolean is_sindex_indirect,
3765
LLVMValueRef swizzle_index)
3766
{
3767
const struct draw_tes_llvm_iface *tes = draw_tes_llvm_iface(tes_iface);
3768
struct gallivm_state *gallivm = bld->gallivm;
3769
LLVMBuilderRef builder = gallivm->builder;
3770
LLVMValueRef indices[3];
3771
LLVMValueRef res;
3772
struct lp_type type = bld->type;
3773
3774
if (is_vindex_indirect || is_aindex_indirect || is_sindex_indirect) {
3775
int i;
3776
3777
res = bld->zero;
3778
3779
for (i = 0; i < type.length; ++i) {
3780
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
3781
LLVMValueRef vert_chan_index = vertex_index;
3782
LLVMValueRef attr_chan_index = attrib_index;
3783
LLVMValueRef swiz_chan_index = swizzle_index;
3784
LLVMValueRef channel_vec;
3785
3786
if (is_vindex_indirect) {
3787
vert_chan_index = LLVMBuildExtractElement(builder,
3788
vertex_index, idx, "");
3789
}
3790
if (is_aindex_indirect) {
3791
attr_chan_index = LLVMBuildExtractElement(builder,
3792
attrib_index, idx, "");
3793
}
3794
if (is_sindex_indirect) {
3795
swiz_chan_index = LLVMBuildExtractElement(builder,
3796
swizzle_index, idx, "");
3797
}
3798
3799
indices[0] = vert_chan_index;
3800
indices[1] = attr_chan_index;
3801
indices[2] = swiz_chan_index;
3802
3803
channel_vec = LLVMBuildGEP(builder, tes->input, indices, 3, "");
3804
channel_vec = LLVMBuildLoad(builder, channel_vec, "");
3805
3806
res = LLVMBuildInsertElement(builder, res, channel_vec, idx, "");
3807
}
3808
} else {
3809
indices[0] = vertex_index;
3810
indices[1] = attrib_index;
3811
indices[2] = swizzle_index;
3812
3813
res = LLVMBuildGEP(builder, tes->input, indices, 3, "");
3814
res = LLVMBuildLoad(builder, res, "");
3815
res = lp_build_broadcast_scalar(bld, res);
3816
}
3817
return res;
3818
}
3819
3820
static LLVMValueRef
3821
draw_tes_llvm_fetch_patch_input(const struct lp_build_tes_iface *tes_iface,
3822
struct lp_build_context *bld,
3823
boolean is_aindex_indirect,
3824
LLVMValueRef attrib_index,
3825
LLVMValueRef swizzle_index)
3826
{
3827
const struct draw_tes_llvm_iface *tes = draw_tes_llvm_iface(tes_iface);
3828
struct gallivm_state *gallivm = bld->gallivm;
3829
LLVMBuilderRef builder = gallivm->builder;
3830
LLVMValueRef indices[3];
3831
LLVMValueRef res;
3832
struct lp_type type = bld->type;
3833
3834
if (is_aindex_indirect) {
3835
int i;
3836
3837
res = bld->zero;
3838
3839
for (i = 0; i < type.length; ++i) {
3840
LLVMValueRef idx = lp_build_const_int32(gallivm, i);
3841
LLVMValueRef attr_chan_index = attrib_index;
3842
LLVMValueRef channel_vec;
3843
3844
if (is_aindex_indirect) {
3845
attr_chan_index = LLVMBuildExtractElement(builder,
3846
attrib_index, idx, "");
3847
}
3848
3849
indices[0] = lp_build_const_int32(gallivm, 0);
3850
indices[1] = attr_chan_index;
3851
indices[2] = swizzle_index;
3852
3853
channel_vec = LLVMBuildGEP(builder, tes->input, indices, 3, "");
3854
channel_vec = LLVMBuildLoad(builder, channel_vec, "");
3855
3856
res = LLVMBuildInsertElement(builder, res, channel_vec, idx, "");
3857
}
3858
} else {
3859
indices[0] = lp_build_const_int32(gallivm, 0);
3860
indices[1] = attrib_index;
3861
indices[2] = swizzle_index;
3862
3863
res = LLVMBuildGEP(builder, tes->input, indices, 3, "");
3864
res = LLVMBuildLoad(builder, res, "");
3865
res = lp_build_broadcast_scalar(bld, res);
3866
}
3867
return res;
3868
}
3869
3870
static void
3871
draw_tes_llvm_generate(struct draw_llvm *llvm,
3872
struct draw_tes_llvm_variant *variant)
3873
{
3874
struct gallivm_state *gallivm = variant->gallivm;
3875
LLVMContextRef context = gallivm->context;
3876
LLVMTypeRef int32_type = LLVMInt32TypeInContext(context);
3877
LLVMTypeRef flt_type = LLVMFloatTypeInContext(context);
3878
LLVMTypeRef arg_types[11];
3879
LLVMTypeRef func_type;
3880
LLVMValueRef variant_func;
3881
LLVMValueRef context_ptr;
3882
LLVMValueRef tess_coord[2], io_ptr, input_array, num_tess_coord;
3883
LLVMValueRef view_index;
3884
LLVMValueRef tess_inner, tess_outer, prim_id, patch_vertices_in;
3885
LLVMBasicBlockRef block;
3886
LLVMBuilderRef builder;
3887
LLVMValueRef mask_val;
3888
struct lp_build_context bld, bldvec;
3889
struct lp_build_sampler_soa *sampler = 0;
3890
struct lp_build_image_soa *image = NULL;
3891
struct lp_bld_tgsi_system_values system_values;
3892
char func_name[64];
3893
unsigned i;
3894
struct draw_tes_llvm_iface tes_iface;
3895
LLVMValueRef outputs[PIPE_MAX_SHADER_OUTPUTS][TGSI_NUM_CHANNELS];
3896
struct lp_build_mask_context mask;
3897
LLVMValueRef consts_ptr, num_consts_ptr;
3898
LLVMValueRef ssbos_ptr, num_ssbos_ptr;
3899
LLVMValueRef step;
3900
struct lp_type tes_type;
3901
unsigned vector_length = variant->shader->base.vector_length;
3902
3903
memset(&system_values, 0, sizeof(system_values));
3904
memset(&outputs, 0, sizeof(outputs));
3905
3906
snprintf(func_name, sizeof(func_name), "draw_llvm_tes_variant");
3907
3908
arg_types[0] = get_tes_context_ptr_type(variant); /* context */
3909
arg_types[1] = variant->input_array_type; /* input */
3910
arg_types[2] = variant->vertex_header_ptr_type;
3911
arg_types[3] = int32_type;
3912
arg_types[4] = int32_type;
3913
arg_types[5] = LLVMPointerType(flt_type, 0);
3914
arg_types[6] = LLVMPointerType(flt_type, 0);
3915
arg_types[7] = LLVMPointerType(LLVMArrayType(flt_type, 4), 0);
3916
arg_types[8] = LLVMPointerType(LLVMArrayType(flt_type, 2), 0);
3917
arg_types[9] = int32_type;
3918
arg_types[10] = int32_type;
3919
3920
func_type = LLVMFunctionType(int32_type, arg_types, ARRAY_SIZE(arg_types), 0);
3921
variant_func = LLVMAddFunction(gallivm->module, func_name, func_type);
3922
3923
variant->function = variant_func;
3924
LLVMSetFunctionCallConv(variant_func, LLVMCCallConv);
3925
3926
for (i = 0; i < ARRAY_SIZE(arg_types); ++i)
3927
if (LLVMGetTypeKind(arg_types[i]) == LLVMPointerTypeKind)
3928
lp_add_function_attr(variant_func, i + 1, LP_FUNC_ATTR_NOALIAS);
3929
3930
if (gallivm->cache && gallivm->cache->data_size)
3931
return;
3932
context_ptr = LLVMGetParam(variant_func, 0);
3933
input_array = LLVMGetParam(variant_func, 1);
3934
io_ptr = LLVMGetParam(variant_func, 2);
3935
prim_id = LLVMGetParam(variant_func, 3);
3936
num_tess_coord = LLVMGetParam(variant_func, 4);
3937
tess_coord[0] = LLVMGetParam(variant_func, 5);
3938
tess_coord[1] = LLVMGetParam(variant_func, 6);
3939
tess_outer = LLVMGetParam(variant_func, 7);
3940
tess_inner = LLVMGetParam(variant_func, 8);
3941
patch_vertices_in = LLVMGetParam(variant_func, 9);
3942
view_index = LLVMGetParam(variant_func, 10);
3943
3944
lp_build_name(context_ptr, "context");
3945
lp_build_name(input_array, "input");
3946
lp_build_name(io_ptr, "io");
3947
lp_build_name(prim_id, "prim_id");
3948
lp_build_name(num_tess_coord, "num_tess_coord");
3949
lp_build_name(tess_coord[0], "tess_coord[0]");
3950
lp_build_name(tess_coord[1], "tess_coord[1]");
3951
lp_build_name(tess_outer, "tess_outer");
3952
lp_build_name(tess_inner, "tess_inner");
3953
lp_build_name(patch_vertices_in, "patch_vertices_in");
3954
lp_build_name(view_index, "view_index");
3955
3956
tes_iface.base.fetch_vertex_input = draw_tes_llvm_fetch_vertex_input;
3957
tes_iface.base.fetch_patch_input = draw_tes_llvm_fetch_patch_input;
3958
tes_iface.input = input_array;
3959
tes_iface.variant = variant;
3960
3961
block = LLVMAppendBasicBlockInContext(gallivm->context, variant_func, "entry");
3962
builder = gallivm->builder;
3963
LLVMPositionBuilderAtEnd(builder, block);
3964
3965
lp_build_context_init(&bld, gallivm, lp_type_int(32));
3966
3967
memset(&tes_type, 0, sizeof tes_type);
3968
tes_type.floating = TRUE; /* floating point values */
3969
tes_type.sign = TRUE; /* values are signed */
3970
tes_type.norm = FALSE; /* values are not limited to [0,1] or [-1,1] */
3971
tes_type.width = 32; /* 32-bit float */
3972
tes_type.length = vector_length;
3973
3974
lp_build_context_init(&bldvec, variant->gallivm, lp_int_type(tes_type));
3975
consts_ptr = draw_tes_jit_context_constants(variant->gallivm, context_ptr);
3976
num_consts_ptr =
3977
draw_tes_jit_context_num_constants(variant->gallivm, context_ptr);
3978
3979
ssbos_ptr = draw_tes_jit_context_ssbos(variant->gallivm, context_ptr);
3980
num_ssbos_ptr =
3981
draw_tes_jit_context_num_ssbos(variant->gallivm, context_ptr);
3982
sampler = draw_llvm_sampler_soa_create(variant->key.samplers, variant->key.nr_samplers);
3983
image = draw_llvm_image_soa_create(draw_tes_llvm_variant_key_images(&variant->key),
3984
variant->key.nr_images);
3985
step = lp_build_const_int32(gallivm, vector_length);
3986
3987
system_values.tess_outer = LLVMBuildLoad(builder, tess_outer, "");
3988
system_values.tess_inner = LLVMBuildLoad(builder, tess_inner, "");
3989
3990
system_values.prim_id = lp_build_broadcast_scalar(&bldvec, prim_id);
3991
3992
system_values.view_index = view_index;
3993
3994
system_values.vertices_in = lp_build_broadcast_scalar(&bldvec, patch_vertices_in);
3995
3996
if (variant->key.primid_needed) {
3997
int slot = variant->key.primid_output;
3998
for (unsigned i = 0; i < 4; i++) {
3999
outputs[slot][i] = lp_build_alloca(gallivm, lp_build_int_vec_type(gallivm, tes_type), "primid");
4000
LLVMBuildStore(builder, system_values.prim_id, outputs[slot][i]);
4001
}
4002
}
4003
struct lp_build_loop_state lp_loop;
4004
lp_build_loop_begin(&lp_loop, gallivm, bld.zero);
4005
{
4006
LLVMValueRef io;
4007
4008
io = LLVMBuildGEP(builder, io_ptr, &lp_loop.counter, 1, "");
4009
mask_val = generate_tes_mask_value(variant, tes_type, num_tess_coord, lp_loop.counter);
4010
lp_build_mask_begin(&mask, gallivm, tes_type, mask_val);
4011
4012
system_values.tess_coord = LLVMGetUndef(LLVMArrayType(LLVMVectorType(flt_type, vector_length), 3));
4013
for (i = 0; i < 3; i++) {
4014
LLVMValueRef tess_coord_chan = LLVMGetUndef(LLVMVectorType(flt_type, vector_length));
4015
for (unsigned j = 0; j < vector_length; j++) {
4016
LLVMValueRef idx = LLVMBuildAdd(builder, lp_loop.counter, lp_build_const_int32(gallivm, j), "");
4017
LLVMValueRef tc_val;
4018
if (i == 2) {
4019
if (variant->shader->base.prim_mode == PIPE_PRIM_TRIANGLES) {
4020
tc_val = lp_build_const_float(gallivm, 1.0);
4021
tc_val = LLVMBuildFSub(builder, tc_val, lp_build_pointer_get(builder, tess_coord[0], idx), "");
4022
tc_val = LLVMBuildFSub(builder, tc_val, lp_build_pointer_get(builder, tess_coord[1], idx), "");
4023
} else
4024
tc_val = lp_build_const_float(gallivm, 0.0);
4025
} else
4026
tc_val = lp_build_pointer_get(builder, tess_coord[i], idx);
4027
4028
tess_coord_chan = LLVMBuildInsertElement(builder, tess_coord_chan, tc_val, lp_build_const_int32(gallivm, j), "");
4029
}
4030
system_values.tess_coord = LLVMBuildInsertValue(builder, system_values.tess_coord, tess_coord_chan, i, "");
4031
}
4032
4033
struct lp_build_tgsi_params params;
4034
memset(&params, 0, sizeof(params));
4035
4036
params.type = tes_type;
4037
params.mask = &mask;
4038
params.consts_ptr = consts_ptr;
4039
params.const_sizes_ptr = num_consts_ptr;
4040
params.system_values = &system_values;
4041
params.context_ptr = context_ptr;
4042
params.sampler = sampler;
4043
params.info = &llvm->draw->tes.tess_eval_shader->info;
4044
params.ssbo_ptr = ssbos_ptr;
4045
params.ssbo_sizes_ptr = num_ssbos_ptr;
4046
params.image = image;
4047
params.tes_iface = &tes_iface.base;
4048
4049
lp_build_nir_soa(variant->gallivm,
4050
llvm->draw->tes.tess_eval_shader->state.ir.nir,
4051
&params,
4052
outputs);
4053
4054
lp_build_mask_end(&mask);
4055
LLVMValueRef clipmask = lp_build_const_int_vec(gallivm,
4056
lp_int_type(tes_type), 0);
4057
4058
convert_to_aos(gallivm, io, NULL, outputs, clipmask,
4059
draw_total_tes_outputs(llvm->draw), tes_type, FALSE);
4060
}
4061
lp_build_loop_end_cond(&lp_loop, num_tess_coord, step, LLVMIntUGE);
4062
sampler->destroy(sampler);
4063
image->destroy(image);
4064
4065
LLVMBuildRet(builder, lp_build_zero(gallivm, lp_type_uint(32)));
4066
gallivm_verify_function(gallivm, variant_func);
4067
}
4068
4069
struct draw_tes_llvm_variant *
4070
draw_tes_llvm_create_variant(struct draw_llvm *llvm,
4071
unsigned num_outputs,
4072
const struct draw_tes_llvm_variant_key *key)
4073
{
4074
struct draw_tes_llvm_variant *variant;
4075
struct llvm_tess_eval_shader *shader = llvm_tess_eval_shader(llvm->draw->tes.tess_eval_shader);
4076
LLVMTypeRef vertex_header;
4077
char module_name[64];
4078
unsigned char ir_sha1_cache_key[20];
4079
struct lp_cached_code cached = { 0 };
4080
bool needs_caching = false;
4081
4082
variant = MALLOC(sizeof *variant +
4083
shader->variant_key_size - sizeof variant->key);
4084
if (!variant)
4085
return NULL;
4086
4087
variant->llvm = llvm;
4088
variant->shader = shader;
4089
4090
snprintf(module_name, sizeof(module_name), "draw_llvm_tes_variant%u",
4091
variant->shader->variants_cached);
4092
4093
memcpy(&variant->key, key, shader->variant_key_size);
4094
if (shader->base.state.ir.nir && llvm->draw->disk_cache_cookie) {
4095
draw_get_ir_cache_key(shader->base.state.ir.nir,
4096
key,
4097
shader->variant_key_size,
4098
num_outputs,
4099
ir_sha1_cache_key);
4100
4101
llvm->draw->disk_cache_find_shader(llvm->draw->disk_cache_cookie,
4102
&cached,
4103
ir_sha1_cache_key);
4104
if (!cached.data_size)
4105
needs_caching = true;
4106
}
4107
variant->gallivm = gallivm_create(module_name, llvm->context, &cached);
4108
4109
create_tes_jit_types(variant);
4110
4111
vertex_header = create_jit_vertex_header(variant->gallivm, num_outputs);
4112
4113
variant->vertex_header_ptr_type = LLVMPointerType(vertex_header, 0);
4114
4115
if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
4116
nir_print_shader(llvm->draw->tes.tess_eval_shader->state.ir.nir, stderr);
4117
draw_tes_llvm_dump_variant_key(&variant->key);
4118
}
4119
4120
draw_tes_llvm_generate(llvm, variant);
4121
4122
gallivm_compile_module(variant->gallivm);
4123
4124
variant->jit_func = (draw_tes_jit_func)
4125
gallivm_jit_function(variant->gallivm, variant->function);
4126
4127
if (needs_caching)
4128
llvm->draw->disk_cache_insert_shader(llvm->draw->disk_cache_cookie,
4129
&cached,
4130
ir_sha1_cache_key);
4131
gallivm_free_ir(variant->gallivm);
4132
4133
variant->list_item_global.base = variant;
4134
variant->list_item_local.base = variant;
4135
/*variant->no = */shader->variants_created++;
4136
variant->list_item_global.base = variant;
4137
4138
return variant;
4139
}
4140
4141
void
4142
draw_tes_llvm_destroy_variant(struct draw_tes_llvm_variant *variant)
4143
{
4144
struct draw_llvm *llvm = variant->llvm;
4145
4146
if (gallivm_debug & (GALLIVM_DEBUG_TGSI | GALLIVM_DEBUG_IR)) {
4147
debug_printf("Deleting TES variant: %u tes variants,\t%u total variants\n",
4148
variant->shader->variants_cached, llvm->nr_tes_variants);
4149
}
4150
4151
gallivm_destroy(variant->gallivm);
4152
4153
remove_from_list(&variant->list_item_local);
4154
variant->shader->variants_cached--;
4155
remove_from_list(&variant->list_item_global);
4156
llvm->nr_tes_variants--;
4157
FREE(variant);
4158
}
4159
4160
struct draw_tes_llvm_variant_key *
4161
draw_tes_llvm_make_variant_key(struct draw_llvm *llvm, char *store)
4162
{
4163
unsigned i;
4164
struct draw_tes_llvm_variant_key *key;
4165
struct draw_sampler_static_state *draw_sampler;
4166
struct draw_image_static_state *draw_image;
4167
4168
key = (struct draw_tes_llvm_variant_key *)store;
4169
4170
memset(key, 0, offsetof(struct draw_tes_llvm_variant_key, samplers[0]));
4171
4172
int primid_output = draw_find_shader_output(llvm->draw, TGSI_SEMANTIC_PRIMID, 0);
4173
if (primid_output >= 0) {
4174
key->primid_output = primid_output;
4175
key->primid_needed = true;
4176
}
4177
4178
/* All variants of this shader will have the same value for
4179
* nr_samplers. Not yet trying to compact away holes in the
4180
* sampler array.
4181
*/
4182
key->nr_samplers = llvm->draw->tes.tess_eval_shader->info.file_max[TGSI_FILE_SAMPLER] + 1;
4183
if (llvm->draw->tes.tess_eval_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] != -1) {
4184
key->nr_sampler_views =
4185
llvm->draw->tes.tess_eval_shader->info.file_max[TGSI_FILE_SAMPLER_VIEW] + 1;
4186
}
4187
else {
4188
key->nr_sampler_views = key->nr_samplers;
4189
}
4190
4191
key->nr_images = llvm->draw->tes.tess_eval_shader->info.file_max[TGSI_FILE_IMAGE] + 1;
4192
4193
draw_sampler = key->samplers;
4194
4195
memset(draw_sampler, 0, MAX2(key->nr_samplers, key->nr_sampler_views) * sizeof *draw_sampler);
4196
4197
for (i = 0 ; i < key->nr_samplers; i++) {
4198
lp_sampler_static_sampler_state(&draw_sampler[i].sampler_state,
4199
llvm->draw->samplers[PIPE_SHADER_TESS_EVAL][i]);
4200
}
4201
for (i = 0 ; i < key->nr_sampler_views; i++) {
4202
lp_sampler_static_texture_state(&draw_sampler[i].texture_state,
4203
llvm->draw->sampler_views[PIPE_SHADER_TESS_EVAL][i]);
4204
}
4205
4206
draw_image = draw_tes_llvm_variant_key_images(key);
4207
memset(draw_image, 0,
4208
key->nr_images * sizeof *draw_image);
4209
for (i = 0; i < key->nr_images; i++) {
4210
lp_sampler_static_texture_state_image(&draw_image[i].image_state,
4211
llvm->draw->images[PIPE_SHADER_TESS_EVAL][i]);
4212
}
4213
return key;
4214
}
4215
4216
void
4217
draw_tes_llvm_dump_variant_key(struct draw_tes_llvm_variant_key *key)
4218
{
4219
unsigned i;
4220
struct draw_sampler_static_state *sampler = key->samplers;
4221
struct draw_image_static_state *image = draw_tes_llvm_variant_key_images(key);
4222
4223
if (key->primid_needed)
4224
debug_printf("prim id output %d\n", key->primid_output);
4225
for (i = 0 ; i < key->nr_sampler_views; i++) {
4226
debug_printf("sampler[%i].src_format = %s\n", i,
4227
util_format_name(sampler[i].texture_state.format));
4228
}
4229
4230
for (i = 0 ; i < key->nr_images; i++)
4231
debug_printf("images[%i].format = %s\n", i, util_format_name(image[i].image_state.format));
4232
4233
}
4234
4235