radeonsi: check for 16-bit hw support instead of relying on options.fp16
options.fp16 can be true even when the hw doesn't support FP16. options.fp16 should only affect the CAP because 16-bit ops can still be used by internal shaders. Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17864>
This commit is contained in:
parent
2847106b94
commit
3b7512cacf
2 changed files with 10 additions and 10 deletions
|
|
@ -490,14 +490,15 @@ static int si_get_shader_param(struct pipe_screen *pscreen, enum pipe_shader_typ
|
|||
case PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR: /* lowered in finalize_nir */
|
||||
return 1;
|
||||
|
||||
case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
|
||||
/* We need f16c for fast FP16 conversions in glUniform. */
|
||||
if (!util_get_cpu_caps()->has_f16c)
|
||||
return 0;
|
||||
FALLTHROUGH;
|
||||
case PIPE_SHADER_CAP_FP16:
|
||||
case PIPE_SHADER_CAP_FP16_DERIVATIVES:
|
||||
case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
|
||||
return sscreen->options.fp16;
|
||||
|
||||
case PIPE_SHADER_CAP_FP16_CONST_BUFFERS:
|
||||
/* We need f16c for fast FP16 conversions in glUniform. */
|
||||
return sscreen->options.fp16 && util_get_cpu_caps()->has_f16c;
|
||||
return sscreen->info.gfx_level >= GFX8 && sscreen->options.fp16;
|
||||
|
||||
/* Unsupported boolean features. */
|
||||
case PIPE_SHADER_CAP_INT16:
|
||||
|
|
@ -1116,8 +1117,8 @@ void si_init_screen_get_functions(struct si_screen *sscreen)
|
|||
.max_unroll_iterations_aggressive = LLVM_VERSION_MAJOR >= 13 ? 128 : 32,
|
||||
.use_interpolated_input_intrinsics = true,
|
||||
.lower_uniforms_to_ubo = true,
|
||||
.support_16bit_alu = sscreen->options.fp16,
|
||||
.vectorize_vec2_16bit = sscreen->options.fp16,
|
||||
.support_16bit_alu = sscreen->info.gfx_level >= GFX8,
|
||||
.vectorize_vec2_16bit = sscreen->info.has_packed_math_16bit,
|
||||
.pack_varying_options =
|
||||
nir_pack_varying_interp_mode_none |
|
||||
nir_pack_varying_interp_mode_smooth |
|
||||
|
|
|
|||
|
|
@ -30,8 +30,7 @@ static bool si_alu_to_scalar_filter(const nir_instr *instr, const void *data)
|
|||
{
|
||||
struct si_screen *sscreen = (struct si_screen *)data;
|
||||
|
||||
if (sscreen->options.fp16 &&
|
||||
instr->type == nir_instr_type_alu) {
|
||||
if (sscreen->info.has_packed_math_16bit && instr->type == nir_instr_type_alu) {
|
||||
nir_alu_instr *alu = nir_instr_as_alu(instr);
|
||||
|
||||
if (alu->dest.dest.is_ssa &&
|
||||
|
|
@ -125,7 +124,7 @@ void si_nir_opts(struct si_screen *sscreen, struct nir_shader *nir, bool first)
|
|||
if (nir->info.stage == MESA_SHADER_FRAGMENT)
|
||||
NIR_PASS_V(nir, nir_opt_move_discards_to_top);
|
||||
|
||||
if (sscreen->options.fp16)
|
||||
if (sscreen->info.has_packed_math_16bit)
|
||||
NIR_PASS(progress, nir, nir_opt_vectorize, si_vectorize_callback, NULL);
|
||||
} while (progress);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue