[Nouveau] [Mesa-dev] [RFC 3/9] st/glsl_to_tgsi: handle precise modifier
Nicolai Hähnle
nhaehnle at gmail.com
Mon Jun 12 10:41:50 UTC 2017
On 11.06.2017 20:42, Karol Herbst wrote:
> all subexpression inside an ir_assignment needs to be tagged as precise.
>
> Signed-off-by: Karol Herbst <karolherbst at gmail.com>
> ---
> src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 80 ++++++++++++++++++++++++------
> 1 file changed, 65 insertions(+), 15 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
> index c5d2e0fcd2..19f90f21fe 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;
> + unsigned precise;
>
> variable_storage *find_variable_storage(ir_variable *var);
>
> @@ -505,13 +514,29 @@ public:
> st_src_reg src0 = undef_src,
> st_src_reg src1 = undef_src,
> st_src_reg src2 = undef_src,
> - st_src_reg src3 = undef_src);
> + st_src_reg src3 = undef_src,
> + unsigned precise = 0);
>
> glsl_to_tgsi_instruction *emit_asm(ir_instruction *ir, unsigned op,
> st_dst_reg dst, st_dst_reg dst1,
> st_src_reg src0 = undef_src,
> st_src_reg src1 = undef_src,
> st_src_reg src2 = undef_src,
> + st_src_reg src3 = undef_src,
> + unsigned precise = 0);
> +
> + glsl_to_tgsi_instruction *emit_asm(ir_expression *ir, unsigned op,
> + st_dst_reg dst = undef_dst,
> + st_src_reg src0 = undef_src,
> + st_src_reg src1 = undef_src,
> + st_src_reg src2 = undef_src,
> + st_src_reg src3 = undef_src);
> +
> + glsl_to_tgsi_instruction *emit_asm(ir_expression *ir, unsigned op,
> + st_dst_reg dst, st_dst_reg dst1,
> + st_src_reg src0 = undef_src,
> + st_src_reg src1 = undef_src,
> + st_src_reg src2 = undef_src,
> st_src_reg src3 = undef_src);
Yeah, I don't like those overloads and the way they force you to add
artificial casts for disambiguation.
I'd suggest to embrace the global precise flag: drop the precise
parameter from emit_asm, and just source the bit from this->precise.
Please make precise a bool, and add a comment explaining that it's a
flag for whether the currently evaluated expression should be precise.
Cheers,
Nicolai
> unsigned get_opcode(unsigned op,
> @@ -650,7 +675,8 @@ glsl_to_tgsi_instruction *
> glsl_to_tgsi_visitor::emit_asm(ir_instruction *ir, unsigned op,
> st_dst_reg dst, st_dst_reg dst1,
> st_src_reg src0, st_src_reg src1,
> - st_src_reg src2, st_src_reg src3)
> + st_src_reg src2, st_src_reg src3,
> + unsigned precise)
> {
> glsl_to_tgsi_instruction *inst = new(mem_ctx) glsl_to_tgsi_instruction();
> int num_reladdr = 0, i, j;
> @@ -691,6 +717,7 @@ glsl_to_tgsi_visitor::emit_asm(ir_instruction *ir, unsigned op,
> STATIC_ASSERT(TGSI_OPCODE_LAST <= 255);
>
> inst->op = op;
> + inst->precise = precise;
> inst->info = tgsi_get_opcode_info(op);
> inst->dst[0] = dst;
> inst->dst[1] = dst1;
> @@ -881,9 +908,28 @@ glsl_to_tgsi_instruction *
> glsl_to_tgsi_visitor::emit_asm(ir_instruction *ir, unsigned op,
> st_dst_reg dst,
> st_src_reg src0, st_src_reg src1,
> + st_src_reg src2, st_src_reg src3,
> + unsigned precise)
> +{
> + return emit_asm(ir, op, dst, undef_dst, src0, src1, src2, src3, precise);
> +}
> +
> +glsl_to_tgsi_instruction *
> +glsl_to_tgsi_visitor::emit_asm(ir_expression *ir, unsigned op,
> + st_dst_reg dst,
> + st_src_reg src0, st_src_reg src1,
> + st_src_reg src2, st_src_reg src3)
> +{
> + return emit_asm(ir, op, dst, undef_dst, src0, src1, src2, src3, this->precise);
> +}
> +
> +glsl_to_tgsi_instruction *
> +glsl_to_tgsi_visitor::emit_asm(ir_expression *ir, unsigned op,
> + st_dst_reg dst, st_dst_reg dst1,
> + st_src_reg src0, st_src_reg src1,
> st_src_reg src2, st_src_reg src3)
> {
> - return emit_asm(ir, op, dst, undef_dst, src0, src1, src2, src3);
> + return emit_asm(ir, op, dst, dst1, src0, src1, src2, src3, this->precise);
> }
>
> /**
> @@ -1116,7 +1162,7 @@ glsl_to_tgsi_visitor::emit_arl(ir_instruction *ir,
> if (dst.index >= this->num_address_regs)
> this->num_address_regs = dst.index + 1;
>
> - emit_asm(NULL, op, dst, src0);
> + emit_asm((ir_instruction *)NULL, op, dst, src0);
> }
>
> int
> @@ -1406,11 +1452,11 @@ glsl_to_tgsi_visitor::visit(ir_variable *ir)
> void
> glsl_to_tgsi_visitor::visit(ir_loop *ir)
> {
> - emit_asm(NULL, TGSI_OPCODE_BGNLOOP);
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_BGNLOOP);
>
> visit_exec_list(&ir->body_instructions, this);
>
> - emit_asm(NULL, TGSI_OPCODE_ENDLOOP);
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_ENDLOOP);
> }
>
> void
> @@ -1418,10 +1464,10 @@ glsl_to_tgsi_visitor::visit(ir_loop_jump *ir)
> {
> switch (ir->mode) {
> case ir_loop_jump::jump_break:
> - emit_asm(NULL, TGSI_OPCODE_BRK);
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_BRK);
> break;
> case ir_loop_jump::jump_continue:
> - emit_asm(NULL, TGSI_OPCODE_CONT);
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_CONT);
> break;
> }
> }
> @@ -2703,7 +2749,7 @@ glsl_to_tgsi_visitor::visit(ir_dereference_variable *ir)
> st_dst_reg dst = st_dst_reg(get_temp(var->type));
> st_src_reg src = st_src_reg(PROGRAM_OUTPUT, decl->mesa_index,
> var->type, component, decl->array_id);
> - emit_asm(NULL, TGSI_OPCODE_FBFETCH, dst, src);
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_FBFETCH, dst, src);
> entry = new(mem_ctx) variable_storage(var, dst.file, dst.index,
> dst.array_id);
> } else {
> @@ -3148,7 +3194,10 @@ 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);
> + this->precise = 0;
> r = this->result;
>
> l = get_assignment_lhs(ir->lhs, this, &dst_component);
> @@ -3233,7 +3282,8 @@ glsl_to_tgsi_visitor::visit(ir_assignment *ir)
> */
> glsl_to_tgsi_instruction *inst, *new_inst;
> inst = (glsl_to_tgsi_instruction *)this->instructions.get_tail();
> - new_inst = emit_asm(ir, inst->op, l, inst->src[0], inst->src[1], inst->src[2], inst->src[3]);
> + new_inst = emit_asm(ir, inst->op, l, inst->src[0], inst->src[1], inst->src[2], inst->src[3],
> + is_precise(ir->lhs->variable_referenced()));
> new_inst->saturate = inst->saturate;
> inst->dead_mask = inst->dst[0].writemask;
> } else {
> @@ -4072,16 +4122,16 @@ glsl_to_tgsi_visitor::calc_deref_offsets(ir_dereference *tail,
>
> deref_arr->array_index->accept(this);
> if (*array_elements != 1)
> - emit_asm(NULL, TGSI_OPCODE_MUL, temp_dst, this->result, st_src_reg_for_int(*array_elements));
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_MUL, temp_dst, this->result, st_src_reg_for_int(*array_elements));
> else
> - emit_asm(NULL, TGSI_OPCODE_MOV, temp_dst, this->result);
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_MOV, temp_dst, this->result);
>
> if (indirect->file == PROGRAM_UNDEFINED)
> *indirect = temp_reg;
> else {
> temp_dst = st_dst_reg(*indirect);
> temp_dst.writemask = 1;
> - emit_asm(NULL, TGSI_OPCODE_ADD, temp_dst, *indirect, temp_reg);
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_ADD, temp_dst, *indirect, temp_reg);
> }
> } else
> *index += array_index->value.u[0] * *array_elements;
> @@ -4141,7 +4191,7 @@ glsl_to_tgsi_visitor::canonicalize_gather_offset(st_src_reg offset)
> st_src_reg tmp = get_temp(glsl_type::ivec2_type);
> st_dst_reg tmp_dst = st_dst_reg(tmp);
> tmp_dst.writemask = WRITEMASK_XY;
> - emit_asm(NULL, TGSI_OPCODE_MOV, tmp_dst, offset);
> + emit_asm((ir_instruction *)NULL, TGSI_OPCODE_MOV, tmp_dst, offset);
> return tmp;
> }
>
> @@ -6777,7 +6827,7 @@ get_mesa_program_tgsi(struct gl_context *ctx,
> v->renumber_registers();
>
> /* Write the END instruction. */
> - v->emit_asm(NULL, TGSI_OPCODE_END);
> + v->emit_asm((ir_instruction *)NULL, TGSI_OPCODE_END);
>
> if (ctx->_Shader->Flags & GLSL_DUMP) {
> _mesa_log("\n");
>
--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
More information about the Nouveau
mailing list