radv: pre-calculate user_data_0 registers and store in pipeline
There's no point recalculating these the whole time on descriptor emission, just store them at pipeline creation. Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
@@ -1950,6 +1950,48 @@ void radv_create_shaders(struct radv_pipeline *pipeline,
|
||||
ralloc_free(fs_m.nir);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
radv_pipeline_stage_to_user_data_0(struct radv_pipeline *pipeline,
|
||||
gl_shader_stage stage, enum chip_class chip_class)
|
||||
{
|
||||
bool has_gs = radv_pipeline_has_gs(pipeline);
|
||||
bool has_tess = radv_pipeline_has_tess(pipeline);
|
||||
switch (stage) {
|
||||
case MESA_SHADER_FRAGMENT:
|
||||
return R_00B030_SPI_SHADER_USER_DATA_PS_0;
|
||||
case MESA_SHADER_VERTEX:
|
||||
if (chip_class >= GFX9) {
|
||||
return has_tess ? R_00B430_SPI_SHADER_USER_DATA_LS_0 :
|
||||
has_gs ? R_00B330_SPI_SHADER_USER_DATA_ES_0 :
|
||||
R_00B130_SPI_SHADER_USER_DATA_VS_0;
|
||||
}
|
||||
if (has_tess)
|
||||
return R_00B530_SPI_SHADER_USER_DATA_LS_0;
|
||||
else
|
||||
return has_gs ? R_00B330_SPI_SHADER_USER_DATA_ES_0 : R_00B130_SPI_SHADER_USER_DATA_VS_0;
|
||||
case MESA_SHADER_GEOMETRY:
|
||||
return 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 :
|
||||
R_00B430_SPI_SHADER_USER_DATA_HS_0;
|
||||
case MESA_SHADER_TESS_EVAL:
|
||||
if (chip_class >= GFX9) {
|
||||
return has_gs ? R_00B330_SPI_SHADER_USER_DATA_ES_0 :
|
||||
R_00B130_SPI_SHADER_USER_DATA_VS_0;
|
||||
}
|
||||
if (has_gs)
|
||||
return R_00B330_SPI_SHADER_USER_DATA_ES_0;
|
||||
else
|
||||
return R_00B130_SPI_SHADER_USER_DATA_VS_0;
|
||||
default:
|
||||
unreachable("unknown shader");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static VkResult
|
||||
radv_pipeline_init(struct radv_pipeline *pipeline,
|
||||
struct radv_device *device,
|
||||
@@ -2212,10 +2254,13 @@ radv_pipeline_init(struct radv_pipeline *pipeline,
|
||||
pipeline->binding_stride[desc->binding] = desc->stride;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
struct ac_userdata_info *loc = radv_lookup_user_sgpr(pipeline, MESA_SHADER_VERTEX,
|
||||
AC_UD_VS_BASE_VERTEX_START_INSTANCE);
|
||||
if (loc->sgpr_idx != -1) {
|
||||
pipeline->graphics.vtx_base_sgpr = radv_shader_stage_to_user_data_0(MESA_SHADER_VERTEX, device->physical_device->rad_info.chip_class, radv_pipeline_has_gs(pipeline), radv_pipeline_has_tess(pipeline));
|
||||
pipeline->graphics.vtx_base_sgpr = pipeline->user_data_0[MESA_SHADER_VERTEX];
|
||||
pipeline->graphics.vtx_base_sgpr += loc->sgpr_idx * 4;
|
||||
if (radv_get_vertex_shader(pipeline)->info.info.vs.needs_draw_id)
|
||||
pipeline->graphics.vtx_emit_num = 3;
|
||||
@@ -2320,7 +2365,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);
|
||||
|
||||
|
||||
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->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) {
|
||||
|
Reference in New Issue
Block a user