From 3d10f0a98c6169dcf4b1a001e624b489abca8298 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kristian=20H=C3=B8gsberg?= Date: Mon, 20 Oct 2014 23:16:48 -0700 Subject: [PATCH] i965: Prepare for using the ATTR register file in the fs backend MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Kenneth Graunke --- 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 9365b7a29b9..b1afe46b6b2 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: @@ -3132,6 +3134,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) { @@ -3183,6 +3188,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 d252caf9b68..a674a0256a4 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -140,6 +140,7 @@ byte_offset(fs_reg reg, unsigned delta) case BAD_FILE: break; case GRF: + case ATTR: reg.reg_offset += delta / 32; break; case MRF: @@ -165,6 +166,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); @@ -181,6 +183,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 c131db2391c..ea8de82bee0 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp @@ -107,8 +107,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 87ba5c41c81..a9f5474cea3 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 @@ -571,7 +578,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.30.2