<div dir="ltr">Reviewed-by: Jason Ekstrand <<a href="mailto:jason@jlekstrand.net">jason@jlekstrand.net</a>><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 30, 2018 at 10:25 AM, Scott D Phillips <span dir="ltr"><<a href="mailto:scott.d.phillips@intel.com" target="_blank">scott.d.phillips@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Similar to the transformation applied to linear_to_ytiled, also align<br>
each readback from the ytiled source to a cacheline (i.e. transfer a<br>
whole cacheline from the source before moving on to the next column).<br>
This will allow us to utilize movntqda (_mm_stream_si128) in a<br>
subsequent patch to obtain near WB readback performance when accessing<br>
the uncached ytiled memory, an order of magnitude improvement.<br>
<br>
Reviewed-by: Chris Wilson <<a href="mailto:chris@chris-wilson.co.uk">chris@chris-wilson.co.uk</a>><br>
---<br>
 src/mesa/drivers/dri/i965/<wbr>intel_tiled_memcpy.c | 72 +++++++++++++++++++++++---<br>
 1 file changed, 66 insertions(+), 6 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_tiled_memcpy.c b/src/mesa/drivers/dri/i965/<wbr>intel_tiled_memcpy.c<br>
index 69306828d72..7c6bde990d6 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>intel_tiled_memcpy.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>intel_tiled_memcpy.c<br>
@@ -451,7 +451,7 @@ xtiled_to_linear(uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3,<br>
  */<br>
 static inline void<br>
 ytiled_to_linear(uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3,<br>
-                 uint32_t y0, uint32_t y1,<br>
+                 uint32_t y0, uint32_t y3,<br>
                  char *dst, const char *src,<br>
                  int32_t dst_pitch,<br>
                  uint32_t swizzle_bit,<br>
@@ -470,6 +470,9 @@ ytiled_to_linear(uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3,<br>
    const uint32_t column_width = ytile_span;<br>
    const uint32_t bytes_per_column = column_width * ytile_height;<br>
<br>
+   uint32_t y1 = MIN2(y3, ALIGN_UP(y0, 4));<br>
+   uint32_t y2 = MAX2(y1, ALIGN_DOWN(y3, 4));<br>
+<br>
    uint32_t xo0 = (x0 % ytile_span) + (x0 / ytile_span) * bytes_per_column;<br>
    uint32_t xo1 = (x1 % ytile_span) + (x1 / ytile_span) * bytes_per_column;<br>
<br>
@@ -485,24 +488,81 @@ ytiled_to_linear(uint32_t x0, uint32_t x1, uint32_t x2, uint32_t x3,<br>
<br>
    dst += (ptrdiff_t)y0 * dst_pitch;<br>
<br>
-   for (yo = y0 * column_width; yo < y1 * column_width; yo += column_width) {<br>
+   if (y0 != y1) {<br>
+      for (yo = y0 * column_width; yo < y1 * column_width; yo += column_width) {<br>
+         uint32_t xo = xo1;<br>
+         uint32_t swizzle = swizzle1;<br>
+<br>
+         mem_copy(dst + x0, src + ((xo0 + yo) ^ swizzle0), x1 - x0);<br>
+<br>
+         /* Step by spans/columns.  As it happens, the swizzle bit flips<br>
+          * at each step so we don't need to calculate it explicitly.<br>
+          */<br>
+         for (x = x1; x < x2; x += ytile_span) {<br>
+            mem_copy_align16(dst + x, src + ((xo + yo) ^ swizzle), ytile_span);<br>
+            xo += bytes_per_column;<br>
+            swizzle ^= swizzle_bit;<br>
+         }<br>
+<br>
+         mem_copy_align16(dst + x2, src + ((xo + yo) ^ swizzle), x3 - x2);<br>
+<br>
+         dst += dst_pitch;<br>
+      }<br>
+   }<br>
+<br>
+   for (yo = y1 * column_width; yo < y2 * column_width; yo += 4 * column_width) {<br>
       uint32_t xo = xo1;<br>
       uint32_t swizzle = swizzle1;<br>
<br>
-      mem_copy(dst + x0, src + ((xo0 + yo) ^ swizzle0), x1 - x0);<br>
+      if (x0 != x1) {<br>
+         mem_copy(dst + x0 + 0 * dst_pitch, src + ((xo0 + yo + 0 * column_width) ^ swizzle0), x1 - x0);<br>
+         mem_copy(dst + x0 + 1 * dst_pitch, src + ((xo0 + yo + 1 * column_width) ^ swizzle0), x1 - x0);<br>
+         mem_copy(dst + x0 + 2 * dst_pitch, src + ((xo0 + yo + 2 * column_width) ^ swizzle0), x1 - x0);<br>
+         mem_copy(dst + x0 + 3 * dst_pitch, src + ((xo0 + yo + 3 * column_width) ^ swizzle0), x1 - x0);<br>
+      }<br>
<br>
       /* Step by spans/columns.  As it happens, the swizzle bit flips<br>
        * at each step so we don't need to calculate it explicitly.<br>
        */<br>
       for (x = x1; x < x2; x += ytile_span) {<br>
-         mem_copy_align16(dst + x, src + ((xo + yo) ^ swizzle), ytile_span);<br>
+         mem_copy_align16(dst + x + 0 * dst_pitch, src + ((xo + yo + 0 * column_width) ^ swizzle), ytile_span);<br>
+         mem_copy_align16(dst + x + 1 * dst_pitch, src + ((xo + yo + 1 * column_width) ^ swizzle), ytile_span);<br>
+         mem_copy_align16(dst + x + 2 * dst_pitch, src + ((xo + yo + 2 * column_width) ^ swizzle), ytile_span);<br>
+         mem_copy_align16(dst + x + 3 * dst_pitch, src + ((xo + yo + 3 * column_width) ^ swizzle), ytile_span);<br>
          xo += bytes_per_column;<br>
          swizzle ^= swizzle_bit;<br>
       }<br>
<br>
-      mem_copy_align16(dst + x2, src + ((xo + yo) ^ swizzle), x3 - x2);<br>
+      if (x2 != x3) {<br>
+         mem_copy_align16(dst + x2 + 0 * dst_pitch, src + ((xo + yo + 0 * column_width) ^ swizzle), x3 - x2);<br>
+         mem_copy_align16(dst + x2 + 1 * dst_pitch, src + ((xo + yo + 1 * column_width) ^ swizzle), x3 - x2);<br>
+         mem_copy_align16(dst + x2 + 2 * dst_pitch, src + ((xo + yo + 2 * column_width) ^ swizzle), x3 - x2);<br>
+         mem_copy_align16(dst + x2 + 3 * dst_pitch, src + ((xo + yo + 3 * column_width) ^ swizzle), x3 - x2);<br>
+      }<br>
<br>
-      dst += dst_pitch;<br>
+      dst += 4 * dst_pitch;<br>
+   }<br>
+<br>
+   if (y2 != y3) {<br>
+      for (yo = y2 * column_width; yo < y3 * column_width; yo += column_width) {<br>
+         uint32_t xo = xo1;<br>
+         uint32_t swizzle = swizzle1;<br>
+<br>
+         mem_copy(dst + x0, src + ((xo0 + yo) ^ swizzle0), x1 - x0);<br>
+<br>
+         /* Step by spans/columns.  As it happens, the swizzle bit flips<br>
+          * at each step so we don't need to calculate it explicitly.<br>
+          */<br>
+         for (x = x1; x < x2; x += ytile_span) {<br>
+            mem_copy_align16(dst + x, src + ((xo + yo) ^ swizzle), ytile_span);<br>
+            xo += bytes_per_column;<br>
+            swizzle ^= swizzle_bit;<br>
+         }<br>
+<br>
+         mem_copy_align16(dst + x2, src + ((xo + yo) ^ swizzle), x3 - x2);<br>
+<br>
+         dst += dst_pitch;<br>
+      }<br>
    }<br>
 }<br>
<span class="HOEnZb"><font color="#888888"> <br>
-- <br>
2.14.3<br>
<br>
</font></span></blockquote></div><br></div>