diff options
author | Karol Herbst <[email protected]> | 2017-06-23 20:30:22 +0200 |
---|---|---|
committer | Ilia Mirkin <[email protected]> | 2017-07-21 23:45:18 -0400 |
commit | 28a5e7104e5f0e25940ccc6b6e500edf694af148 (patch) | |
tree | 861307256b0a1a31a5f7e5970607e2b19f9860dc /src/mesa/state_tracker | |
parent | 0341aea2f892d0ea72bbb92e3c659658f348d993 (diff) |
st/glsl_to_tgsi: handle precise modifier
all subexpression inside an ir_assignment needs to be tagged as precise.
v2: make precise handling more global inside the visitor
Signed-off-by: Karol Herbst <[email protected]>
Reviewed-by: Nicolai Hähnle <[email protected]>
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index 7c64a3897e9..4e9b24f1914 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -87,6 +87,13 @@ static int swizzle_for_type(const glsl_type *type, int component = 0) return swizzle; } +static unsigned is_precise(const ir_variable *ir) +{ + if (!ir) + return 0; + return ir->data.precise || ir->data.invariant; +} + /** * This struct is a corresponding struct to TGSI ureg_src. */ @@ -296,6 +303,7 @@ public: ir_instruction *ir; unsigned op:8; /**< TGSI opcode */ + unsigned precise:1; unsigned saturate:1; unsigned is_64bit_expanded:1; unsigned sampler_base:5; @@ -435,6 +443,7 @@ public: bool have_fma; bool use_shared_memory; bool has_tex_txf_lz; + bool precise; variable_storage *find_variable_storage(ir_variable *var); @@ -691,6 +700,7 @@ glsl_to_tgsi_visitor::emit_asm(ir_instruction *ir, unsigned op, STATIC_ASSERT(TGSI_OPCODE_LAST <= 255); inst->op = op; + inst->precise = this->precise; inst->info = tgsi_get_opcode_info(op); inst->dst[0] = dst; inst->dst[1] = dst1; @@ -3147,6 +3157,8 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir) st_dst_reg l; st_src_reg r; + /* all generated instructions need to be flaged as precise */ + this->precise = is_precise(ir->lhs->variable_referenced()); ir->rhs->accept(this); r = this->result; @@ -3238,6 +3250,7 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir) } else { emit_block_mov(ir, ir->rhs->type, &l, &r, NULL, false); } + this->precise = 0; } |