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

Matt Turner mattst88 at gmail.com
Tue Oct 28 16:33:27 PDT 2014


On Tue, Oct 28, 2014 at 3:17 PM, Kristian Høgsberg <krh at bitplanet.net> wrote:
> 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           | 12 ++++++++++--
>  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   | 11 +++++++++--
>  4 files changed, 24 insertions(+), 4 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index 815c8c2..e8819ef 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:
> @@ -636,7 +638,7 @@ fs_reg::is_contiguous() const
>  bool
>  fs_reg::is_valid_3src() const
>  {
> -   return file == GRF || file == UNIFORM;
> +   return file == GRF || file == UNIFORM || file == ATTR;
>  }
>
>  int
> @@ -3148,6 +3150,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, "a%d", inst->dst.reg + inst->dst.reg_offset);

a0 is an address register, not this. Print these like the vec4 code
does -- attr%d.

> +      break;
>     case HW_REG:
>        if (inst->dst.fixed_hw_reg.file == BRW_ARCHITECTURE_REGISTER_FILE) {
>           switch (inst->dst.fixed_hw_reg.nr) {
> @@ -3199,6 +3204,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, "a%d", inst->src[i].reg + inst->src[i].reg_offset);

and here.

> +         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 67a5cdd..8d60544 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 a463386..74fe79c 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> @@ -1272,6 +1272,8 @@ brw_reg_from_fs_reg(fs_reg *reg)
>        break;
>     case UNIFORM:
>        unreachable("not reached");
> +   case ATTR:
> +      unreachable("not reached");

How about

   case UNIFORM:
   case ATTR:
   default:
      unreachable("not reached");

instead?

>     default:
>        unreachable("not reached");
>     }


More information about the mesa-dev mailing list