i915: Ask the compiler to flatten out all the if statements that it can.
authorEric Anholt <eric@anholt.net>
Mon, 19 Jul 2010 17:21:58 +0000 (10:21 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 19 Jul 2010 17:47:08 +0000 (10:47 -0700)
src/mesa/drivers/dri/i915/i915_context.c
src/mesa/main/mtypes.h
src/mesa/shader/ir_to_mesa.cpp
src/mesa/shader/shader_api.c

index b3fe1c05d669c4dad0a6a0705a375733b6daeb6f..d8715cf026d3ebe5c49a20920c15e6953b887d5b 100644 (file)
@@ -174,6 +174,8 @@ i915CreateContext(int api,
 
    ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
 
+   ctx->Shader.EmitNoIfs = GL_TRUE;
+
    ctx->Const.MaxDrawBuffers = 1;
 
    _tnl_init_vertices(ctx, ctx->Const.MaxArrayLockSize + 12,
index 9a36740c415b62ec8ee4676c842e2bc6dd849ff6..be9eaaa875c2bdc6d6463c690f6f8c4f41925f6a 100644 (file)
@@ -2038,6 +2038,11 @@ struct gl_shader_state
    GLboolean EmitCondCodes;             /**< Use condition codes? */
    GLboolean EmitComments;              /**< Annotated instructions */
    GLboolean EmitNVTempInitialization;  /**< 0-fill NV temp registers */
+   /**
+    * Attempts to flatten all ir_if (OPCODE_IF) for GPUs that can't
+    * support control flow.
+    */
+   GLboolean EmitNoIfs;
    void *MemPool;
    GLbitfield Flags;                    /**< Mask of GLSL_x flags */
    struct gl_sl_pragmas DefaultPragmas; /**< Default #pragma settings */
index 84cfff4010694019babef0dc0bdaa6e902c99809..58320c921744aff21ea4d2c06cc6fe89c73696aa 100644 (file)
@@ -2026,8 +2026,10 @@ link_uniforms_to_shared_uniform_list(struct gl_uniform_list *uniforms,
 }
 
 struct gl_program *
-get_mesa_program(GLcontext *ctx, void *mem_ctx, struct gl_shader *shader)
+get_mesa_program(GLcontext *ctx, struct gl_shader_program *shader_program,
+                struct gl_shader *shader)
 {
+   void *mem_ctx = shader_program;
    ir_to_mesa_visitor v;
    struct prog_instruction *mesa_instructions, *mesa_inst;
    ir_instruction **mesa_instruction_annotation;
@@ -2112,6 +2114,13 @@ get_mesa_program(GLcontext *ctx, void *mem_ctx, struct gl_shader *shader)
       mesa_inst->TexShadow = inst->tex_shadow;
       mesa_instruction_annotation[i] = inst->ir;
 
+      if (ctx->Shader.EmitNoIfs && mesa_inst->Opcode == OPCODE_IF) {
+        shader_program->InfoLog =
+           talloc_asprintf_append(shader_program->InfoLog,
+                                  "Couldn't flatten if statement\n");
+        shader_program->LinkStatus = false;
+      }
+
       if (mesa_inst->Opcode == OPCODE_BGNSUB)
         inst->function->inst = i;
       else if (mesa_inst->Opcode == OPCODE_CAL)
@@ -2206,6 +2215,8 @@ _mesa_glsl_compile_shader(GLcontext *ctx, struct gl_shader *shader)
         progress = do_constant_variable_unlinked(shader->ir) || progress;
         progress = do_constant_folding(shader->ir) || progress;
         progress = do_if_return(shader->ir) || progress;
+        if (ctx->Shader.EmitNoIfs)
+           progress = do_if_to_cond_assign(shader->ir) || progress;
 
         progress = do_vec_index_to_swizzle(shader->ir) || progress;
         /* Do this one after the previous to let the easier pass handle
index f05ebc9fcb6c6e0c5627c0d6185de8389f793835..cd02d7d83074b46f4891d11b110f06d776648559 100644 (file)
@@ -431,6 +431,7 @@ _mesa_init_shader_state(GLcontext * ctx)
    ctx->Shader.EmitContReturn = GL_TRUE;
    ctx->Shader.EmitCondCodes = GL_FALSE;
    ctx->Shader.EmitComments = GL_FALSE;
+   ctx->Shader.EmitNoIfs = GL_FALSE;
    ctx->Shader.Flags = get_shader_flags();
 
    /* Default pragma settings */