[Mesa-dev] [PATCH 1/2] radv: store a pointer to rad_info in the pipeline
Samuel Pitoiset
samuel.pitoiset at gmail.com
Fri Jul 12 08:43:22 UTC 2019
Cleanup.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
src/amd/vulkan/radv_pipeline.c | 173 ++++++++++++++++-----------------
src/amd/vulkan/radv_private.h | 2 +
2 files changed, 87 insertions(+), 88 deletions(-)
diff --git a/src/amd/vulkan/radv_pipeline.c b/src/amd/vulkan/radv_pipeline.c
index 9b68650fd36..e81afdd426c 100644
--- a/src/amd/vulkan/radv_pipeline.c
+++ b/src/amd/vulkan/radv_pipeline.c
@@ -178,7 +178,7 @@ radv_pipeline_scratch_init(struct radv_device *device,
pipeline->shaders[i]->config.scratch_bytes_per_wave);
max_stage_waves = MIN2(max_stage_waves,
- 4 * device->physical_device->rad_info.num_good_compute_units *
+ 4 * pipeline->info->num_good_compute_units *
(256 / pipeline->shaders[i]->config.num_vgprs));
max_waves = MAX2(max_waves, max_stage_waves);
}
@@ -1092,7 +1092,7 @@ radv_pipeline_init_multisample_state(struct radv_pipeline *pipeline,
{
const VkPipelineMultisampleStateCreateInfo *vkms = pCreateInfo->pMultisampleState;
struct radv_multisample_state *ms = &pipeline->graphics.ms;
- unsigned num_tile_pipes = pipeline->device->physical_device->rad_info.num_tile_pipes;
+ unsigned num_tile_pipes = pipeline->info->num_tile_pipes;
bool out_of_order_rast = false;
int ps_iter_samples = 1;
uint32_t mask = 0xffff;
@@ -1141,7 +1141,7 @@ radv_pipeline_init_multisample_state(struct radv_pipeline *pipeline,
S_028A4C_MULTI_SHADER_ENGINE_PRIM_DISCARD_ENABLE(1) |
S_028A4C_FORCE_EOV_CNTDWN_ENABLE(1) |
S_028A4C_FORCE_EOV_REZ_ENABLE(1);
- ms->pa_sc_mode_cntl_0 = S_028A48_ALTERNATE_RBS_PER_TILE(pipeline->device->physical_device->rad_info.chip_class >= GFX9) |
+ ms->pa_sc_mode_cntl_0 = S_028A48_ALTERNATE_RBS_PER_TILE(pipeline->info->chip_class >= GFX9) |
S_028A48_VPORT_SCISSOR_ENABLE(1);
if (ms->num_samples > 1) {
@@ -1492,7 +1492,7 @@ calculate_gs_info(const VkGraphicsPipelineCreateInfo *pCreateInfo,
struct radv_gs_state gs = {0};
struct radv_shader_variant_info *gs_info = &pipeline->shaders[MESA_SHADER_GEOMETRY]->info;
struct radv_es_output_info *es_info;
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX9)
+ if (pipeline->info->chip_class >= GFX9)
es_info = radv_pipeline_has_tess(pipeline) ? &gs_info->tes.es_info : &gs_info->vs.es_info;
else
es_info = radv_pipeline_has_tess(pipeline) ?
@@ -1835,15 +1835,14 @@ calculate_ngg_info(const VkGraphicsPipelineCreateInfo *pCreateInfo,
static void
calculate_gs_ring_sizes(struct radv_pipeline *pipeline, const struct radv_gs_state *gs)
{
- struct radv_device *device = pipeline->device;
- unsigned num_se = device->physical_device->rad_info.max_se;
+ unsigned num_se = pipeline->info->max_se;
unsigned wave_size = 64;
unsigned max_gs_waves = 32 * num_se; /* max 32 per SE on GCN */
/* On GFX6-GFX7, the value comes from VGT_GS_VERTEX_REUSE = 16.
* On GFX8+, the value comes from VGT_VERTEX_REUSE_BLOCK_CNTL = 30 (+2).
*/
unsigned gs_vertex_reuse =
- (device->physical_device->rad_info.chip_class >= GFX8 ? 32 : 16) * num_se;
+ (pipeline->info->chip_class >= GFX8 ? 32 : 16) * num_se;
unsigned alignment = 256 * num_se;
/* The maximum size is 63.999 MB per SE. */
unsigned max_size = ((unsigned)(63.999 * 1024 * 1024) & ~255) * num_se;
@@ -1862,13 +1861,13 @@ calculate_gs_ring_sizes(struct radv_pipeline *pipeline, const struct radv_gs_sta
esgs_ring_size = align(esgs_ring_size, alignment);
gsvs_ring_size = align(gsvs_ring_size, alignment);
- if (pipeline->device->physical_device->rad_info.chip_class <= GFX8)
+ if (pipeline->info->chip_class <= GFX8)
pipeline->graphics.esgs_ring_size = CLAMP(esgs_ring_size, min_esgs_ring_size, max_size);
pipeline->graphics.gsvs_ring_size = MIN2(gsvs_ring_size, max_size);
}
-static void si_multiwave_lds_size_workaround(struct radv_device *device,
+static void si_multiwave_lds_size_workaround(struct radv_pipeline *pipeline,
unsigned *lds_size)
{
/* If tessellation is all offchip and on-chip GS isn't used, this
@@ -1880,8 +1879,8 @@ static void si_multiwave_lds_size_workaround(struct radv_device *device,
* Make sure we have at least 4k of LDS in use to avoid the bug.
* It applies to workgroup sizes of more than one wavefront.
*/
- if (device->physical_device->rad_info.family == CHIP_BONAIRE ||
- device->physical_device->rad_info.family == CHIP_KABINI)
+ if (pipeline->info->family == CHIP_BONAIRE ||
+ pipeline->info->family == CHIP_KABINI)
*lds_size = MAX2(*lds_size, 8);
}
@@ -1923,14 +1922,14 @@ calculate_tess_state(struct radv_pipeline *pipeline,
lds_size = pipeline->shaders[MESA_SHADER_TESS_CTRL]->info.tcs.lds_size;
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX7) {
+ if (pipeline->info->chip_class >= GFX7) {
assert(lds_size <= 65536);
lds_size = align(lds_size, 512) / 512;
} else {
assert(lds_size <= 32768);
lds_size = align(lds_size, 256) / 256;
}
- si_multiwave_lds_size_workaround(pipeline->device, &lds_size);
+ si_multiwave_lds_size_workaround(pipeline, &lds_size);
tess.lds_size = lds_size;
@@ -1986,8 +1985,8 @@ calculate_tess_state(struct radv_pipeline *pipeline,
topology = V_028B6C_OUTPUT_TRIANGLE_CW;
if (pipeline->device->has_distributed_tess) {
- if (pipeline->device->physical_device->rad_info.family == CHIP_FIJI ||
- pipeline->device->physical_device->rad_info.family >= CHIP_POLARIS10)
+ if (pipeline->info->family == CHIP_FIJI ||
+ pipeline->info->family >= CHIP_POLARIS10)
distribution_mode = V_028B6C_DISTRIBUTION_MODE_TRAPEZOIDS;
else
distribution_mode = V_028B6C_DISTRIBUTION_MODE_DONUTS;
@@ -2099,13 +2098,13 @@ radv_link_shaders(struct radv_pipeline *pipeline, nir_shader **shaders)
if (progress) {
if (nir_lower_global_vars_to_local(ordered_shaders[i])) {
ac_lower_indirect_derefs(ordered_shaders[i],
- pipeline->device->physical_device->rad_info.chip_class);
+ pipeline->info->chip_class);
}
radv_optimize_nir(ordered_shaders[i], false, false);
if (nir_lower_global_vars_to_local(ordered_shaders[i - 1])) {
ac_lower_indirect_derefs(ordered_shaders[i - 1],
- pipeline->device->physical_device->rad_info.chip_class);
+ pipeline->info->chip_class);
}
radv_optimize_nir(ordered_shaders[i - 1], false, false);
}
@@ -2187,8 +2186,8 @@ radv_generate_graphics_pipeline_key(struct radv_pipeline *pipeline,
key.vertex_attribute_offsets[location] = desc->offset;
key.vertex_attribute_strides[location] = radv_get_attrib_stride(input_state, desc->binding);
- if (pipeline->device->physical_device->rad_info.chip_class <= GFX8 &&
- pipeline->device->physical_device->rad_info.family != CHIP_STONEY) {
+ if (pipeline->info->chip_class <= GFX8 &&
+ pipeline->info->family != CHIP_STONEY) {
VkFormat format = input_state->pVertexAttributeDescriptions[i].format;
uint64_t adjust;
switch(format) {
@@ -2245,14 +2244,14 @@ radv_generate_graphics_pipeline_key(struct radv_pipeline *pipeline,
}
key.col_format = blend->spi_shader_col_format;
- if (pipeline->device->physical_device->rad_info.chip_class < GFX8)
+ if (pipeline->info->chip_class < GFX8)
radv_pipeline_compute_get_int_clamp(pCreateInfo, &key.is_int8, &key.is_int10);
return key;
}
static void
-radv_fill_shader_keys(struct radv_device *device,
+radv_fill_shader_keys(struct radv_pipeline *pipeline,
struct radv_shader_variant_key *keys,
const struct radv_pipeline_key *key,
nir_shader **nir)
@@ -2284,7 +2283,7 @@ radv_fill_shader_keys(struct radv_device *device,
keys[MESA_SHADER_VERTEX].vs_common_out.as_es = true;
}
- if (device->physical_device->rad_info.chip_class >= GFX10) {
+ if (pipeline->info->chip_class >= GFX10) {
if (nir[MESA_SHADER_TESS_CTRL]) {
keys[MESA_SHADER_TESS_EVAL].vs_common_out.as_ngg = true;
} else {
@@ -2395,7 +2394,7 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
struct radv_shader_binary *binaries[MESA_SHADER_STAGES] = {NULL};
struct radv_shader_variant_key keys[MESA_SHADER_STAGES] = {{{{{0}}}}};
unsigned char hash[20], gs_copy_hash[20];
- bool use_ngg = device->physical_device->rad_info.chip_class >= GFX10;
+ bool use_ngg = pipeline->info->chip_class >= GFX10;
radv_start_feedback(pipeline_feedback);
@@ -2483,7 +2482,7 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
nir_print_shader(nir[i], stderr);
}
- radv_fill_shader_keys(device, keys, key, nir);
+ radv_fill_shader_keys(pipeline, keys, key, nir);
if (nir[MESA_SHADER_FRAGMENT]) {
if (!pipeline->shaders[MESA_SHADER_FRAGMENT]) {
@@ -2512,7 +2511,7 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
!!pipeline->shaders[MESA_SHADER_FRAGMENT]->info.info.ps.num_input_clips_culls;
}
- if (device->physical_device->rad_info.chip_class >= GFX9 && modules[MESA_SHADER_TESS_CTRL]) {
+ if (pipeline->info->chip_class >= GFX9 && modules[MESA_SHADER_TESS_CTRL]) {
if (!pipeline->shaders[MESA_SHADER_TESS_CTRL]) {
struct nir_shader *combined_nir[] = {nir[MESA_SHADER_VERTEX], nir[MESA_SHADER_TESS_CTRL]};
struct radv_shader_variant_key key = keys[MESA_SHADER_TESS_CTRL];
@@ -2531,7 +2530,7 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
keys[MESA_SHADER_TESS_EVAL].tes.tcs_num_outputs = util_last_bit64(pipeline->shaders[MESA_SHADER_TESS_CTRL]->info.info.tcs.outputs_written);
}
- if (device->physical_device->rad_info.chip_class >= GFX9 && modules[MESA_SHADER_GEOMETRY]) {
+ if (pipeline->info->chip_class >= GFX9 && modules[MESA_SHADER_GEOMETRY]) {
gl_shader_stage pre_stage = modules[MESA_SHADER_TESS_EVAL] ? MESA_SHADER_TESS_EVAL : MESA_SHADER_VERTEX;
if (!pipeline->shaders[MESA_SHADER_GEOMETRY]) {
struct nir_shader *combined_nir[] = {nir[pre_stage], nir[MESA_SHADER_GEOMETRY]};
@@ -2614,7 +2613,7 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
static uint32_t
radv_pipeline_stage_to_user_data_0(struct radv_pipeline *pipeline,
- gl_shader_stage stage, enum chip_class chip_class)
+ gl_shader_stage stage)
{
bool has_gs = radv_pipeline_has_gs(pipeline);
bool has_tess = radv_pipeline_has_tess(pipeline);
@@ -2625,9 +2624,9 @@ radv_pipeline_stage_to_user_data_0(struct radv_pipeline *pipeline,
return R_00B030_SPI_SHADER_USER_DATA_PS_0;
case MESA_SHADER_VERTEX:
if (has_tess) {
- if (chip_class >= GFX10) {
+ if (pipeline->info->chip_class >= GFX10) {
return R_00B430_SPI_SHADER_USER_DATA_HS_0;
- } else if (chip_class == GFX9) {
+ } else if (pipeline->info->chip_class == GFX9) {
return R_00B430_SPI_SHADER_USER_DATA_LS_0;
} else {
return R_00B530_SPI_SHADER_USER_DATA_LS_0;
@@ -2636,7 +2635,7 @@ radv_pipeline_stage_to_user_data_0(struct radv_pipeline *pipeline,
}
if (has_gs) {
- if (chip_class >= GFX10) {
+ if (pipeline->info->chip_class >= GFX10) {
return R_00B230_SPI_SHADER_USER_DATA_GS_0;
} else {
return R_00B330_SPI_SHADER_USER_DATA_ES_0;
@@ -2648,16 +2647,16 @@ radv_pipeline_stage_to_user_data_0(struct radv_pipeline *pipeline,
return R_00B130_SPI_SHADER_USER_DATA_VS_0;
case MESA_SHADER_GEOMETRY:
- return chip_class == GFX9 ? R_00B330_SPI_SHADER_USER_DATA_ES_0 :
+ return pipeline->info->chip_class == GFX9 ? R_00B330_SPI_SHADER_USER_DATA_ES_0 :
R_00B230_SPI_SHADER_USER_DATA_GS_0;
case MESA_SHADER_COMPUTE:
return R_00B900_COMPUTE_USER_DATA_0;
case MESA_SHADER_TESS_CTRL:
- return chip_class == GFX9 ? R_00B430_SPI_SHADER_USER_DATA_LS_0 :
+ return pipeline->info->chip_class == GFX9 ? R_00B430_SPI_SHADER_USER_DATA_LS_0 :
R_00B430_SPI_SHADER_USER_DATA_HS_0;
case MESA_SHADER_TESS_EVAL:
if (has_gs) {
- return chip_class >= GFX10 ? R_00B230_SPI_SHADER_USER_DATA_GS_0 :
+ return pipeline->info->chip_class >= GFX10 ? R_00B230_SPI_SHADER_USER_DATA_GS_0 :
R_00B330_SPI_SHADER_USER_DATA_ES_0;
} else if (has_ngg) {
return R_00B230_SPI_SHADER_USER_DATA_GS_0;
@@ -2892,9 +2891,9 @@ radv_compute_bin_size(struct radv_pipeline *pipeline, const VkGraphicsPipelineCr
VkExtent2D extent = {512, 512};
unsigned log_num_rb_per_se =
- util_logbase2_ceil(pipeline->device->physical_device->rad_info.num_render_backends /
- pipeline->device->physical_device->rad_info.max_se);
- unsigned log_num_se = util_logbase2_ceil(pipeline->device->physical_device->rad_info.max_se);
+ util_logbase2_ceil(pipeline->info->num_render_backends /
+ pipeline->info->max_se);
+ unsigned log_num_se = util_logbase2_ceil(pipeline->info->max_se);
unsigned total_samples = 1u << G_028BE0_MSAA_NUM_SAMPLES(pipeline->graphics.ms.pa_sc_aa_config);
unsigned ps_iter_samples = 1u << G_028804_PS_ITER_SAMPLES(pipeline->graphics.ms.db_eqaa);
@@ -2950,7 +2949,7 @@ radv_pipeline_generate_binning_state(struct radeon_cmdbuf *ctx_cs,
struct radv_pipeline *pipeline,
const VkGraphicsPipelineCreateInfo *pCreateInfo)
{
- if (pipeline->device->physical_device->rad_info.chip_class < GFX9)
+ if (pipeline->info->chip_class < GFX9)
return;
uint32_t pa_sc_binner_cntl_0 =
@@ -2965,7 +2964,7 @@ radv_pipeline_generate_binning_state(struct radeon_cmdbuf *ctx_cs,
unsigned persistent_states_per_bin; /* allowed range: [1, 32] */
unsigned fpovs_per_batch; /* allowed range: [0, 255], 0 = unlimited */
- switch (pipeline->device->physical_device->rad_info.family) {
+ switch (pipeline->info->family) {
case CHIP_VEGA10:
case CHIP_VEGA12:
case CHIP_VEGA20:
@@ -2999,7 +2998,7 @@ radv_pipeline_generate_binning_state(struct radeon_cmdbuf *ctx_cs,
radeon_set_context_reg(ctx_cs, R_028C44_PA_SC_BINNER_CNTL_0,
pa_sc_binner_cntl_0);
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX10) {
+ if (pipeline->info->chip_class >= GFX10) {
radeon_set_context_reg(ctx_cs, R_028038_DB_DFSM_CONTROL,
db_dfsm_control);
} else {
@@ -3226,7 +3225,7 @@ radv_pipeline_generate_multisample_state(struct radeon_cmdbuf *ctx_cs,
* if no sample lies on the pixel boundary (-8 sample offset). It's
* currently always TRUE because the driver doesn't support 16 samples.
*/
- bool exclusion = pipeline->device->physical_device->rad_info.chip_class >= GFX7;
+ bool exclusion = pipeline->info->chip_class >= GFX7;
radeon_set_context_reg(ctx_cs, R_02882C_PA_SU_PRIM_FILTER_CNTL,
S_02882C_XMAX_RIGHT_EXCLUSION(exclusion) |
S_02882C_YMAX_BOTTOM_EXCLUSION(exclusion));
@@ -3245,7 +3244,7 @@ radv_pipeline_generate_vgt_gs_mode(struct radeon_cmdbuf *ctx_cs,
pipeline->shaders[MESA_SHADER_GEOMETRY];
vgt_gs_mode = ac_vgt_gs_mode(gs->info.gs.vertices_out,
- pipeline->device->physical_device->rad_info.chip_class);
+ pipeline->info->chip_class);
} else if (radv_pipeline_has_ngg(pipeline)) {
const struct radv_shader_variant *vs =
pipeline->shaders[MESA_SHADER_TESS_EVAL] ?
@@ -3320,7 +3319,7 @@ radv_pipeline_generate_hw_vs(struct radeon_cmdbuf *ctx_cs,
cull_dist_mask << 8 |
clip_dist_mask);
- if (pipeline->device->physical_device->rad_info.chip_class <= GFX8)
+ if (pipeline->info->chip_class <= GFX8)
radeon_set_context_reg(ctx_cs, R_028AB4_VGT_REUSE_OFF,
outinfo->writes_viewport_index);
}
@@ -3353,8 +3352,8 @@ radv_pipeline_generate_hw_ls(struct radeon_cmdbuf *cs,
radeon_emit(cs, S_00B524_MEM_BASE(va >> 40));
rsrc2 |= S_00B52C_LDS_SIZE(tess->lds_size);
- if (pipeline->device->physical_device->rad_info.chip_class == GFX7 &&
- pipeline->device->physical_device->rad_info.family != CHIP_HAWAII)
+ if (pipeline->info->chip_class == GFX7 &&
+ pipeline->info->family != CHIP_HAWAII)
radeon_set_sh_reg(cs, R_00B52C_SPI_SHADER_PGM_RSRC2_LS, rsrc2);
radeon_set_sh_reg_seq(cs, R_00B528_SPI_SHADER_PGM_RSRC1_LS, 2);
@@ -3422,8 +3421,8 @@ radv_pipeline_generate_hw_ngg(struct radeon_cmdbuf *ctx_cs,
cull_dist_mask << 8 |
clip_dist_mask);
- bool vgt_reuse_off = pipeline->device->physical_device->rad_info.family == CHIP_NAVI10 &&
- pipeline->device->physical_device->rad_info.chip_external_rev == 0x1 &&
+ bool vgt_reuse_off = pipeline->info->family == CHIP_NAVI10 &&
+ pipeline->info->chip_external_rev == 0x1 &&
es_type == MESA_SHADER_TESS_EVAL;
radeon_set_context_reg(ctx_cs, R_028AB4_VGT_REUSE_OFF,
@@ -3475,16 +3474,16 @@ radv_pipeline_generate_hw_hs(struct radeon_cmdbuf *cs,
{
uint64_t va = radv_buffer_get_va(shader->bo) + shader->bo_offset;
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX9) {
+ if (pipeline->info->chip_class >= GFX9) {
unsigned hs_rsrc2 = shader->config.rsrc2;
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX10) {
+ if (pipeline->info->chip_class >= GFX10) {
hs_rsrc2 |= S_00B42C_LDS_SIZE_GFX10(tess->lds_size);
} else {
hs_rsrc2 |= S_00B42C_LDS_SIZE_GFX9(tess->lds_size);
}
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX10) {
+ if (pipeline->info->chip_class >= GFX10) {
radeon_set_sh_reg_seq(cs, R_00B520_SPI_SHADER_PGM_LO_LS, 2);
radeon_emit(cs, va >> 8);
radeon_emit(cs, S_00B524_MEM_BASE(va >> 40));
@@ -3559,7 +3558,7 @@ radv_pipeline_generate_tess_shaders(struct radeon_cmdbuf *ctx_cs,
radeon_set_context_reg(ctx_cs, R_028B6C_VGT_TF_PARAM,
tess->tf_param);
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX7)
+ if (pipeline->info->chip_class >= GFX7)
radeon_set_context_reg_idx(ctx_cs, R_028B58_VGT_LS_HS_CONFIG, 2,
tess->ls_hs_config);
else
@@ -3614,8 +3613,8 @@ radv_pipeline_generate_hw_gs(struct radeon_cmdbuf *ctx_cs,
va = radv_buffer_get_va(gs->bo) + gs->bo_offset;
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX9) {
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX10) {
+ if (pipeline->info->chip_class >= GFX9) {
+ if (pipeline->info->chip_class >= GFX10) {
radeon_set_sh_reg_seq(cs, R_00B320_SPI_SHADER_PGM_LO_ES, 2);
radeon_emit(cs, va >> 8);
radeon_emit(cs, S_00B324_MEM_BASE(va >> 40));
@@ -3768,8 +3767,7 @@ radv_pipeline_generate_ps_inputs(struct radeon_cmdbuf *ctx_cs,
}
static uint32_t
-radv_compute_db_shader_control(const struct radv_device *device,
- const struct radv_pipeline *pipeline,
+radv_compute_db_shader_control(const struct radv_pipeline *pipeline,
const struct radv_shader_variant *ps)
{
unsigned z_order;
@@ -3778,8 +3776,8 @@ radv_compute_db_shader_control(const struct radv_device *device,
else
z_order = V_02880C_LATE_Z;
- bool disable_rbplus = device->physical_device->has_rbplus &&
- !device->physical_device->rbplus_allowed;
+ bool disable_rbplus = pipeline->device->physical_device->has_rbplus &&
+ !pipeline->device->physical_device->rbplus_allowed;
/* It shouldn't be needed to export gl_SampleMask when MSAA is disabled
* but this appears to break Project Cars (DXVK). See
@@ -3817,8 +3815,7 @@ radv_pipeline_generate_fragment_shader(struct radeon_cmdbuf *ctx_cs,
radeon_emit(cs, ps->config.rsrc2);
radeon_set_context_reg(ctx_cs, R_02880C_DB_SHADER_CONTROL,
- radv_compute_db_shader_control(pipeline->device,
- pipeline, ps));
+ radv_compute_db_shader_control(pipeline, ps));
radeon_set_context_reg(ctx_cs, R_0286CC_SPI_PS_INPUT_ENA,
ps->config.spi_ps_input_ena);
@@ -3847,8 +3844,8 @@ static void
radv_pipeline_generate_vgt_vertex_reuse(struct radeon_cmdbuf *ctx_cs,
struct radv_pipeline *pipeline)
{
- if (pipeline->device->physical_device->rad_info.family < CHIP_POLARIS10 ||
- pipeline->device->physical_device->rad_info.chip_class >= GFX10)
+ if (pipeline->info->family < CHIP_POLARIS10 ||
+ pipeline->info->chip_class >= GFX10)
return;
unsigned vtx_reuse_depth = 30;
@@ -3888,7 +3885,7 @@ radv_compute_vgt_shader_stages_en(const struct radv_pipeline *pipeline)
stages |= S_028B54_VS_EN(V_028B54_VS_STAGE_COPY_SHADER);
}
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX9)
+ if (pipeline->info->chip_class >= GFX9)
stages |= S_028B54_MAX_PRIMGRP_IN_WAVE(2);
return stages;
@@ -3991,7 +3988,7 @@ radv_pipeline_generate_pm4(struct radv_pipeline *pipeline,
radv_pipeline_generate_vgt_vertex_reuse(ctx_cs, pipeline);
radv_pipeline_generate_binning_state(ctx_cs, pipeline, pCreateInfo);
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX10 && !radv_pipeline_has_ngg(pipeline))
+ if (pipeline->info->chip_class >= GFX10 && !radv_pipeline_has_ngg(pipeline))
gfx10_pipeline_generate_ge_cntl(ctx_cs, pipeline, tess, gs);
radeon_set_context_reg(ctx_cs, R_0286E8_SPI_TMPRING_SIZE,
@@ -4000,7 +3997,7 @@ radv_pipeline_generate_pm4(struct radv_pipeline *pipeline,
radeon_set_context_reg(ctx_cs, R_028B54_VGT_SHADER_STAGES_EN, radv_compute_vgt_shader_stages_en(pipeline));
- if (pipeline->device->physical_device->rad_info.chip_class >= GFX7) {
+ if (pipeline->info->chip_class >= GFX7) {
radeon_set_uconfig_reg_idx(pipeline->device->physical_device,
cs, R_030908_VGT_PRIMITIVE_TYPE, 1, prim);
} else {
@@ -4022,7 +4019,6 @@ radv_compute_ia_multi_vgt_param_helpers(struct radv_pipeline *pipeline,
uint32_t prim)
{
struct radv_ia_multi_vgt_param_helpers ia_multi_vgt_param = {0};
- const struct radv_device *device = pipeline->device;
if (radv_pipeline_has_tess(pipeline))
ia_multi_vgt_param.primgroup_size = tess->num_patches;
@@ -4033,22 +4029,22 @@ radv_compute_ia_multi_vgt_param_helpers(struct radv_pipeline *pipeline,
/* GS requirement. */
ia_multi_vgt_param.partial_es_wave = false;
- if (radv_pipeline_has_gs(pipeline) && device->physical_device->rad_info.chip_class <= GFX8)
+ if (radv_pipeline_has_gs(pipeline) && pipeline->info->chip_class <= GFX8)
if (SI_GS_PER_ES / ia_multi_vgt_param.primgroup_size >= pipeline->device->gs_table_depth - 3)
ia_multi_vgt_param.partial_es_wave = true;
ia_multi_vgt_param.wd_switch_on_eop = false;
- if (device->physical_device->rad_info.chip_class >= GFX7) {
+ if (pipeline->info->chip_class >= GFX7) {
/* WD_SWITCH_ON_EOP has no effect on GPUs with less than
* 4 shader engines. Set 1 to pass the assertion below.
* The other cases are hardware requirements. */
- if (device->physical_device->rad_info.max_se < 4 ||
+ if (pipeline->info->max_se < 4 ||
prim == V_008958_DI_PT_POLYGON ||
prim == V_008958_DI_PT_LINELOOP ||
prim == V_008958_DI_PT_TRIFAN ||
prim == V_008958_DI_PT_TRISTRIP_ADJ ||
(pipeline->graphics.prim_restart_enable &&
- (device->physical_device->rad_info.family < CHIP_POLARIS10 ||
+ (pipeline->info->family < CHIP_POLARIS10 ||
(prim != V_008958_DI_PT_POINTLIST &&
prim != V_008958_DI_PT_LINESTRIP))))
ia_multi_vgt_param.wd_switch_on_eop = true;
@@ -4070,15 +4066,15 @@ radv_compute_ia_multi_vgt_param_helpers(struct radv_pipeline *pipeline,
ia_multi_vgt_param.partial_vs_wave = false;
if (radv_pipeline_has_tess(pipeline)) {
/* Bug with tessellation and GS on Bonaire and older 2 SE chips. */
- if ((device->physical_device->rad_info.family == CHIP_TAHITI ||
- device->physical_device->rad_info.family == CHIP_PITCAIRN ||
- device->physical_device->rad_info.family == CHIP_BONAIRE) &&
+ if ((pipeline->info->family == CHIP_TAHITI ||
+ pipeline->info->family == CHIP_PITCAIRN ||
+ pipeline->info->family == CHIP_BONAIRE) &&
radv_pipeline_has_gs(pipeline))
ia_multi_vgt_param.partial_vs_wave = true;
/* Needed for 028B6C_DISTRIBUTION_MODE != 0 */
- if (device->has_distributed_tess) {
+ if (pipeline->device->has_distributed_tess) {
if (radv_pipeline_has_gs(pipeline)) {
- if (device->physical_device->rad_info.chip_class <= GFX8)
+ if (pipeline->info->chip_class <= GFX8)
ia_multi_vgt_param.partial_es_wave = true;
} else {
ia_multi_vgt_param.partial_vs_wave = true;
@@ -4107,12 +4103,12 @@ radv_compute_ia_multi_vgt_param_helpers(struct radv_pipeline *pipeline,
*
* Reproducer: https://bugs.freedesktop.org/show_bug.cgi?id=109242
*/
- if (device->physical_device->rad_info.family == CHIP_TONGA ||
- device->physical_device->rad_info.family == CHIP_FIJI ||
- device->physical_device->rad_info.family == CHIP_POLARIS10 ||
- device->physical_device->rad_info.family == CHIP_POLARIS11 ||
- device->physical_device->rad_info.family == CHIP_POLARIS12 ||
- device->physical_device->rad_info.family == CHIP_VEGAM) {
+ if (pipeline->info->family == CHIP_TONGA ||
+ pipeline->info->family == CHIP_FIJI ||
+ pipeline->info->family == CHIP_POLARIS10 ||
+ pipeline->info->family == CHIP_POLARIS11 ||
+ pipeline->info->family == CHIP_POLARIS12 ||
+ pipeline->info->family == CHIP_VEGAM) {
ia_multi_vgt_param.partial_vs_wave = true;
}
}
@@ -4120,9 +4116,9 @@ radv_compute_ia_multi_vgt_param_helpers(struct radv_pipeline *pipeline,
ia_multi_vgt_param.base =
S_028AA8_PRIMGROUP_SIZE(ia_multi_vgt_param.primgroup_size - 1) |
/* The following field was moved to VGT_SHADER_STAGES_EN in GFX9. */
- S_028AA8_MAX_PRIMGRP_IN_WAVE(device->physical_device->rad_info.chip_class == GFX8 ? 2 : 0) |
- S_030960_EN_INST_OPT_BASIC(device->physical_device->rad_info.chip_class >= GFX9) |
- S_030960_EN_INST_OPT_ADV(device->physical_device->rad_info.chip_class >= GFX9);
+ S_028AA8_MAX_PRIMGRP_IN_WAVE(pipeline->info->chip_class == GFX8 ? 2 : 0) |
+ S_030960_EN_INST_OPT_BASIC(pipeline->info->chip_class >= GFX9) |
+ S_030960_EN_INST_OPT_ADV(pipeline->info->chip_class >= GFX9);
return ia_multi_vgt_param;
}
@@ -4189,6 +4185,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline,
has_view_index = true;
pipeline->device = device;
+ pipeline->info = &device->physical_device->rad_info;
pipeline->layout = radv_pipeline_layout_from_handle(pCreateInfo->layout);
assert(pipeline->layout);
@@ -4293,7 +4290,7 @@ radv_pipeline_init(struct radv_pipeline *pipeline,
radv_compute_vertex_input_state(pipeline, pCreateInfo);
for (uint32_t i = 0; i < MESA_SHADER_STAGES; i++)
- pipeline->user_data_0[i] = radv_pipeline_stage_to_user_data_0(pipeline, i, device->physical_device->rad_info.chip_class);
+ pipeline->user_data_0[i] = radv_pipeline_stage_to_user_data_0(pipeline, i);
struct radv_userdata_info *loc = radv_lookup_user_sgpr(pipeline, MESA_SHADER_VERTEX,
AC_UD_VS_BASE_VERTEX_START_INSTANCE);
@@ -4377,7 +4374,6 @@ static void
radv_compute_generate_pm4(struct radv_pipeline *pipeline)
{
struct radv_shader_variant *compute_shader;
- struct radv_device *device = pipeline->device;
unsigned compute_resource_limits;
unsigned waves_per_threadgroup;
uint64_t va;
@@ -4408,10 +4404,10 @@ radv_compute_generate_pm4(struct radv_pipeline *pipeline)
compute_resource_limits =
S_00B854_SIMD_DEST_CNTL(waves_per_threadgroup % 4 == 0);
- if (device->physical_device->rad_info.chip_class >= GFX7) {
+ if (pipeline->info->chip_class >= GFX7) {
unsigned num_cu_per_se =
- device->physical_device->rad_info.num_good_compute_units /
- device->physical_device->rad_info.max_se;
+ pipeline->info->num_good_compute_units /
+ pipeline->info->max_se;
/* Force even distribution on all SIMDs in CU if the workgroup
* size is 64. This has shown some good improvements if # of
@@ -4455,6 +4451,7 @@ static VkResult radv_compute_pipeline_create(
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
pipeline->device = device;
+ pipeline->info = &device->physical_device->rad_info;
pipeline->layout = radv_pipeline_layout_from_handle(pCreateInfo->layout);
assert(pipeline->layout);
@@ -4469,7 +4466,7 @@ static VkResult radv_compute_pipeline_create(
pStages[MESA_SHADER_COMPUTE] = &pCreateInfo->stage;
radv_create_shaders(pipeline, device, cache, &(struct radv_pipeline_key) {0}, pStages, pCreateInfo->flags, pipeline_feedback, stage_feedbacks);
- pipeline->user_data_0[MESA_SHADER_COMPUTE] = radv_pipeline_stage_to_user_data_0(pipeline, MESA_SHADER_COMPUTE, device->physical_device->rad_info.chip_class);
+ pipeline->user_data_0[MESA_SHADER_COMPUTE] = radv_pipeline_stage_to_user_data_0(pipeline, MESA_SHADER_COMPUTE);
pipeline->need_indirect_descriptor_sets |= pipeline->shaders[MESA_SHADER_COMPUTE]->info.need_indirect_descriptor_sets;
result = radv_pipeline_scratch_init(device, pipeline);
if (result != VK_SUCCESS) {
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index f4dd526c89d..64042c7eb52 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -1455,6 +1455,8 @@ struct radv_pipeline {
struct radv_device * device;
struct radv_dynamic_state dynamic_state;
+ struct radeon_info *info;
+
struct radv_pipeline_layout * layout;
bool need_indirect_descriptor_sets;
--
2.22.0
More information about the mesa-dev
mailing list