From: Karol Herbst Date: Fri, 23 Jun 2017 18:30:22 +0000 (+0200) Subject: st/glsl_to_tgsi: handle precise modifier X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=28a5e7104e5f0e25940ccc6b6e500edf694af148;p=mesa.git 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 Reviewed-by: Nicolai Hähnle --- 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; }