Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/amd/vulkan/radv_shader_info.c
7237 views
1
/*
2
* Copyright © 2017 Red Hat
3
*
4
* Permission is hereby granted, free of charge, to any person obtaining a
5
* copy of this software and associated documentation files (the "Software"),
6
* to deal in the Software without restriction, including without limitation
7
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
* and/or sell copies of the Software, and to permit persons to whom the
9
* Software is furnished to do so, subject to the following conditions:
10
*
11
* The above copyright notice and this permission notice (including the next
12
* paragraph) shall be included in all copies or substantial portions of the
13
* Software.
14
*
15
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21
* IN THE SOFTWARE.
22
*/
23
#include "nir/nir.h"
24
#include "nir/nir_xfb_info.h"
25
#include "radv_private.h"
26
#include "radv_shader.h"
27
28
static void
29
mark_sampler_desc(const nir_variable *var, struct radv_shader_info *info)
30
{
31
info->desc_set_used_mask |= (1u << var->data.descriptor_set);
32
}
33
34
static void
35
gather_intrinsic_load_input_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
36
struct radv_shader_info *info)
37
{
38
switch (nir->info.stage) {
39
case MESA_SHADER_VERTEX: {
40
unsigned idx = nir_intrinsic_io_semantics(instr).location;
41
unsigned component = nir_intrinsic_component(instr);
42
unsigned mask = nir_ssa_def_components_read(&instr->dest.ssa);
43
44
info->vs.input_usage_mask[idx] |= mask << component;
45
break;
46
}
47
default:
48
break;
49
}
50
}
51
52
static uint32_t
53
widen_writemask(uint32_t wrmask)
54
{
55
uint32_t new_wrmask = 0;
56
for (unsigned i = 0; i < 4; i++)
57
new_wrmask |= (wrmask & (1 << i) ? 0x3 : 0x0) << (i * 2);
58
return new_wrmask;
59
}
60
61
static void
62
set_writes_memory(const nir_shader *nir, struct radv_shader_info *info)
63
{
64
if (nir->info.stage == MESA_SHADER_FRAGMENT)
65
info->ps.writes_memory = true;
66
}
67
68
static void
69
gather_intrinsic_store_output_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
70
struct radv_shader_info *info)
71
{
72
unsigned idx = nir_intrinsic_base(instr);
73
unsigned num_slots = nir_intrinsic_io_semantics(instr).num_slots;
74
unsigned component = nir_intrinsic_component(instr);
75
unsigned write_mask = nir_intrinsic_write_mask(instr);
76
uint8_t *output_usage_mask = NULL;
77
78
if (instr->src[0].ssa->bit_size == 64)
79
write_mask = widen_writemask(write_mask);
80
81
switch (nir->info.stage) {
82
case MESA_SHADER_VERTEX:
83
output_usage_mask = info->vs.output_usage_mask;
84
break;
85
case MESA_SHADER_TESS_EVAL:
86
output_usage_mask = info->tes.output_usage_mask;
87
break;
88
case MESA_SHADER_GEOMETRY:
89
output_usage_mask = info->gs.output_usage_mask;
90
break;
91
default:
92
break;
93
}
94
95
if (output_usage_mask) {
96
for (unsigned i = 0; i < num_slots; i++) {
97
output_usage_mask[idx + i] |= ((write_mask >> (i * 4)) & 0xf) << component;
98
}
99
}
100
}
101
102
static void
103
gather_push_constant_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
104
struct radv_shader_info *info)
105
{
106
int base = nir_intrinsic_base(instr);
107
108
if (!nir_src_is_const(instr->src[0])) {
109
info->has_indirect_push_constants = true;
110
} else {
111
uint32_t min = base + nir_src_as_uint(instr->src[0]);
112
uint32_t max = min + instr->num_components * 4;
113
114
info->max_push_constant_used = MAX2(max, info->max_push_constant_used);
115
info->min_push_constant_used = MIN2(min, info->min_push_constant_used);
116
}
117
118
if (instr->dest.ssa.bit_size != 32)
119
info->has_only_32bit_push_constants = false;
120
121
info->loads_push_constants = true;
122
}
123
124
static void
125
gather_intrinsic_info(const nir_shader *nir, const nir_intrinsic_instr *instr,
126
struct radv_shader_info *info)
127
{
128
switch (instr->intrinsic) {
129
case nir_intrinsic_load_barycentric_sample:
130
case nir_intrinsic_load_barycentric_pixel:
131
case nir_intrinsic_load_barycentric_centroid: {
132
enum glsl_interp_mode mode = nir_intrinsic_interp_mode(instr);
133
switch (mode) {
134
case INTERP_MODE_NONE:
135
case INTERP_MODE_SMOOTH:
136
case INTERP_MODE_NOPERSPECTIVE:
137
info->ps.uses_persp_or_linear_interp = true;
138
break;
139
default:
140
break;
141
}
142
break;
143
}
144
case nir_intrinsic_load_barycentric_at_offset:
145
case nir_intrinsic_load_barycentric_at_sample:
146
if (nir_intrinsic_interp_mode(instr) != INTERP_MODE_FLAT)
147
info->ps.uses_persp_or_linear_interp = true;
148
149
if (instr->intrinsic == nir_intrinsic_load_barycentric_at_sample)
150
info->ps.needs_sample_positions = true;
151
break;
152
case nir_intrinsic_load_draw_id:
153
info->vs.needs_draw_id = true;
154
break;
155
case nir_intrinsic_load_base_instance:
156
info->vs.needs_base_instance = true;
157
break;
158
case nir_intrinsic_load_instance_id:
159
info->vs.needs_instance_id = true;
160
break;
161
case nir_intrinsic_load_num_workgroups:
162
info->cs.uses_grid_size = true;
163
break;
164
case nir_intrinsic_load_local_invocation_id:
165
case nir_intrinsic_load_workgroup_id: {
166
unsigned mask = nir_ssa_def_components_read(&instr->dest.ssa);
167
while (mask) {
168
unsigned i = u_bit_scan(&mask);
169
170
if (instr->intrinsic == nir_intrinsic_load_workgroup_id)
171
info->cs.uses_block_id[i] = true;
172
else
173
info->cs.uses_thread_id[i] = true;
174
}
175
break;
176
}
177
case nir_intrinsic_load_local_invocation_index:
178
case nir_intrinsic_load_subgroup_id:
179
case nir_intrinsic_load_num_subgroups:
180
info->cs.uses_local_invocation_idx = true;
181
break;
182
case nir_intrinsic_load_sample_mask_in:
183
info->ps.reads_sample_mask_in = true;
184
break;
185
case nir_intrinsic_load_view_index:
186
info->needs_multiview_view_index = true;
187
if (nir->info.stage == MESA_SHADER_FRAGMENT)
188
info->ps.layer_input = true;
189
break;
190
case nir_intrinsic_load_layer_id:
191
if (nir->info.stage == MESA_SHADER_FRAGMENT)
192
info->ps.layer_input = true;
193
break;
194
case nir_intrinsic_load_invocation_id:
195
info->uses_invocation_id = true;
196
break;
197
case nir_intrinsic_load_primitive_id:
198
info->uses_prim_id = true;
199
break;
200
case nir_intrinsic_load_push_constant:
201
gather_push_constant_info(nir, instr, info);
202
break;
203
case nir_intrinsic_vulkan_resource_index:
204
info->desc_set_used_mask |= (1u << nir_intrinsic_desc_set(instr));
205
break;
206
case nir_intrinsic_image_deref_load:
207
case nir_intrinsic_image_deref_sparse_load:
208
case nir_intrinsic_image_deref_store:
209
case nir_intrinsic_image_deref_atomic_add:
210
case nir_intrinsic_image_deref_atomic_imin:
211
case nir_intrinsic_image_deref_atomic_umin:
212
case nir_intrinsic_image_deref_atomic_imax:
213
case nir_intrinsic_image_deref_atomic_umax:
214
case nir_intrinsic_image_deref_atomic_and:
215
case nir_intrinsic_image_deref_atomic_or:
216
case nir_intrinsic_image_deref_atomic_xor:
217
case nir_intrinsic_image_deref_atomic_exchange:
218
case nir_intrinsic_image_deref_atomic_comp_swap:
219
case nir_intrinsic_image_deref_size: {
220
nir_variable *var =
221
nir_deref_instr_get_variable(nir_instr_as_deref(instr->src[0].ssa->parent_instr));
222
mark_sampler_desc(var, info);
223
224
if (instr->intrinsic == nir_intrinsic_image_deref_store ||
225
instr->intrinsic == nir_intrinsic_image_deref_atomic_add ||
226
instr->intrinsic == nir_intrinsic_image_deref_atomic_imin ||
227
instr->intrinsic == nir_intrinsic_image_deref_atomic_umin ||
228
instr->intrinsic == nir_intrinsic_image_deref_atomic_imax ||
229
instr->intrinsic == nir_intrinsic_image_deref_atomic_umax ||
230
instr->intrinsic == nir_intrinsic_image_deref_atomic_and ||
231
instr->intrinsic == nir_intrinsic_image_deref_atomic_or ||
232
instr->intrinsic == nir_intrinsic_image_deref_atomic_xor ||
233
instr->intrinsic == nir_intrinsic_image_deref_atomic_exchange ||
234
instr->intrinsic == nir_intrinsic_image_deref_atomic_comp_swap) {
235
set_writes_memory(nir, info);
236
}
237
break;
238
}
239
case nir_intrinsic_store_ssbo:
240
case nir_intrinsic_ssbo_atomic_add:
241
case nir_intrinsic_ssbo_atomic_imin:
242
case nir_intrinsic_ssbo_atomic_umin:
243
case nir_intrinsic_ssbo_atomic_imax:
244
case nir_intrinsic_ssbo_atomic_umax:
245
case nir_intrinsic_ssbo_atomic_and:
246
case nir_intrinsic_ssbo_atomic_or:
247
case nir_intrinsic_ssbo_atomic_xor:
248
case nir_intrinsic_ssbo_atomic_exchange:
249
case nir_intrinsic_ssbo_atomic_comp_swap:
250
case nir_intrinsic_store_global:
251
case nir_intrinsic_global_atomic_add:
252
case nir_intrinsic_global_atomic_imin:
253
case nir_intrinsic_global_atomic_umin:
254
case nir_intrinsic_global_atomic_imax:
255
case nir_intrinsic_global_atomic_umax:
256
case nir_intrinsic_global_atomic_and:
257
case nir_intrinsic_global_atomic_or:
258
case nir_intrinsic_global_atomic_xor:
259
case nir_intrinsic_global_atomic_exchange:
260
case nir_intrinsic_global_atomic_comp_swap:
261
set_writes_memory(nir, info);
262
break;
263
case nir_intrinsic_load_input:
264
gather_intrinsic_load_input_info(nir, instr, info);
265
break;
266
case nir_intrinsic_store_output:
267
gather_intrinsic_store_output_info(nir, instr, info);
268
break;
269
case nir_intrinsic_load_sbt_amd:
270
info->cs.uses_sbt = true;
271
break;
272
default:
273
break;
274
}
275
}
276
277
static void
278
gather_tex_info(const nir_shader *nir, const nir_tex_instr *instr, struct radv_shader_info *info)
279
{
280
for (unsigned i = 0; i < instr->num_srcs; i++) {
281
switch (instr->src[i].src_type) {
282
case nir_tex_src_texture_deref:
283
mark_sampler_desc(nir_deref_instr_get_variable(nir_src_as_deref(instr->src[i].src)), info);
284
break;
285
case nir_tex_src_sampler_deref:
286
mark_sampler_desc(nir_deref_instr_get_variable(nir_src_as_deref(instr->src[i].src)), info);
287
break;
288
default:
289
break;
290
}
291
}
292
}
293
294
static void
295
gather_info_block(const nir_shader *nir, const nir_block *block, struct radv_shader_info *info)
296
{
297
nir_foreach_instr (instr, block) {
298
switch (instr->type) {
299
case nir_instr_type_intrinsic:
300
gather_intrinsic_info(nir, nir_instr_as_intrinsic(instr), info);
301
break;
302
case nir_instr_type_tex:
303
gather_tex_info(nir, nir_instr_as_tex(instr), info);
304
break;
305
default:
306
break;
307
}
308
}
309
}
310
311
static void
312
gather_info_input_decl_vs(const nir_shader *nir, const nir_variable *var,
313
struct radv_shader_info *info, const struct radv_shader_variant_key *key)
314
{
315
unsigned attrib_count = glsl_count_attribute_slots(var->type, true);
316
317
for (unsigned i = 0; i < attrib_count; ++i) {
318
unsigned attrib_index = var->data.location + i - VERT_ATTRIB_GENERIC0;
319
320
if (key->vs.instance_rate_inputs & (1u << attrib_index)) {
321
info->vs.needs_instance_id = true;
322
info->vs.needs_base_instance = true;
323
}
324
325
if (info->vs.use_per_attribute_vb_descs)
326
info->vs.vb_desc_usage_mask |= 1u << attrib_index;
327
else
328
info->vs.vb_desc_usage_mask |= 1u << key->vs.vertex_attribute_bindings[attrib_index];
329
}
330
}
331
332
static void
333
mark_16bit_ps_input(struct radv_shader_info *info, const struct glsl_type *type, int location)
334
{
335
if (glsl_type_is_scalar(type) || glsl_type_is_vector(type) || glsl_type_is_matrix(type)) {
336
unsigned attrib_count = glsl_count_attribute_slots(type, false);
337
if (glsl_type_is_16bit(type)) {
338
info->ps.float16_shaded_mask |= ((1ull << attrib_count) - 1) << location;
339
}
340
} else if (glsl_type_is_array(type)) {
341
unsigned stride = glsl_count_attribute_slots(glsl_get_array_element(type), false);
342
for (unsigned i = 0; i < glsl_get_length(type); ++i) {
343
mark_16bit_ps_input(info, glsl_get_array_element(type), location + i * stride);
344
}
345
} else {
346
assert(glsl_type_is_struct_or_ifc(type));
347
for (unsigned i = 0; i < glsl_get_length(type); i++) {
348
mark_16bit_ps_input(info, glsl_get_struct_field(type, i), location);
349
location += glsl_count_attribute_slots(glsl_get_struct_field(type, i), false);
350
}
351
}
352
}
353
static void
354
gather_info_input_decl_ps(const nir_shader *nir, const nir_variable *var,
355
struct radv_shader_info *info)
356
{
357
unsigned attrib_count = glsl_count_attribute_slots(var->type, false);
358
int idx = var->data.location;
359
360
switch (idx) {
361
case VARYING_SLOT_PNTC:
362
info->ps.has_pcoord = true;
363
break;
364
case VARYING_SLOT_PRIMITIVE_ID:
365
info->ps.prim_id_input = true;
366
break;
367
case VARYING_SLOT_LAYER:
368
info->ps.layer_input = true;
369
break;
370
case VARYING_SLOT_CLIP_DIST0:
371
case VARYING_SLOT_CLIP_DIST1:
372
info->ps.num_input_clips_culls += attrib_count;
373
break;
374
case VARYING_SLOT_VIEWPORT:
375
info->ps.viewport_index_input = true;
376
break;
377
default:
378
break;
379
}
380
381
if (var->data.compact) {
382
unsigned component_count = var->data.location_frac + glsl_get_length(var->type);
383
attrib_count = (component_count + 3) / 4;
384
} else {
385
mark_16bit_ps_input(info, var->type, var->data.driver_location);
386
}
387
388
uint64_t mask = ((1ull << attrib_count) - 1);
389
390
if (var->data.interpolation == INTERP_MODE_FLAT)
391
info->ps.flat_shaded_mask |= mask << var->data.driver_location;
392
if (var->data.interpolation == INTERP_MODE_EXPLICIT)
393
info->ps.explicit_shaded_mask |= mask << var->data.driver_location;
394
395
if (var->data.location >= VARYING_SLOT_VAR0)
396
info->ps.input_mask |= mask << (var->data.location - VARYING_SLOT_VAR0);
397
}
398
399
static void
400
gather_info_input_decl(const nir_shader *nir, const nir_variable *var,
401
struct radv_shader_info *info, const struct radv_shader_variant_key *key)
402
{
403
switch (nir->info.stage) {
404
case MESA_SHADER_VERTEX:
405
gather_info_input_decl_vs(nir, var, info, key);
406
break;
407
case MESA_SHADER_FRAGMENT:
408
gather_info_input_decl_ps(nir, var, info);
409
break;
410
default:
411
break;
412
}
413
}
414
415
static void
416
gather_info_output_decl_ps(const nir_shader *nir, const nir_variable *var,
417
struct radv_shader_info *info)
418
{
419
int idx = var->data.location;
420
421
switch (idx) {
422
case FRAG_RESULT_DEPTH:
423
info->ps.writes_z = true;
424
break;
425
case FRAG_RESULT_STENCIL:
426
info->ps.writes_stencil = true;
427
break;
428
case FRAG_RESULT_SAMPLE_MASK:
429
info->ps.writes_sample_mask = true;
430
break;
431
default:
432
break;
433
}
434
}
435
436
static void
437
gather_info_output_decl_gs(const nir_shader *nir, const nir_variable *var,
438
struct radv_shader_info *info)
439
{
440
unsigned num_components = glsl_get_component_slots(var->type);
441
unsigned stream = var->data.stream;
442
unsigned idx = var->data.location;
443
444
assert(stream < 4);
445
446
info->gs.max_stream = MAX2(info->gs.max_stream, stream);
447
info->gs.num_stream_output_components[stream] += num_components;
448
info->gs.output_streams[idx] = stream;
449
}
450
451
static void
452
gather_info_output_decl(const nir_shader *nir, const nir_variable *var,
453
struct radv_shader_info *info, const struct radv_shader_variant_key *key)
454
{
455
struct radv_vs_output_info *vs_info = NULL;
456
457
switch (nir->info.stage) {
458
case MESA_SHADER_FRAGMENT:
459
gather_info_output_decl_ps(nir, var, info);
460
break;
461
case MESA_SHADER_VERTEX:
462
if (!key->vs_common_out.as_ls && !key->vs_common_out.as_es)
463
vs_info = &info->vs.outinfo;
464
465
/* TODO: Adjust as_ls/as_nng. */
466
if (!key->vs_common_out.as_ls && key->vs_common_out.as_ngg)
467
gather_info_output_decl_gs(nir, var, info);
468
break;
469
case MESA_SHADER_GEOMETRY:
470
vs_info = &info->vs.outinfo;
471
gather_info_output_decl_gs(nir, var, info);
472
break;
473
case MESA_SHADER_TESS_EVAL:
474
if (!key->vs_common_out.as_es)
475
vs_info = &info->tes.outinfo;
476
break;
477
default:
478
break;
479
}
480
481
if (vs_info) {
482
switch (var->data.location) {
483
case VARYING_SLOT_CLIP_DIST0:
484
vs_info->clip_dist_mask = (1 << nir->info.clip_distance_array_size) - 1;
485
vs_info->cull_dist_mask = (1 << nir->info.cull_distance_array_size) - 1;
486
vs_info->cull_dist_mask <<= nir->info.clip_distance_array_size;
487
break;
488
case VARYING_SLOT_PSIZ:
489
vs_info->writes_pointsize = true;
490
break;
491
case VARYING_SLOT_VIEWPORT:
492
vs_info->writes_viewport_index = true;
493
break;
494
case VARYING_SLOT_LAYER:
495
vs_info->writes_layer = true;
496
break;
497
case VARYING_SLOT_PRIMITIVE_SHADING_RATE:
498
vs_info->writes_primitive_shading_rate = true;
499
break;
500
default:
501
break;
502
}
503
}
504
}
505
506
static void
507
gather_xfb_info(const nir_shader *nir, struct radv_shader_info *info)
508
{
509
nir_xfb_info *xfb = nir_gather_xfb_info(nir, NULL);
510
struct radv_streamout_info *so = &info->so;
511
512
if (!xfb)
513
return;
514
515
assert(xfb->output_count < MAX_SO_OUTPUTS);
516
so->num_outputs = xfb->output_count;
517
518
for (unsigned i = 0; i < xfb->output_count; i++) {
519
struct radv_stream_output *output = &so->outputs[i];
520
521
output->buffer = xfb->outputs[i].buffer;
522
output->stream = xfb->buffer_to_stream[xfb->outputs[i].buffer];
523
output->offset = xfb->outputs[i].offset;
524
output->location = xfb->outputs[i].location;
525
output->component_mask = xfb->outputs[i].component_mask;
526
527
so->enabled_stream_buffers_mask |= (1 << output->buffer) << (output->stream * 4);
528
}
529
530
for (unsigned i = 0; i < NIR_MAX_XFB_BUFFERS; i++) {
531
so->strides[i] = xfb->buffers[i].stride / 4;
532
}
533
534
ralloc_free(xfb);
535
}
536
537
void
538
radv_nir_shader_info_init(struct radv_shader_info *info)
539
{
540
/* Assume that shaders only have 32-bit push constants by default. */
541
info->min_push_constant_used = UINT8_MAX;
542
info->has_only_32bit_push_constants = true;
543
}
544
545
void
546
radv_nir_shader_info_pass(struct radv_device *device, const struct nir_shader *nir,
547
const struct radv_pipeline_layout *layout,
548
const struct radv_shader_variant_key *key, struct radv_shader_info *info)
549
{
550
struct nir_function *func = (struct nir_function *)exec_list_get_head_const(&nir->functions);
551
552
if (layout && layout->dynamic_offset_count &&
553
(layout->dynamic_shader_stages & mesa_to_vk_shader_stage(nir->info.stage))) {
554
info->loads_push_constants = true;
555
info->loads_dynamic_offsets = true;
556
}
557
558
if (nir->info.stage == MESA_SHADER_VERTEX) {
559
/* Use per-attribute vertex descriptors to prevent faults and
560
* for correct bounds checking.
561
*/
562
info->vs.use_per_attribute_vb_descs = device->robust_buffer_access;
563
}
564
565
nir_foreach_shader_in_variable (variable, nir)
566
gather_info_input_decl(nir, variable, info, key);
567
568
nir_foreach_block (block, func->impl) {
569
gather_info_block(nir, block, info);
570
}
571
572
nir_foreach_shader_out_variable(variable, nir) gather_info_output_decl(nir, variable, info, key);
573
574
if (nir->info.stage == MESA_SHADER_VERTEX || nir->info.stage == MESA_SHADER_TESS_EVAL ||
575
nir->info.stage == MESA_SHADER_GEOMETRY)
576
gather_xfb_info(nir, info);
577
578
/* Make sure to export the LayerID if the fragment shader needs it. */
579
if (key->vs_common_out.export_layer_id) {
580
switch (nir->info.stage) {
581
case MESA_SHADER_VERTEX:
582
info->vs.output_usage_mask[VARYING_SLOT_LAYER] |= 0x1;
583
break;
584
case MESA_SHADER_TESS_EVAL:
585
info->tes.output_usage_mask[VARYING_SLOT_LAYER] |= 0x1;
586
break;
587
case MESA_SHADER_GEOMETRY:
588
info->gs.output_usage_mask[VARYING_SLOT_LAYER] |= 0x1;
589
break;
590
default:
591
break;
592
}
593
}
594
595
/* Make sure to export the LayerID if the subpass has multiviews. */
596
if (key->has_multiview_view_index) {
597
switch (nir->info.stage) {
598
case MESA_SHADER_VERTEX:
599
info->vs.outinfo.writes_layer = true;
600
break;
601
case MESA_SHADER_TESS_EVAL:
602
info->tes.outinfo.writes_layer = true;
603
break;
604
case MESA_SHADER_GEOMETRY:
605
info->vs.outinfo.writes_layer = true;
606
break;
607
default:
608
break;
609
}
610
}
611
612
/* Make sure to export the PrimitiveID if the fragment shader needs it. */
613
if (key->vs_common_out.export_prim_id) {
614
switch (nir->info.stage) {
615
case MESA_SHADER_VERTEX:
616
info->vs.outinfo.export_prim_id = true;
617
break;
618
case MESA_SHADER_TESS_EVAL:
619
info->tes.outinfo.export_prim_id = true;
620
break;
621
case MESA_SHADER_GEOMETRY:
622
info->vs.outinfo.export_prim_id = true;
623
break;
624
default:
625
break;
626
}
627
}
628
629
/* Make sure to export the ViewportIndex if the fragment shader needs it. */
630
if (key->vs_common_out.export_viewport_index) {
631
switch (nir->info.stage) {
632
case MESA_SHADER_VERTEX:
633
info->vs.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1;
634
break;
635
case MESA_SHADER_TESS_EVAL:
636
info->tes.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1;
637
break;
638
case MESA_SHADER_GEOMETRY:
639
info->gs.output_usage_mask[VARYING_SLOT_VIEWPORT] |= 0x1;
640
break;
641
default:
642
break;
643
}
644
}
645
646
if (nir->info.stage == MESA_SHADER_FRAGMENT)
647
info->ps.num_interp = nir->num_inputs;
648
649
switch (nir->info.stage) {
650
case MESA_SHADER_COMPUTE:
651
for (int i = 0; i < 3; ++i)
652
info->cs.block_size[i] = nir->info.workgroup_size[i];
653
break;
654
case MESA_SHADER_FRAGMENT:
655
info->ps.can_discard = nir->info.fs.uses_discard;
656
info->ps.early_fragment_test = nir->info.fs.early_fragment_tests;
657
info->ps.post_depth_coverage = nir->info.fs.post_depth_coverage;
658
info->ps.depth_layout = nir->info.fs.depth_layout;
659
info->ps.uses_sample_shading = nir->info.fs.uses_sample_shading;
660
break;
661
case MESA_SHADER_GEOMETRY:
662
info->gs.vertices_in = nir->info.gs.vertices_in;
663
info->gs.vertices_out = nir->info.gs.vertices_out;
664
info->gs.output_prim = nir->info.gs.output_primitive;
665
info->gs.invocations = nir->info.gs.invocations;
666
break;
667
case MESA_SHADER_TESS_EVAL:
668
info->tes.primitive_mode = nir->info.tess.primitive_mode;
669
info->tes.spacing = nir->info.tess.spacing;
670
info->tes.ccw = nir->info.tess.ccw;
671
info->tes.point_mode = nir->info.tess.point_mode;
672
info->tes.as_es = key->vs_common_out.as_es;
673
info->tes.export_prim_id = key->vs_common_out.export_prim_id;
674
info->is_ngg = key->vs_common_out.as_ngg;
675
info->is_ngg_passthrough = key->vs_common_out.as_ngg_passthrough;
676
break;
677
case MESA_SHADER_TESS_CTRL:
678
info->tcs.tcs_vertices_out = nir->info.tess.tcs_vertices_out;
679
break;
680
case MESA_SHADER_VERTEX:
681
info->vs.as_es = key->vs_common_out.as_es;
682
info->vs.as_ls = key->vs_common_out.as_ls;
683
info->vs.export_prim_id = key->vs_common_out.export_prim_id;
684
info->is_ngg = key->vs_common_out.as_ngg;
685
info->is_ngg_passthrough = key->vs_common_out.as_ngg_passthrough;
686
break;
687
default:
688
break;
689
}
690
691
if (nir->info.stage == MESA_SHADER_GEOMETRY) {
692
unsigned add_clip =
693
nir->info.clip_distance_array_size + nir->info.cull_distance_array_size > 4;
694
info->gs.gsvs_vertex_size = (util_bitcount64(nir->info.outputs_written) + add_clip) * 16;
695
info->gs.max_gsvs_emit_size = info->gs.gsvs_vertex_size * nir->info.gs.vertices_out;
696
}
697
698
/* Compute the ESGS item size for VS or TES as ES. */
699
if ((nir->info.stage == MESA_SHADER_VERTEX || nir->info.stage == MESA_SHADER_TESS_EVAL) &&
700
key->vs_common_out.as_es) {
701
struct radv_es_output_info *es_info =
702
nir->info.stage == MESA_SHADER_VERTEX ? &info->vs.es_info : &info->tes.es_info;
703
uint32_t num_outputs_written = nir->info.stage == MESA_SHADER_VERTEX
704
? info->vs.num_linked_outputs
705
: info->tes.num_linked_outputs;
706
es_info->esgs_itemsize = num_outputs_written * 16;
707
}
708
709
info->float_controls_mode = nir->info.float_controls_execution_mode;
710
711
if (nir->info.stage == MESA_SHADER_FRAGMENT) {
712
info->ps.allow_flat_shading =
713
!(info->ps.uses_persp_or_linear_interp || info->ps.needs_sample_positions ||
714
info->ps.writes_memory || nir->info.fs.needs_quad_helper_invocations ||
715
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_FRAG_COORD) ||
716
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_POINT_COORD) ||
717
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SAMPLE_ID) ||
718
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SAMPLE_POS) ||
719
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_SAMPLE_MASK_IN) ||
720
BITSET_TEST(nir->info.system_values_read, SYSTEM_VALUE_HELPER_INVOCATION));
721
}
722
}
723
724