Mesa (7.10): i965: Flatten if-statements beyond depth 16 on pre-gen6.

Ian Romanick idr at kemper.freedesktop.org
Tue Jan 4 17:59:29 UTC 2011


Module: Mesa
Branch: 7.10
Commit: 8cfce0c6430e554bff8425adbe7f9d1cb5018196
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=8cfce0c6430e554bff8425adbe7f9d1cb5018196

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Mon Dec 27 00:40:26 2010 -0800

i965: Flatten if-statements beyond depth 16 on pre-gen6.

Gen4 and Gen5 hardware can have a maximum supported nesting depth of 16.
Previously, shaders with control flow nested 17 levels deep would
cause a driver assertion or segmentation fault.

Gen6 (Sandybridge) hardware no longer has this restriction.

Fixes fd.o bug #31967.
(cherry picked from commit 634a7dce9c1d9e4a8576ff8197c8adaea7e9ddd1)

---

 src/mesa/drivers/dri/i965/brw_fs.cpp |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index 2de81b2..1c6ead5 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -89,6 +89,9 @@ brw_compile_shader(struct gl_context *ctx, struct gl_shader *shader)
 GLboolean
 brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
 {
+   struct brw_context *brw = brw_context(ctx);
+   struct intel_context *intel = &brw->intel;
+
    struct brw_shader *shader =
       (struct brw_shader *)prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
    if (shader != NULL) {
@@ -107,6 +110,13 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
 			 SUB_TO_ADD_NEG |
 			 EXP_TO_EXP2 |
 			 LOG_TO_LOG2);
+
+      /* Pre-gen6 HW can only nest if-statements 16 deep.  Beyond this,
+       * if-statements need to be flattened.
+       */
+      if (intel->gen < 6)
+	 lower_if_to_cond_assign(shader->ir, 16);
+
       do_lower_texture_projection(shader->ir);
       brw_do_cubemap_normalize(shader->ir);
 




More information about the mesa-commit mailing list