2 * Copyright © 2019 Valve Corporation.
3 * Copyright © 2016 Red Hat.
4 * Copyright © 2016 Bas Nieuwenhuizen
6 * based in part on anv driver which is:
7 * Copyright © 2015 Intel Corporation
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice (including the next
17 * paragraph) shall be included in all copies or substantial portions of the
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
29 #include "radv_private.h"
30 #include "radv_shader.h"
31 #include "radv_shader_args.h"
34 set_loc(struct radv_userdata_info
*ud_info
, uint8_t *sgpr_idx
,
37 ud_info
->sgpr_idx
= *sgpr_idx
;
38 ud_info
->num_sgprs
= num_sgprs
;
39 *sgpr_idx
+= num_sgprs
;
43 set_loc_shader(struct radv_shader_args
*args
, int idx
, uint8_t *sgpr_idx
,
46 struct radv_userdata_info
*ud_info
=
47 &args
->shader_info
->user_sgprs_locs
.shader_data
[idx
];
50 set_loc(ud_info
, sgpr_idx
, num_sgprs
);
54 set_loc_shader_ptr(struct radv_shader_args
*args
, int idx
, uint8_t *sgpr_idx
)
56 bool use_32bit_pointers
= idx
!= AC_UD_SCRATCH_RING_OFFSETS
;
58 set_loc_shader(args
, idx
, sgpr_idx
, use_32bit_pointers
? 1 : 2);
62 set_loc_desc(struct radv_shader_args
*args
, int idx
, uint8_t *sgpr_idx
)
64 struct radv_userdata_locations
*locs
=
65 &args
->shader_info
->user_sgprs_locs
;
66 struct radv_userdata_info
*ud_info
= &locs
->descriptor_sets
[idx
];
69 set_loc(ud_info
, sgpr_idx
, 1);
71 locs
->descriptor_sets_enabled
|= 1 << idx
;
74 struct user_sgpr_info
{
75 bool need_ring_offsets
;
76 bool indirect_all_descriptor_sets
;
77 uint8_t remaining_sgprs
;
80 static bool needs_view_index_sgpr(struct radv_shader_args
*args
,
81 gl_shader_stage stage
)
84 case MESA_SHADER_VERTEX
:
85 if (args
->shader_info
->needs_multiview_view_index
||
86 (!args
->options
->key
.vs_common_out
.as_es
&& !args
->options
->key
.vs_common_out
.as_ls
&& args
->options
->key
.has_multiview_view_index
))
89 case MESA_SHADER_TESS_EVAL
:
90 if (args
->shader_info
->needs_multiview_view_index
|| (!args
->options
->key
.vs_common_out
.as_es
&& args
->options
->key
.has_multiview_view_index
))
93 case MESA_SHADER_GEOMETRY
:
94 case MESA_SHADER_TESS_CTRL
:
95 if (args
->shader_info
->needs_multiview_view_index
)
105 count_vs_user_sgprs(struct radv_shader_args
*args
)
109 if (args
->shader_info
->vs
.has_vertex_buffers
)
111 count
+= args
->shader_info
->vs
.needs_draw_id
? 3 : 2;
116 static void allocate_inline_push_consts(struct radv_shader_args
*args
,
117 struct user_sgpr_info
*user_sgpr_info
)
119 uint8_t remaining_sgprs
= user_sgpr_info
->remaining_sgprs
;
121 /* Only supported if shaders use push constants. */
122 if (args
->shader_info
->min_push_constant_used
== UINT8_MAX
)
125 /* Only supported if shaders don't have indirect push constants. */
126 if (args
->shader_info
->has_indirect_push_constants
)
129 /* Only supported for 32-bit push constants. */
130 if (!args
->shader_info
->has_only_32bit_push_constants
)
133 uint8_t num_push_consts
=
134 (args
->shader_info
->max_push_constant_used
-
135 args
->shader_info
->min_push_constant_used
) / 4;
137 /* Check if the number of user SGPRs is large enough. */
138 if (num_push_consts
< remaining_sgprs
) {
139 args
->shader_info
->num_inline_push_consts
= num_push_consts
;
141 args
->shader_info
->num_inline_push_consts
= remaining_sgprs
;
144 /* Clamp to the maximum number of allowed inlined push constants. */
145 if (args
->shader_info
->num_inline_push_consts
> AC_MAX_INLINE_PUSH_CONSTS
)
146 args
->shader_info
->num_inline_push_consts
= AC_MAX_INLINE_PUSH_CONSTS
;
148 if (args
->shader_info
->num_inline_push_consts
== num_push_consts
&&
149 !args
->shader_info
->loads_dynamic_offsets
) {
150 /* Disable the default push constants path if all constants are
151 * inlined and if shaders don't use dynamic descriptors.
153 args
->shader_info
->loads_push_constants
= false;
156 args
->shader_info
->base_inline_push_consts
=
157 args
->shader_info
->min_push_constant_used
/ 4;
160 static void allocate_user_sgprs(struct radv_shader_args
*args
,
161 gl_shader_stage stage
,
162 bool has_previous_stage
,
163 gl_shader_stage previous_stage
,
164 bool needs_view_index
,
165 struct user_sgpr_info
*user_sgpr_info
)
167 uint8_t user_sgpr_count
= 0;
169 memset(user_sgpr_info
, 0, sizeof(struct user_sgpr_info
));
171 /* until we sort out scratch/global buffers always assign ring offsets for gs/vs/es */
172 if (stage
== MESA_SHADER_GEOMETRY
||
173 stage
== MESA_SHADER_VERTEX
||
174 stage
== MESA_SHADER_TESS_CTRL
||
175 stage
== MESA_SHADER_TESS_EVAL
||
176 args
->is_gs_copy_shader
)
177 user_sgpr_info
->need_ring_offsets
= true;
179 if (stage
== MESA_SHADER_FRAGMENT
&&
180 args
->shader_info
->ps
.needs_sample_positions
)
181 user_sgpr_info
->need_ring_offsets
= true;
183 /* 2 user sgprs will nearly always be allocated for scratch/rings */
184 if (args
->options
->supports_spill
|| user_sgpr_info
->need_ring_offsets
) {
185 user_sgpr_count
+= 2;
189 case MESA_SHADER_COMPUTE
:
190 if (args
->shader_info
->cs
.uses_grid_size
)
191 user_sgpr_count
+= 3;
193 case MESA_SHADER_FRAGMENT
:
194 user_sgpr_count
+= args
->shader_info
->ps
.needs_sample_positions
;
196 case MESA_SHADER_VERTEX
:
197 if (!args
->is_gs_copy_shader
)
198 user_sgpr_count
+= count_vs_user_sgprs(args
);
200 case MESA_SHADER_TESS_CTRL
:
201 if (has_previous_stage
) {
202 if (previous_stage
== MESA_SHADER_VERTEX
)
203 user_sgpr_count
+= count_vs_user_sgprs(args
);
206 case MESA_SHADER_TESS_EVAL
:
208 case MESA_SHADER_GEOMETRY
:
209 if (has_previous_stage
) {
210 if (previous_stage
== MESA_SHADER_VERTEX
) {
211 user_sgpr_count
+= count_vs_user_sgprs(args
);
219 if (needs_view_index
)
222 if (args
->shader_info
->loads_push_constants
)
225 if (args
->shader_info
->so
.num_outputs
)
228 uint32_t available_sgprs
= args
->options
->chip_class
>= GFX9
&& stage
!= MESA_SHADER_COMPUTE
? 32 : 16;
229 uint32_t remaining_sgprs
= available_sgprs
- user_sgpr_count
;
230 uint32_t num_desc_set
=
231 util_bitcount(args
->shader_info
->desc_set_used_mask
);
233 if (remaining_sgprs
< num_desc_set
) {
234 user_sgpr_info
->indirect_all_descriptor_sets
= true;
235 user_sgpr_info
->remaining_sgprs
= remaining_sgprs
- 1;
237 user_sgpr_info
->remaining_sgprs
= remaining_sgprs
- num_desc_set
;
240 allocate_inline_push_consts(args
, user_sgpr_info
);
244 declare_global_input_sgprs(struct radv_shader_args
*args
,
245 const struct user_sgpr_info
*user_sgpr_info
)
247 /* 1 for each descriptor set */
248 if (!user_sgpr_info
->indirect_all_descriptor_sets
) {
249 uint32_t mask
= args
->shader_info
->desc_set_used_mask
;
252 int i
= u_bit_scan(&mask
);
254 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_CONST_PTR
,
255 &args
->descriptor_sets
[i
]);
258 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_CONST_PTR_PTR
,
259 &args
->descriptor_sets
[0]);
262 if (args
->shader_info
->loads_push_constants
) {
263 /* 1 for push constants and dynamic descriptors */
264 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_CONST_PTR
,
265 &args
->ac
.push_constants
);
268 for (unsigned i
= 0; i
< args
->shader_info
->num_inline_push_consts
; i
++) {
269 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
270 &args
->ac
.inline_push_consts
[i
]);
272 args
->ac
.num_inline_push_consts
= args
->shader_info
->num_inline_push_consts
;
273 args
->ac
.base_inline_push_consts
= args
->shader_info
->base_inline_push_consts
;
275 if (args
->shader_info
->so
.num_outputs
) {
276 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_CONST_DESC_PTR
,
277 &args
->streamout_buffers
);
282 declare_vs_specific_input_sgprs(struct radv_shader_args
*args
,
283 gl_shader_stage stage
,
284 bool has_previous_stage
,
285 gl_shader_stage previous_stage
)
287 if (!args
->is_gs_copy_shader
&&
288 (stage
== MESA_SHADER_VERTEX
||
289 (has_previous_stage
&& previous_stage
== MESA_SHADER_VERTEX
))) {
290 if (args
->shader_info
->vs
.has_vertex_buffers
) {
291 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_CONST_DESC_PTR
,
292 &args
->vertex_buffers
);
294 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->ac
.base_vertex
);
295 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->ac
.start_instance
);
296 if (args
->shader_info
->vs
.needs_draw_id
) {
297 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->ac
.draw_id
);
303 declare_vs_input_vgprs(struct radv_shader_args
*args
)
305 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.vertex_id
);
306 if (!args
->is_gs_copy_shader
) {
307 if (args
->options
->key
.vs_common_out
.as_ls
) {
308 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->rel_auto_id
);
309 if (args
->options
->chip_class
>= GFX10
) {
310 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, NULL
); /* user vgpr */
311 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.instance_id
);
313 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.instance_id
);
314 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, NULL
); /* unused */
317 if (args
->options
->chip_class
>= GFX10
) {
318 if (args
->options
->key
.vs_common_out
.as_ngg
) {
319 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, NULL
); /* user vgpr */
320 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, NULL
); /* user vgpr */
321 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.instance_id
);
323 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, NULL
); /* unused */
324 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->vs_prim_id
);
325 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.instance_id
);
328 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.instance_id
);
329 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->vs_prim_id
);
330 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, NULL
); /* unused */
337 declare_streamout_sgprs(struct radv_shader_args
*args
, gl_shader_stage stage
)
341 if (args
->options
->use_ngg_streamout
) {
342 if (stage
== MESA_SHADER_TESS_EVAL
)
343 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
);
347 /* Streamout SGPRs. */
348 if (args
->shader_info
->so
.num_outputs
) {
349 assert(stage
== MESA_SHADER_VERTEX
||
350 stage
== MESA_SHADER_TESS_EVAL
);
352 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->streamout_config
);
353 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->streamout_write_idx
);
354 } else if (stage
== MESA_SHADER_TESS_EVAL
) {
355 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
);
358 /* A streamout buffer offset is loaded if the stride is non-zero. */
359 for (i
= 0; i
< 4; i
++) {
360 if (!args
->shader_info
->so
.strides
[i
])
363 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->streamout_offset
[i
]);
368 declare_tes_input_vgprs(struct radv_shader_args
*args
)
370 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_FLOAT
, &args
->tes_u
);
371 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_FLOAT
, &args
->tes_v
);
372 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->tes_rel_patch_id
);
373 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.tes_patch_id
);
377 set_global_input_locs(struct radv_shader_args
*args
,
378 const struct user_sgpr_info
*user_sgpr_info
,
379 uint8_t *user_sgpr_idx
)
381 uint32_t mask
= args
->shader_info
->desc_set_used_mask
;
383 if (!user_sgpr_info
->indirect_all_descriptor_sets
) {
385 int i
= u_bit_scan(&mask
);
387 set_loc_desc(args
, i
, user_sgpr_idx
);
390 set_loc_shader_ptr(args
, AC_UD_INDIRECT_DESCRIPTOR_SETS
,
393 args
->shader_info
->need_indirect_descriptor_sets
= true;
396 if (args
->shader_info
->loads_push_constants
) {
397 set_loc_shader_ptr(args
, AC_UD_PUSH_CONSTANTS
, user_sgpr_idx
);
400 if (args
->shader_info
->num_inline_push_consts
) {
401 set_loc_shader(args
, AC_UD_INLINE_PUSH_CONSTANTS
, user_sgpr_idx
,
402 args
->shader_info
->num_inline_push_consts
);
405 if (args
->streamout_buffers
.used
) {
406 set_loc_shader_ptr(args
, AC_UD_STREAMOUT_BUFFERS
,
412 set_vs_specific_input_locs(struct radv_shader_args
*args
,
413 gl_shader_stage stage
, bool has_previous_stage
,
414 gl_shader_stage previous_stage
,
415 uint8_t *user_sgpr_idx
)
417 if (!args
->is_gs_copy_shader
&&
418 (stage
== MESA_SHADER_VERTEX
||
419 (has_previous_stage
&& previous_stage
== MESA_SHADER_VERTEX
))) {
420 if (args
->shader_info
->vs
.has_vertex_buffers
) {
421 set_loc_shader_ptr(args
, AC_UD_VS_VERTEX_BUFFERS
,
426 if (args
->shader_info
->vs
.needs_draw_id
)
429 set_loc_shader(args
, AC_UD_VS_BASE_VERTEX_START_INSTANCE
,
430 user_sgpr_idx
, vs_num
);
434 /* Returns whether the stage is a stage that can be directly before the GS */
435 static bool is_pre_gs_stage(gl_shader_stage stage
)
437 return stage
== MESA_SHADER_VERTEX
|| stage
== MESA_SHADER_TESS_EVAL
;
441 radv_declare_shader_args(struct radv_shader_args
*args
,
442 gl_shader_stage stage
,
443 bool has_previous_stage
,
444 gl_shader_stage previous_stage
)
446 struct user_sgpr_info user_sgpr_info
;
447 bool needs_view_index
= needs_view_index_sgpr(args
, stage
);
449 if (args
->options
->chip_class
>= GFX10
) {
450 if (is_pre_gs_stage(stage
) && args
->options
->key
.vs_common_out
.as_ngg
) {
451 /* On GFX10, VS is merged into GS for NGG. */
452 previous_stage
= stage
;
453 stage
= MESA_SHADER_GEOMETRY
;
454 has_previous_stage
= true;
458 for (int i
= 0; i
< MAX_SETS
; i
++)
459 args
->shader_info
->user_sgprs_locs
.descriptor_sets
[i
].sgpr_idx
= -1;
460 for (int i
= 0; i
< AC_UD_MAX_UD
; i
++)
461 args
->shader_info
->user_sgprs_locs
.shader_data
[i
].sgpr_idx
= -1;
464 allocate_user_sgprs(args
, stage
, has_previous_stage
,
465 previous_stage
, needs_view_index
, &user_sgpr_info
);
467 if (user_sgpr_info
.need_ring_offsets
&& !args
->options
->supports_spill
) {
468 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 2, AC_ARG_CONST_DESC_PTR
,
469 &args
->ring_offsets
);
473 case MESA_SHADER_COMPUTE
:
474 declare_global_input_sgprs(args
, &user_sgpr_info
);
476 if (args
->shader_info
->cs
.uses_grid_size
) {
477 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 3, AC_ARG_INT
,
478 &args
->ac
.num_work_groups
);
481 for (int i
= 0; i
< 3; i
++) {
482 if (args
->shader_info
->cs
.uses_block_id
[i
]) {
483 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
484 &args
->ac
.workgroup_ids
[i
]);
488 if (args
->shader_info
->cs
.uses_local_invocation_idx
) {
489 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
493 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 3, AC_ARG_INT
,
494 &args
->ac
.local_invocation_ids
);
496 case MESA_SHADER_VERTEX
:
497 declare_global_input_sgprs(args
, &user_sgpr_info
);
499 declare_vs_specific_input_sgprs(args
, stage
, has_previous_stage
,
502 if (needs_view_index
) {
503 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
504 &args
->ac
.view_index
);
507 if (args
->options
->key
.vs_common_out
.as_es
) {
508 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
509 &args
->es2gs_offset
);
510 } else if (args
->options
->key
.vs_common_out
.as_ls
) {
511 /* no extra parameters */
513 declare_streamout_sgprs(args
, stage
);
516 declare_vs_input_vgprs(args
);
518 case MESA_SHADER_TESS_CTRL
:
519 if (has_previous_stage
) {
520 // First 6 system regs
521 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->oc_lds
);
522 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
523 &args
->merged_wave_info
);
524 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
525 &args
->tess_factor_offset
);
527 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
); // scratch offset
528 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
); // unknown
529 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
); // unknown
531 declare_global_input_sgprs(args
, &user_sgpr_info
);
533 declare_vs_specific_input_sgprs(args
, stage
,
537 if (needs_view_index
) {
538 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
539 &args
->ac
.view_index
);
542 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
543 &args
->ac
.tcs_patch_id
);
544 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
545 &args
->ac
.tcs_rel_ids
);
547 declare_vs_input_vgprs(args
);
549 declare_global_input_sgprs(args
, &user_sgpr_info
);
551 if (needs_view_index
) {
552 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
553 &args
->ac
.view_index
);
556 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->oc_lds
);
557 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
558 &args
->tess_factor_offset
);
559 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
560 &args
->ac
.tcs_patch_id
);
561 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
562 &args
->ac
.tcs_rel_ids
);
565 case MESA_SHADER_TESS_EVAL
:
566 declare_global_input_sgprs(args
, &user_sgpr_info
);
568 if (needs_view_index
)
569 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
570 &args
->ac
.view_index
);
572 if (args
->options
->key
.vs_common_out
.as_es
) {
573 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->oc_lds
);
574 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
);
575 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
576 &args
->es2gs_offset
);
578 declare_streamout_sgprs(args
, stage
);
579 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->oc_lds
);
581 declare_tes_input_vgprs(args
);
583 case MESA_SHADER_GEOMETRY
:
584 if (has_previous_stage
) {
585 // First 6 system regs
586 if (args
->options
->key
.vs_common_out
.as_ngg
) {
587 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
590 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
591 &args
->gs2vs_offset
);
594 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
595 &args
->merged_wave_info
);
596 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->oc_lds
);
598 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
); // scratch offset
599 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
); // unknown
600 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, NULL
); // unknown
602 declare_global_input_sgprs(args
, &user_sgpr_info
);
604 if (previous_stage
!= MESA_SHADER_TESS_EVAL
) {
605 declare_vs_specific_input_sgprs(args
, stage
,
610 if (needs_view_index
) {
611 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
612 &args
->ac
.view_index
);
615 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
616 &args
->gs_vtx_offset
[0]);
617 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
618 &args
->gs_vtx_offset
[2]);
619 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
620 &args
->ac
.gs_prim_id
);
621 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
622 &args
->ac
.gs_invocation_id
);
623 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
624 &args
->gs_vtx_offset
[4]);
626 if (previous_stage
== MESA_SHADER_VERTEX
) {
627 declare_vs_input_vgprs(args
);
629 declare_tes_input_vgprs(args
);
632 declare_global_input_sgprs(args
, &user_sgpr_info
);
634 if (needs_view_index
) {
635 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
,
636 &args
->ac
.view_index
);
639 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->gs2vs_offset
);
640 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->gs_wave_id
);
641 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
642 &args
->gs_vtx_offset
[0]);
643 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
644 &args
->gs_vtx_offset
[1]);
645 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
646 &args
->ac
.gs_prim_id
);
647 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
648 &args
->gs_vtx_offset
[2]);
649 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
650 &args
->gs_vtx_offset
[3]);
651 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
652 &args
->gs_vtx_offset
[4]);
653 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
654 &args
->gs_vtx_offset
[5]);
655 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
,
656 &args
->ac
.gs_invocation_id
);
659 case MESA_SHADER_FRAGMENT
:
660 declare_global_input_sgprs(args
, &user_sgpr_info
);
662 ac_add_arg(&args
->ac
, AC_ARG_SGPR
, 1, AC_ARG_INT
, &args
->ac
.prim_mask
);
663 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 2, AC_ARG_INT
, &args
->ac
.persp_sample
);
664 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 2, AC_ARG_INT
, &args
->ac
.persp_center
);
665 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 2, AC_ARG_INT
, &args
->ac
.persp_centroid
);
666 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 3, AC_ARG_INT
, NULL
); /* persp pull model */
667 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 2, AC_ARG_INT
, &args
->ac
.linear_sample
);
668 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 2, AC_ARG_INT
, &args
->ac
.linear_center
);
669 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 2, AC_ARG_INT
, &args
->ac
.linear_centroid
);
670 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_FLOAT
, NULL
); /* line stipple tex */
671 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_FLOAT
, &args
->ac
.frag_pos
[0]);
672 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_FLOAT
, &args
->ac
.frag_pos
[1]);
673 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_FLOAT
, &args
->ac
.frag_pos
[2]);
674 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_FLOAT
, &args
->ac
.frag_pos
[3]);
675 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.front_face
);
676 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.ancillary
);
677 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, &args
->ac
.sample_coverage
);
678 ac_add_arg(&args
->ac
, AC_ARG_VGPR
, 1, AC_ARG_INT
, NULL
); /* fixed pt */
681 unreachable("Shader stage not implemented");
684 args
->shader_info
->num_input_vgprs
= 0;
685 args
->shader_info
->num_input_sgprs
= args
->options
->supports_spill
? 2 : 0;
686 args
->shader_info
->num_input_sgprs
+= args
->ac
.num_sgprs_used
;
688 if (stage
!= MESA_SHADER_FRAGMENT
)
689 args
->shader_info
->num_input_vgprs
= args
->ac
.num_vgprs_used
;
691 uint8_t user_sgpr_idx
= 0;
693 if (args
->options
->supports_spill
|| user_sgpr_info
.need_ring_offsets
) {
694 set_loc_shader_ptr(args
, AC_UD_SCRATCH_RING_OFFSETS
,
698 /* For merged shaders the user SGPRs start at 8, with 8 system SGPRs in front (including
699 * the rw_buffers at s0/s1. With user SGPR0 = s8, lets restart the count from 0 */
700 if (has_previous_stage
)
703 set_global_input_locs(args
, &user_sgpr_info
, &user_sgpr_idx
);
706 case MESA_SHADER_COMPUTE
:
707 if (args
->shader_info
->cs
.uses_grid_size
) {
708 set_loc_shader(args
, AC_UD_CS_GRID_SIZE
,
712 case MESA_SHADER_VERTEX
:
713 set_vs_specific_input_locs(args
, stage
, has_previous_stage
,
714 previous_stage
, &user_sgpr_idx
);
715 if (args
->ac
.view_index
.used
)
716 set_loc_shader(args
, AC_UD_VIEW_INDEX
, &user_sgpr_idx
, 1);
718 case MESA_SHADER_TESS_CTRL
:
719 set_vs_specific_input_locs(args
, stage
, has_previous_stage
,
720 previous_stage
, &user_sgpr_idx
);
721 if (args
->ac
.view_index
.used
)
722 set_loc_shader(args
, AC_UD_VIEW_INDEX
, &user_sgpr_idx
, 1);
724 case MESA_SHADER_TESS_EVAL
:
725 if (args
->ac
.view_index
.used
)
726 set_loc_shader(args
, AC_UD_VIEW_INDEX
, &user_sgpr_idx
, 1);
728 case MESA_SHADER_GEOMETRY
:
729 if (has_previous_stage
) {
730 if (previous_stage
== MESA_SHADER_VERTEX
)
731 set_vs_specific_input_locs(args
, stage
,
736 if (args
->ac
.view_index
.used
)
737 set_loc_shader(args
, AC_UD_VIEW_INDEX
, &user_sgpr_idx
, 1);
739 case MESA_SHADER_FRAGMENT
:
742 unreachable("Shader stage not implemented");
745 args
->shader_info
->num_user_sgprs
= user_sgpr_idx
;