152e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand/* 252e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * Copyright © 2015 Intel Corporation 352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * 452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * Permission is hereby granted, free of charge, to any person obtaining a 552e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * copy of this software and associated documentation files (the "Software"), 652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * to deal in the Software without restriction, including without limitation 752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * the rights to use, copy, modify, merge, publish, distribute, sublicense, 852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * and/or sell copies of the Software, and to permit persons to whom the 952e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * Software is furnished to do so, subject to the following conditions: 1052e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * 1152e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * The above copyright notice and this permission notice (including the next 1252e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * paragraph) shall be included in all copies or substantial portions of the 1352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * Software. 1452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * 1552e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1952e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2052e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 2152e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * IN THE SOFTWARE. 2252e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * 2352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * Authors: 2452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * Jason Ekstrand <jason@jlekstrand.net> 2552e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand */ 2652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 2752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand#include "nir.h" 2852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand#include "nir_builder.h" 2952e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 3052e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand/** 3152e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * This file implements a NIR lowering pass to perform the normalization of 3252e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * the cubemap coordinates to have the largest magnitude component be -1.0 3352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * or 1.0. This is based on the old GLSL IR based pass by Eric. 3452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand */ 3552e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 3652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrandstatic bool 37f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbottnormalize_cubemap_coords_block(nir_block *block, nir_builder *b) 3852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand{ 39f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott bool progress = false; 4052e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 41707e72f13bb78869ee95d3286980bf1709cba6cfJason Ekstrand nir_foreach_instr(instr, block) { 4252e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand if (instr->type != nir_instr_type_tex) 4352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand continue; 4452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 4552e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_tex_instr *tex = nir_instr_as_tex(instr); 4652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand if (tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE) 4752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand continue; 4852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 490a913a9d85f2eb772be6a133965c5b8a4aa3c800Kenneth Graunke b->cursor = nir_before_instr(&tex->instr); 5052e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 5152e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand for (unsigned i = 0; i < tex->num_srcs; i++) { 5252e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand if (tex->src[i].src_type != nir_tex_src_coord) 5352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand continue; 5452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 5552e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_ssa_def *orig_coord = 5652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_ssa_for_src(b, tex->src[i].src, nir_tex_instr_src_size(tex, i)); 5752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand assert(orig_coord->num_components >= 3); 5852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 5952e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_ssa_def *abs = nir_fabs(b, orig_coord); 60b88aeff4f51e8a505a8c5e5905d80ae3b75ed3efRob Clark nir_ssa_def *norm = nir_fmax(b, nir_channel(b, abs, 0), 61b88aeff4f51e8a505a8c5e5905d80ae3b75ed3efRob Clark nir_fmax(b, nir_channel(b, abs, 1), 62b88aeff4f51e8a505a8c5e5905d80ae3b75ed3efRob Clark nir_channel(b, abs, 2))); 6352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 6452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_ssa_def *normalized = nir_fmul(b, orig_coord, nir_frcp(b, norm)); 6552e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 6652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand /* Array indices don't have to be normalized, so make a new vector 6752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand * with the coordinate's array index untouched. 6852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand */ 6952e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand if (tex->coord_components == 4) { 7052e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand normalized = nir_vec4(b, 71b88aeff4f51e8a505a8c5e5905d80ae3b75ed3efRob Clark nir_channel(b, normalized, 0), 72b88aeff4f51e8a505a8c5e5905d80ae3b75ed3efRob Clark nir_channel(b, normalized, 1), 73b88aeff4f51e8a505a8c5e5905d80ae3b75ed3efRob Clark nir_channel(b, normalized, 2), 74b88aeff4f51e8a505a8c5e5905d80ae3b75ed3efRob Clark nir_channel(b, orig_coord, 3)); 7552e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand } 7652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 7752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_instr_rewrite_src(&tex->instr, 7852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand &tex->src[i].src, 7952e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_src_for_ssa(normalized)); 805cede90f6269d517a420856cced705c2d2cc7ef6Kenneth Graunke 81f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott progress = true; 8252e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand } 8352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand } 8452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 85f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott return progress; 8652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand} 8752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 885cede90f6269d517a420856cced705c2d2cc7ef6Kenneth Graunkestatic bool 8952e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrandnormalize_cubemap_coords_impl(nir_function_impl *impl) 9052e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand{ 91f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott nir_builder b; 92f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott nir_builder_init(&b, impl); 93f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott bool progress = false; 9452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 95f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott nir_foreach_block(block, impl) { 96f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott progress |= normalize_cubemap_coords_block(block, &b); 97f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott } 9852e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 9952e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_metadata_preserve(impl, nir_metadata_block_index | 10052e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand nir_metadata_dominance); 1015cede90f6269d517a420856cced705c2d2cc7ef6Kenneth Graunke 102f4ebff89e4a59b7cc21317eca341d5c8de4f1c81Connor Abbott return progress; 10352e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand} 10452e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand 1055cede90f6269d517a420856cced705c2d2cc7ef6Kenneth Graunkebool 10652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrandnir_normalize_cubemap_coords(nir_shader *shader) 10752e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand{ 1085cede90f6269d517a420856cced705c2d2cc7ef6Kenneth Graunke bool progress = false; 1095cede90f6269d517a420856cced705c2d2cc7ef6Kenneth Graunke 1109464d8c49813aba77285e7465b96e92a91ed327cJason Ekstrand nir_foreach_function(function, shader) { 111237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand if (function->impl) 112237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand progress = normalize_cubemap_coords_impl(function->impl) || progress; 113d7ffd90ecb1e91fc3e0c816c06c71a2743d48276Kenneth Graunke } 1145cede90f6269d517a420856cced705c2d2cc7ef6Kenneth Graunke 1155cede90f6269d517a420856cced705c2d2cc7ef6Kenneth Graunke return progress; 11652e718097fa7dc808b3e8b43a8fd14a5b2b64797Jason Ekstrand} 117