summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
authorGert Wollny <[email protected]>2018-09-14 16:56:48 +0200
committerGert Wollny <[email protected]>2018-09-15 20:44:53 +0200
commit14976817f4dbd089dc6ea1897d7006b94f30580d (patch)
treee2715e52ab33c114acfdc0f31836153f4e639e03 /src/gallium
parentcc3b99bb48769ccd018b781338b548306af5046b (diff)
r600/sb: use safe math optimizations when TGSI contains precise operations
Fixes: dEQP-GLES3.functional.shaders.invariance.highp.common_subexpression_3 dEQP-GLES3.functional.shaders.invariance.mediump.common_subexpression_3 dEQP-GLES3.functional.shaders.invariance.lowp.common_subexpression_3 Signed-off-by: Gert Wollny <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/r600/r600_asm.h1
-rw-r--r--src/gallium/drivers/r600/r600_shader.c3
-rw-r--r--src/gallium/drivers/r600/sb/sb_bc_parser.cpp2
3 files changed, 5 insertions, 1 deletions
diff --git a/src/gallium/drivers/r600/r600_asm.h b/src/gallium/drivers/r600/r600_asm.h
index 5841044bf81..ca9280a7a83 100644
--- a/src/gallium/drivers/r600/r600_asm.h
+++ b/src/gallium/drivers/r600/r600_asm.h
@@ -277,6 +277,7 @@ struct r600_bytecode {
struct r600_bytecode_output pending_outputs[5];
int n_pending_outputs;
boolean need_wait_ack; /* emit a pending WAIT_ACK prior to control flow */
+ boolean precise;
};
/* eg_asm.c */
diff --git a/src/gallium/drivers/r600/r600_shader.c b/src/gallium/drivers/r600/r600_shader.c
index 2229dc8fab3..408939d1105 100644
--- a/src/gallium/drivers/r600/r600_shader.c
+++ b/src/gallium/drivers/r600/r600_shader.c
@@ -3879,6 +3879,9 @@ static int r600_shader_from_tgsi(struct r600_context *rctx,
ctx.inst_info = &eg_shader_tgsi_instruction[opcode];
else
ctx.inst_info = &r600_shader_tgsi_instruction[opcode];
+
+ ctx.bc->precise |= ctx.parse.FullToken.FullInstruction.Instruction.Precise;
+
r = ctx.inst_info->process(&ctx);
if (r)
goto out_err;
diff --git a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
index a7b828268b9..eafc1cb8ec4 100644
--- a/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
+++ b/src/gallium/drivers/r600/sb/sb_bc_parser.cpp
@@ -75,7 +75,7 @@ int bc_parser::decode() {
}
sh = new shader(ctx, t, bc->debug_id);
- sh->safe_math = sb_context::safe_math || (t == TARGET_COMPUTE);
+ sh->safe_math = sb_context::safe_math || (t == TARGET_COMPUTE || bc->precise);
int r = decode_shader();