i965: Store QPitch in intel_mipmap_tree.
authorKenneth Graunke <kenneth@whitecape.org>
Sat, 14 Dec 2013 00:10:02 +0000 (16:10 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Fri, 20 Dec 2013 20:41:54 +0000 (12:41 -0800)
Broadwell allows us to specify an arbitrary value for QPitch, rather
than baking a specific formula into the hardware and requiring software
to lay things out to match.  The only restriction is that the software
provided QPitch needs to be large enough so successive array slices do
not overlap.

In order to support this flexibility, software needs to specify QPitch
in a bunch of packets.  Storing QPitch makes that easy, and allows us to
adjust it in a single place should we wish to change it in the future.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Paul Berry <stereotype441@gmail.com>
src/mesa/drivers/dri/i965/brw_tex_layout.c
src/mesa/drivers/dri/i965/intel_mipmap_tree.h

index 16af19f0090174710af259fd2f8135b4e5f5e25e..a0f584b763b9c299091f6c9e43c5842b3c0594fd 100644 (file)
@@ -238,26 +238,25 @@ static void
 brw_miptree_layout_texture_array(struct brw_context *brw,
                                 struct intel_mipmap_tree *mt)
 {
-   unsigned qpitch = 0;
    int h0, h1;
 
    h0 = ALIGN(mt->physical_height0, mt->align_h);
    h1 = ALIGN(minify(mt->physical_height0, 1), mt->align_h);
    if (mt->array_spacing_lod0)
-      qpitch = h0;
+      mt->qpitch = h0;
    else
-      qpitch = (h0 + h1 + (brw->gen >= 7 ? 12 : 11) * mt->align_h);
+      mt->qpitch = (h0 + h1 + (brw->gen >= 7 ? 12 : 11) * mt->align_h);
    if (mt->compressed)
-      qpitch /= 4;
+      mt->qpitch /= 4;
 
    brw_miptree_layout_2d(mt);
 
    for (unsigned level = mt->first_level; level <= mt->last_level; level++) {
       for (int q = 0; q < mt->physical_depth0; q++) {
-        intel_miptree_set_image_offset(mt, level, q, 0, q * qpitch);
+        intel_miptree_set_image_offset(mt, level, q, 0, q * mt->qpitch);
       }
    }
-   mt->total_height = qpitch * mt->physical_depth0;
+   mt->total_height = mt->qpitch * mt->physical_depth0;
 
    align_cube(mt);
 }
index cde702c3c4ad6e0c3fa7a13ecc01cb722575482c..329eeb0fbd507e20bfc6bd6e628e0e95453a3a89 100644 (file)
@@ -333,6 +333,11 @@ struct intel_mipmap_tree
     */
    bool array_spacing_lod0;
 
+   /**
+    * The distance in rows between array slices.
+    */
+   uint32_t qpitch;
+
    /**
     * MSAA layout used by this buffer.
     */