i965: Flatten if-statements beyond depth 16 on pre-gen6.
authorKenneth Graunke <kenneth@whitecape.org>
Mon, 27 Dec 2010 08:40:26 +0000 (00:40 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 27 Dec 2010 08:59:31 +0000 (00:59 -0800)
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.

src/mesa/drivers/dri/i965/brw_fs.cpp

index 2de81b283715b7ec4ee8e41f81b63bbe903f9be0..1c6ead57a74e170cea1e54d4a2dfb718f032e33b 100644 (file)
@@ -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);