diff options
author | Michal Krol <michal@vmware.com> | 2009-12-23 19:08:45 +0100 |
---|---|---|
committer | Michal Krol <michal@vmware.com> | 2010-01-05 09:27:13 +0100 |
commit | 08a3efee10034d9bd8809eb6707a372b81ea3957 (patch) | |
tree | 88c445bf27826c76e2b2c0ab5d1b149c760c1fee /src | |
parent | ff56a12051a91c5c69db9afb85e4a3ebdb17ef96 (diff) |
tgsi/ureg: Improve immediate match & expand logic.
Do not pollute immediates with unsuccessfull attempts to expand them.
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.c | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index 5eb6aaafca..e64e2b731d 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -495,9 +495,10 @@ static int match_or_expand_immediate( const unsigned *v, unsigned nr, unsigned *v2, - unsigned *nr2, + unsigned *pnr2, unsigned *swizzle ) { + unsigned nr2 = *pnr2; unsigned i, j; *swizzle = 0; @@ -505,7 +506,7 @@ match_or_expand_immediate( const unsigned *v, for (i = 0; i < nr; i++) { boolean found = FALSE; - for (j = 0; j < *nr2 && !found; j++) { + for (j = 0; j < nr2 && !found; j++) { if (v[i] == v2[j]) { *swizzle |= j << (i * 2); found = TRUE; @@ -513,16 +514,19 @@ match_or_expand_immediate( const unsigned *v, } if (!found) { - if (*nr2 >= 4) { + if (nr2 >= 4) { return FALSE; } - v2[*nr2] = v[i]; - *swizzle |= *nr2 << (i * 2); - (*nr2)++; + v2[nr2] = v[i]; + *swizzle |= nr2 << (i * 2); + nr2++; } } + /* Actually expand immediate only when fully succeeded. + */ + *pnr2 = nr2; return TRUE; } |