intel: Align untiled region height to 2 according to 965 docs.
authorEric Anholt <eric@anholt.net>
Thu, 13 Aug 2009 02:40:27 +0000 (19:40 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 19 Aug 2009 16:19:06 +0000 (09:19 -0700)
This may or may not be required pre-965, but it doesn't seem unlikely, and
I'd rather be safe.

src/mesa/drivers/dri/intel/intel_regions.c

index 497f7967649eaafe9d47d63d3f9d48ef9b79b5e3..068a3f33797b4c4cedc85551ff8858c11a97d5f5 100644 (file)
@@ -181,10 +181,20 @@ intel_region_alloc(struct intel_context *intel,
    dri_bo *buffer;
    struct intel_region *region;
 
+   /* If we're tiled, our allocations are in 8 or 32-row blocks, so
+    * failure to align our height means that we won't allocate enough pages.
+    *
+    * If we're untiled, we still have to align to 2 rows high because the
+    * data port accesses 2x2 blocks even if the bottom row isn't to be
+    * rendered, so failure to align means we could walk off the end of the
+    * GTT and fault.
+    */
    if (tiling == I915_TILING_X)
       height = ALIGN(height, 8);
    else if (tiling == I915_TILING_Y)
       height = ALIGN(height, 32);
+   else
+      height = ALIGN(height, 2);
 
    if (expect_accelerated_upload) {
       buffer = drm_intel_bo_alloc_for_render(intel->bufmgr, "region",