[Mesa-dev] [PATCH 2/2] r600: assert on double opcodes if we hit them

Dave Airlie airlied at gmail.com
Tue Mar 13 02:32:49 UTC 2018


From: Dave Airlie <airlied at redhat.com>

This asserts on any double opcocde getting into the shader
assembler on gpus that don't support them. This is a better
way to find holes in the soft fp64 coverage than gpu hangs.

Signed-off-by: Dave Airlie <airlied at redhat.com>
---
 src/gallium/drivers/r600/r600_shader.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 6b5c42f..c2f5b8d 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -402,6 +402,17 @@ static bool ctx_needs_stack_workaround_8xx(struct r600_shader_ctx *ctx)
 	return true;
 }
 
+static bool ctx_has_doubles(struct r600_shader_ctx *ctx)
+{
+	if (ctx->bc->family == CHIP_ARUBA ||
+	    ctx->bc->family == CHIP_CAYMAN ||
+	    ctx->bc->family == CHIP_CYPRESS ||
+	    ctx->bc->family == CHIP_HEMLOCK)
+		return true;
+	else
+		return false;
+}
+
 static int tgsi_last_instruction(unsigned writemask)
 {
 	int i, lasti = 0;
@@ -4419,6 +4430,7 @@ static int tgsi_op2_64_params(struct r600_shader_ctx *ctx, bool singledest, bool
 	int use_tmp = 0;
 	int swizzle_x = inst->Src[0].Register.SwizzleX;
 
+	assert (ctx_has_doubles(ctx));
 	if (singledest) {
 		switch (write_mask) {
 		case 0x1:
@@ -4568,6 +4580,7 @@ static int tgsi_op3_64(struct r600_shader_ctx *ctx)
 	int lasti = 3;
 	int tmp = r600_get_temp(ctx);
 
+	assert (ctx_has_doubles(ctx));
 	for (i = 0; i < lasti + 1; i++) {
 
 		memset(&alu, 0, sizeof(struct r600_bytecode_alu));
@@ -4987,6 +5000,7 @@ static int cayman_emit_double_instr(struct r600_shader_ctx *ctx)
 	int lasti = tgsi_last_instruction(inst->Dst[0].Register.WriteMask);
 	int t1 = ctx->temp_reg;
 
+	assert (ctx_has_doubles(ctx));
 	/* should only be one src regs */
 	assert(inst->Instruction.NumSrcRegs == 1);
 
-- 
2.9.5



More information about the mesa-dev mailing list