[Mesa-dev] [PATCH 14/22] i965/vec4: fix double_to_single() for IVB/VLV

Samuel Iglesias Gonsálvez siglesias at igalia.com
Thu Jan 5 13:07:34 UTC 2017


From: "Juan A. Suarez Romero" <jasuarez at igalia.com>

In the generator we must generate slightly different code for
Ivybridge/Valleview, because of the way the stride works in
this hardware.
---
 src/mesa/drivers/dri/i965/brw_vec4_generator.cpp | 26 +++++++++++++++++++++---
 1 file changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
index 0eaa91b..a68e14c 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_generator.cpp
@@ -1936,13 +1936,28 @@ generate_code(struct brw_codegen *p,
 
          brw_set_default_access_mode(p, BRW_ALIGN_1);
 
-         dst.hstride = BRW_HORIZONTAL_STRIDE_2;
+         /* When converting from DF->F, we set destination's stride as 2 as an
+          * aligment requirement. But in IVB/VLV, each DF implicitly writes
+          * two floats, being the first one the converted value. So we don't
+          * need to explicitly set stride 2, but 1.
+          */
+         if (devinfo->gen == 7 && !devinfo->is_haswell)
+            dst.hstride = BRW_HORIZONTAL_STRIDE_1;
+         else
+            dst.hstride = BRW_HORIZONTAL_STRIDE_2;
+
          dst.width = BRW_WIDTH_4;
          src[0].vstride = BRW_VERTICAL_STRIDE_4;
          src[0].width = BRW_WIDTH_4;
          brw_MOV(p, dst, src[0]);
 
          struct brw_reg dst_as_src = dst;
+         /* As we have set horizontal stride 1 instead of 2 in IVB/VLV, we
+          * need to fix it here to have the expected value.
+          */
+         if (devinfo->gen == 7 && !devinfo->is_haswell)
+            dst_as_src.hstride = BRW_HORIZONTAL_STRIDE_2;
+
          dst.hstride = BRW_HORIZONTAL_STRIDE_1;
          dst.width = BRW_WIDTH_8;
          brw_MOV(p, dst, dst_as_src);
@@ -1965,8 +1980,13 @@ generate_code(struct brw_codegen *p,
          src[0].width = BRW_WIDTH_4;
          brw_MOV(p, tmp, src[0]);
 
-         tmp.vstride = BRW_VERTICAL_STRIDE_8;
-         tmp.hstride = BRW_HORIZONTAL_STRIDE_2;
+         if (devinfo->gen == 7 && !devinfo->is_haswell) {
+            tmp.vstride = BRW_VERTICAL_STRIDE_4;
+            tmp.hstride = BRW_HORIZONTAL_STRIDE_1;
+         } else {
+            tmp.vstride = BRW_VERTICAL_STRIDE_8;
+            tmp.hstride = BRW_HORIZONTAL_STRIDE_2;
+         }
          tmp.width = BRW_WIDTH_4;
          brw_MOV(p, dst, tmp);
 
-- 
2.9.3



More information about the mesa-dev mailing list