Roy Spliet
2012-Jul-09 21:15 UTC
[Nouveau] nv30: Support negative offsets in indirect constant access
Incoming one patch that fixes a shader compiler problem. Testers wanted, especially for NV3x cards. Please test on piglit testcase vp-address-01 to make sure it now passes.
Roy Spliet
2012-Jul-09 21:15 UTC
[Nouveau] [PATCH] nv30: Support negative offsets in indirect constant access
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); } @@ -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]; -- 1.7.10.4
Roy Spliet
2012-Jul-15 19:53 UTC
[Nouveau] [PATCH] nv30: Support negative offsets in indirect constant access
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 | 6 +++--- src/gallium/drivers/nv30/nvfx_shader.h | 2 +- src/gallium/drivers/nv30/nvfx_vertprog.c | 13 ++++++++++--- 4 files changed, 15 insertions(+), 8 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..06e1b8c 100644 --- a/src/gallium/drivers/nv30/nv30_vertprog.c +++ b/src/gallium/drivers/nv30/nv30_vertprog.c @@ -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++; } } 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..827d518 100644 --- a/src/gallium/drivers/nv30/nvfx_vertprog.c +++ b/src/gallium/drivers/nv30/nvfx_vertprog.c @@ -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]; -- 1.7.10.4