diff --git a/src/amd/common/ac_shader_util.c b/src/amd/common/ac_shader_util.c index 5d9f622dd4c..18bece754a1 100644 --- a/src/amd/common/ac_shader_util.c +++ b/src/amd/common/ac_shader_util.c @@ -605,11 +605,9 @@ enum ac_image_dim ac_get_image_dim(enum amd_gfx_level gfx_level, enum glsl_sampl return dim; } -unsigned ac_get_fs_input_vgpr_cnt(const struct ac_shader_config *config, - uint8_t *num_fragcoord_components) +unsigned ac_get_fs_input_vgpr_cnt(const struct ac_shader_config *config) { unsigned num_input_vgprs = 0; - unsigned fragcoord_components = 0; if (G_0286CC_PERSP_SAMPLE_ENA(config->spi_ps_input_addr)) num_input_vgprs += 2; @@ -627,22 +625,14 @@ unsigned ac_get_fs_input_vgpr_cnt(const struct ac_shader_config *config, num_input_vgprs += 2; if (G_0286CC_LINE_STIPPLE_TEX_ENA(config->spi_ps_input_addr)) num_input_vgprs += 1; - if (G_0286CC_POS_X_FLOAT_ENA(config->spi_ps_input_addr)) { + if (G_0286CC_POS_X_FLOAT_ENA(config->spi_ps_input_addr)) num_input_vgprs += 1; - fragcoord_components++; - } - if (G_0286CC_POS_Y_FLOAT_ENA(config->spi_ps_input_addr)) { + if (G_0286CC_POS_Y_FLOAT_ENA(config->spi_ps_input_addr)) num_input_vgprs += 1; - fragcoord_components++; - } - if (G_0286CC_POS_Z_FLOAT_ENA(config->spi_ps_input_addr)) { + if (G_0286CC_POS_Z_FLOAT_ENA(config->spi_ps_input_addr)) num_input_vgprs += 1; - fragcoord_components++; - } - if (G_0286CC_POS_W_FLOAT_ENA(config->spi_ps_input_addr)) { + if (G_0286CC_POS_W_FLOAT_ENA(config->spi_ps_input_addr)) num_input_vgprs += 1; - fragcoord_components++; - } if (G_0286CC_FRONT_FACE_ENA(config->spi_ps_input_addr)) num_input_vgprs += 1; if (G_0286CC_ANCILLARY_ENA(config->spi_ps_input_addr)) @@ -652,9 +642,6 @@ unsigned ac_get_fs_input_vgpr_cnt(const struct ac_shader_config *config, if (G_0286CC_POS_FIXED_PT_ENA(config->spi_ps_input_addr)) num_input_vgprs += 1; - if (num_fragcoord_components) - *num_fragcoord_components = fragcoord_components; - return num_input_vgprs; } diff --git a/src/amd/common/ac_shader_util.h b/src/amd/common/ac_shader_util.h index 99919a12833..35759fb60f2 100644 --- a/src/amd/common/ac_shader_util.h +++ b/src/amd/common/ac_shader_util.h @@ -269,8 +269,7 @@ enum ac_image_dim ac_get_sampler_dim(enum amd_gfx_level gfx_level, enum glsl_sam enum ac_image_dim ac_get_image_dim(enum amd_gfx_level gfx_level, enum glsl_sampler_dim sdim, bool is_array); -unsigned ac_get_fs_input_vgpr_cnt(const struct ac_shader_config *config, - uint8_t *num_fragcoord_components); +unsigned ac_get_fs_input_vgpr_cnt(const struct ac_shader_config *config); uint16_t ac_get_ps_iter_mask(unsigned ps_iter_samples); diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index ccf987c3c83..50698c06372 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -1933,7 +1933,7 @@ radv_postprocess_binary_config(struct radv_device *device, struct radv_shader_bi unsigned num_input_vgprs = args->ac.num_vgprs_used; if (stage == MESA_SHADER_FRAGMENT) { - num_input_vgprs = ac_get_fs_input_vgpr_cnt(config, NULL); + num_input_vgprs = ac_get_fs_input_vgpr_cnt(config); } unsigned num_vgprs = MAX2(config->num_vgprs, num_input_vgprs); diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index c0b19daa8d5..00e2459b304 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -3182,10 +3182,8 @@ bool si_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compi } /* Calculate the number of fragment input VGPRs. */ - if (nir->info.stage == MESA_SHADER_FRAGMENT) { - shader->info.num_input_vgprs = ac_get_fs_input_vgpr_cnt( - &shader->config, &shader->info.num_fragcoord_components); - } + if (nir->info.stage == MESA_SHADER_FRAGMENT) + shader->info.num_input_vgprs = ac_get_fs_input_vgpr_cnt(&shader->config); si_calculate_max_simd_waves(shader); @@ -3319,7 +3317,11 @@ static void si_get_ps_prolog_key(struct si_shader *shader, union si_shader_part_ key->ps_prolog.states.force_linear_center_interp || key->ps_prolog.states.bc_optimize_for_persp || key->ps_prolog.states.bc_optimize_for_linear || key->ps_prolog.states.samplemask_log_ps_iter); - key->ps_prolog.num_fragcoord_components = shader->info.num_fragcoord_components; + key->ps_prolog.fragcoord_usage_mask = + G_0286CC_POS_X_FLOAT_ENA(shader->config.spi_ps_input_ena) | + (G_0286CC_POS_Y_FLOAT_ENA(shader->config.spi_ps_input_ena) << 1) | + (G_0286CC_POS_Z_FLOAT_ENA(shader->config.spi_ps_input_ena) << 2) | + (G_0286CC_POS_W_FLOAT_ENA(shader->config.spi_ps_input_ena) << 3); if (shader->key.ps.part.prolog.poly_stipple) shader->info.uses_vmem_load_other = true; @@ -3786,8 +3788,8 @@ void si_get_ps_prolog_args(struct si_shader_args *args, /* skip LINE_STIPPLE_TEX */ /* POS_X|Y|Z|W_FLOAT */ - for (unsigned i = 0; i < key->ps_prolog.num_fragcoord_components; i++) - ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, NULL); + u_foreach_bit(i, key->ps_prolog.fragcoord_usage_mask) + ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.frag_pos[i]); ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.front_face); ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &args->ac.ancillary); diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h index b6937729365..11f16ee73d8 100644 --- a/src/gallium/drivers/radeonsi/si_shader.h +++ b/src/gallium/drivers/radeonsi/si_shader.h @@ -704,7 +704,7 @@ union si_shader_part_key { /* Color interpolation and two-side color selection. */ unsigned colors_read : 8; /* color input components read */ unsigned num_interp_inputs : 5; /* BCOLOR is at this location */ - unsigned num_fragcoord_components : 3; + unsigned fragcoord_usage_mask : 4; unsigned wqm : 1; char color_attr_index[2]; signed char color_interp_vgpr_index[2]; /* -1 == constant */ @@ -869,7 +869,6 @@ struct si_shader_binary_info { uint8_t num_input_vgprs; bool uses_vmem_load_other; /* all other VMEM loads and atomics with return */ bool uses_vmem_sampler_or_bvh; - uint8_t num_fragcoord_components; bool uses_instanceid; uint8_t nr_pos_exports; uint8_t nr_param_exports;