Mesa (master): radeonsi: enable FP16 for mediump on gfx9+ if radeonsi_fp16=true

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Apr 14 01:25:54 UTC 2021


Module: Mesa
Branch: master
Commit: 30ab38ba6d8b78164074569aa1f103c895753090
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=30ab38ba6d8b78164074569aa1f103c895753090

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri Sep  4 13:48:30 2020 -0400

radeonsi: enable FP16 for mediump on gfx9+ if radeonsi_fp16=true

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9051>

---

 src/gallium/drivers/radeonsi/si_debug_options.h |  1 +
 src/gallium/drivers/radeonsi/si_get.c           | 16 ++++++++++++----
 src/gallium/drivers/radeonsi/si_pipe.c          |  3 ++-
 src/gallium/drivers/radeonsi/si_shader_nir.c    |  4 ++--
 4 files changed, 17 insertions(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_debug_options.h b/src/gallium/drivers/radeonsi/si_debug_options.h
index 11af7e2d594..6131fb3e8f5 100644
--- a/src/gallium/drivers/radeonsi/si_debug_options.h
+++ b/src/gallium/drivers/radeonsi/si_debug_options.h
@@ -15,5 +15,6 @@ OPT_BOOL(shader_culling, false, "Cull primitives in shaders when benefical (with
 OPT_BOOL(vrs2x2, false, "Enable 2x2 coarse shading for non-GUI elements")
 OPT_BOOL(enable_sam, false, "Enable Smart Access Memory with Above 4G Decoding for unvalidated platforms.")
 OPT_BOOL(disable_sam, false, "Disable Smart Access Memory.")
+OPT_BOOL(fp16, false, "Enable FP16 for mediump.")
 
 #undef OPT_BOOL
diff --git a/src/gallium/drivers/radeonsi/si_get.c b/src/gallium/drivers/radeonsi/si_get.c
index db6e75cf062..7578db3f0c4 100644
--- a/src/gallium/drivers/radeonsi/si_get.c
+++ b/src/gallium/drivers/radeonsi/si_get.c
@@ -27,6 +27,7 @@
 #include "radeon/radeon_vce.h"
 #include "radeon/radeon_video.h"
 #include "si_pipe.h"
+#include "util/u_cpu_detect.h"
 #include "util/u_screen.h"
 #include "util/u_video.h"
 #include "vl/vl_decoder.h"
@@ -431,12 +432,17 @@ 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;
 
-   /* Unsupported boolean features. */
    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;
+
+   /* Unsupported boolean features. */
    case PIPE_SHADER_CAP_INT16:
-   case PIPE_SHADER_CAP_GLSL_16BIT_CONSTS:
    case PIPE_SHADER_CAP_SUBROUTINES:
    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS:
    case PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTER_BUFFERS:
@@ -925,6 +931,8 @@ static void si_init_renderer_string(struct si_screen *sscreen)
 
 void si_init_screen_get_functions(struct si_screen *sscreen)
 {
+   util_cpu_detect();
+
    sscreen->b.get_name = si_get_name;
    sscreen->b.get_vendor = si_get_vendor;
    sscreen->b.get_device_vendor = si_get_device_vendor;
@@ -997,8 +1005,8 @@ void si_init_screen_get_functions(struct si_screen *sscreen)
       .max_unroll_iterations = 32,
       .use_interpolated_input_intrinsics = true,
       .lower_uniforms_to_ubo = true,
-      .support_16bit_alu = sscreen->info.has_packed_math_16bit,
-      .vectorize_vec2_16bit = sscreen->info.has_packed_math_16bit,
+      .support_16bit_alu = sscreen->options.fp16,
+      .vectorize_vec2_16bit = sscreen->options.fp16,
    };
    sscreen->nir_options = nir_options;
 }
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index 6037558c213..35bbbb8125d 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -1005,7 +1005,8 @@ static struct pipe_screen *radeonsi_screen_create_impl(struct radeon_winsys *ws,
                   sscreen->options.disable_sam);
 
    /* Older LLVM have buggy v_pk_* instructions. */
-   sscreen->info.has_packed_math_16bit &= LLVM_VERSION_MAJOR >= 11;
+   if (!sscreen->info.has_packed_math_16bit || LLVM_VERSION_MAJOR < 11)
+      sscreen->options.fp16 = false;
 
    if (sscreen->info.chip_class == GFX10_3 && LLVM_VERSION_MAJOR < 11) {
       fprintf(stderr, "radeonsi: GFX 10.3 requires LLVM 11 or higher\n");
diff --git a/src/gallium/drivers/radeonsi/si_shader_nir.c b/src/gallium/drivers/radeonsi/si_shader_nir.c
index a04a724e263..21576b12410 100644
--- a/src/gallium/drivers/radeonsi/si_shader_nir.c
+++ b/src/gallium/drivers/radeonsi/si_shader_nir.c
@@ -514,7 +514,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->info.has_packed_math_16bit &&
+   if (sscreen->options.fp16 &&
        instr->type == nir_instr_type_alu) {
       nir_alu_instr *alu = nir_instr_as_alu(instr);
 
@@ -594,7 +594,7 @@ void si_nir_opts(struct si_screen *sscreen, struct nir_shader *nir, bool first)
          NIR_PASS(progress, nir, nir_opt_loop_unroll, 0);
       }
 
-      if (sscreen->info.has_packed_math_16bit)
+      if (sscreen->options.fp16)
          NIR_PASS(progress, nir, nir_opt_vectorize, NULL, NULL);
    } while (progress);
 



More information about the mesa-commit mailing list