freedreno/a3xx: fix const/rel/const-rel encoding
authorRob Clark <robclark@freedesktop.org>
Thu, 24 Oct 2013 21:45:27 +0000 (17:45 -0400)
committerRob Clark <robclark@freedesktop.org>
Fri, 25 Oct 2013 00:21:08 +0000 (20:21 -0400)
commit4317c4e6e05f84a985ff76a7f66e506681d8e37f
tree3cbfbd6cdc8409130ea9e79ec4faf8506b03efb9
parentbfd30935c996f453fff7345c79dcef4e83d89cfb
freedreno/a3xx: fix const/rel/const-rel encoding

The encoding of constant, relative, and relative-const src registers is
a bit more complex than originally thought, which gives an extra bit to
encode const reg # at expense of taking a bit from relative offset.

In most cases a3xx seems to actually use a scheme whereby it can encode
an extra bit for const register.  You have three possible encodings in
thirteen bits:

   register:  (11 bits for N.c)
     00........... rN.c

   relative:  (10 bits for N)
     010.......... r<a0.x + N>
     011.......... c<a0.x + N>

   const:     (12 bits for N.c)
     1............ cN.c

Which means we can deal w/ more consts than previously thought.

Signed-off-by: Rob Clark <robclark@freedesktop.org>
src/gallium/drivers/freedreno/a3xx/disasm-a3xx.c
src/gallium/drivers/freedreno/a3xx/instr-a3xx.h
src/gallium/drivers/freedreno/a3xx/ir-a3xx.c
src/gallium/drivers/freedreno/freedreno_screen.c