radv/shader_info: rename gs_ring_info -> legacy_gs_info and use union with ngg_info

Reduces the size of radv_shader_info from 784 bytes to 760 bytes.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37931>
This commit is contained in:
Daniel Schürmann 2025-10-16 15:50:28 +02:00
parent 9b34da3da8
commit e1bcbbf3dd
6 changed files with 23 additions and 16 deletions

View file

@ -243,7 +243,7 @@ lower_abi_instr(nir_builder *b, nir_intrinsic_instr *intrin, void *state)
replacement = ac_nir_load_arg(b, &s->args->ac, s->args->vgt_esgs_ring_itemsize); replacement = ac_nir_load_arg(b, &s->args->ac, s->args->vgt_esgs_ring_itemsize);
} else { } else {
const unsigned stride = const unsigned stride =
s->info->is_ngg ? s->info->ngg_info.vgt_esgs_ring_itemsize : s->info->gs_ring_info.esgs_itemsize; s->info->is_ngg ? s->info->ngg_info.vgt_esgs_ring_itemsize : s->info->legacy_gs_info.esgs_itemsize;
replacement = nir_imm_int(b, stride); replacement = nir_imm_int(b, stride);
} }
break; break;

View file

@ -30,7 +30,7 @@ radv_calculate_lds_size(const struct radv_shader_info *radv, const enum amd_gfx_
if (radv->is_ngg) if (radv->is_ngg)
lds_size = radv->nir_shared_size; lds_size = radv->nir_shared_size;
else if (gfx_level >= GFX9 && radv->stage == MESA_SHADER_GEOMETRY) else if (gfx_level >= GFX9 && radv->stage == MESA_SHADER_GEOMETRY)
lds_size = radv->gs_ring_info.lds_size; lds_size = radv->legacy_gs_info.lds_size;
else if (radv->stage == MESA_SHADER_TESS_CTRL) else if (radv->stage == MESA_SHADER_TESS_CTRL)
lds_size = radv->tcs.lds_size; /* only used by stats */ lds_size = radv->tcs.lds_size; /* only used by stats */
else else

View file

@ -3313,7 +3313,7 @@ radv_emit_hw_gs(struct radv_cmd_buffer *cmd_buffer, const struct radv_shader *gs
{ {
const struct radv_device *device = radv_cmd_buffer_device(cmd_buffer); const struct radv_device *device = radv_cmd_buffer_device(cmd_buffer);
const struct radv_physical_device *pdev = radv_device_physical(device); const struct radv_physical_device *pdev = radv_device_physical(device);
const struct radv_legacy_gs_info *gs_state = &gs->info.gs_ring_info; const struct radv_legacy_gs_info *gs_state = &gs->info.legacy_gs_info;
struct radv_cmd_stream *cs = cmd_buffer->cs; struct radv_cmd_stream *cs = cmd_buffer->cs;
const uint64_t va = radv_shader_get_va(gs); const uint64_t va = radv_shader_get_va(gs);
@ -7005,7 +7005,8 @@ gfx10_emit_ge_cntl(struct radv_cmd_buffer *cmd_buffer)
break_wave_at_eoi = true; break_wave_at_eoi = true;
} }
} else if (radv_cmdbuf_has_stage(cmd_buffer, MESA_SHADER_GEOMETRY)) { } else if (radv_cmdbuf_has_stage(cmd_buffer, MESA_SHADER_GEOMETRY)) {
const struct radv_legacy_gs_info *gs_state = &cmd_buffer->state.shaders[MESA_SHADER_GEOMETRY]->info.gs_ring_info; const struct radv_legacy_gs_info *gs_state =
&cmd_buffer->state.shaders[MESA_SHADER_GEOMETRY]->info.legacy_gs_info;
primgroup_size = gs_state->gs_prims_per_subgroup; primgroup_size = gs_state->gs_prims_per_subgroup;
} else { } else {
primgroup_size = 128; /* recommended without a GS and tess */ primgroup_size = 128; /* recommended without a GS and tess */
@ -8364,8 +8365,12 @@ radv_bind_geometry_shader(struct radv_cmd_buffer *cmd_buffer, const struct radv_
{ {
radv_bind_pre_rast_shader(cmd_buffer, gs); radv_bind_pre_rast_shader(cmd_buffer, gs);
cmd_buffer->esgs_ring_size_needed = MAX2(cmd_buffer->esgs_ring_size_needed, gs->info.gs_ring_info.esgs_ring_size); if (!gs->info.is_ngg) {
cmd_buffer->gsvs_ring_size_needed = MAX2(cmd_buffer->gsvs_ring_size_needed, gs->info.gs_ring_info.gsvs_ring_size); cmd_buffer->esgs_ring_size_needed =
MAX2(cmd_buffer->esgs_ring_size_needed, gs->info.legacy_gs_info.esgs_ring_size);
cmd_buffer->gsvs_ring_size_needed =
MAX2(cmd_buffer->gsvs_ring_size_needed, gs->info.legacy_gs_info.gsvs_ring_size);
}
/* Re-emit the VS prolog when the geometry shader is compiled separately because shader configs /* Re-emit the VS prolog when the geometry shader is compiled separately because shader configs
* are combined and need to be updated. * are combined and need to be updated.

View file

@ -1627,14 +1627,14 @@ radv_precompute_registers_hw_gs(struct radv_device *device, struct radv_shader_b
const struct radv_physical_device *pdev = radv_device_physical(device); const struct radv_physical_device *pdev = radv_device_physical(device);
struct radv_shader_info *info = &binary->info; struct radv_shader_info *info = &binary->info;
info->regs.gs.vgt_esgs_ring_itemsize = info->gs_ring_info.esgs_itemsize; info->regs.gs.vgt_esgs_ring_itemsize = info->legacy_gs_info.esgs_itemsize;
info->regs.gs.vgt_gs_max_prims_per_subgroup = info->regs.gs.vgt_gs_max_prims_per_subgroup =
S_028A94_MAX_PRIMS_PER_SUBGROUP(info->gs_ring_info.gs_inst_prims_in_subgroup); S_028A94_MAX_PRIMS_PER_SUBGROUP(info->legacy_gs_info.gs_inst_prims_in_subgroup);
info->regs.vgt_gs_onchip_cntl = S_028A44_ES_VERTS_PER_SUBGRP(info->gs_ring_info.es_verts_per_subgroup) | info->regs.vgt_gs_onchip_cntl = S_028A44_ES_VERTS_PER_SUBGRP(info->legacy_gs_info.es_verts_per_subgroup) |
S_028A44_GS_PRIMS_PER_SUBGRP(info->gs_ring_info.gs_prims_per_subgroup) | S_028A44_GS_PRIMS_PER_SUBGRP(info->legacy_gs_info.gs_prims_per_subgroup) |
S_028A44_GS_INST_PRIMS_IN_SUBGRP(info->gs_ring_info.gs_inst_prims_in_subgroup); S_028A44_GS_INST_PRIMS_IN_SUBGRP(info->legacy_gs_info.gs_inst_prims_in_subgroup);
const uint32_t gs_max_out_vertices = info->gs.vertices_out; const uint32_t gs_max_out_vertices = info->gs.vertices_out;
const uint8_t max_stream = info->gs.num_components_per_stream[3] ? 3 const uint8_t max_stream = info->gs.num_components_per_stream[3] ? 3
@ -2454,7 +2454,7 @@ radv_shader_combine_cfg_vs_gs(const struct radv_device *device, const struct rad
if (gs->info.is_ngg) { if (gs->info.is_ngg) {
lds_size = gs->info.ngg_info.lds_size; lds_size = gs->info.ngg_info.lds_size;
} else { } else {
lds_size = gs->info.gs_ring_info.lds_size; lds_size = gs->info.legacy_gs_info.lds_size;
} }
rsrc2 |= S_00B22C_LDS_SIZE(ac_shader_encode_lds_size(lds_size, pdev->info.gfx_level, MESA_SHADER_VERTEX)); rsrc2 |= S_00B22C_LDS_SIZE(ac_shader_encode_lds_size(lds_size, pdev->info.gfx_level, MESA_SHADER_VERTEX));

View file

@ -643,7 +643,7 @@ void
radv_get_legacy_gs_info(const struct radv_device *device, struct radv_shader_info *gs_info) radv_get_legacy_gs_info(const struct radv_device *device, struct radv_shader_info *gs_info)
{ {
const struct radv_physical_device *pdev = radv_device_physical(device); const struct radv_physical_device *pdev = radv_device_physical(device);
struct radv_legacy_gs_info *out = &gs_info->gs_ring_info; struct radv_legacy_gs_info *out = &gs_info->legacy_gs_info;
const unsigned esgs_vertex_stride = out->esgs_itemsize * 4; const unsigned esgs_vertex_stride = out->esgs_itemsize * 4;
ac_legacy_gs_subgroup_info info; ac_legacy_gs_subgroup_info info;
@ -706,7 +706,7 @@ gather_shader_info_gs(struct radv_device *device, const nir_shader *nir, struct
if (info->is_ngg) if (info->is_ngg)
gather_shader_info_ngg_query(device, info); gather_shader_info_ngg_query(device, info);
else else
info->gs_ring_info.esgs_itemsize = radv_compute_esgs_itemsize(device, info->gs.num_linked_inputs) / 4; info->legacy_gs_info.esgs_itemsize = radv_compute_esgs_itemsize(device, info->gs.num_linked_inputs) / 4;
} }
static void static void

View file

@ -248,8 +248,10 @@ struct radv_shader_info {
struct radv_streamout_info so; struct radv_streamout_info so;
struct radv_legacy_gs_info gs_ring_info; union {
struct gfx10_ngg_info ngg_info; struct radv_legacy_gs_info legacy_gs_info;
struct gfx10_ngg_info ngg_info;
};
/* Precomputed register values. */ /* Precomputed register values. */
struct { struct {