#define PIPE_NEW_SCISSOR 0x100000
#define PIPE_NEW_BOUND_TEXTURES 0x200000
#define PIPE_NEW_NR_CBUFS 0x400000
+#define PIPE_NEW_FRAGMENT_SIGNATURE 0x800000
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;
}
/* 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
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
},
{
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));
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.
.dirty = {
.mesa = (PIPE_NEW_CLIP |
PIPE_NEW_RAST |
- PIPE_NEW_FRAGMENT_SHADER),
+ PIPE_NEW_FRAGMENT_SIGNATURE),
.brw = BRW_NEW_VERTEX_PROGRAM,
.cache = 0
},