i965g: add new state flag tracking fs signature changes
authorKeith Whitwell <keithw@vmware.com>
Fri, 20 Nov 2009 02:55:18 +0000 (18:55 -0800)
committerKeith Whitwell <keithw@vmware.com>
Fri, 20 Nov 2009 02:55:18 +0000 (18:55 -0800)
src/gallium/drivers/i965/brw_context.h
src/gallium/drivers/i965/brw_pipe_shader.c
src/gallium/drivers/i965/brw_sf.c
src/gallium/drivers/i965/brw_vs.c

index 31e04b6e14c1589c47855b56cf177d9e20f54ce2..65859be0ec566938bc21e41e24d15befd7e885b2 100644 (file)
@@ -233,6 +233,7 @@ struct brw_sampler {
 #define PIPE_NEW_SCISSOR                0x100000
 #define PIPE_NEW_BOUND_TEXTURES         0x200000
 #define PIPE_NEW_NR_CBUFS               0x400000
+#define PIPE_NEW_FRAGMENT_SIGNATURE     0x800000
 
 
 
index 02bc8fa1305a0429158911c8b539e3f542cf0608..c755fa688962ff7672d0a9dbc126b3e6088d99c8 100644 (file)
@@ -58,9 +58,20 @@ static GLboolean has_flow_control(const struct tgsi_shader_info *info)
 
 static void brw_bind_fs_state( struct pipe_context *pipe, void *prog )
 {
+   struct brw_fragment_shader *fs = (struct brw_fragment_shader *)prog;
    struct brw_context *brw = brw_context(pipe);
+   
+   if (brw->curr.fragment_shader == fs)
+      return;
+
+   if (brw->curr.fragment_shader == NULL ||
+       fs == NULL ||
+       memcmp(&brw->curr.fragment_shader->signature, &fs->signature,
+              brw_fs_signature_size(&fs->signature)) != 0) {
+      brw->state.dirty.mesa |= PIPE_NEW_FRAGMENT_SIGNATURE;
+   }
 
-   brw->curr.fragment_shader = (struct brw_fragment_shader *)prog;
+   brw->curr.fragment_shader = fs;
    brw->state.dirty.mesa |= PIPE_NEW_FRAGMENT_SHADER;
 }
 
index 6f4502da97f6127bfe14e4b6f1b8a79b48750204..aa2ab5098cedef2515648e51eccf2efc33a9530a 100644 (file)
@@ -125,11 +125,10 @@ static enum pipe_error upload_sf_prog(struct brw_context *brw)
    /* Populate the key, noting state dependencies:
     */
 
-   /* XXX: Add one to turn the max value into a count, then add
-    * another one to account for the position input.
+   /* XXX: Add one to account for the position input.
     */
-   /* PIPE_NEW_FRAGMENT_SHADER */
-   key.nr_attrs = brw->curr.fragment_shader->info.file_max[TGSI_FILE_INPUT] + 2;
+   /* PIPE_NEW_FRAGMENT_SIGNATURE */
+   key.nr_attrs = brw->curr.fragment_shader->signature.nr_inputs + 1;
 
 
    /* XXX: this is probably where the mapping between vertex shader
@@ -194,7 +193,7 @@ static enum pipe_error upload_sf_prog(struct brw_context *brw)
 
 const struct brw_tracked_state brw_sf_prog = {
    .dirty = {
-      .mesa  = (PIPE_NEW_RAST | PIPE_NEW_VERTEX_SHADER),
+      .mesa  = (PIPE_NEW_RAST | PIPE_NEW_FRAGMENT_SIGNATURE),
       .brw   = (BRW_NEW_REDUCED_PRIMITIVE),
       .cache = 0
    },
index 266839291924eefb0c09c35a03a1d426ab039cf4..25b51eb41e3e170b017b7c97ebcec5cc459623f3 100644 (file)
@@ -101,7 +101,7 @@ static enum pipe_error brw_upload_vs_prog(struct brw_context *brw)
 {
    struct brw_vs_prog_key key;
    struct brw_vertex_shader *vp = brw->curr.vertex_shader;
-   struct brw_fragment_shader *fs = brw->curr.fragment_shader;
+   struct brw_fs_signature *sig = &brw->curr.fragment_shader->signature;
    enum pipe_error ret;
 
    memset(&key, 0, sizeof(key));
@@ -111,8 +111,7 @@ static enum pipe_error brw_upload_vs_prog(struct brw_context *brw)
    key.copy_edgeflag = (brw->curr.rast->templ.fill_ccw != PIPE_POLYGON_MODE_FILL ||
                        brw->curr.rast->templ.fill_cw != PIPE_POLYGON_MODE_FILL);
 
-   memcpy(&key.fs_signature, &fs->signature,
-          brw_fs_signature_size(&fs->signature));
+   memcpy(&key.fs_signature, sig, brw_fs_signature_size(sig));
 
 
    /* Make an early check for the key.
@@ -138,7 +137,7 @@ const struct brw_tracked_state brw_vs_prog = {
    .dirty = {
       .mesa  = (PIPE_NEW_CLIP | 
                 PIPE_NEW_RAST |
-                PIPE_NEW_FRAGMENT_SHADER),
+                PIPE_NEW_FRAGMENT_SIGNATURE),
       .brw   = BRW_NEW_VERTEX_PROGRAM,
       .cache = 0
    },