Mesa (master): v3d: Add support for hardware pack/unpack of half floats.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Oct 16 00:17:42 UTC 2018


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

Author: Eric Anholt <eric at anholt.net>
Date:   Tue Sep 18 14:09:25 2018 -0700

v3d: Add support for hardware pack/unpack of half floats.

Cuts the formerly 7-minute simulation time of fs-packHalf2x16.shader_test
in half.

---

 src/broadcom/compiler/nir_to_vir.c   | 16 ++++++++++++++++
 src/gallium/drivers/v3d/v3d_screen.c |  1 +
 2 files changed, 17 insertions(+)

diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index 158c1c3e9f..714d76f58b 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -845,6 +845,20 @@ ntq_emit_alu(struct v3d_compile *c, nir_alu_instr *instr)
                                             vir_uniform_ui(c, 0)));
                 break;
 
+        case nir_op_pack_half_2x16_split:
+                result = vir_VFPACK(c, src[0], src[1]);
+                break;
+
+        case nir_op_unpack_half_2x16_split_x:
+                result = vir_FMOV(c, src[0]);
+                vir_set_unpack(c->defs[result.index], 0, V3D_QPU_UNPACK_L);
+                break;
+
+        case nir_op_unpack_half_2x16_split_y:
+                result = vir_FMOV(c, src[0]);
+                vir_set_unpack(c->defs[result.index], 0, V3D_QPU_UNPACK_H);
+                break;
+
         default:
                 fprintf(stderr, "unknown NIR ALU inst: ");
                 nir_print_instr(&instr->instr, stderr);
@@ -1917,6 +1931,8 @@ const nir_shader_compiler_options v3d_nir_options = {
         .lower_pack_snorm_4x8 = true,
         .lower_unpack_unorm_4x8 = true,
         .lower_unpack_snorm_4x8 = true,
+        .lower_pack_half_2x16 = true,
+        .lower_unpack_half_2x16 = true,
         .lower_fdiv = true,
         .lower_find_lsb = true,
         .lower_ffma = true,
diff --git a/src/gallium/drivers/v3d/v3d_screen.c b/src/gallium/drivers/v3d/v3d_screen.c
index efde220c89..5a8400dcf0 100644
--- a/src/gallium/drivers/v3d/v3d_screen.c
+++ b/src/gallium/drivers/v3d/v3d_screen.c
@@ -109,6 +109,7 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
         case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
         case PIPE_CAP_SIGNED_VERTEX_BUFFER_OFFSET:
         case PIPE_CAP_TGSI_CAN_READ_OUTPUTS:
+        case PIPE_CAP_TGSI_PACK_HALF_FLOAT:
                 return 1;
 
         case PIPE_CAP_INDEP_BLEND_ENABLE:




More information about the mesa-commit mailing list