Reviewed-by: Iago Toral Quiroga <ito...@igalia.com> On Mon, 2016-01-25 at 15:18 -0800, Matt Turner wrote: > The vec4 backend will lower it. > --- > src/mesa/drivers/dri/i965/brw_defines.h | 12 ++++++++++++ > src/mesa/drivers/dri/i965/brw_fs_cse.cpp | 2 ++ > src/mesa/drivers/dri/i965/brw_fs_generator.cpp | 22 ++++++++++++++++++++++ > src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 16 ++++++++++++++++ > src/mesa/drivers/dri/i965/brw_shader.cpp | 4 ++++ > 5 files changed, 56 insertions(+) > > diff --git a/src/mesa/drivers/dri/i965/brw_defines.h > b/src/mesa/drivers/dri/i965/brw_defines.h > index 10a6d39..01e0c99 100644 > --- a/src/mesa/drivers/dri/i965/brw_defines.h > +++ b/src/mesa/drivers/dri/i965/brw_defines.h > @@ -1085,6 +1085,18 @@ enum opcode { > */ > SHADER_OPCODE_BROADCAST, > > + /** > + * Pick the byte from its first source register given by the index > + * specified as second source. > + */ > + SHADER_OPCODE_EXTRACT_BYTE, > + > + /** > + * Pick the word from its first source register given by the index > + * specified as second source. > + */ > + SHADER_OPCODE_EXTRACT_WORD, > + > VEC4_OPCODE_MOV_BYTES, > VEC4_OPCODE_PACK_BYTES, > VEC4_OPCODE_UNPACK_UNIFORM, > diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp > b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp > index 3b65a38..cde6566 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp > @@ -78,6 +78,8 @@ is_expression(const fs_visitor *v, const fs_inst *const > inst) > case FS_OPCODE_LINTERP: > case SHADER_OPCODE_FIND_LIVE_CHANNEL: > case SHADER_OPCODE_BROADCAST: > + case SHADER_OPCODE_EXTRACT_BYTE: > + case SHADER_OPCODE_EXTRACT_WORD: > case SHADER_OPCODE_MOV_INDIRECT: > return true; > case SHADER_OPCODE_RCP: > diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp > b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp > index e05622a..1916a99 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp > @@ -2201,6 +2201,28 @@ fs_generator::generate_code(const cfg_t *cfg, int > dispatch_width) > brw_broadcast(p, dst, src[0], src[1]); > break; > > + case SHADER_OPCODE_EXTRACT_BYTE: { > + assert(src[0].type == BRW_REGISTER_TYPE_D || > + src[0].type == BRW_REGISTER_TYPE_UD); > + > + enum brw_reg_type type = > + src[0].type == BRW_REGISTER_TYPE_D ? BRW_REGISTER_TYPE_B > + : BRW_REGISTER_TYPE_UB; > + brw_MOV(p, dst, spread(suboffset(retype(src[0], type), src[1].ud), > 4)); > + break; > + } > + > + case SHADER_OPCODE_EXTRACT_WORD: { > + assert(src[0].type == BRW_REGISTER_TYPE_D || > + src[0].type == BRW_REGISTER_TYPE_UD); > + > + enum brw_reg_type type = > + src[0].type == BRW_REGISTER_TYPE_D ? BRW_REGISTER_TYPE_W > + : BRW_REGISTER_TYPE_UW; > + brw_MOV(p, dst, spread(suboffset(retype(src[0], type), src[1].ud), > 2)); > + break; > + } > + > case FS_OPCODE_SET_SAMPLE_ID: > generate_set_sample_id(inst, dst, src[0], src[1]); > break; > diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > index d7bcc1c..3efee50 100644 > --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp > @@ -1075,6 +1075,22 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, > nir_alu_instr *instr) > inst->predicate = BRW_PREDICATE_NORMAL; > break; > > + case nir_op_extract_ubyte: > + case nir_op_extract_ibyte: { > + nir_const_value *byte = nir_src_as_const_value(instr->src[1].src); > + bld.emit(SHADER_OPCODE_EXTRACT_BYTE, > + result, op[0], brw_imm_ud(byte->u[0])); > + break; > + } > + > + case nir_op_extract_uword: > + case nir_op_extract_iword: { > + nir_const_value *word = nir_src_as_const_value(instr->src[1].src); > + bld.emit(SHADER_OPCODE_EXTRACT_WORD, > + result, op[0], brw_imm_ud(word->u[0])); > + break; > + } > + > default: > unreachable("unhandled instruction"); > } > diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp > b/src/mesa/drivers/dri/i965/brw_shader.cpp > index e42601b..6a6efa9 100644 > --- a/src/mesa/drivers/dri/i965/brw_shader.cpp > +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp > @@ -312,6 +312,10 @@ brw_instruction_name(enum opcode op) > case SHADER_OPCODE_BROADCAST: > return "broadcast"; > > + case SHADER_OPCODE_EXTRACT_BYTE: > + return "extract_byte"; > + case SHADER_OPCODE_EXTRACT_WORD: > + return "extract_word"; > case VEC4_OPCODE_MOV_BYTES: > return "mov_bytes"; > case VEC4_OPCODE_PACK_BYTES:
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev