intel/compiler: rework message descriptors for render targets
Render target message descriptors are slightly different from the dataport ones. In particular the msg_type field is on bits 14:17 for RT while bits 14:18 for DP. v2: Drop unused send_commit_msg field in brw_fb_write_desc() (Ken) v3: Rebase on top renaming (Lionel) Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Suggested-by: Jason Ekstrand <jason@jlekstrand.net> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7455>
This commit is contained in:
parent
dabaaaf6c7
commit
64551610d1
|
@ -1956,7 +1956,7 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
|
||||||
|
|
||||||
case GFX6_SFID_DATAPORT_RENDER_CACHE: {
|
case GFX6_SFID_DATAPORT_RENDER_CACHE: {
|
||||||
/* aka BRW_SFID_DATAPORT_WRITE on Gfx4-5 */
|
/* aka BRW_SFID_DATAPORT_WRITE on Gfx4-5 */
|
||||||
unsigned msg_type = brw_dp_write_desc_msg_type(devinfo, imm_desc);
|
unsigned msg_type = brw_fb_write_desc_msg_type(devinfo, imm_desc);
|
||||||
|
|
||||||
err |= control(file, "DP rc message type",
|
err |= control(file, "DP rc message type",
|
||||||
dp_rc_msg_type(devinfo), msg_type, &space);
|
dp_rc_msg_type(devinfo), msg_type, &space);
|
||||||
|
@ -1970,18 +1970,18 @@ brw_disassemble_inst(FILE *file, const struct intel_device_info *devinfo,
|
||||||
brw_inst_rt_message_type(devinfo, inst), &space);
|
brw_inst_rt_message_type(devinfo, inst), &space);
|
||||||
if (devinfo->ver >= 6 && brw_inst_rt_slot_group(devinfo, inst))
|
if (devinfo->ver >= 6 && brw_inst_rt_slot_group(devinfo, inst))
|
||||||
string(file, " Hi");
|
string(file, " Hi");
|
||||||
if (brw_dp_write_desc_last_render_target(devinfo, imm_desc))
|
if (brw_fb_write_desc_last_render_target(devinfo, imm_desc))
|
||||||
string(file, " LastRT");
|
string(file, " LastRT");
|
||||||
if (devinfo->ver < 7 &&
|
if (devinfo->ver < 7 &&
|
||||||
brw_dp_write_desc_write_commit(devinfo, imm_desc))
|
brw_fb_write_desc_write_commit(devinfo, imm_desc))
|
||||||
string(file, " WriteCommit");
|
string(file, " WriteCommit");
|
||||||
} else {
|
} else {
|
||||||
format(file, " MsgCtrl = 0x%u",
|
format(file, " MsgCtrl = 0x%u",
|
||||||
brw_dp_write_desc_msg_control(devinfo, imm_desc));
|
brw_fb_write_desc_msg_control(devinfo, imm_desc));
|
||||||
}
|
}
|
||||||
|
|
||||||
format(file, " Surface = %u",
|
format(file, " Surface = %u",
|
||||||
brw_dp_desc_binding_table_index(devinfo, imm_desc));
|
brw_fb_desc_binding_table_index(devinfo, imm_desc));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -555,21 +555,19 @@ brw_dp_write_desc(const struct intel_device_info *devinfo,
|
||||||
unsigned binding_table_index,
|
unsigned binding_table_index,
|
||||||
unsigned msg_control,
|
unsigned msg_control,
|
||||||
unsigned msg_type,
|
unsigned msg_type,
|
||||||
unsigned last_render_target,
|
|
||||||
unsigned send_commit_msg)
|
unsigned send_commit_msg)
|
||||||
{
|
{
|
||||||
assert(devinfo->ver <= 6 || !send_commit_msg);
|
assert(devinfo->ver <= 6 || !send_commit_msg);
|
||||||
if (devinfo->ver >= 6)
|
if (devinfo->ver >= 6) {
|
||||||
return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control) |
|
return brw_dp_desc(devinfo, binding_table_index, msg_type, msg_control) |
|
||||||
SET_BITS(last_render_target, 12, 12) |
|
|
||||||
SET_BITS(send_commit_msg, 17, 17);
|
SET_BITS(send_commit_msg, 17, 17);
|
||||||
else
|
} else {
|
||||||
return (SET_BITS(binding_table_index, 7, 0) |
|
return (SET_BITS(binding_table_index, 7, 0) |
|
||||||
SET_BITS(msg_control, 11, 8) |
|
SET_BITS(msg_control, 11, 8) |
|
||||||
SET_BITS(last_render_target, 11, 11) |
|
|
||||||
SET_BITS(msg_type, 14, 12) |
|
SET_BITS(msg_type, 14, 12) |
|
||||||
SET_BITS(send_commit_msg, 15, 15));
|
SET_BITS(send_commit_msg, 15, 15));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline unsigned
|
static inline unsigned
|
||||||
brw_dp_write_desc_msg_type(const struct intel_device_info *devinfo,
|
brw_dp_write_desc_msg_type(const struct intel_device_info *devinfo,
|
||||||
|
@ -591,16 +589,6 @@ brw_dp_write_desc_msg_control(const struct intel_device_info *devinfo,
|
||||||
return GET_BITS(desc, 11, 8);
|
return GET_BITS(desc, 11, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
|
||||||
brw_dp_write_desc_last_render_target(const struct intel_device_info *devinfo,
|
|
||||||
uint32_t desc)
|
|
||||||
{
|
|
||||||
if (devinfo->ver >= 6)
|
|
||||||
return GET_BITS(desc, 12, 12);
|
|
||||||
else
|
|
||||||
return GET_BITS(desc, 11, 11);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool
|
static inline bool
|
||||||
brw_dp_write_desc_write_commit(const struct intel_device_info *devinfo,
|
brw_dp_write_desc_write_commit(const struct intel_device_info *devinfo,
|
||||||
uint32_t desc)
|
uint32_t desc)
|
||||||
|
@ -1025,6 +1013,130 @@ brw_dp_typed_surface_rw_desc(const struct intel_device_info *devinfo,
|
||||||
return brw_dp_surface_desc(devinfo, msg_type, msg_control);
|
return brw_dp_surface_desc(devinfo, msg_type, msg_control);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
brw_fb_desc(const struct intel_device_info *devinfo,
|
||||||
|
unsigned binding_table_index,
|
||||||
|
unsigned msg_type,
|
||||||
|
unsigned msg_control)
|
||||||
|
{
|
||||||
|
/* Prior to gen6, things are too inconsistent; use the fb_(read|write)_desc
|
||||||
|
* helpers instead.
|
||||||
|
*/
|
||||||
|
assert(devinfo->ver >= 6);
|
||||||
|
const unsigned desc = SET_BITS(binding_table_index, 7, 0);
|
||||||
|
if (devinfo->ver >= 7) {
|
||||||
|
return (desc | SET_BITS(msg_control, 13, 8) |
|
||||||
|
SET_BITS(msg_type, 17, 14));
|
||||||
|
} else {
|
||||||
|
return (desc | SET_BITS(msg_control, 12, 8) |
|
||||||
|
SET_BITS(msg_type, 16, 13));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned
|
||||||
|
brw_fb_desc_binding_table_index(UNUSED const struct intel_device_info *devinfo,
|
||||||
|
uint32_t desc)
|
||||||
|
{
|
||||||
|
return GET_BITS(desc, 7, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
brw_fb_desc_msg_control(const struct intel_device_info *devinfo, uint32_t desc)
|
||||||
|
{
|
||||||
|
assert(devinfo->ver >= 6);
|
||||||
|
if (devinfo->ver >= 7)
|
||||||
|
return GET_BITS(desc, 13, 8);
|
||||||
|
else
|
||||||
|
return GET_BITS(desc, 12, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned
|
||||||
|
brw_fb_desc_msg_type(const struct intel_device_info *devinfo, uint32_t desc)
|
||||||
|
{
|
||||||
|
assert(devinfo->ver >= 6);
|
||||||
|
if (devinfo->ver >= 7)
|
||||||
|
return GET_BITS(desc, 17, 14);
|
||||||
|
else
|
||||||
|
return GET_BITS(desc, 16, 13);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
brw_fb_read_desc(const struct intel_device_info *devinfo,
|
||||||
|
unsigned binding_table_index,
|
||||||
|
unsigned msg_control,
|
||||||
|
unsigned exec_size,
|
||||||
|
bool per_sample)
|
||||||
|
{
|
||||||
|
assert(devinfo->ver >= 9);
|
||||||
|
return brw_fb_desc(devinfo, binding_table_index,
|
||||||
|
GFX9_DATAPORT_RC_RENDER_TARGET_READ, msg_control) |
|
||||||
|
SET_BITS(per_sample, 13, 13) |
|
||||||
|
SET_BITS(exec_size == 16, 8, 8) /* Render Target Message Subtype */;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
brw_fb_write_desc(const struct intel_device_info *devinfo,
|
||||||
|
unsigned binding_table_index,
|
||||||
|
unsigned msg_control,
|
||||||
|
bool last_render_target)
|
||||||
|
{
|
||||||
|
const unsigned msg_type =
|
||||||
|
devinfo->ver >= 6 ?
|
||||||
|
GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE :
|
||||||
|
BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
|
||||||
|
|
||||||
|
if (devinfo->ver >= 6) {
|
||||||
|
return brw_fb_desc(devinfo, binding_table_index, msg_type, msg_control) |
|
||||||
|
SET_BITS(last_render_target, 12, 12);
|
||||||
|
} else {
|
||||||
|
return (SET_BITS(binding_table_index, 7, 0) |
|
||||||
|
SET_BITS(msg_control, 11, 8) |
|
||||||
|
SET_BITS(last_render_target, 11, 11) |
|
||||||
|
SET_BITS(msg_type, 14, 12));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned
|
||||||
|
brw_fb_write_desc_msg_type(const struct intel_device_info *devinfo,
|
||||||
|
uint32_t desc)
|
||||||
|
{
|
||||||
|
if (devinfo->ver >= 6)
|
||||||
|
return brw_fb_desc_msg_type(devinfo, desc);
|
||||||
|
else
|
||||||
|
return GET_BITS(desc, 14, 12);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline unsigned
|
||||||
|
brw_fb_write_desc_msg_control(const struct intel_device_info *devinfo,
|
||||||
|
uint32_t desc)
|
||||||
|
{
|
||||||
|
if (devinfo->ver >= 6)
|
||||||
|
return brw_fb_desc_msg_control(devinfo, desc);
|
||||||
|
else
|
||||||
|
return GET_BITS(desc, 11, 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
brw_fb_write_desc_last_render_target(const struct intel_device_info *devinfo,
|
||||||
|
uint32_t desc)
|
||||||
|
{
|
||||||
|
if (devinfo->ver >= 6)
|
||||||
|
return GET_BITS(desc, 12, 12);
|
||||||
|
else
|
||||||
|
return GET_BITS(desc, 11, 11);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
brw_fb_write_desc_write_commit(const struct intel_device_info *devinfo,
|
||||||
|
uint32_t desc)
|
||||||
|
{
|
||||||
|
assert(devinfo->ver <= 6);
|
||||||
|
if (devinfo->ver >= 6)
|
||||||
|
return GET_BITS(desc, 17, 17);
|
||||||
|
else
|
||||||
|
return GET_BITS(desc, 15, 15);
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
brw_mdc_sm2(unsigned exec_size)
|
brw_mdc_sm2(unsigned exec_size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -2224,8 +2224,7 @@ void brw_oword_block_write_scratch(struct brw_codegen *p,
|
||||||
brw_message_desc(devinfo, mlen, send_commit_msg, true) |
|
brw_message_desc(devinfo, mlen, send_commit_msg, true) |
|
||||||
brw_dp_write_desc(devinfo, brw_scratch_surface_idx(p),
|
brw_dp_write_desc(devinfo, brw_scratch_surface_idx(p),
|
||||||
BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8),
|
BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8),
|
||||||
msg_type, 0, /* not a render target */
|
msg_type, send_commit_msg));
|
||||||
send_commit_msg));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2434,7 +2433,6 @@ brw_fb_WRITE(struct brw_codegen *p,
|
||||||
(devinfo->ver >= 6 ? GFX6_SFID_DATAPORT_RENDER_CACHE :
|
(devinfo->ver >= 6 ? GFX6_SFID_DATAPORT_RENDER_CACHE :
|
||||||
BRW_SFID_DATAPORT_WRITE);
|
BRW_SFID_DATAPORT_WRITE);
|
||||||
brw_inst *insn;
|
brw_inst *insn;
|
||||||
unsigned msg_type;
|
|
||||||
struct brw_reg dest, src0;
|
struct brw_reg dest, src0;
|
||||||
|
|
||||||
if (brw_get_default_exec_size(p) >= BRW_EXECUTE_16)
|
if (brw_get_default_exec_size(p) >= BRW_EXECUTE_16)
|
||||||
|
@ -2453,14 +2451,10 @@ brw_fb_WRITE(struct brw_codegen *p,
|
||||||
if (devinfo->ver >= 6) {
|
if (devinfo->ver >= 6) {
|
||||||
/* headerless version, just submit color payload */
|
/* headerless version, just submit color payload */
|
||||||
src0 = payload;
|
src0 = payload;
|
||||||
|
|
||||||
msg_type = GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
|
|
||||||
} else {
|
} else {
|
||||||
assert(payload.file == BRW_MESSAGE_REGISTER_FILE);
|
assert(payload.file == BRW_MESSAGE_REGISTER_FILE);
|
||||||
brw_inst_set_base_mrf(devinfo, insn, payload.nr);
|
brw_inst_set_base_mrf(devinfo, insn, payload.nr);
|
||||||
src0 = implied_header;
|
src0 = implied_header;
|
||||||
|
|
||||||
msg_type = BRW_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
brw_set_dest(p, insn, dest);
|
brw_set_dest(p, insn, dest);
|
||||||
|
@ -2468,9 +2462,8 @@ brw_fb_WRITE(struct brw_codegen *p,
|
||||||
brw_set_desc(p, insn,
|
brw_set_desc(p, insn,
|
||||||
brw_message_desc(devinfo, msg_length, response_length,
|
brw_message_desc(devinfo, msg_length, response_length,
|
||||||
header_present) |
|
header_present) |
|
||||||
brw_dp_write_desc(devinfo, binding_table_index, msg_control,
|
brw_fb_write_desc(devinfo, binding_table_index, msg_control,
|
||||||
msg_type, last_render_target,
|
last_render_target));
|
||||||
0 /* send_commit_msg */));
|
|
||||||
brw_inst_set_eot(devinfo, insn, eot);
|
brw_inst_set_eot(devinfo, insn, eot);
|
||||||
|
|
||||||
return insn;
|
return insn;
|
||||||
|
@ -2487,8 +2480,6 @@ gfx9_fb_READ(struct brw_codegen *p,
|
||||||
{
|
{
|
||||||
const struct intel_device_info *devinfo = p->devinfo;
|
const struct intel_device_info *devinfo = p->devinfo;
|
||||||
assert(devinfo->ver >= 9);
|
assert(devinfo->ver >= 9);
|
||||||
const unsigned msg_subtype =
|
|
||||||
brw_get_default_exec_size(p) == BRW_EXECUTE_16 ? 0 : 1;
|
|
||||||
brw_inst *insn = next_insn(p, BRW_OPCODE_SENDC);
|
brw_inst *insn = next_insn(p, BRW_OPCODE_SENDC);
|
||||||
|
|
||||||
brw_inst_set_sfid(devinfo, insn, GFX6_SFID_DATAPORT_RENDER_CACHE);
|
brw_inst_set_sfid(devinfo, insn, GFX6_SFID_DATAPORT_RENDER_CACHE);
|
||||||
|
@ -2497,10 +2488,8 @@ gfx9_fb_READ(struct brw_codegen *p,
|
||||||
brw_set_desc(
|
brw_set_desc(
|
||||||
p, insn,
|
p, insn,
|
||||||
brw_message_desc(devinfo, msg_length, response_length, true) |
|
brw_message_desc(devinfo, msg_length, response_length, true) |
|
||||||
brw_dp_read_desc(devinfo, binding_table_index,
|
brw_fb_read_desc(devinfo, binding_table_index, 0 /* msg_control */,
|
||||||
per_sample << 5 | msg_subtype,
|
brw_get_default_exec_size(p), per_sample));
|
||||||
GFX9_DATAPORT_RC_RENDER_TARGET_READ,
|
|
||||||
BRW_DATAPORT_READ_TARGET_RENDER_CACHE));
|
|
||||||
brw_inst_set_rt_slot_group(devinfo, insn, brw_get_default_group(p) / 16);
|
brw_inst_set_rt_slot_group(devinfo, insn, brw_get_default_group(p) / 16);
|
||||||
|
|
||||||
return insn;
|
return insn;
|
||||||
|
@ -3094,7 +3083,6 @@ brw_svb_write(struct brw_codegen *p,
|
||||||
brw_dp_write_desc(devinfo, binding_table_index,
|
brw_dp_write_desc(devinfo, binding_table_index,
|
||||||
0, /* msg_control: ignored */
|
0, /* msg_control: ignored */
|
||||||
GFX6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE,
|
GFX6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE,
|
||||||
0, /* last_render_target: ignored */
|
|
||||||
send_commit_msg)); /* send_commit_msg */
|
send_commit_msg)); /* send_commit_msg */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4663,9 +4663,7 @@ lower_fb_write_logical_send(const fs_builder &bld, fs_inst *inst,
|
||||||
|
|
||||||
inst->desc =
|
inst->desc =
|
||||||
(inst->group / 16) << 11 | /* rt slot group */
|
(inst->group / 16) << 11 | /* rt slot group */
|
||||||
brw_dp_write_desc(devinfo, inst->target, msg_ctl,
|
brw_fb_write_desc(devinfo, inst->target, msg_ctl, inst->last_rt);
|
||||||
GFX6_DATAPORT_WRITE_MESSAGE_RENDER_TARGET_WRITE,
|
|
||||||
inst->last_rt, false);
|
|
||||||
|
|
||||||
uint32_t ex_desc = 0;
|
uint32_t ex_desc = 0;
|
||||||
if (devinfo->ver >= 11) {
|
if (devinfo->ver >= 11) {
|
||||||
|
|
|
@ -969,7 +969,6 @@ fs_reg_alloc::emit_spill(const fs_builder &bld, fs_reg src,
|
||||||
brw_dp_write_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
|
brw_dp_write_desc(devinfo, GFX8_BTI_STATELESS_NON_COHERENT,
|
||||||
BRW_DATAPORT_OWORD_BLOCK_DWORDS(reg_size * 8),
|
BRW_DATAPORT_OWORD_BLOCK_DWORDS(reg_size * 8),
|
||||||
GFX6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE,
|
GFX6_DATAPORT_WRITE_MESSAGE_OWORD_BLOCK_WRITE,
|
||||||
0 /* not a render target */,
|
|
||||||
false /* send_commit_msg */);
|
false /* send_commit_msg */);
|
||||||
} else {
|
} else {
|
||||||
spill_inst = bld.emit(SHADER_OPCODE_GFX4_SCRATCH_WRITE,
|
spill_inst = bld.emit(SHADER_OPCODE_GFX4_SCRATCH_WRITE,
|
||||||
|
|
|
@ -1259,7 +1259,6 @@ generate_scratch_write(struct brw_codegen *p,
|
||||||
brw_scratch_surface_idx(p),
|
brw_scratch_surface_idx(p),
|
||||||
BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD,
|
BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD,
|
||||||
msg_type,
|
msg_type,
|
||||||
false, /* not a render target write */
|
|
||||||
write_commit));
|
write_commit));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue