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
SHADER_OPCODE_GEN7_SCRATCH_READ, | SHADER_OPCODE_GEN7_SCRATCH_READ, | ||||
SHADER_OPCODE_URB_WRITE_SIMD8, | 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 | * Return the index of an arbitrary live channel (i.e. one of the channels |
case SHADER_OPCODE_TYPED_SURFACE_READ: | case SHADER_OPCODE_TYPED_SURFACE_READ: | ||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE: | case SHADER_OPCODE_TYPED_SURFACE_WRITE: | ||||
case SHADER_OPCODE_URB_WRITE_SIMD8: | 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; | return true; | ||||
case FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD: | case FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD: | ||||
return src[1].file == GRF; | return src[1].file == GRF; | ||||
switch (opcode) { | switch (opcode) { | ||||
case FS_OPCODE_FB_WRITE: | case FS_OPCODE_FB_WRITE: | ||||
case SHADER_OPCODE_URB_WRITE_SIMD8: | 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_ATOMIC: | ||||
case SHADER_OPCODE_UNTYPED_SURFACE_READ: | case SHADER_OPCODE_UNTYPED_SURFACE_READ: | ||||
case SHADER_OPCODE_UNTYPED_SURFACE_WRITE: | case SHADER_OPCODE_UNTYPED_SURFACE_WRITE: | ||||
case SHADER_OPCODE_TYPED_SURFACE_READ: | case SHADER_OPCODE_TYPED_SURFACE_READ: | ||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE: | case SHADER_OPCODE_TYPED_SURFACE_WRITE: | ||||
case SHADER_OPCODE_URB_WRITE_SIMD8: | 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_CENTROID: | ||||
case FS_OPCODE_INTERPOLATE_AT_SAMPLE: | case FS_OPCODE_INTERPOLATE_AT_SAMPLE: | ||||
case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET: | case FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET: |
brw_inst_set_sfid(p->devinfo, insn, BRW_SFID_URB); | brw_inst_set_sfid(p->devinfo, insn, BRW_SFID_URB); | ||||
brw_inst_set_urb_opcode(p->devinfo, insn, GEN8_URB_OPCODE_SIMD8_WRITE); | 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_mlen(p->devinfo, insn, inst->mlen); | ||||
brw_inst_set_rlen(p->devinfo, insn, 0); | brw_inst_set_rlen(p->devinfo, insn, 0); | ||||
brw_inst_set_eot(p->devinfo, insn, inst->eot); | brw_inst_set_eot(p->devinfo, insn, inst->eot); | ||||
break; | break; | ||||
case SHADER_OPCODE_URB_WRITE_SIMD8: | 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]); | generate_urb_write(inst, src[0]); | ||||
break; | break; | ||||
/* 4-6: */ -1, -1, -1, -1, -1, -1, -1, -1, | /* 4-6: */ -1, -1, -1, -1, -1, -1, -1, -1, | ||||
/* 7: */ MD(16), MD(16), | /* 7: */ MD(16), MD(16), | ||||
/* 8: */ MD(17), MD(17)) | /* 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_complete, MD(15), MD(15), devinfo->gen < 8) | ||||
FC(urb_used, MD(14), MD(14), devinfo->gen < 7) | FC(urb_used, MD(14), MD(14), devinfo->gen < 7) | ||||
FC(urb_allocate, MD(13), MD(13), devinfo->gen < 7) | FC(urb_allocate, MD(13), MD(13), devinfo->gen < 7) |
return "gen7_scratch_read"; | return "gen7_scratch_read"; | ||||
case SHADER_OPCODE_URB_WRITE_SIMD8: | case SHADER_OPCODE_URB_WRITE_SIMD8: | ||||
return "gen8_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: | case SHADER_OPCODE_FIND_LIVE_CHANNEL: | ||||
return "find_live_channel"; | return "find_live_channel"; | ||||
case SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL: | case SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL: | ||||
case SHADER_OPCODE_MEMORY_FENCE: | case SHADER_OPCODE_MEMORY_FENCE: | ||||
case SHADER_OPCODE_URB_WRITE_SIMD8: | 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 FS_OPCODE_FB_WRITE: | ||||
case SHADER_OPCODE_BARRIER: | case SHADER_OPCODE_BARRIER: | ||||
return true; | return true; |