From: Alyssa Rosenzweig Date: Mon, 16 May 2022 17:40:51 +0000 (-0400) Subject: panfrost: Don't use nir_variable in the compilers X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2a6338722e8c9f3cbfe05bd83041fab6a66a2289;p=platform%2Fupstream%2Fmesa.git panfrost: Don't use nir_variable in the compilers More future proof, simpler, and works with early I/O lowering. Signed-off-by: Alyssa Rosenzweig Part-of: --- diff --git a/src/compiler/nir/nir_intrinsics.py b/src/compiler/nir/nir_intrinsics.py index 4bc16b5..c5ab952 100644 --- a/src/compiler/nir/nir_intrinsics.py +++ b/src/compiler/nir/nir_intrinsics.py @@ -1275,8 +1275,8 @@ intrinsic("shared_atomic_comp_swap_dxil", src_comp=[1, 1, 1], dest_comp=1) # src[] = { value } store("raw_output_pan", [], []) -store("combined_output_pan", [1, 1, 1, 4], [BASE, COMPONENT, SRC_TYPE, DEST_TYPE]) -load("raw_output_pan", [1], [BASE], [CAN_ELIMINATE, CAN_REORDER]) +store("combined_output_pan", [1, 1, 1, 4], [IO_SEMANTICS, COMPONENT, SRC_TYPE, DEST_TYPE]) +load("raw_output_pan", [1], [IO_SEMANTICS], [CAN_ELIMINATE, CAN_REORDER]) # Loads the sampler paramaters # src[] = { sampler_index } diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 40f52e7..5afb34e 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -859,12 +859,7 @@ bi_emit_fragment_out(bi_builder *b, nir_intrinsic_instr *instr) bool emit_blend = writeout & (PAN_WRITEOUT_C); bool emit_zs = writeout & (PAN_WRITEOUT_Z | PAN_WRITEOUT_S); - const nir_variable *var = - nir_find_variable_with_driver_location(b->shader->nir, - nir_var_shader_out, nir_intrinsic_base(instr)); - - unsigned loc = var ? var->data.location : 0; - + unsigned loc = nir_intrinsic_io_semantics(instr).location; bi_index src0 = bi_src_index(&instr->src[0]); /* By ISA convention, the coverage mask is stored in R60. The store @@ -924,10 +919,7 @@ bi_emit_fragment_out(bi_builder *b, nir_intrinsic_instr *instr) /* Explicit copy since BLEND inputs are precoloured to R0-R3, * TODO: maybe schedule around this or implement in RA as a * spill */ - bool has_mrt = false; - - nir_foreach_shader_out_variable(var, b->shader->nir) - has_mrt |= (var->data.location > FRAG_RESULT_DATA0); + bool has_mrt = (b->shader->nir->info.outputs_written >> FRAG_RESULT_DATA1); if (has_mrt) { bi_index srcs[4] = { color, color, color, color }; @@ -1578,10 +1570,8 @@ bi_emit_ld_tile(bi_builder *b, nir_intrinsic_instr *instr) /* Get the render target */ if (!b->shader->inputs->is_blend) { - const nir_variable *var = - nir_find_variable_with_driver_location(b->shader->nir, - nir_var_shader_out, nir_intrinsic_base(instr)); - unsigned loc = var->data.location; + nir_io_semantics sem = nir_intrinsic_io_semantics(instr); + unsigned loc = sem.location; assert(loc >= FRAG_RESULT_DATA0); rt = (loc - FRAG_RESULT_DATA0); } diff --git a/src/panfrost/midgard/midgard_compile.c b/src/panfrost/midgard/midgard_compile.c index 08ef81e..8ce6d90 100644 --- a/src/panfrost/midgard/midgard_compile.c +++ b/src/panfrost/midgard/midgard_compile.c @@ -1763,11 +1763,7 @@ output_load_rt_addr(compiler_context *ctx, nir_intrinsic_instr *instr) if (ctx->inputs->is_blend) return MIDGARD_COLOR_RT0 + ctx->inputs->blend.rt; - const nir_variable *var; - var = nir_find_variable_with_driver_location(ctx->nir, nir_var_shader_out, nir_intrinsic_base(instr)); - assert(var); - - unsigned loc = var->data.location; + unsigned loc = nir_intrinsic_io_semantics(instr).location; if (loc >= FRAG_RESULT_DATA0) return loc - FRAG_RESULT_DATA0; @@ -1988,15 +1984,10 @@ emit_intrinsic(compiler_context *ctx, nir_intrinsic_instr *instr) } if (writeout & PAN_WRITEOUT_C) { - const nir_variable *var = - nir_find_variable_with_driver_location(ctx->nir, nir_var_shader_out, - nir_intrinsic_base(instr)); - - assert(var != NULL); - assert(var->data.location >= FRAG_RESULT_DATA0); + nir_io_semantics sem = nir_intrinsic_io_semantics(instr); - rt = MIDGARD_COLOR_RT0 + var->data.location - - FRAG_RESULT_DATA0; + rt = MIDGARD_COLOR_RT0 + + (sem.location - FRAG_RESULT_DATA0); } else { rt = MIDGARD_ZS_RT; } diff --git a/src/panfrost/util/pan_lower_framebuffer.c b/src/panfrost/util/pan_lower_framebuffer.c index c31d043..946ae5c 100644 --- a/src/panfrost/util/pan_lower_framebuffer.c +++ b/src/panfrost/util/pan_lower_framebuffer.c @@ -554,11 +554,15 @@ pan_lower_fb_load(nir_shader *shader, nir_intrinsic_instr *intr, const struct util_format_description *desc, bool reorder_comps, - unsigned base, int sample) + int sample) { + nir_io_semantics sem = { + .location = nir_intrinsic_get_var(intr, 0)->data.location, + }; + nir_ssa_def *packed = nir_load_raw_output_pan(b, 4, 32, pan_sample_id(b, sample), - .base = base); + .io_semantics = sem); /* Convert the raw value */ nir_ssa_def *unpacked = pan_unpack(b, desc, packed); @@ -621,7 +625,6 @@ pan_lower_framebuffer(nir_shader *shader, const enum pipe_format *rt_fmts, if (var->data.location < FRAG_RESULT_DATA0) continue; - unsigned base = var->data.driver_location; unsigned rt = var->data.location - FRAG_RESULT_DATA0; if (rt_fmts[rt] == PIPE_FORMAT_NONE) @@ -649,7 +652,7 @@ pan_lower_framebuffer(nir_shader *shader, const enum pipe_format *rt_fmts, pan_lower_fb_store(shader, &b, intr, desc, reorder_comps); } else { b.cursor = nir_after_instr(instr); - pan_lower_fb_load(shader, &b, intr, desc, reorder_comps, base, sample); + pan_lower_fb_load(shader, &b, intr, desc, reorder_comps, sample); } nir_instr_remove(instr); diff --git a/src/panfrost/util/pan_lower_writeout.c b/src/panfrost/util/pan_lower_writeout.c index 75d482f..d4099fb 100644 --- a/src/panfrost/util/pan_lower_writeout.c +++ b/src/panfrost/util/pan_lower_writeout.c @@ -56,7 +56,7 @@ pan_nir_emit_combined_store(nir_builder *b, intr->num_components = rt0_store ? rt0_store->src[0].ssa->num_components : 4; if (rt0_store) - nir_intrinsic_set_base(intr, nir_intrinsic_base(rt0_store)); + nir_intrinsic_set_io_semantics(intr, nir_intrinsic_io_semantics(rt0_store)); nir_intrinsic_set_src_type(intr, pan_nir_rt_store_type(rt0_store)); nir_intrinsic_set_dest_type(intr, pan_nir_rt_store_type(stores[2])); nir_intrinsic_set_component(intr, writeout); @@ -80,29 +80,16 @@ pan_nir_emit_combined_store(nir_builder *b, bool pan_nir_lower_zs_store(nir_shader *nir) { - if (nir->info.stage != MESA_SHADER_FRAGMENT) - return false; - - nir_variable *vars[3] = { NULL }; - - nir_foreach_shader_out_variable(var, nir) { - if (var->data.location == FRAG_RESULT_DEPTH) - vars[0] = var; - else if (var->data.location == FRAG_RESULT_STENCIL) - vars[1] = var; - else if (var->data.index) - vars[2] = var; - } + bool progress = false; - if (!vars[0] && !vars[1] && !vars[2]) + if (nir->info.stage != MESA_SHADER_FRAGMENT) return false; - bool progress = false; - nir_foreach_function(function, nir) { if (!function->impl) continue; nir_intrinsic_instr *stores[3] = { NULL }; + unsigned writeout = 0; nir_foreach_block(block, function->impl) { nir_foreach_instr_safe(instr, block) { @@ -113,16 +100,21 @@ pan_nir_lower_zs_store(nir_shader *nir) if (intr->intrinsic != nir_intrinsic_store_output) continue; - for (unsigned i = 0; i < ARRAY_SIZE(vars); ++i) { - if (vars[i] && nir_intrinsic_base(intr) == vars[i]->data.driver_location) { - assert(!stores[i]); - stores[i] = intr; - } + nir_io_semantics sem = nir_intrinsic_io_semantics(intr); + if (sem.location == FRAG_RESULT_DEPTH) { + stores[0] = intr; + writeout |= PAN_WRITEOUT_Z; + } else if (sem.location == FRAG_RESULT_STENCIL) { + stores[1] = intr; + writeout |= PAN_WRITEOUT_S; + } else if (sem.dual_source_blend_index) { + stores[2] = intr; + writeout |= PAN_WRITEOUT_2; } } } - if (!stores[0] && !stores[1] && !stores[2]) continue; + if (!writeout) continue; nir_block *common_block = NULL; @@ -139,14 +131,6 @@ pan_nir_lower_zs_store(nir_shader *nir) common_block = block; } - unsigned writeout = 0; - if (stores[0]) - writeout |= PAN_WRITEOUT_Z; - if (stores[1]) - writeout |= PAN_WRITEOUT_S; - if (stores[2]) - writeout |= PAN_WRITEOUT_2; - bool replaced = false; nir_foreach_block(block, function->impl) { @@ -158,13 +142,12 @@ pan_nir_lower_zs_store(nir_shader *nir) if (intr->intrinsic != nir_intrinsic_store_output) continue; - const nir_variable *var = nir_find_variable_with_driver_location(nir, nir_var_shader_out, nir_intrinsic_base(intr)); - assert(var); + nir_io_semantics sem = nir_intrinsic_io_semantics(intr); - if (var->data.location < FRAG_RESULT_DATA0) + if (sem.location < FRAG_RESULT_DATA0) continue; - if (var->data.index) + if (sem.dual_source_blend_index) continue; assert(nir_src_is_const(intr->src[1]) && "no indirect outputs");