-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 04/09/2011 10:08 PM, Eric Anholt wrote: > This is like what we do for add/mul, but we have to invert the > predicate to choose the other source instead. > > This removes 5 extra moves of constants in nexuiz shaders. > --- > src/mesa/drivers/dri/i965/brw_eu.c | 5 +++++ > src/mesa/drivers/dri/i965/brw_eu.h | 1 + > src/mesa/drivers/dri/i965/brw_fs.cpp | 9 +++++++++ > src/mesa/drivers/dri/i965/brw_fs.h | 1 + > 4 files changed, 16 insertions(+), 0 deletions(-) > > diff --git a/src/mesa/drivers/dri/i965/brw_eu.c > b/src/mesa/drivers/dri/i965/brw_eu.c > index b59d6b2..7e63482 100644 > --- a/src/mesa/drivers/dri/i965/brw_eu.c > +++ b/src/mesa/drivers/dri/i965/brw_eu.c > @@ -82,6 +82,11 @@ void brw_set_predicate_control( struct brw_compile *p, > GLuint pc ) > p->current->header.predicate_control = pc; > } > > +void brw_set_predicate_inverse(struct brw_compile *p, bool predicate_inverse) > +{ > + p->current->header.predicate_inverse = predicate_inverse; > +} > + > void brw_set_conditionalmod( struct brw_compile *p, GLuint conditional ) > { > p->current->header.destreg__conditionalmod = conditional; > diff --git a/src/mesa/drivers/dri/i965/brw_eu.h > b/src/mesa/drivers/dri/i965/brw_eu.h > index c2e59c1..718b380 100644 > --- a/src/mesa/drivers/dri/i965/brw_eu.h > +++ b/src/mesa/drivers/dri/i965/brw_eu.h > @@ -772,6 +772,7 @@ void brw_set_access_mode( struct brw_compile *p, GLuint > access_mode ); > void brw_set_compression_control( struct brw_compile *p, GLboolean control ); > void brw_set_predicate_control_flag_value( struct brw_compile *p, GLuint > value ); > void brw_set_predicate_control( struct brw_compile *p, GLuint pc ); > +void brw_set_predicate_inverse(struct brw_compile *p, bool > predicate_inverse); > void brw_set_conditionalmod( struct brw_compile *p, GLuint conditional ); > void brw_set_acc_write_control(struct brw_compile *p, GLuint value); > > diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp > b/src/mesa/drivers/dri/i965/brw_fs.cpp > index 128bbe9..12f9e6a 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp > @@ -2963,6 +2963,14 @@ fs_visitor::propagate_constants() > if (i == 1) { > scan_inst->src[i] = inst->src[0]; > progress = true; > + } else if (i == 0 && scan_inst->src[1].file != IMM) { > + /* Fit this constant in by swapping the operands and > + * flipping the predicate > + */ > + scan_inst->src[0] = scan_inst->src[1]; > + scan_inst->src[1] = inst->src[0]; > + scan_inst->predicate_inverse = ~scan_inst->predicate_inverse;
Since predicate_inverse is a bool, shouldn't that be !scan_inst->predicate_inverse instead of ~scan_inst->predicate_inverse? > + progress = true; > } > break; > } > @@ -3450,6 +3458,7 @@ fs_visitor::generate_code() > > brw_set_conditionalmod(p, inst->conditional_mod); > brw_set_predicate_control(p, inst->predicated); > + brw_set_predicate_inverse(p, inst->predicate_inverse); > brw_set_saturate(p, inst->saturate); > > switch (inst->opcode) { > diff --git a/src/mesa/drivers/dri/i965/brw_fs.h > b/src/mesa/drivers/dri/i965/brw_fs.h > index e48bf40..f792906 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs.h > +++ b/src/mesa/drivers/dri/i965/brw_fs.h > @@ -331,6 +331,7 @@ public: > fs_reg src[3]; > bool saturate; > bool predicated; > + bool predicate_inverse; > int conditional_mod; /**< BRW_CONDITIONAL_* */ > > int mlen; /**< SEND message length */ -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org/ iEYEARECAAYFAk2jKWAACgkQX1gOwKyEAw86yACgkfybN+EkvcyGtqtYUYKNuTI/ W4MAn2SCBrBqMOXKPLIFPeB2qfvG6wSV =35CR -----END PGP SIGNATURE----- _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev