1f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand/* 2f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * Copyright © 2016 Intel Corporation 3f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * 4f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a 5f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * copy of this software and associated documentation files (the "Software"), 6f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * to deal in the Software without restriction, including without limitation 7f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the 9f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * Software is furnished to do so, subject to the following conditions: 10f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * 11f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * The above copyright notice and this permission notice (including the next 12f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * paragraph) shall be included in all copies or substantial portions of the 13f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * Software. 14f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * 15f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand * IN THE SOFTWARE. 22f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand */ 23f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 24f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand#include "nir.h" 25f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand#include "nir_builder.h" 26f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 27f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrandstatic bool 28f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrandderef_apply_constant_initializer(nir_deref_var *deref, void *state) 29f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand{ 30f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand struct nir_builder *b = state; 31f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 32f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_load_const_instr *initializer = 33f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_deref_get_const_initializer_load(b->shader, deref); 34f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_builder_instr_insert(b, &initializer->instr); 35f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 36f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_store_deref_var(b, deref, &initializer->def, 0xf); 37f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 38f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand return true; 39f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand} 40f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 41f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrandstatic bool 42f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrandlower_const_initializer(struct nir_builder *b, struct exec_list *var_list) 43f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand{ 44f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand bool progress = false; 45f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 46f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand b->cursor = nir_before_cf_list(&b->impl->body); 47f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 48f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_foreach_variable(var, var_list) { 49f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (!var->constant_initializer) 50f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand continue; 51f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 52f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand progress = true; 53f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 54f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_deref_var deref; 55f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand deref.deref.deref_type = nir_deref_type_var, 56f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand deref.deref.child = NULL; 57f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand deref.deref.type = var->type, 58f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand deref.var = var; 59f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 60f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_deref_foreach_leaf(&deref, deref_apply_constant_initializer, b); 61f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 62f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand var->constant_initializer = NULL; 63f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand } 64f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 65f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand return progress; 66f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand} 67f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 68f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrandbool 69f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrandnir_lower_constant_initializers(nir_shader *shader, nir_variable_mode modes) 70f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand{ 71f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand bool progress = false; 72f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 73f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_builder builder; 74f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (modes & ~nir_var_local) 75f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_builder_init(&builder, nir_shader_get_entrypoint(shader)); 76f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 77f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (modes & nir_var_shader_out) 78f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand progress |= lower_const_initializer(&builder, &shader->outputs); 79f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 80f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (modes & nir_var_global) 81f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand progress |= lower_const_initializer(&builder, &shader->globals); 82f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 83f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (modes & nir_var_system_value) 84f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand progress |= lower_const_initializer(&builder, &shader->system_values); 85f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 86f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (progress) { 87f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_foreach_function(function, shader) { 88f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (function->impl) { 89f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_metadata_preserve(function->impl, nir_metadata_block_index | 90f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_metadata_dominance | 91f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_metadata_live_ssa_defs); 92f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand } 93f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand } 94f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand } 95f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 96f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (modes & nir_var_local) { 97f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_foreach_function(function, shader) { 98f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (!function->impl) 99f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand continue; 100f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 101f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_builder_init(&builder, function->impl); 102f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand if (lower_const_initializer(&builder, &function->impl->locals)) { 103f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_metadata_preserve(function->impl, nir_metadata_block_index | 104f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_metadata_dominance | 105f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand nir_metadata_live_ssa_defs); 106f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand progress = true; 107f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand } 108f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand } 109f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand } 110f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand 111f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand return progress; 112f5232db9e5fb00efc094c5dd071da4be88527568Jason Ekstrand} 113