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

Matt Turner mattst88 at gmail.com
Sat Jul 12 00:05:29 PDT 2014


On Sat, Jul 12, 2014 at 12:06 AM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> 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.

Sounds reasonable to me.


More information about the mesa-dev mailing list