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