~mmach/netext73/mesa-ryzen

« back to all changes in this revision

Viewing changes to src/amd/vulkan/radv_shader_args.c

  • Committer: mmach
  • Date: 2023-11-02 21:31:35 UTC
  • Revision ID: netbit73@gmail.com-20231102213135-18d4tzh7tj0uz752
2023-11-02 22:11:57

Show diffs side-by-side

added added

removed removed

Lines of Context:
38
38
};
39
39
 
40
40
static void
41
 
allocate_inline_push_consts(const struct radv_shader_info *info,
42
 
                            struct user_sgpr_info *user_sgpr_info)
 
41
allocate_inline_push_consts(const struct radv_shader_info *info, struct user_sgpr_info *user_sgpr_info)
43
42
{
44
43
   uint8_t remaining_sgprs = user_sgpr_info->remaining_sgprs;
45
44
 
52
51
   /* Disable the default push constants path if all constants can be inlined and if shaders don't
53
52
    * use dynamic descriptors.
54
53
    */
55
 
   if (num_push_consts <= MIN2(remaining_sgprs + 1, AC_MAX_INLINE_PUSH_CONSTS) &&
56
 
       info->can_inline_all_push_constants && !info->loads_dynamic_offsets) {
 
54
   if (num_push_consts <= MIN2(remaining_sgprs + 1, AC_MAX_INLINE_PUSH_CONSTS) && info->can_inline_all_push_constants &&
 
55
       !info->loads_dynamic_offsets) {
57
56
      user_sgpr_info->inlined_all_push_consts = true;
58
57
      remaining_sgprs++;
59
58
   } else {
85
84
}
86
85
 
87
86
static void
88
 
add_descriptor_set(struct radv_shader_args *args, enum ac_arg_type type, struct ac_arg *arg,
89
 
                   uint32_t set)
 
87
add_descriptor_set(struct radv_shader_args *args, enum ac_arg_type type, struct ac_arg *arg, uint32_t set)
90
88
{
91
89
   ac_add_arg(&args->ac, AC_ARG_SGPR, 1, type, arg);
92
90
 
99
97
}
100
98
 
101
99
static void
102
 
declare_global_input_sgprs(const struct radv_shader_info *info,
103
 
                           const struct user_sgpr_info *user_sgpr_info,
 
100
declare_global_input_sgprs(const struct radv_shader_info *info, const struct user_sgpr_info *user_sgpr_info,
104
101
                           struct radv_shader_args *args)
105
102
{
106
103
   if (user_sgpr_info) {
114
111
            add_descriptor_set(args, AC_ARG_CONST_PTR, &args->descriptor_sets[i], i);
115
112
         }
116
113
      } else {
117
 
         add_ud_arg(args, 1, AC_ARG_CONST_PTR_PTR, &args->descriptor_sets[0],
118
 
                    AC_UD_INDIRECT_DESCRIPTOR_SETS);
 
114
         add_ud_arg(args, 1, AC_ARG_CONST_PTR_PTR, &args->descriptor_sets[0], AC_UD_INDIRECT_DESCRIPTOR_SETS);
119
115
      }
120
116
 
121
117
      if (info->loads_push_constants && !user_sgpr_info->inlined_all_push_consts) {
124
120
      }
125
121
 
126
122
      for (unsigned i = 0; i < util_bitcount64(user_sgpr_info->inline_push_constant_mask); i++) {
127
 
         add_ud_arg(args, 1, AC_ARG_INT, &args->ac.inline_push_consts[i],
128
 
                    AC_UD_INLINE_PUSH_CONSTANTS);
 
123
         add_ud_arg(args, 1, AC_ARG_INT, &args->ac.inline_push_consts[i], AC_UD_INLINE_PUSH_CONSTANTS);
129
124
      }
130
125
      args->ac.inline_push_const_mask = user_sgpr_info->inline_push_constant_mask;
131
126
   }
142
137
   if (info->vs.has_prolog)
143
138
      add_ud_arg(args, 2, AC_ARG_INT, &args->prolog_inputs, AC_UD_VS_PROLOG_INPUTS);
144
139
 
145
 
   if (args->type != RADV_SHADER_TYPE_GS_COPY &&
 
140
   if (info->type != RADV_SHADER_TYPE_GS_COPY &&
146
141
       (stage == MESA_SHADER_VERTEX || previous_stage == MESA_SHADER_VERTEX)) {
147
142
      if (info->vs.vb_desc_usage_mask) {
148
 
         add_ud_arg(args, 1, AC_ARG_CONST_DESC_PTR, &args->ac.vertex_buffers,
149
 
                    AC_UD_VS_VERTEX_BUFFERS);
 
143
         add_ud_arg(args, 1, AC_ARG_CONST_DESC_PTR, &args->ac.vertex_buffers, AC_UD_VS_VERTEX_BUFFERS);
150
144
      }
151
145
 
152
146
      add_ud_arg(args, 1, AC_ARG_INT, &args->ac.base_vertex, AC_UD_VS_BASE_VERTEX_START_INSTANCE);
154
148
         add_ud_arg(args, 1, AC_ARG_INT, &args->ac.draw_id, AC_UD_VS_BASE_VERTEX_START_INSTANCE);
155
149
      }
156
150
      if (info->vs.needs_base_instance) {
157
 
         add_ud_arg(args, 1, AC_ARG_INT, &args->ac.start_instance,
158
 
                    AC_UD_VS_BASE_VERTEX_START_INSTANCE);
 
151
         add_ud_arg(args, 1, AC_ARG_INT, &args->ac.start_instance, AC_UD_VS_BASE_VERTEX_START_INSTANCE);
159
152
      }
160
153
   }
161
154
}
162
155
 
163
156
static void
164
 
declare_vs_input_vgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info *info,
165
 
                       struct radv_shader_args *args, bool merged_vs_tcs)
 
157
declare_vs_input_vgprs(enum amd_gfx_level gfx_level, const struct radv_shader_info *info, struct radv_shader_args *args,
 
158
                       bool merged_vs_tcs)
166
159
{
167
160
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.vertex_id);
168
 
   if (args->type != RADV_SHADER_TYPE_GS_COPY) {
 
161
   if (info->type != RADV_SHADER_TYPE_GS_COPY) {
169
162
      if (info->vs.as_ls || merged_vs_tcs) {
170
163
 
171
164
         if (gfx_level >= GFX11) {
215
208
}
216
209
 
217
210
static void
218
 
declare_streamout_sgprs(const struct radv_shader_info *info, struct radv_shader_args *args,
219
 
                        gl_shader_stage stage)
 
211
declare_streamout_sgprs(const struct radv_shader_info *info, struct radv_shader_args *args, gl_shader_stage stage)
220
212
{
221
213
   int i;
222
214
 
272
264
static void
273
265
declare_ps_input_vgprs(const struct radv_shader_info *info, struct radv_shader_args *args)
274
266
{
275
 
   unsigned spi_ps_input = info->ps.spi_ps_input;
276
 
 
277
267
   ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_sample);
278
268
   ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_center);
279
269
   ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_INT, &args->ac.persp_centroid);
291
281
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.sample_coverage);
292
282
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, NULL); /* fixed pt */
293
283
 
294
 
   if (args->remap_spi_ps_input) {
295
 
      /* LLVM optimizes away unused FS inputs and computes spi_ps_input_addr itself and then
296
 
       * communicates the results back via the ELF binary. Mirror what LLVM does by re-mapping the
297
 
       * VGPR arguments here.
298
 
       */
299
 
      for (unsigned i = 0, vgpr_arg = 0, vgpr_reg = 0; i < args->ac.arg_count; i++) {
300
 
         if (args->ac.args[i].file != AC_ARG_VGPR) {
301
 
            continue;
302
 
         }
303
 
 
304
 
         if (!(spi_ps_input & (1 << vgpr_arg))) {
305
 
            args->ac.args[i].skip = true;
306
 
         } else {
307
 
            args->ac.args[i].offset = vgpr_reg;
308
 
            vgpr_reg += args->ac.args[i].size;
309
 
         }
310
 
         vgpr_arg++;
311
 
      }
312
 
   }
 
284
   if (args->remap_spi_ps_input)
 
285
      ac_compact_ps_vgpr_args(&args->ac, info->ps.spi_ps_input);
313
286
}
314
287
 
315
288
static void
316
 
declare_ngg_sgprs(const struct radv_shader_info *info, struct radv_shader_args *args,
317
 
                  bool has_ngg_query, bool has_ngg_provoking_vtx)
 
289
declare_ngg_sgprs(const struct radv_shader_info *info, struct radv_shader_args *args, bool has_ngg_query,
 
290
                  bool has_ngg_provoking_vtx)
318
291
{
319
292
   if (has_ngg_query)
320
293
      add_ud_arg(args, 1, AC_ARG_INT, &args->ngg_query_state, AC_UD_NGG_QUERY_STATE);
332
305
}
333
306
 
334
307
static void
335
 
radv_init_shader_args(const struct radv_device *device, gl_shader_stage stage,
336
 
                      enum radv_shader_type type, struct radv_shader_args *args)
 
308
radv_init_shader_args(const struct radv_device *device, gl_shader_stage stage, struct radv_shader_args *args)
337
309
{
338
310
   memset(args, 0, sizeof(*args));
339
311
 
340
312
   args->explicit_scratch_args = !radv_use_llvm_for_stage(device, stage);
341
313
   args->remap_spi_ps_input = !radv_use_llvm_for_stage(device, stage);
342
314
   args->load_grid_size_from_user_sgpr = device->load_grid_size_from_user_sgpr;
343
 
   args->type = type;
344
315
 
345
316
   for (int i = 0; i < MAX_SETS; i++)
346
317
      args->user_sgprs_locs.descriptor_sets[i].sgpr_idx = -1;
351
322
void
352
323
radv_declare_rt_shader_args(enum amd_gfx_level gfx_level, struct radv_shader_args *args)
353
324
{
354
 
   add_ud_arg(args, 2, AC_ARG_CONST_PTR, &args->ac.rt_shader_pc, AC_UD_SCRATCH_RING_OFFSETS);
355
 
   add_ud_arg(args, 1, AC_ARG_CONST_PTR_PTR, &args->descriptor_sets[0],
356
 
              AC_UD_INDIRECT_DESCRIPTOR_SETS);
 
325
   add_ud_arg(args, 2, AC_ARG_CONST_PTR, &args->ac.rt.shader_pc, AC_UD_SCRATCH_RING_OFFSETS);
 
326
   add_ud_arg(args, 1, AC_ARG_CONST_PTR_PTR, &args->descriptor_sets[0], AC_UD_INDIRECT_DESCRIPTOR_SETS);
357
327
   ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_CONST_PTR, &args->ac.push_constants);
358
 
   ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ac.sbt_descriptors);
359
 
   ac_add_arg(&args->ac, AC_ARG_SGPR, 3, AC_ARG_INT, &args->ac.ray_launch_size);
 
328
   ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ac.rt.sbt_descriptors);
 
329
   ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_PTR, &args->ac.rt.traversal_shader);
 
330
   ac_add_arg(&args->ac, AC_ARG_SGPR, 3, AC_ARG_INT, &args->ac.rt.launch_size);
360
331
   if (gfx_level < GFX9) {
361
332
      ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);
362
333
      ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ac.ring_offsets);
363
334
   }
364
335
 
365
 
   ac_add_arg(&args->ac, AC_ARG_VGPR, 3, AC_ARG_INT, &args->ac.ray_launch_id);
366
 
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt_dynamic_callable_stack_base);
 
336
   ac_add_arg(&args->ac, AC_ARG_VGPR, 3, AC_ARG_INT, &args->ac.rt.launch_id);
 
337
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.dynamic_callable_stack_base);
 
338
   ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_CONST_PTR, &args->ac.rt.next_shader);
 
339
   ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_CONST_PTR, &args->ac.rt.shader_record);
 
340
 
 
341
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.payload_offset);
 
342
   ac_add_arg(&args->ac, AC_ARG_VGPR, 3, AC_ARG_FLOAT, &args->ac.rt.ray_origin);
 
343
   ac_add_arg(&args->ac, AC_ARG_VGPR, 3, AC_ARG_FLOAT, &args->ac.rt.ray_direction);
 
344
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.rt.ray_tmin);
 
345
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.rt.ray_tmax);
 
346
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.cull_mask_and_flags);
 
347
 
 
348
   ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_CONST_PTR, &args->ac.rt.accel_struct);
 
349
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.sbt_offset);
 
350
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.sbt_stride);
 
351
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.miss_index);
 
352
 
 
353
   ac_add_arg(&args->ac, AC_ARG_VGPR, 2, AC_ARG_CONST_PTR, &args->ac.rt.instance_addr);
 
354
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.primitive_id);
 
355
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.geometry_id_and_flags);
 
356
   ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->ac.rt.hit_kind);
 
357
}
 
358
 
 
359
static bool
 
360
radv_ps_needs_state_sgpr(const struct radv_shader_info *info, const struct radv_pipeline_key *key)
 
361
{
 
362
   if (info->ps.needs_sample_positions && key->dynamic_rasterization_samples)
 
363
      return true;
 
364
 
 
365
   if (key->dynamic_line_rast_mode)
 
366
      return true;
 
367
 
 
368
   if (info->ps.reads_sample_mask_in && (info->ps.uses_sample_shading || key->ps.sample_shading_enable))
 
369
      return true;
 
370
 
 
371
   /* For computing barycentrics when the primitive topology is unknown at compile time (GPL). */
 
372
   if (info->ps.load_rasterization_prim && key->unknown_rast_prim)
 
373
      return true;
 
374
 
 
375
   return false;
367
376
}
368
377
 
369
378
static void
370
379
declare_shader_args(const struct radv_device *device, const struct radv_pipeline_key *key,
371
 
                    const struct radv_shader_info *info, gl_shader_stage stage,
372
 
                    gl_shader_stage previous_stage, enum radv_shader_type type,
 
380
                    const struct radv_shader_info *info, gl_shader_stage stage, gl_shader_stage previous_stage,
373
381
                    struct radv_shader_args *args, struct user_sgpr_info *user_sgpr_info)
374
382
{
375
383
   const enum amd_gfx_level gfx_level = device->physical_device->rad_info.gfx_level;
376
384
   bool needs_view_index = info->uses_view_index;
377
385
   bool has_ngg_query = info->has_ngg_prim_query || info->has_ngg_xfb_query ||
378
386
                        (stage == MESA_SHADER_GEOMETRY && info->gs.has_ngg_pipeline_stat_query);
379
 
   bool has_ngg_provoking_vtx = (stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_GEOMETRY) &&
380
 
                                key->dynamic_provoking_vtx_mode;
 
387
   bool has_ngg_provoking_vtx =
 
388
      (stage == MESA_SHADER_VERTEX || stage == MESA_SHADER_GEOMETRY) && key->dynamic_provoking_vtx_mode;
381
389
 
382
390
   if (gfx_level >= GFX10 && info->is_ngg && stage != MESA_SHADER_GEOMETRY) {
383
391
      /* Handle all NGG shaders as GS to simplify the code here. */
385
393
      stage = MESA_SHADER_GEOMETRY;
386
394
   }
387
395
 
388
 
   radv_init_shader_args(device, stage, type, args);
 
396
   radv_init_shader_args(device, stage, args);
389
397
 
390
398
   if (gl_shader_stage_is_rt(stage)) {
391
399
      radv_declare_rt_shader_args(gfx_level, args);
394
402
 
395
403
   add_ud_arg(args, 2, AC_ARG_CONST_DESC_PTR, &args->ac.ring_offsets, AC_UD_SCRATCH_RING_OFFSETS);
396
404
   if (stage == MESA_SHADER_TASK) {
397
 
      add_ud_arg(args, 2, AC_ARG_CONST_DESC_PTR, &args->task_ring_offsets,
398
 
                 AC_UD_CS_TASK_RING_OFFSETS);
 
405
      add_ud_arg(args, 2, AC_ARG_CONST_DESC_PTR, &args->task_ring_offsets, AC_UD_CS_TASK_RING_OFFSETS);
399
406
   }
400
407
 
401
408
   /* For merged shaders the user SGPRs start at 8, with 8 system SGPRs in front (including
421
428
      }
422
429
 
423
430
      if (info->cs.is_rt_shader) {
424
 
         add_ud_arg(args, 2, AC_ARG_CONST_DESC_PTR, &args->ac.sbt_descriptors,
425
 
                    AC_UD_CS_SBT_DESCRIPTORS);
426
 
         add_ud_arg(args, 2, AC_ARG_CONST_PTR, &args->ac.ray_launch_size_addr,
427
 
                    AC_UD_CS_RAY_LAUNCH_SIZE_ADDR);
428
 
         add_ud_arg(args, 2, AC_ARG_CONST_PTR, &args->ac.rt_traversal_shader_addr,
429
 
                    AC_UD_CS_TRAVERSAL_SHADER_ADDR);
430
 
         add_ud_arg(args, 1, AC_ARG_INT, &args->ac.rt_dynamic_callable_stack_base,
 
431
         add_ud_arg(args, 2, AC_ARG_CONST_DESC_PTR, &args->ac.rt.sbt_descriptors, AC_UD_CS_SBT_DESCRIPTORS);
 
432
         add_ud_arg(args, 2, AC_ARG_CONST_PTR, &args->ac.rt.traversal_shader, AC_UD_CS_TRAVERSAL_SHADER_ADDR);
 
433
         add_ud_arg(args, 2, AC_ARG_CONST_PTR, &args->ac.rt.launch_size_addr, AC_UD_CS_RAY_LAUNCH_SIZE_ADDR);
 
434
         add_ud_arg(args, 1, AC_ARG_INT, &args->ac.rt.dynamic_callable_stack_base,
431
435
                    AC_UD_CS_RAY_DYNAMIC_CALLABLE_STACK_BASE);
432
436
      }
433
437
 
659
663
         add_ud_arg(args, 1, AC_ARG_INT, &args->ps_epilog_pc, AC_UD_PS_EPILOG_PC);
660
664
      }
661
665
 
662
 
      if (info->ps.needs_sample_positions && key->dynamic_rasterization_samples) {
663
 
         add_ud_arg(args, 1, AC_ARG_INT, &args->ps_num_samples, AC_UD_PS_NUM_SAMPLES);
664
 
      }
 
666
      if (radv_ps_needs_state_sgpr(info, key))
 
667
         add_ud_arg(args, 1, AC_ARG_INT, &args->ps_state, AC_UD_PS_STATE);
665
668
 
666
669
      ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.prim_mask);
 
670
 
 
671
      if (info->ps.pops && gfx_level < GFX11) {
 
672
         ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.pops_collision_wave_id);
 
673
      }
 
674
 
 
675
      if (info->ps.load_provoking_vtx) {
 
676
         ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.load_provoking_vtx);
 
677
      }
 
678
 
667
679
      if (args->explicit_scratch_args && gfx_level < GFX11) {
668
680
         ac_add_arg(&args->ac, AC_ARG_SGPR, 1, AC_ARG_INT, &args->ac.scratch_offset);
669
681
      }
677
689
 
678
690
void
679
691
radv_declare_shader_args(const struct radv_device *device, const struct radv_pipeline_key *key,
680
 
                         const struct radv_shader_info *info, gl_shader_stage stage,
681
 
                         gl_shader_stage previous_stage, enum radv_shader_type type,
 
692
                         const struct radv_shader_info *info, gl_shader_stage stage, gl_shader_stage previous_stage,
682
693
                         struct radv_shader_args *args)
683
694
{
684
 
   declare_shader_args(device, key, info, stage, previous_stage, type, args, NULL);
 
695
   declare_shader_args(device, key, info, stage, previous_stage, args, NULL);
685
696
 
686
697
   if (gl_shader_stage_is_rt(stage))
687
698
      return;
691
702
      num_user_sgprs++;
692
703
 
693
704
   const enum amd_gfx_level gfx_level = device->physical_device->rad_info.gfx_level;
694
 
   uint32_t available_sgprs =
695
 
      gfx_level >= GFX9 && stage != MESA_SHADER_COMPUTE && stage != MESA_SHADER_TASK ? 32 : 16;
 
705
   uint32_t available_sgprs = gfx_level >= GFX9 && stage != MESA_SHADER_COMPUTE && stage != MESA_SHADER_TASK ? 32 : 16;
696
706
   uint32_t remaining_sgprs = available_sgprs - num_user_sgprs;
697
707
 
698
708
   struct user_sgpr_info user_sgpr_info = {
710
720
 
711
721
   allocate_inline_push_consts(info, &user_sgpr_info);
712
722
 
713
 
   declare_shader_args(device, key, info, stage, previous_stage, type, args, &user_sgpr_info);
 
723
   declare_shader_args(device, key, info, stage, previous_stage, args, &user_sgpr_info);
714
724
}
715
725
 
716
726
void
719
729
{
720
730
   const enum amd_gfx_level gfx_level = device->physical_device->rad_info.gfx_level;
721
731
 
722
 
   radv_init_shader_args(device, MESA_SHADER_FRAGMENT, RADV_SHADER_TYPE_DEFAULT, args);
 
732
   radv_init_shader_args(device, MESA_SHADER_FRAGMENT, args);
723
733
 
724
734
   ac_add_arg(&args->ac, AC_ARG_SGPR, 2, AC_ARG_CONST_DESC_PTR, &args->ac.ring_offsets);
725
735
   if (gfx_level < GFX11)