summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancisco Jerez <[email protected]>2017-01-13 14:22:19 -0800
committerJason Ekstrand <[email protected]>2018-06-28 13:19:38 -0700
commitce370902d4579ba5908ff3460c07d50eb845445c (patch)
treec66ee44466db63ece7204389e5bda1f508127fbf
parent8b788069fbb4ffe98aea52232bfd5e0200a88121 (diff)
intel/fs: Fix FB write message control codegen for SIMD32.
Reviewed-by: Jason Ekstrand <[email protected]> Reviewed-by: Matt Turner <[email protected]>
-rw-r--r--src/intel/compiler/brw_fs_generator.cpp52
1 files changed, 34 insertions, 18 deletions
diff --git a/src/intel/compiler/brw_fs_generator.cpp b/src/intel/compiler/brw_fs_generator.cpp
index ca6577a62ad..b06cd0f576c 100644
--- a/src/intel/compiler/brw_fs_generator.cpp
+++ b/src/intel/compiler/brw_fs_generator.cpp
@@ -271,17 +271,30 @@ fs_generator::fire_fb_write(fs_inst *inst,
brw_pop_insn_state(p);
}
- if (inst->opcode == FS_OPCODE_REP_FB_WRITE)
+ if (inst->opcode == FS_OPCODE_REP_FB_WRITE) {
+ assert(inst->group == 0 && inst->exec_size == 16);
msg_control = BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE_REPLICATED;
- else if (prog_data->dual_src_blend) {
- if (!inst->group)
+
+ } else if (prog_data->dual_src_blend) {
+ assert(inst->exec_size == 8);
+
+ if (inst->group % 16 == 0)
msg_control = BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN01;
- else
+ else if (inst->group % 16 == 8)
msg_control = BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_DUAL_SOURCE_SUBSPAN23;
- } else if (inst->exec_size == 16)
- msg_control = BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE;
- else
- msg_control = BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_SINGLE_SOURCE_SUBSPAN01;
+ else
+ unreachable("Invalid dual-source FB write instruction group");
+
+ } else {
+ assert(inst->group == 0 || (inst->group == 16 && inst->exec_size == 16));
+
+ if (inst->exec_size == 16)
+ msg_control = BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD16_SINGLE_SOURCE;
+ else if (inst->exec_size == 8)
+ msg_control = BRW_DATAPORT_RENDER_TARGET_WRITE_SIMD8_SINGLE_SOURCE_SUBSPAN01;
+ else
+ unreachable("Invalid FB write execution size");
+ }
/* We assume render targets start at 0, because headerless FB write
* messages set "Render Target Index" to 0. Using a different binding
@@ -289,16 +302,19 @@ fs_generator::fire_fb_write(fs_inst *inst,
*/
const uint32_t surf_index = inst->target;
- brw_fb_WRITE(p,
- payload,
- retype(implied_header, BRW_REGISTER_TYPE_UW),
- msg_control,
- surf_index,
- nr,
- 0,
- inst->eot,
- inst->last_rt,
- inst->header_size != 0);
+ brw_inst *insn = brw_fb_WRITE(p,
+ payload,
+ retype(implied_header, BRW_REGISTER_TYPE_UW),
+ msg_control,
+ surf_index,
+ nr,
+ 0,
+ inst->eot,
+ inst->last_rt,
+ inst->header_size != 0);
+
+ if (devinfo->gen >= 6)
+ brw_inst_set_rt_slot_group(devinfo, insn, inst->group / 16);
brw_mark_surface_used(&prog_data->base, surf_index);
}