In the vec4 backend, we have a vec4_instruction::urb_write_flags field. There are many kinds of flags for SIMD4x2 messages. However, there are really only two (per-slot offset, use channel masks) for SIMD8 messages. Rather than adding a boolean flag for per-slot offsets (polluting all instructions), I decided to just make three new opcodes. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Kristian Høgsberg <krh@bitplanet.net>tags/11.1-branchpoint
@@ -1032,6 +1032,9 @@ enum opcode { | |||
SHADER_OPCODE_GEN7_SCRATCH_READ, | |||
SHADER_OPCODE_URB_WRITE_SIMD8, | |||
SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT, | |||
SHADER_OPCODE_URB_WRITE_SIMD8_MASKED, | |||
SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT, | |||
/** | |||
* Return the index of an arbitrary live channel (i.e. one of the channels |
@@ -281,6 +281,9 @@ fs_inst::is_send_from_grf() const | |||
case SHADER_OPCODE_TYPED_SURFACE_READ: | |||
case SHADER_OPCODE_TYPED_SURFACE_WRITE: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT: | |||
return true; | |||
case FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD: | |||
return src[1].file == GRF; | |||
@@ -781,6 +784,9 @@ fs_inst::regs_read(int arg) const | |||
switch (opcode) { | |||
case FS_OPCODE_FB_WRITE: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT: | |||
case SHADER_OPCODE_UNTYPED_ATOMIC: | |||
case SHADER_OPCODE_UNTYPED_SURFACE_READ: | |||
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE: | |||
@@ -910,6 +916,9 @@ fs_visitor::implied_mrf_writes(fs_inst *inst) | |||
case SHADER_OPCODE_TYPED_SURFACE_READ: | |||
case SHADER_OPCODE_TYPED_SURFACE_WRITE: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT: | |||
case FS_OPCODE_INTERPOLATE_AT_CENTROID: | |||
case FS_OPCODE_INTERPOLATE_AT_SAMPLE: | |||
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET: |
@@ -368,6 +368,14 @@ fs_generator::generate_urb_write(fs_inst *inst, struct brw_reg payload) | |||
brw_inst_set_sfid(p->devinfo, insn, BRW_SFID_URB); | |||
brw_inst_set_urb_opcode(p->devinfo, insn, GEN8_URB_OPCODE_SIMD8_WRITE); | |||
if (inst->opcode == SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT || | |||
inst->opcode == SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT) | |||
brw_inst_set_urb_per_slot_offset(p->devinfo, insn, true); | |||
if (inst->opcode == SHADER_OPCODE_URB_WRITE_SIMD8_MASKED || | |||
inst->opcode == SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT) | |||
brw_inst_set_urb_channel_mask_present(p->devinfo, insn, true); | |||
brw_inst_set_mlen(p->devinfo, insn, inst->mlen); | |||
brw_inst_set_rlen(p->devinfo, insn, 0); | |||
brw_inst_set_eot(p->devinfo, insn, inst->eot); | |||
@@ -2002,6 +2010,9 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width) | |||
break; | |||
case SHADER_OPCODE_URB_WRITE_SIMD8: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT: | |||
generate_urb_write(inst, src[0]); | |||
break; | |||
@@ -393,6 +393,7 @@ FF(urb_per_slot_offset, | |||
/* 4-6: */ -1, -1, -1, -1, -1, -1, -1, -1, | |||
/* 7: */ MD(16), MD(16), | |||
/* 8: */ MD(17), MD(17)) | |||
FC(urb_channel_mask_present, MD(15), MD(15), devinfo->gen >= 8) | |||
FC(urb_complete, MD(15), MD(15), devinfo->gen < 8) | |||
FC(urb_used, MD(14), MD(14), devinfo->gen < 7) | |||
FC(urb_allocate, MD(13), MD(13), devinfo->gen < 7) |
@@ -408,6 +408,12 @@ brw_instruction_name(enum opcode op) | |||
return "gen7_scratch_read"; | |||
case SHADER_OPCODE_URB_WRITE_SIMD8: | |||
return "gen8_urb_write_simd8"; | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT: | |||
return "gen8_urb_write_simd8_per_slot"; | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED: | |||
return "gen8_urb_write_simd8_masked"; | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT: | |||
return "gen8_urb_write_simd8_masked_per_slot"; | |||
case SHADER_OPCODE_FIND_LIVE_CHANNEL: | |||
return "find_live_channel"; | |||
@@ -961,6 +967,9 @@ backend_instruction::has_side_effects() const | |||
case SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL: | |||
case SHADER_OPCODE_MEMORY_FENCE: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_PER_SLOT: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED: | |||
case SHADER_OPCODE_URB_WRITE_SIMD8_MASKED_PER_SLOT: | |||
case FS_OPCODE_FB_WRITE: | |||
case SHADER_OPCODE_BARRIER: | |||
return true; |