Mesa (master): i965: Only set proj_attrib_mask for fixed function.

Kenneth Graunke kwg at kemper.freedesktop.org
Mon Aug 27 21:24:58 UTC 2012


Module: Mesa
Branch: master
Commit: ab17762c70852ca8fc400d7b5c6696d412ff2afe
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=ab17762c70852ca8fc400d7b5c6696d412ff2afe

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Mon Aug 13 23:42:23 2012 -0700

i965: Only set proj_attrib_mask for fixed function.

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 at whitecape.org>
Suggested-by: Eric Anholt <eric at anholt.net>
Reviewed-by: Eric Anholt <eric at anholt.net>

---

 src/mesa/drivers/dri/i965/brw_fs.cpp |    6 +++++-
 src/mesa/drivers/dri/i965/brw_wm.c   |    8 +++++++-
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
index ae462f7..ebb52fc 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -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);
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 9d96961..ec5eccd 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -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);




More information about the mesa-commit mailing list