From 92333c6d1a6e71215c82a49485ba27d1def85152 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 10 May 2020 23:04:23 -0400 Subject: [PATCH] nir: lower int16 and uint16 in nir_lower_mediump_outputs Reviewed-by: Alyssa Rosenzweig Reviewed-by: Rob Clark Part-of: --- src/compiler/nir/nir_lower_mediump_outputs.c | 60 ++++++++++++-------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/compiler/nir/nir_lower_mediump_outputs.c b/src/compiler/nir/nir_lower_mediump_outputs.c index 1b3b9ebc7ae..13c03f9b624 100644 --- a/src/compiler/nir/nir_lower_mediump_outputs.c +++ b/src/compiler/nir/nir_lower_mediump_outputs.c @@ -24,24 +24,7 @@ #include "nir.h" #include "nir_builder.h" -/* Lower mediump FS outputs to fp16 */ - -static bool -lower_output_var(nir_shader *nir, int location) -{ - nir_foreach_variable (var, &nir->outputs) { - if (var->data.driver_location == location && - ((var->data.precision == GLSL_PRECISION_MEDIUM) || - (var->data.precision == GLSL_PRECISION_LOW))) { - if (glsl_get_base_type(var->type) == GLSL_TYPE_FLOAT) - var->type = glsl_float16_type(var->type); - - return glsl_get_base_type(var->type) == GLSL_TYPE_FLOAT16; - } - } - - return false; -} +/* Lower mediump outputs to float16, int16, or uint16. */ void nir_lower_mediump_outputs(nir_shader *nir) @@ -64,14 +47,43 @@ nir_lower_mediump_outputs(nir_shader *nir) if (intr->intrinsic != nir_intrinsic_store_output) continue; - if (!lower_output_var(nir, nir_intrinsic_base(intr))) - continue; + nir_foreach_variable (var, &nir->outputs) { + if (var->data.driver_location != nir_intrinsic_base(intr)) + continue; /* not found yet */ + + if (var->data.precision != GLSL_PRECISION_MEDIUM && + var->data.precision != GLSL_PRECISION_LOW) + break; /* can't lower */ + + switch (glsl_get_base_type(var->type)) { + case GLSL_TYPE_FLOAT: + var->type = glsl_float16_type(var->type); + b.cursor = nir_before_instr(&intr->instr); + nir_instr_rewrite_src(&intr->instr, &intr->src[0], + nir_src_for_ssa(nir_f2f16(&b, intr->src[0].ssa))); + nir_intrinsic_set_type(intr, nir_type_float16); + break; + + case GLSL_TYPE_INT: + var->type = glsl_int16_type(var->type); + b.cursor = nir_before_instr(&intr->instr); + nir_instr_rewrite_src(&intr->instr, &intr->src[0], + nir_src_for_ssa(nir_i2i16(&b, intr->src[0].ssa))); + nir_intrinsic_set_type(intr, nir_type_int16); + break; - b.cursor = nir_before_instr(&intr->instr); - nir_instr_rewrite_src(&intr->instr, &intr->src[0], - nir_src_for_ssa(nir_f2f16(&b, intr->src[0].ssa))); + case GLSL_TYPE_UINT: + var->type = glsl_uint16_type(var->type); + b.cursor = nir_before_instr(&intr->instr); + nir_instr_rewrite_src(&intr->instr, &intr->src[0], + nir_src_for_ssa(nir_u2u16(&b, intr->src[0].ssa))); + nir_intrinsic_set_type(intr, nir_type_uint16); + break; - nir_intrinsic_set_type(intr, nir_type_float16); + default:; + } + break; + } } } } -- 2.30.2