[Mesa-dev] [PATCH V4 4/6] i965/fs: add generator support for pixel interpolator query

Kenneth Graunke kenneth at whitecape.org
Sat Jul 12 00:06:02 PDT 2014


On Saturday, July 12, 2014 03:20:13 PM Chris Forbes wrote:
> Signed-off-by: Chris Forbes <chrisf at ijw.co.nz>
> ---
>  src/mesa/drivers/dri/i965/brw_defines.h        |  1 +
>  src/mesa/drivers/dri/i965/brw_fs.cpp           |  2 ++
>  src/mesa/drivers/dri/i965/brw_fs.h             |  4 ++++
>  src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 19 +++++++++++++++++++
>  src/mesa/drivers/dri/i965/brw_shader.h         |  6 ++++++
>  5 files changed, 32 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h 
b/src/mesa/drivers/dri/i965/brw_defines.h
> index e528232..b4428c1 100644
> --- a/src/mesa/drivers/dri/i965/brw_defines.h
> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
> @@ -853,6 +853,7 @@ enum opcode {
>     FS_OPCODE_UNPACK_HALF_2x16_SPLIT_X,
>     FS_OPCODE_UNPACK_HALF_2x16_SPLIT_Y,
>     FS_OPCODE_PLACEHOLDER_HALT,
> +   FS_OPCODE_PIXEL_INTERPOLATOR_QUERY,
>  
>     VS_OPCODE_URB_WRITE,
>     VS_OPCODE_PULL_CONSTANT_LOAD,
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.cpp 
b/src/mesa/drivers/dri/i965/brw_fs.cpp
> index a3ad375..f431eff 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs.cpp
> @@ -370,6 +370,7 @@ fs_inst::is_send_from_grf() const
>  {
>     return (opcode == FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GEN7 ||
>             opcode == SHADER_OPCODE_SHADER_TIME_ADD ||
> +           opcode == FS_OPCODE_PIXEL_INTERPOLATOR_QUERY ||
>             (opcode == FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD &&
>              src[1].file == GRF) ||
>             (is_tex() && src[0].file == GRF));
> @@ -837,6 +838,7 @@ fs_visitor::implied_mrf_writes(fs_inst *inst)
>        return 2;
>     case SHADER_OPCODE_UNTYPED_ATOMIC:
>     case SHADER_OPCODE_UNTYPED_SURFACE_READ:
> +   case FS_OPCODE_PIXEL_INTERPOLATOR_QUERY:
>        return 0;
>     default:
>        unreachable("not reached");
> diff --git a/src/mesa/drivers/dri/i965/brw_fs.h 
b/src/mesa/drivers/dri/i965/brw_fs.h
> index 537f10e..48f1069 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs.h
> +++ b/src/mesa/drivers/dri/i965/brw_fs.h
> @@ -623,6 +623,10 @@ private:
>                                                   struct brw_reg offset);
>     void generate_mov_dispatch_to_flags(fs_inst *inst);
>  
> +   void generate_pixel_interpolator_query(fs_inst *inst,
> +                                          struct brw_reg dst,
> +                                          struct brw_reg src);
> +
>     void generate_set_omask(fs_inst *inst,
>                             struct brw_reg dst,
>                             struct brw_reg sample_mask);
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp 
b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> index eae55f0..fcc9a7d 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp
> @@ -995,6 +995,21 @@ fs_generator::generate_mov_dispatch_to_flags(fs_inst 
*inst)
>     brw_pop_insn_state(p);
>  }
>  
> +void
> +fs_generator::generate_pixel_interpolator_query(fs_inst *inst,
> +                                                struct brw_reg dst,
> +                                                struct brw_reg src)
> +{
> +   brw_pixel_interpolator_query(p,
> +         retype(dst, BRW_REGISTER_TYPE_UW),
> +         src,
> +         inst->pi_noperspective,
> +         inst->pi_msg_type,
> +         inst->pi_msg_data,
> +         inst->mlen,
> +         inst->regs_written);
> +}
> +
>  
>  static uint32_t brw_file_from_reg(fs_reg *reg)
>  {
> @@ -1730,6 +1745,10 @@ fs_generator::generate_code(exec_list *instructions)
>           }
>           break;
>  
> +      case FS_OPCODE_PIXEL_INTERPOLATOR_QUERY:
> +         generate_pixel_interpolator_query(inst, dst, src[0]);
> +         break;
> +
>        default:
>  	 if (inst->opcode < (int) ARRAY_SIZE(opcode_descs)) {
>  	    _mesa_problem(ctx, "Unsupported opcode `%s' in FS",
> diff --git a/src/mesa/drivers/dri/i965/brw_shader.h 
b/src/mesa/drivers/dri/i965/brw_shader.h
> index cfaea9e..6ccc148 100644
> --- a/src/mesa/drivers/dri/i965/brw_shader.h
> +++ b/src/mesa/drivers/dri/i965/brw_shader.h
> @@ -112,6 +112,12 @@ struct backend_instruction {
>     uint8_t mlen; /**< SEND message length */
>     int8_t base_mrf; /**< First MRF in the SEND message, if mlen is nonzero. 
*/
>     uint8_t target; /**< MRT target. */
> +   struct {
> +         /* Descriptor parameters for pixel interpolator messages */
> +         uint32_t pi_noperspective: 1;
> +         uint32_t pi_msg_type: 3;
> +         uint32_t pi_msg_data: 8;
> +   };

It seems like backend_instruction is the wrong place for these - it's shared 
between VS/GS/HS/DS/FS, and interpolateAt only exists in the FS.  It seems 
like they should just go in fs_inst, instead.

That said, I also think we could eliminate pi_msg_type and pi_msg_data.

For pi_msg_type, it seems like we could just create four separate opcodes:
- FS_OPCODE_INTERPOLATE_AT_CENTROID
- FS_OPCODE_INTERPOLATE_AT_SAMPLE_POS
- ...
(or whatever you want to call them)

I would just encode pi_msg_data in src[1], which would be an fs_reg of IMM 
type.  That's what we do for pull constant offsets and other things.

Setting pi_noperspective as a flag in fs_inst is probably reasonable.

Perhaps Matt has an opinion as well.

>  
>     enum opcode opcode; /* BRW_OPCODE_* or FS_OPCODE_* */
>     enum brw_conditional_mod conditional_mod; /**< BRW_CONDITIONAL_* */
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20140712/7b9b768e/attachment.sig>


More information about the mesa-dev mailing list