114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand/* 214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * Copyright © 2016 Intel Corporation 314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * 414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a 514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * copy of this software and associated documentation files (the "Software"), 614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * to deal in the Software without restriction, including without limitation 714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense, 814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the 914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * Software is furnished to do so, subject to the following conditions: 1014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * 1114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * The above copyright notice and this permission notice (including the next 1214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * paragraph) shall be included in all copies or substantial portions of the 1314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * Software. 1414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * 1514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 2114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * IN THE SOFTWARE. 2214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand */ 2314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 2414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand#include "nir.h" 2514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand#include "nir_builder.h" 2614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 2714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandstatic void 2814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandemit_load_store(nir_builder *b, nir_intrinsic_instr *orig_instr, 2914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_deref_var *deref, nir_deref *tail, 3014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_ssa_def **dest, nir_ssa_def *src); 3114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 3214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandstatic void 3314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandemit_indirect_load_store(nir_builder *b, nir_intrinsic_instr *orig_instr, 3414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_deref_var *deref, nir_deref *arr_parent, 3514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand int start, int end, 3614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_ssa_def **dest, nir_ssa_def *src) 3714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand{ 3814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_deref_array *arr = nir_deref_as_array(arr_parent->child); 3914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand assert(arr->deref_array_type == nir_deref_array_type_indirect); 4014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand assert(arr->indirect.is_ssa); 4114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 4214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand assert(start < end); 4314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (start == end - 1) { 4414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand /* Base case. Just emit the load/store op */ 4514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_deref_array direct = *arr; 4614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand direct.deref_array_type = nir_deref_array_type_direct; 4714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand direct.base_offset += start; 4814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand direct.indirect = NIR_SRC_INIT; 4914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 5014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand arr_parent->child = &direct.deref; 5145542f554ca01b00b3d4674cf90575dff7904736Jason Ekstrand emit_load_store(b, orig_instr, deref, &direct.deref, dest, src); 5214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand arr_parent->child = &arr->deref; 5314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } else { 5414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand int mid = start + (end - start) / 2; 5514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 5614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_ssa_def *then_dest, *else_dest; 5714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 5814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_if *if_stmt = nir_if_create(b->shader); 5914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if_stmt->condition = nir_src_for_ssa(nir_ilt(b, arr->indirect.ssa, 6014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_imm_int(b, mid))); 6114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_cf_node_insert(b->cursor, &if_stmt->cf_node); 6214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 6314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand b->cursor = nir_after_cf_list(&if_stmt->then_list); 6414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand emit_indirect_load_store(b, orig_instr, deref, arr_parent, 6514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand start, mid, &then_dest, src); 6614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 6714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand b->cursor = nir_after_cf_list(&if_stmt->else_list); 6814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand emit_indirect_load_store(b, orig_instr, deref, arr_parent, 6914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand mid, end, &else_dest, src); 7014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 7114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand b->cursor = nir_after_cf_node(&if_stmt->cf_node); 7214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 7314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (src == NULL) { 7414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand /* We're a load. We need to insert a phi node */ 7514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_phi_instr *phi = nir_phi_instr_create(b->shader); 763124ce699bb3844e793f00e00bfbea5c91744f90Connor Abbott unsigned bit_size = then_dest->bit_size; 7714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_ssa_dest_init(&phi->instr, &phi->dest, 783124ce699bb3844e793f00e00bfbea5c91744f90Connor Abbott then_dest->num_components, bit_size, NULL); 7914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 8014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_phi_src *src0 = ralloc(phi, nir_phi_src); 812ed17d46de045404042f13c6591895a1cf31b167Jason Ekstrand src0->pred = nir_if_last_then_block(if_stmt); 8214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand src0->src = nir_src_for_ssa(then_dest); 8314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand exec_list_push_tail(&phi->srcs, &src0->node); 8414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 8514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_phi_src *src1 = ralloc(phi, nir_phi_src); 862ed17d46de045404042f13c6591895a1cf31b167Jason Ekstrand src1->pred = nir_if_last_else_block(if_stmt); 8714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand src1->src = nir_src_for_ssa(else_dest); 8814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand exec_list_push_tail(&phi->srcs, &src1->node); 8914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 9014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_builder_instr_insert(b, &phi->instr); 9114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand *dest = &phi->dest.ssa; 9214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } 9314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } 9414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand} 9514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 9614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandstatic void 9714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandemit_load_store(nir_builder *b, nir_intrinsic_instr *orig_instr, 9814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_deref_var *deref, nir_deref *tail, 9914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_ssa_def **dest, nir_ssa_def *src) 10014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand{ 10114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand for (; tail->child; tail = tail->child) { 10214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (tail->child->deref_type != nir_deref_type_array) 10314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand continue; 10414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 10514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_deref_array *arr = nir_deref_as_array(tail->child); 10614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (arr->deref_array_type != nir_deref_array_type_indirect) 10714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand continue; 10814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 10914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand int length = glsl_get_length(tail->type); 11014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 11114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand emit_indirect_load_store(b, orig_instr, deref, tail, -arr->base_offset, 11214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand length - arr->base_offset, dest, src); 11314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand return; 11414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } 11514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 11614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand assert(tail && tail->child == NULL); 11714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 11814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand /* We reached the end of the deref chain. Emit the instruction */ 11914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 12014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (src == NULL) { 12114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand /* This is a load instruction */ 12214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_intrinsic_instr *load = 12314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_intrinsic_instr_create(b->shader, nir_intrinsic_load_var); 12414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand load->num_components = orig_instr->num_components; 125134a5ad31c8d39219f241f7a7cad246a6864c74bJason Ekstrand load->variables[0] = nir_deref_var_clone(deref, load); 1263124ce699bb3844e793f00e00bfbea5c91744f90Connor Abbott unsigned bit_size = orig_instr->dest.ssa.bit_size; 12714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_ssa_dest_init(&load->instr, &load->dest, 1283124ce699bb3844e793f00e00bfbea5c91744f90Connor Abbott load->num_components, bit_size, NULL); 12914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_builder_instr_insert(b, &load->instr); 13014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand *dest = &load->dest.ssa; 13114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } else { 13214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand /* This is a store instruction */ 13314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_intrinsic_instr *store = 13414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_intrinsic_instr_create(b->shader, nir_intrinsic_store_var); 13514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand store->num_components = orig_instr->num_components; 13614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_intrinsic_set_write_mask(store, nir_intrinsic_write_mask(orig_instr)); 137134a5ad31c8d39219f241f7a7cad246a6864c74bJason Ekstrand store->variables[0] = nir_deref_var_clone(deref, store); 13814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand store->src[0] = nir_src_for_ssa(src); 13914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_builder_instr_insert(b, &store->instr); 14014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } 14114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand} 14214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 14314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandstatic bool 14414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandderef_has_indirect(nir_deref_var *deref) 14514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand{ 14614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand for (nir_deref *tail = deref->deref.child; tail; tail = tail->child) { 14714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (tail->deref_type != nir_deref_type_array) 14814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand continue; 14914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 15014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_deref_array *arr = nir_deref_as_array(tail); 15114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (arr->deref_array_type == nir_deref_array_type_indirect) 15214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand return true; 15314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } 15414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 15514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand return false; 15614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand} 15714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 15814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandstatic bool 159b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbottlower_indirect_block(nir_block *block, nir_builder *b, 160b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott nir_variable_mode modes) 16114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand{ 162b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott bool progress = false; 16314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 164707e72f13bb78869ee95d3286980bf1709cba6cfJason Ekstrand nir_foreach_instr_safe(instr, block) { 16514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (instr->type != nir_instr_type_intrinsic) 16614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand continue; 16714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 16814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr); 16914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (intrin->intrinsic != nir_intrinsic_load_var && 17014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand intrin->intrinsic != nir_intrinsic_store_var) 17114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand continue; 17214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 17314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (!deref_has_indirect(intrin->variables[0])) 17414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand continue; 17514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 176663b2e9a92f152c314f611526b8a16ff4c06249fKenneth Graunke /* Only lower variables whose mode is in the mask, or compact 177663b2e9a92f152c314f611526b8a16ff4c06249fKenneth Graunke * array variables. (We can't handle indirects on tightly packed 178663b2e9a92f152c314f611526b8a16ff4c06249fKenneth Graunke * scalar arrays, so we need to lower them regardless.) 179663b2e9a92f152c314f611526b8a16ff4c06249fKenneth Graunke */ 180663b2e9a92f152c314f611526b8a16ff4c06249fKenneth Graunke if (!(modes & intrin->variables[0]->var->data.mode) && 181663b2e9a92f152c314f611526b8a16ff4c06249fKenneth Graunke !intrin->variables[0]->var->data.compact) 18214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand continue; 18314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 184b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott b->cursor = nir_before_instr(&intrin->instr); 18514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 18614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (intrin->intrinsic == nir_intrinsic_load_var) { 18714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_ssa_def *result; 188b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott emit_load_store(b, intrin, intrin->variables[0], 18914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand &intrin->variables[0]->deref, &result, NULL); 19014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_ssa_def_rewrite_uses(&intrin->dest.ssa, nir_src_for_ssa(result)); 19114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } else { 19214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand assert(intrin->src[0].is_ssa); 193b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott emit_load_store(b, intrin, intrin->variables[0], 19414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand &intrin->variables[0]->deref, NULL, intrin->src[0].ssa); 19514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } 19614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_instr_remove(&intrin->instr); 197b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott progress = true; 19814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } 19914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 200b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott return progress; 20114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand} 20214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 20314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandstatic bool 2042caaf0ac5e0266c69e64309af9307e422e48b44dJason Ekstrandlower_indirects_impl(nir_function_impl *impl, nir_variable_mode modes) 20514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand{ 206b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott nir_builder builder; 207b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott nir_builder_init(&builder, impl); 208b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott bool progress = false; 20914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 210b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott nir_foreach_block_safe(block, impl) { 211b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott progress |= lower_indirect_block(block, &builder, modes); 212b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott } 21314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 214b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott if (progress) 21514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand nir_metadata_preserve(impl, nir_metadata_none); 21614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 217b89f0bb58c4eec72918656460bb6e14b0b178590Connor Abbott return progress; 21814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand} 21914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 22014b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand/** Lowers indirect variable loads/stores to direct loads/stores. 22114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * 22214b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * The pass works by replacing any indirect load or store with an if-ladder 22314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand * that does a binary search on the array index. 22414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand */ 22514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrandbool 2262caaf0ac5e0266c69e64309af9307e422e48b44dJason Ekstrandnir_lower_indirect_derefs(nir_shader *shader, nir_variable_mode modes) 22714b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand{ 22814b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand bool progress = false; 22914b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 2309464d8c49813aba77285e7465b96e92a91ed327cJason Ekstrand nir_foreach_function(function, shader) { 23114b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand if (function->impl) 2322caaf0ac5e0266c69e64309af9307e422e48b44dJason Ekstrand progress = lower_indirects_impl(function->impl, modes) || progress; 23314b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand } 23414b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand 23514b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand return progress; 23614b18aba89026204043d2e0d441e6be0e1af4acaJason Ekstrand} 237