[Mesa-dev] [PATCH v3 08/12] i965: Prepare for using the ATTR register file in the fs backend

Kristian Høgsberg krh at bitplanet.net
Thu Dec 4 22:02:29 PST 2014


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 <krh at 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



More information about the mesa-dev mailing list