i965: Only set proj_attrib_mask for fixed function.
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 14 Aug 2012 06:42:23 +0000 (23:42 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 27 Aug 2012 21:23:40 +0000 (14:23 -0700)
brw_wm_prog_key's proj_attrib_mask field is designed to enable an
optimization for fixed-function programs, letting us avoid projecting
attributes where the divisor is 1.0.

However, for shaders, this is not useful, and is pretty much impossible
to guess when building the FS precompile key.  Turning it off for
shaders should allow the precompile to work and not lose much.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Suggested-by: Eric Anholt <eric@anholt.net>
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_wm.c

index ae462f7fcfe4eb1f8e5ae64b19e6494cb3654da4..ebb52fcef43aa1d8d104a3fba7cab6b2dcb1b757 100644 (file)
@@ -2155,6 +2155,9 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
       key.iz_lookup |= IZ_DEPTH_WRITE_ENABLE_BIT;
    }
 
+   if (prog->Name != 0)
+      key.proj_attrib_mask = 0xffffffff;
+
    if (intel->gen < 6)
       key.vp_outputs_written |= BITFIELD64_BIT(FRAG_ATTRIB_WPOS);
 
@@ -2162,7 +2165,8 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
       if (!(fp->Base.InputsRead & BITFIELD64_BIT(i)))
         continue;
 
-      key.proj_attrib_mask |= 1 << i;
+      if (prog->Name == 0)
+         key.proj_attrib_mask |= 1 << i;
 
       if (intel->gen < 6) {
          int vp_index = _mesa_vert_result_to_frag_attrib((gl_vert_result) i);
index 9d9696180428f719ab5d75cb0f3317dbcb67c874..ec5eccdc13051039d2bb5595be3efe604621986b 100644 (file)
@@ -592,7 +592,13 @@ static void brw_wm_populate_key( struct brw_context *brw,
       key->stats_wm = brw->intel.stats_wm;
 
    /* BRW_NEW_WM_INPUT_DIMENSIONS */
-   key->proj_attrib_mask = brw->wm.input_size_masks[4-1];
+   /* Only set this for fixed function.  The optimization it enables isn't
+    * useful for programs using shaders.
+    */
+   if (ctx->Shader.CurrentFragmentProgram)
+      key->proj_attrib_mask = 0xffffffff;
+   else
+      key->proj_attrib_mask = brw->wm.input_size_masks[4-1];
 
    /* _NEW_LIGHT */
    key->flat_shade = (ctx->Light.ShadeModel == GL_FLAT);