nv30: Support negative offsets in indirect constant access.
Fixes piglit vp-address-01 amongst several others. Signed-off-by: Roy Spliet <r.spliet@student.tudelft.nl> Reviewed-by: Lucas Stach <dev@lynxeye.de> Tested-by: Lucas Stach <dev@lynxeye.de>
This commit is contained in:
committed by
Christoph Bumiller
parent
248e6f0331
commit
542bd6941f
@@ -63,7 +63,7 @@ struct nv30_sampler_view {
|
||||
|
||||
struct nv30_shader_reloc {
|
||||
unsigned location;
|
||||
unsigned target;
|
||||
int target;
|
||||
};
|
||||
|
||||
struct nv30_vertprog_exec {
|
||||
|
||||
@@ -149,8 +149,8 @@ nv30_vertprog_validate(struct nv30_context *nv30)
|
||||
inst = vp->insns[reloc->location].data;
|
||||
target = vp->data->start + reloc->target;
|
||||
|
||||
inst[1] &= ~0x0003fc000;
|
||||
inst[1] |= target << 14;
|
||||
inst[1] &= ~0x0007fc000;
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -416,7 +416,7 @@
|
||||
|
||||
struct nvfx_reg {
|
||||
int8_t type;
|
||||
uint32_t index;
|
||||
int32_t index;
|
||||
};
|
||||
|
||||
struct nvfx_src {
|
||||
|
||||
@@ -135,12 +135,13 @@ emit_src(struct nv30_context *nv30, struct nvfx_vpc *vpc, uint32_t *hw,
|
||||
case NVFXSR_CONST:
|
||||
sr |= (NVFX_VP(SRC_REG_TYPE_CONST) <<
|
||||
NVFX_VP(SRC_REG_TYPE_SHIFT));
|
||||
if (src.reg.index < 512) {
|
||||
if (src.reg.index < 256 && src.reg.index >= -256) {
|
||||
reloc.location = vp->nr_insns - 1;
|
||||
reloc.target = src.reg.index;
|
||||
util_dynarray_append(&vp->const_relocs, struct nvfx_relocation, reloc);
|
||||
} else {
|
||||
hw[1] |= (src.reg.index - 512) << NVFX_VP(INST_CONST_SRC_SHIFT);
|
||||
hw[1] |= (src.reg.index << NVFX_VP(INST_CONST_SRC_SHIFT)) &
|
||||
NVFX_VP(INST_CONST_SRC_MASK);
|
||||
}
|
||||
break;
|
||||
case NVFXSR_NONE:
|
||||
@@ -169,6 +170,7 @@ 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)
|
||||
hw[0] |= NVFX_VP(INST_ADDR_REG_SELECT_1);
|
||||
hw[0] |= src.indirect_swz << NVFX_VP(INST_ADDR_SWZ_SHIFT);
|
||||
@@ -367,7 +369,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];
|
||||
|
||||
Reference in New Issue
Block a user