[Mesa-dev] [PATCH 3/3] i965: Use correct VertStride on align16 instructions.
Matt Turner
mattst88 at gmail.com
Fri Jan 20 21:35:33 UTC 2017
In commit c35fa7a, we changed the "width" of DF source registers to 2,
which is conceptually fine. Unfortunately a VertStride of 2 is not
allowed by align16 instructions on IVB/BYT, and the regular VertStride
of 4 works fine in any case.
See generated_tests/spec/arb_gpu_shader_fp64/execution/built-in-functions/vs-round-double.shader_test
for example:
cmp.ge.f0(8) g18<1>DF g1<0>.xyxyDF -g8<2>DF { align16 1Q };
ERROR: In Align16 mode, only VertStride of 0 or 4 is allowed
cmp.ge.f0(8) g19<1>DF g1<0>.xyxyDF -g9<2>DF { align16 2N };
ERROR: In Align16 mode, only VertStride of 0 or 4 is allowed
---
src/mesa/drivers/dri/i965/brw_eu_emit.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
index 888f95e..a01083f 100644
--- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
+++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
@@ -512,10 +512,15 @@ brw_set_src0(struct brw_codegen *p, brw_inst *inst, struct brw_reg reg)
/* This is an oddity of the fact we're using the same
* descriptions for registers in align_16 as align_1:
*/
- if (reg.vstride == BRW_VERTICAL_STRIDE_8)
+ if (reg.vstride == BRW_VERTICAL_STRIDE_8) {
brw_inst_set_src0_vstride(devinfo, inst, BRW_VERTICAL_STRIDE_4);
- else
+ } else if (devinfo->gen == 7 && !devinfo->is_haswell &&
+ reg.type == BRW_REGISTER_TYPE_DF &&
+ reg.vstride >= BRW_VERTICAL_STRIDE_1) {
+ brw_inst_set_src0_vstride(devinfo, inst, BRW_VERTICAL_STRIDE_4);
+ } else {
brw_inst_set_src0_vstride(devinfo, inst, reg.vstride);
+ }
}
}
}
@@ -594,10 +599,15 @@ brw_set_src1(struct brw_codegen *p, brw_inst *inst, struct brw_reg reg)
/* This is an oddity of the fact we're using the same
* descriptions for registers in align_16 as align_1:
*/
- if (reg.vstride == BRW_VERTICAL_STRIDE_8)
+ if (reg.vstride == BRW_VERTICAL_STRIDE_8) {
brw_inst_set_src1_vstride(devinfo, inst, BRW_VERTICAL_STRIDE_4);
- else
+ } else if (devinfo->gen == 7 && !devinfo->is_haswell &&
+ reg.type == BRW_REGISTER_TYPE_DF &&
+ reg.vstride >= BRW_VERTICAL_STRIDE_1) {
+ brw_inst_set_src1_vstride(devinfo, inst, BRW_VERTICAL_STRIDE_4);
+ } else {
brw_inst_set_src1_vstride(devinfo, inst, reg.vstride);
+ }
}
}
}
--
2.7.3
More information about the mesa-dev
mailing list