On Saturday, July 12, 2014 03:20:13 PM Chris Forbes wrote: > Signed-off-by: Chris Forbes <chr...@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_* */ >
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev