Mesa (master): i965/gen6: Fix HiZ hang in WebGL Google Maps

Chad Versace chadversary at kemper.freedesktop.org
Fri Dec 20 23:21:02 UTC 2013


Module: Mesa
Branch: master
Commit: 1a928816a1b717201f3b3cc998a42731b280e6ba
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1a928816a1b717201f3b3cc998a42731b280e6ba

Author: Chad Versace <chad.versace at linux.intel.com>
Date:   Fri Dec 20 04:39:03 2013 -0800

i965/gen6: Fix HiZ hang in WebGL Google Maps

Emitting flushes before depth and hiz resolves at the top of blorp's
state emission fixes the hang. Marchesin and I found the fix
experimentally, as opposed to adhering to a documented hardware
workaround.  A more minimal fix likely exists, but this gets the job
done.

Fixes HiZ hangs in the new WebGL Google maps on Sandybridge Chrome OS.
Tested by zooming in and out continuously for 2 hours.

This patch is based on
https://chromium.googlesource.com/chromiumos/overlays/chromiumos-overlay/+/8bc07bb70163c3706fb4ba5f980e57dc942f56dd

CC: mesa-stable at lists.freedesktop.org
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=70740
Signed-off-by: Stéphane Marchesin <marcheu at chromium.org>
Signed-off-by: Chad Versace <chad.versace at linux.intel.com>
Reviewed-by: Paul Berry <stereotype441 at gmail.com>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 src/mesa/drivers/dri/i965/gen6_blorp.cpp |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/gen6_blorp.cpp b/src/mesa/drivers/dri/i965/gen6_blorp.cpp
index 6a5841f..441d61f 100644
--- a/src/mesa/drivers/dri/i965/gen6_blorp.cpp
+++ b/src/mesa/drivers/dri/i965/gen6_blorp.cpp
@@ -1012,6 +1012,19 @@ gen6_blorp_emit_primitive(struct brw_context *brw,
    ADVANCE_BATCH();
 }
 
+static void
+gen6_emit_hiz_workaround(struct brw_context *brw, enum gen6_hiz_op hiz_op)
+{
+   /* This fixes a HiZ hang in WebGL Google Maps. A more minimal fix likely
+    * exists, but this gets the job done.
+    */
+   if (hiz_op == GEN6_HIZ_OP_DEPTH_RESOLVE ||
+       hiz_op == GEN6_HIZ_OP_HIZ_RESOLVE) {
+      brw->batch.need_workaround_flush = true;
+      intel_emit_post_sync_nonzero_flush(brw);
+      intel_emit_depth_stall_flushes(brw);
+   }
+}
 
 /**
  * \brief Execute a blit or render pass operation.
@@ -1034,6 +1047,8 @@ gen6_blorp_exec(struct brw_context *brw,
    uint32_t wm_bind_bo_offset = 0;
 
    uint32_t prog_offset = params->get_wm_prog(brw, &prog_data);
+
+   gen6_emit_hiz_workaround(brw, params->hiz_op);
    gen6_emit_3dstate_multisample(brw, params->dst.num_samples);
    gen6_emit_3dstate_sample_mask(brw,
                                  params->dst.num_samples > 1 ?




More information about the mesa-commit mailing list