The scalar vertex shader will use the ATTR register file for vertex attributes. This patch adds support for the ATTR file to fs_visitor.
Signed-off-by: Kristian Høgsberg <k...@bitplanet.net> --- src/mesa/drivers/dri/i965/brw_fs.cpp | 10 +++++++++- src/mesa/drivers/dri/i965/brw_fs.h | 3 +++ src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 2 -- src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 14 +++++++++++--- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp index ac6be73..bf28193 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp @@ -76,7 +76,7 @@ fs_inst::init(enum opcode opcode, uint8_t exec_size, const fs_reg &dst, this->exec_size = dst.width; } else { for (int i = 0; i < sources; ++i) { - if (src[i].file != GRF) + if (src[i].file != GRF && src[i].file != ATTR) continue; if (this->exec_size <= 1) @@ -97,6 +97,7 @@ fs_inst::init(enum opcode opcode, uint8_t exec_size, const fs_reg &dst, break; case GRF: case HW_REG: + case ATTR: assert(this->src[i].width > 0); if (this->src[i].width == 1) { this->src[i].effective_width = this->exec_size; @@ -121,6 +122,7 @@ fs_inst::init(enum opcode opcode, uint8_t exec_size, const fs_reg &dst, case GRF: case HW_REG: case MRF: + case ATTR: this->regs_written = (dst.width * dst.stride * type_sz(dst.type) + 31) / 32; break; case BAD_FILE: @@ -3133,6 +3135,9 @@ fs_visitor::dump_instruction(backend_instruction *be_inst, FILE *file) case UNIFORM: fprintf(file, "***u%d***", inst->dst.reg + inst->dst.reg_offset); break; + case ATTR: + fprintf(file, "***attr%d***", inst->dst.reg + inst->dst.reg_offset); + break; case HW_REG: if (inst->dst.fixed_hw_reg.file == BRW_ARCHITECTURE_REGISTER_FILE) { switch (inst->dst.fixed_hw_reg.nr) { @@ -3184,6 +3189,9 @@ fs_visitor::dump_instruction(backend_instruction *be_inst, FILE *file) case MRF: fprintf(file, "***m%d***", inst->src[i].reg); break; + case ATTR: + fprintf(file, "attr%d", inst->src[i].reg + inst->src[i].reg_offset); + break; case UNIFORM: fprintf(file, "u%d", inst->src[i].reg + inst->src[i].reg_offset); if (inst->src[i].reladdr) { diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 19812fc..b16883f 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -132,6 +132,7 @@ byte_offset(fs_reg reg, unsigned delta) case BAD_FILE: break; case GRF: + case ATTR: reg.reg_offset += delta / 32; break; case MRF: @@ -157,6 +158,7 @@ horiz_offset(fs_reg reg, unsigned delta) break; case GRF: case MRF: + case ATTR: return byte_offset(reg, delta * reg.stride * type_sz(reg.type)); default: assert(delta == 0); @@ -173,6 +175,7 @@ offset(fs_reg reg, unsigned delta) break; case GRF: case MRF: + case ATTR: return byte_offset(reg, delta * reg.width * reg.stride * type_sz(reg.type)); case UNIFORM: reg.reg_offset += delta; diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp index c50f07d..a9ba6fa 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp @@ -1274,8 +1274,6 @@ brw_reg_from_fs_reg(fs_reg *reg) /* Probably unused. */ brw_reg = brw_null_reg(); break; - case UNIFORM: - unreachable("not reached"); default: unreachable("not reached"); } diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index fb8fd22..3b38f67 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -197,8 +197,15 @@ fs_visitor::visit(ir_dereference_array *ir) src.type = brw_type_for_base_type(ir->type); if (constant_index) { - assert(src.file == UNIFORM || src.file == GRF || src.file == HW_REG); - src = offset(src, constant_index->value.i[0] * element_size); + if (src.file == ATTR) { + /* Attribute arrays get loaded as one vec4 per element. In that case + * offset the source register. + */ + src.reg += constant_index->value.i[0]; + } else { + assert(src.file == UNIFORM || src.file == GRF || src.file == HW_REG); + src = offset(src, constant_index->value.i[0] * element_size); + } } else { /* Variable index array dereference. We attach the variable index * component to the reg as a pointer to a register containing the @@ -516,7 +523,8 @@ fs_visitor::visit(ir_expression *ir) ir->operands[operand]->fprint(stderr); fprintf(stderr, "\n"); } - assert(this->result.file == GRF || this->result.file == UNIFORM); + assert(this->result.file == GRF || + this->result.file == UNIFORM || this->result.file == ATTR); op[operand] = this->result; /* Matrix expression operands should have been broken down to vector -- 2.2.0 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev