[Nouveau] [PATCH] nv30: Support negative offsets in indirect constant access
Lucas Stach
dev at lynxeye.de
Tue Jul 10 11:23:43 PDT 2012
One minor nitpick inline, otherwise:
Reviewed-by: Lucas Stach <dev at lynxeye.de>
Tested-by: Lucas Stach <dev at lynxeye.de> on nv49 and nv35
Am Montag, den 09.07.2012, 23:15 +0200 schrieb Roy Spliet:
> Fixes piglit vp-address-01 amongst several others
>
> Signed-off-by: Roy Spliet <r.spliet at student.tudelft.nl>
> ---
> src/gallium/drivers/nv30/nv30_state.h | 2 +-
> src/gallium/drivers/nv30/nv30_vertprog.c | 4 ++--
> src/gallium/drivers/nv30/nvfx_shader.h | 2 +-
> src/gallium/drivers/nv30/nvfx_vertprog.c | 10 ++++++++--
> 4 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/src/gallium/drivers/nv30/nv30_state.h b/src/gallium/drivers/nv30/nv30_state.h
> index 964676a..a44eb59 100644
> --- a/src/gallium/drivers/nv30/nv30_state.h
> +++ b/src/gallium/drivers/nv30/nv30_state.h
> @@ -63,7 +63,7 @@ struct nv30_sampler_view {
>
> struct nv30_shader_reloc {
> unsigned location;
> - unsigned target;
> + signed target;
> };
>
> struct nv30_vertprog_exec {
> diff --git a/src/gallium/drivers/nv30/nv30_vertprog.c b/src/gallium/drivers/nv30/nv30_vertprog.c
> index 9b5ba35..1492c15 100644
> --- a/src/gallium/drivers/nv30/nv30_vertprog.c
> +++ b/src/gallium/drivers/nv30/nv30_vertprog.c
> @@ -150,7 +150,7 @@ nv30_vertprog_validate(struct nv30_context *nv30)
> target = vp->data->start + reloc->target;
>
> inst[1] &= ~0x0003fc000;
> - inst[1] |= target << 14;
> + inst[1] |= (target & 0x1ff) << 14;
> reloc++;
> }
> } else {
> @@ -159,7 +159,7 @@ nv30_vertprog_validate(struct nv30_context *nv30)
> target = vp->data->start + reloc->target;
>
> inst[1] &= ~0x0001ff000;
> - inst[1] |= target << 12;
> + inst[1] |= (target & 0x1ff) << 12;
> reloc++;
> }
> }
> diff --git a/src/gallium/drivers/nv30/nvfx_shader.h b/src/gallium/drivers/nv30/nvfx_shader.h
> index e343bf0..987e1b0 100644
> --- a/src/gallium/drivers/nv30/nvfx_shader.h
> +++ b/src/gallium/drivers/nv30/nvfx_shader.h
> @@ -416,7 +416,7 @@
>
> struct nvfx_reg {
> int8_t type;
> - uint32_t index;
> + int32_t index;
> };
>
> struct nvfx_src {
> diff --git a/src/gallium/drivers/nv30/nvfx_vertprog.c b/src/gallium/drivers/nv30/nvfx_vertprog.c
> index f41f82d..cf49c56 100644
> --- a/src/gallium/drivers/nv30/nvfx_vertprog.c
> +++ b/src/gallium/drivers/nv30/nvfx_vertprog.c
> @@ -169,8 +169,9 @@ emit_src(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
> hw[0] |= NVFX_VP(INST_INDEX_INPUT);
> else
> assert(0);
> - if(src.indirect_reg)
> + if(src.indirect_reg) {
> hw[0] |= NVFX_VP(INST_ADDR_REG_SELECT_1);
> + }
> hw[0] |= src.indirect_swz << NVFX_VP(INST_ADDR_SWZ_SHIFT);
> }
I don't see the need for the added parentheses here.
>
> @@ -367,7 +368,12 @@ tgsi_src(struct nvfx_vpc *vpc, const struct tgsi_full_src_register *fsrc) {
> src.reg = nvfx_reg(NVFXSR_INPUT, fsrc->Register.Index);
> break;
> case TGSI_FILE_CONSTANT:
> - src.reg = vpc->r_const[fsrc->Register.Index];
> + if(fsrc->Register.Indirect) {
> + src.reg = vpc->r_const[0];
> + src.reg.index = fsrc->Register.Index;
> + } else {
> + src.reg = vpc->r_const[fsrc->Register.Index];
> + }
> break;
> case TGSI_FILE_IMMEDIATE:
> src.reg = vpc->imm[fsrc->Register.Index];
More information about the Nouveau
mailing list