Kenneth Graunke <kenn...@whitecape.org> writes: > On Friday, December 9, 2016 11:03:27 AM PST Francisco Jerez wrote: >> We'll need roughly the same logic in other places and it would be >> annoying to duplicate it. Instead factor it out into a function-like >> macro that takes the number of dwords per block (which will prove more >> convenient than taking the same value in owords or some other unit). >> --- >> src/mesa/drivers/dri/i965/brw_defines.h | 6 ++++++ >> src/mesa/drivers/dri/i965/brw_eu_emit.c | 14 ++------------ >> 2 files changed, 8 insertions(+), 12 deletions(-) >> >> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h >> b/src/mesa/drivers/dri/i965/brw_defines.h >> index cae8e9a..1c638a0 100644 >> --- a/src/mesa/drivers/dri/i965/brw_defines.h >> +++ b/src/mesa/drivers/dri/i965/brw_defines.h >> @@ -1669,6 +1669,12 @@ enum brw_message_target { >> #define BRW_DATAPORT_OWORD_BLOCK_2_OWORDS 2 >> #define BRW_DATAPORT_OWORD_BLOCK_4_OWORDS 3 >> #define BRW_DATAPORT_OWORD_BLOCK_8_OWORDS 4 >> +#define BRW_DATAPORT_OWORD_BLOCK_DWORDS(n) \ >> + ((n) == 4 ? BRW_DATAPORT_OWORD_BLOCK_1_OWORDLOW : \ >> + (n) == 8 ? BRW_DATAPORT_OWORD_BLOCK_2_OWORDS : \ >> + (n) == 16 ? BRW_DATAPORT_OWORD_BLOCK_4_OWORDS : \ >> + (n) == 32 ? BRW_DATAPORT_OWORD_BLOCK_8_OWORDS : \ >> + (abort(), ~0)) > > How about: > > #define BRW_DATAPORT_OWORD_BLOCK_DWORDS(n) \ > (assert(n == 4 || n == 8 || n == 16 || n == 32), ffs(n) - 3) >
I don't think that would work for n > 4 due to the rather unfortunate hardware encoding, e.g. BRW_DATAPORT_OWORD_BLOCK_2_OWORDS is supposed to be encoded as 2 but your macro would give 1 as result. :| >> >> #define BRW_DATAPORT_OWORD_DUAL_BLOCK_1OWORD 0 >> #define BRW_DATAPORT_OWORD_DUAL_BLOCK_4OWORDS 2 >> diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c >> b/src/mesa/drivers/dri/i965/brw_eu_emit.c >> index 341f543..6141bfb 100644 >> --- a/src/mesa/drivers/dri/i965/brw_eu_emit.c >> +++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c >> @@ -2056,11 +2056,6 @@ void brw_oword_block_write_scratch(struct brw_codegen >> *p, >> mrf = retype(mrf, BRW_REGISTER_TYPE_UD); >> >> const unsigned mlen = 1 + num_regs; >> - const unsigned msg_control = >> - (num_regs == 1 ? BRW_DATAPORT_OWORD_BLOCK_2_OWORDS : >> - num_regs == 2 ? BRW_DATAPORT_OWORD_BLOCK_4_OWORDS : >> - num_regs == 4 ? BRW_DATAPORT_OWORD_BLOCK_8_OWORDS : 0); >> - assert(msg_control); >> >> /* Set up the message header. This is g0, with g0.2 filled with >> * the offset. We don't want to leave our offset around in g0 or >> @@ -2134,7 +2129,7 @@ void brw_oword_block_write_scratch(struct brw_codegen >> *p, >> brw_set_dp_write_message(p, >> insn, >> brw_scratch_surface_idx(p), >> - msg_control, >> + BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8), >> msg_type, >> target_cache, >> mlen, >> @@ -2181,11 +2176,6 @@ brw_oword_block_read_scratch(struct brw_codegen *p, >> dest = retype(dest, BRW_REGISTER_TYPE_UW); >> >> const unsigned rlen = num_regs; >> - const unsigned msg_control = >> - (num_regs == 1 ? BRW_DATAPORT_OWORD_BLOCK_2_OWORDS : >> - num_regs == 2 ? BRW_DATAPORT_OWORD_BLOCK_4_OWORDS : >> - num_regs == 4 ? BRW_DATAPORT_OWORD_BLOCK_8_OWORDS : 0); >> - assert(msg_control); >> const unsigned target_cache = >> (devinfo->gen >= 7 ? GEN7_SFID_DATAPORT_DATA_CACHE : >> devinfo->gen >= 6 ? GEN6_SFID_DATAPORT_RENDER_CACHE : >> @@ -2222,7 +2212,7 @@ brw_oword_block_read_scratch(struct brw_codegen *p, >> brw_set_dp_read_message(p, >> insn, >> brw_scratch_surface_idx(p), >> - msg_control, >> + BRW_DATAPORT_OWORD_BLOCK_DWORDS(num_regs * 8), >> BRW_DATAPORT_READ_MESSAGE_OWORD_BLOCK_READ, /* >> msg_type */ >> target_cache, >> 1, /* msg_length */ >>
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev