i965/gen6+: Avoid recomputing whether we use noperspective.
authorEric Anholt <eric@anholt.net>
Wed, 15 Feb 2012 20:57:25 +0000 (12:57 -0800)
committerEric Anholt <eric@anholt.net>
Tue, 21 Feb 2012 19:54:10 +0000 (11:54 -0800)
Improves VS state change microbenchmark performance 2.38246% +/-
1.15046% (n=20).

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_context.h
src/mesa/drivers/dri/i965/gen6_clip_state.c
src/mesa/drivers/dri/i965/gen7_clip_state.c

index a5a98b257a9dfe776843f75a9a930e54daf6b782..98f68e7c3817b3a6154aadb11bcfda4038b41be4 100644 (file)
@@ -1063,10 +1063,6 @@ brw_update_sol_surface(struct brw_context *brw,
                        uint32_t *out_offset, unsigned num_vector_components,
                        unsigned stride_dwords, unsigned offset_dwords);
 
-/* gen6_clip_state.c */
-bool
-brw_fprog_uses_noperspective(const struct gl_fragment_program *fprog);
-
 /* gen6_sol.c */
 void
 brw_begin_transform_feedback(struct gl_context *ctx, GLenum mode,
index b3bb8aee3ec3bb9bd0c46df3c49f4f9b2ebf604d..abf1d762eb5b03c584bd416ff42d98d3635729f9 100644 (file)
 #include "brw_util.h"
 #include "intel_batchbuffer.h"
 
-/**
- * Return true if at least one of the inputs used by the given fragment
- * program has the GLSL "noperspective" interpolation qualifier.
- */
-bool
-brw_fprog_uses_noperspective(const struct gl_fragment_program *fprog)
-{
-   int attr;
-   for (attr = 0; attr < FRAG_ATTRIB_MAX; ++attr) {
-      /* Ignore unused inputs. */
-      if (!(fprog->Base.InputsRead & BITFIELD64_BIT(attr)))
-         continue;
-
-      if (fprog->InterpQualifier[attr] == INTERP_QUALIFIER_NOPERSPECTIVE)
-         return true;
-   }
-   return false;
-}
-
-
 static void
 upload_clip_state(struct brw_context *brw)
 {
@@ -59,10 +39,10 @@ upload_clip_state(struct brw_context *brw)
    uint32_t depth_clamp = 0;
    uint32_t provoking, userclip;
    uint32_t nonperspective_barycentric_enable_flag = 0;
-   /* BRW_NEW_FRAGMENT_PROGRAM */
-   const struct gl_fragment_program *fprog = brw->fragment_program;
 
-   if (brw_fprog_uses_noperspective(fprog)) {
+   /* CACHE_NEW_WM_PROG */
+   if (brw->wm.prog_data->barycentric_interp_modes &
+       (1 << BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC)) {
       nonperspective_barycentric_enable_flag =
          GEN6_CLIP_NON_PERSPECTIVE_BARYCENTRIC_ENABLE;
    }
@@ -106,9 +86,8 @@ upload_clip_state(struct brw_context *brw)
 const struct brw_tracked_state gen6_clip_state = {
    .dirty = {
       .mesa  = _NEW_TRANSFORM | _NEW_LIGHT,
-      .brw   = (BRW_NEW_CONTEXT |
-                BRW_NEW_FRAGMENT_PROGRAM),
-      .cache = 0
+      .brw   = (BRW_NEW_CONTEXT),
+      .cache = CACHE_NEW_WM_PROG
    },
    .emit = upload_clip_state,
 };
index c32cd988297dbeef569f8e28f836e2da6daacb84..f78b089484d01120b65a8c8a625e4756e3e1a021 100644 (file)
@@ -36,13 +36,13 @@ upload_clip_state(struct brw_context *brw)
    uint32_t provoking, userclip;
    uint32_t dw1 = GEN6_CLIP_STATISTICS_ENABLE;
    uint32_t nonperspective_barycentric_enable_flag = 0;
-   /* BRW_NEW_FRAGMENT_PROGRAM */
-   const struct gl_fragment_program *fprog = brw->fragment_program;
 
    /* _NEW_BUFFERS */
    bool render_to_fbo = brw->intel.ctx.DrawBuffer->Name != 0;
 
-   if (brw_fprog_uses_noperspective(fprog)) {
+   /* CACHE_NEW_WM_PROG */
+   if (brw->wm.prog_data->barycentric_interp_modes &
+       (1 << BRW_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC)) {
       nonperspective_barycentric_enable_flag =
          GEN6_CLIP_NON_PERSPECTIVE_BARYCENTRIC_ENABLE;
    }
@@ -115,9 +115,8 @@ const struct brw_tracked_state gen7_clip_state = {
                 _NEW_POLYGON |
                 _NEW_LIGHT |
                 _NEW_TRANSFORM),
-      .brw   = (BRW_NEW_CONTEXT |
-                BRW_NEW_FRAGMENT_PROGRAM),
-      .cache = 0
+      .brw   = BRW_NEW_CONTEXT,
+      .cache = CACHE_NEW_WM_PROG
    },
    .emit = upload_clip_state,
 };