Mesa (master): i965/fs: Avoid unnecessary recompiles due to POS bit of proj_attrib_mask.

Paul Berry stereotype441 at kemper.freedesktop.org
Tue Mar 19 23:59:11 UTC 2013


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

Author: Paul Berry <stereotype441 at gmail.com>
Date:   Fri Feb 22 16:40:41 2013 -0800

i965/fs: Avoid unnecessary recompiles due to POS bit of proj_attrib_mask.

Previous to this patch, when using fixed function fragment shading,
bit VARYING_BIT_POS of brw_wm_prog_key::proj_attrib_mask was being set
differently during precompiles and normal usage.  During precompiles
it was being set only if the fragment shader reads from window
position (which it never does), so it was always being set to 0.
During normal usage it was being set if the vertex shader writes to
all 4 components of gl_Position (which it usually does), so it was
usually being set to 1.  As a result, we were almost always doing an
extra recompile for the fixed function fragment shader.

The recompile was totally unnecessary, though, because
brw_wm_prog_key::proj_attrib_mask is only consulted for
fs_visitor::emit_general_interpolation(), which isn't used for
VARYING_SLOT_POS.

This patch avoids the unnecessary recompile by always setting bit
VARYING_BIT_POS of brw_wm_prog_key::proj_attrib_mask to 1.

Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 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 d0f5fea..5a5bfeb 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
@@ -2987,6 +2987,12 @@ brw_fs_precompile(struct gl_context *ctx, struct gl_shader_program *prog)
 
    if (prog->Name != 0)
       key.proj_attrib_mask = ~(GLbitfield64) 0;
+   else {
+      /* Bit VARYING_BIT_POS of key.proj_attrib_mask is never used, so to
+       * avoid unnecessary recompiles, always set it to 1.
+       */
+      key.proj_attrib_mask |= VARYING_BIT_POS;
+   }
 
    if (intel->gen < 6)
       key.vp_outputs_written |= BITFIELD64_BIT(VARYING_SLOT_POS);
diff --git a/src/mesa/drivers/dri/i965/brw_wm.c b/src/mesa/drivers/dri/i965/brw_wm.c
index 39cbbb7..bec8d85 100644
--- a/src/mesa/drivers/dri/i965/brw_wm.c
+++ b/src/mesa/drivers/dri/i965/brw_wm.c
@@ -429,8 +429,12 @@ static void brw_wm_populate_key( struct brw_context *brw,
     */
    if (ctx->Shader.CurrentFragmentProgram)
       key->proj_attrib_mask = ~(GLbitfield64) 0;
-   else
-      key->proj_attrib_mask = brw->wm.input_size_masks[4-1];
+   else {
+      /* Bit VARYING_BIT_POS of key.proj_attrib_mask is never used, so to
+       * avoid unnecessary recompiles, always set it to 1.
+       */
+      key->proj_attrib_mask = brw->wm.input_size_masks[4-1] | VARYING_BIT_POS;
+   }
 
    /* _NEW_LIGHT */
    key->flat_shade = (ctx->Light.ShadeModel == GL_FLAT);




More information about the mesa-commit mailing list