[Mesa-dev] [PATCH 19/22] i965/vs: Communicate the pull constant block read parameters through src_regs.

Kenneth Graunke kenneth at whitecape.org
Mon Aug 6 14:29:22 PDT 2012


On 07/31/2012 03:01 PM, Eric Anholt wrote:
> Similar to the previous commit for the fragment shader.
> ---
>  src/mesa/drivers/dri/i965/brw_vec4.h           |    3 ++-
>  src/mesa/drivers/dri/i965/brw_vec4_emit.cpp    |   19 ++++++++++++-------
>  src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |    5 +++--
>  3 files changed, 17 insertions(+), 10 deletions(-)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h
> index 920d703..deac55d 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4.h
> +++ b/src/mesa/drivers/dri/i965/brw_vec4.h
> @@ -476,7 +476,8 @@ public:
>  			      struct brw_reg index);
>     void generate_pull_constant_load(vec4_instruction *inst,
>  				    struct brw_reg dst,
> -				    struct brw_reg index);
> +				    struct brw_reg index,
> +				    struct brw_reg offset);

Commit message says "through src_regs."  These are brw_regs.

Other than that, this looks fine.
Reviewed-by: Kenneth Graunke <kenneth at whitecape.org>

One tiny comment below.

>  };
>  
>  } /* namespace brw */
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
> index 9df7b11..7658bb8 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_emit.cpp
> @@ -645,15 +645,20 @@ vec4_visitor::generate_scratch_write(vec4_instruction *inst,
>  void
>  vec4_visitor::generate_pull_constant_load(vec4_instruction *inst,
>  					  struct brw_reg dst,
> -					  struct brw_reg index)
> +					  struct brw_reg index,
> +					  struct brw_reg offset)
>  {
> +   assert(index.file == BRW_IMMEDIATE_VALUE &&
> +	  index.type == BRW_REGISTER_TYPE_UD);
> +   uint32_t surf_index = index.dw1.ud;
> +
>     if (intel->gen == 7) {
> -      gen6_resolve_implied_move(p, &index, inst->base_mrf);
> +      gen6_resolve_implied_move(p, &offset, inst->base_mrf);
>        brw_instruction *insn = brw_next_insn(p, BRW_OPCODE_SEND);
>        brw_set_dest(p, insn, dst);
> -      brw_set_src0(p, insn, index);
> +      brw_set_src0(p, insn, offset);
>        brw_set_sampler_message(p, insn,
> -                              SURF_INDEX_VERT_CONST_BUFFER,
> +                              surf_index,
>                                0, /* LD message ignores sampler unit */
>                                GEN5_SAMPLER_MESSAGE_SAMPLE_LD,
>                                1, /* rlen */
> @@ -669,7 +674,7 @@ vec4_visitor::generate_pull_constant_load(vec4_instruction *inst,
>     gen6_resolve_implied_move(p, &header, inst->base_mrf);
>  
>     brw_MOV(p, retype(brw_message_reg(inst->base_mrf + 1), BRW_REGISTER_TYPE_D),
> -	   index);
> +	   offset);
>  
>     uint32_t msg_type;
>  
> @@ -689,7 +694,7 @@ vec4_visitor::generate_pull_constant_load(vec4_instruction *inst,
>     if (intel->gen < 6)
>        send->header.destreg__conditionalmod = inst->base_mrf;
>     brw_set_dp_read_message(p, send,
> -			   SURF_INDEX_VERT_CONST_BUFFER,
> +			   surf_index,
>  			   BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD,
>  			   msg_type,
>  			   BRW_DATAPORT_READ_TARGET_DATA_CACHE,
> @@ -753,7 +758,7 @@ vec4_visitor::generate_vs_instruction(vec4_instruction *instruction,
>        break;
>  
>     case VS_OPCODE_PULL_CONSTANT_LOAD:
> -      generate_pull_constant_load(inst, dst, src[0]);
> +      generate_pull_constant_load(inst, dst, src[0], src[1]);
>        break;
>  
>     default:
> diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> index d6a786f..33078a0 100644
> --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
> @@ -2484,11 +2484,12 @@ vec4_visitor::emit_pull_constant_load(vec4_instruction *inst,
>  				      int base_offset)
>  {
>     int reg_offset = base_offset + orig_src.reg_offset;
> -   src_reg index = get_pull_constant_offset(inst, orig_src.reladdr, reg_offset);
> +   src_reg index = src_reg((unsigned)SURF_INDEX_VERT_CONST_BUFFER);

If you want, in C++ you can constructor-style casts:

   src_reg index = src_reg(unsigned(SURF_INDEX_VERT_CONST_BUFFER));

Makes the parenthesis a little nicer, IMHO.  But it's purely preference.

> +   src_reg offset = get_pull_constant_offset(inst, orig_src.reladdr, reg_offset);
>     vec4_instruction *load;
>  
>     load = new(mem_ctx) vec4_instruction(this, VS_OPCODE_PULL_CONSTANT_LOAD,
> -					temp, index);
> +					temp, index, offset);
>     load->base_mrf = 14;
>     load->mlen = 1;
>     emit_before(inst, load);
> 



More information about the mesa-dev mailing list