From c4a6b0d2d222667944f78a7688936534b2be0e96 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Thu, 9 Jun 2016 12:36:55 -0700 Subject: [PATCH] i965: Validate a few SEND-from-GRF requirements. We recently had a mistake where we emitted SEND instructions with EOT set, but from g107 rather than g112-g127. Adding validation code should prevent these sorts of problems from slipping back in. Signed-off-by: Kenneth Graunke Reviewed-by: Matt Turner --- src/mesa/drivers/dri/i965/brw_eu_validate.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/mesa/drivers/dri/i965/brw_eu_validate.c b/src/mesa/drivers/dri/i965/brw_eu_validate.c index dbf75e4ef35..15fc25b126a 100644 --- a/src/mesa/drivers/dri/i965/brw_eu_validate.c +++ b/src/mesa/drivers/dri/i965/brw_eu_validate.c @@ -68,6 +68,12 @@ src1_is_null(const struct brw_device_info *devinfo, const brw_inst *inst) brw_inst_src1_da_reg_nr(devinfo, inst) == BRW_ARF_NULL; } +static bool +src0_is_grf(const struct brw_device_info *devinfo, const brw_inst *inst) +{ + return brw_inst_src0_reg_file(devinfo, inst) == BRW_GENERAL_REGISTER_FILE; +} + static unsigned num_sources_from_inst(const struct brw_device_info *devinfo, const brw_inst *inst) @@ -157,6 +163,18 @@ brw_validate_instructions(const struct brw_codegen *p, int start_offset, ERROR_IF(is_unsupported_inst(devinfo, inst), "Instruction not supported on this Gen"); + if (brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SEND) { + ERROR_IF(brw_inst_src0_address_mode(devinfo, inst) != + BRW_ADDRESS_DIRECT, "send must use direct addressing"); + + if (devinfo->gen >= 7) { + ERROR_IF(!src0_is_grf(devinfo, inst), "send from non-GRF"); + ERROR_IF(brw_inst_eot(devinfo, inst) && + brw_inst_src0_da_reg_nr(devinfo, inst) < 112, + "send with EOT must use g112-g127"); + } + } + if (error_msg.str && annotation) { annotation_insert_error(annotation, src_offset, error_msg.str); } -- 2.30.2