i965: re-enable gen6 IF statements in the fragment shader.
authorEric Anholt <eric@anholt.net>
Mon, 11 Oct 2010 23:02:08 +0000 (16:02 -0700)
committerEric Anholt <eric@anholt.net>
Wed, 10 Nov 2010 21:33:27 +0000 (13:33 -0800)
IF statements were getting flattened while they were broken.  With
Zhenyu's last fix for ENDIF's type, everything appears to have lined
up to actually work.

This regresses two tests:
glsl1-! (not) operator (1, fail)
glsl1-! (not) operator (1, pass)

but fixes tests that couldn't work before because the IFs couldn't be
flattened:
glsl-fs-discard-01
occlusion-query-discard

(and, naturally, this should be a performance improvement for apps
that actually use IF statements to avoid executing a bunch of code).

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

index 3c4ae8a7a4f6d7920bf43457f1d707d6863ad130..cb0a8b96c9c3cdb03b7e3de33320a9461a381a96 100644 (file)
@@ -124,7 +124,7 @@ GLboolean brwCreateContext( int api,
         (i == MESA_SHADER_FRAGMENT);
 
       if (intel->gen == 6)
-        ctx->ShaderCompilerOptions[i].EmitNoIfs = GL_TRUE;
+        ctx->ShaderCompilerOptions[i].EmitNoIfs = (i == MESA_SHADER_VERTEX);
    }
 
    ctx->Const.VertexProgram.MaxNativeInstructions = (16 * 1024);
index 3caddae4a102ac85a2c98922d07c9aea5d20d72a..283d5aad496fc1e431fc896838b5f0acc725ca2e 100644 (file)
@@ -89,8 +89,6 @@ 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 intel_context *intel = intel_context(ctx);
-
    struct brw_shader *shader =
       (struct brw_shader *)prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
    if (shader != NULL) {
@@ -132,9 +130,6 @@ brw_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
                                                GL_TRUE, /* temp */
                                                GL_TRUE /* uniform */
                                                ) || progress;
-        if (intel->gen == 6) {
-           progress = do_if_to_cond_assign(shader->ir) || progress;
-        }
       } while (progress);
 
       validate_ir_tree(shader->ir);