The apitrace dump in bug #34009 managed to fool the draw_offset check
into thinking that we were tile aligned when we weren't.  This led to an
assertion failure in brw_update_renderbuffer_surface with tile_y != 0.

Simply compute tile_x and tile_y and check those, as that way both
places are checking the same thing.

NOTE: This is a candidate for stable release branches.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=34009
Signed-off-by: Kenneth Graunke <kenn...@whitecape.org>
---
 src/mesa/drivers/dri/intel/intel_fbo.c |   53 +++++++++++++++++---------------
 1 files changed, 28 insertions(+), 25 deletions(-)

For reviewers: Most of this patch is simply reindenting the code, as I added
pushed it inside a new if-statement.

diff --git a/src/mesa/drivers/dri/intel/intel_fbo.c 
b/src/mesa/drivers/dri/intel/intel_fbo.c
index 35be325..6f65e2c 100644
--- a/src/mesa/drivers/dri/intel/intel_fbo.c
+++ b/src/mesa/drivers/dri/intel/intel_fbo.c
@@ -700,8 +700,7 @@ intel_render_texture(struct gl_context * ctx,
    intel_image->used_as_render_target = GL_TRUE;
 
 #ifndef I915
-   if (!brw_context(ctx)->has_surface_tile_offset &&
-       (irb->draw_offset & 4095) != 0) {
+   if (!brw_context(ctx)->has_surface_tile_offset) {
       /* Original gen4 hardware couldn't draw to a non-tile-aligned
        * destination in a miptree unless you actually setup your
        * renderbuffer as a miptree and used the fragile
@@ -709,30 +708,34 @@ intel_render_texture(struct gl_context * ctx,
        * instead, we just make a new single-level miptree and render
        * into that.
        */
-      struct intel_context *intel = intel_context(ctx);
-      struct intel_mipmap_tree *old_mt = intel_image->mt;
-      struct intel_mipmap_tree *new_mt;
-
-      new_mt = intel_miptree_create(intel, image->TexObject->Target,
-                                   intel_image->base.TexFormat,
-                                   intel_image->level,
-                                   intel_image->level,
-                                   intel_image->base.Width,
-                                   intel_image->base.Height,
-                                   intel_image->base.Depth,
-                                   GL_TRUE);
-
-      intel_miptree_image_copy(intel,
-                               new_mt,
-                               intel_image->face,
-                              intel_image->level,
-                              old_mt);
-
-      intel_miptree_release(intel, &intel_image->mt);
-      intel_image->mt = new_mt;
-      intel_renderbuffer_set_draw_offset(irb, intel_image, att->Zoffset);
+      uint32_t tile_x, tile_y;
+      intel_renderbuffer_tile_offsets(irb, &tile_x, &tile_y);
+      if (tile_x != 0 || tile_y != 0) {
+        struct intel_context *intel = intel_context(ctx);
+        struct intel_mipmap_tree *old_mt = intel_image->mt;
+        struct intel_mipmap_tree *new_mt;
+
+        new_mt = intel_miptree_create(intel, image->TexObject->Target,
+                                      intel_image->base.TexFormat,
+                                      intel_image->level,
+                                      intel_image->level,
+                                      intel_image->base.Width,
+                                      intel_image->base.Height,
+                                      intel_image->base.Depth,
+                                      GL_TRUE);
 
-      intel_region_reference(&irb->region, intel_image->mt->region);
+        intel_miptree_image_copy(intel,
+                                 new_mt,
+                                 intel_image->face,
+                                 intel_image->level,
+                                 old_mt);
+
+        intel_miptree_release(intel, &intel_image->mt);
+        intel_image->mt = new_mt;
+        intel_renderbuffer_set_draw_offset(irb, intel_image, att->Zoffset);
+
+        intel_region_reference(&irb->region, intel_image->mt->region);
+      }
    }
 #endif
    /* update drawing region, etc */
-- 
1.7.6

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to