summaryrefslogtreecommitdiffstats
path: root/src/broadcom/compiler/nir_to_vir.c
diff options
context:
space:
mode:
authorEric Anholt <[email protected]>2018-09-18 14:09:25 -0700
committerEric Anholt <[email protected]>2018-10-15 17:16:44 -0700
commit8ec83dc51e407fa0987d636752497509278c0dbb (patch)
treefa6234c585a2df6041667ed3db0031577a6ecb09 /src/broadcom/compiler/nir_to_vir.c
parent7d77fe1bcc8e84a30ddc5d4bc6b0c571dfd64b22 (diff)
v3d: Add support for hardware pack/unpack of half floats.
Cuts the formerly 7-minute simulation time of fs-packHalf2x16.shader_test in half.
Diffstat (limited to 'src/broadcom/compiler/nir_to_vir.c')
-rw-r--r--src/broadcom/compiler/nir_to_vir.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index 158c1c3e9f3..714d76f58ba 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,