Mesa (master): i965: Prepare for using the ATTR register file in the fs backend

Kristian Høgsberg krh at kemper.freedesktop.org
Wed Dec 10 20:45:05 UTC 2014


Module: Mesa
Branch: master
Commit: 3d10f0a98c6169dcf4b1a001e624b489abca8298
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3d10f0a98c6169dcf4b1a001e624b489abca8298

Author: Kristian Høgsberg <krh at bitplanet.net>
Date:   Mon Oct 20 23:16:48 2014 -0700

i965: Prepare for using the ATTR register file in the fs backend

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>
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

---

 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 9365b7a..b1afe46 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 d252caf..a674a02 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 c131db2..ea8de82 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 87ba5c4..a9f5474 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




More information about the mesa-commit mailing list