1ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt/*
2ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * Copyright © 2015 Broadcom
3ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt *
4ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
5ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * copy of this software and associated documentation files (the "Software"),
6ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * to deal in the Software without restriction, including without limitation
7ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * and/or sell copies of the Software, and to permit persons to whom the
9ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * Software is furnished to do so, subject to the following conditions:
10ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt *
11ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * The above copyright notice and this permission notice (including the next
12ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * paragraph) shall be included in all copies or substantial portions of the
13ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * Software.
14ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt *
15ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt * IN THE SOFTWARE.
22ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt */
23ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
24ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt/*
251ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark * This lowering pass supports (as configured via nir_lower_tex_options)
261ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark * various texture related conversions:
271ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark *   + texture projector lowering: converts the coordinate division for
281ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark *     texture projection to be done in ALU instructions instead of
291ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark *     asking the texture operation to do so.
301ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark *   + lowering RECT: converts the un-normalized RECT texture coordinates
311ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark *     to normalized coordinates with txs plus ALU instructions
323745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark *   + saturate s/t/r coords: to emulate certain texture clamp/wrap modes,
333745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark *     inserts instructions to clamp specified coordinates to [0.0, 1.0].
343745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark *     Note that this automatically triggers texture projector lowering if
353745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark *     needed, since clamping must happen after projector lowering.
36ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt */
37ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
38ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt#include "nir.h"
39ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt#include "nir_builder.h"
40ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
41843fc8f3e782379899976f6f6f6dcdeb58153fa1Jason Ekstrandstatic void
42f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clarkproject_src(nir_builder *b, nir_tex_instr *tex)
43f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark{
44f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark   /* Find the projector in the srcs list, if present. */
452c3f9662762f6e45b47ea5d3047f5596b555f29cRob Clark   int proj_index = nir_tex_instr_src_index(tex, nir_tex_src_projector);
46843fc8f3e782379899976f6f6f6dcdeb58153fa1Jason Ekstrand   if (proj_index < 0)
47f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      return;
48f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark
49f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark   b->cursor = nir_before_instr(&tex->instr);
50f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark
51f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark   nir_ssa_def *inv_proj =
52f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      nir_frcp(b, nir_ssa_for_src(b, tex->src[proj_index].src, 1));
53f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark
54f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark   /* Walk through the sources projecting the arguments. */
55f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark   for (unsigned i = 0; i < tex->num_srcs; i++) {
56f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      switch (tex->src[i].src_type) {
57f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      case nir_tex_src_coord:
58fd249c803e3ae2acb83f5e3b7152728e73228b7bIlia Mirkin      case nir_tex_src_comparator:
59f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         break;
60f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      default:
61f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         continue;
62f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      }
63f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      nir_ssa_def *unprojected =
64f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         nir_ssa_for_src(b, tex->src[i].src, nir_tex_instr_src_size(tex, i));
65f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      nir_ssa_def *projected = nir_fmul(b, unprojected, inv_proj);
66f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark
67f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      /* Array indices don't get projected, so make an new vector with the
68f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark       * coordinate's array index untouched.
69f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark       */
70f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      if (tex->is_array && tex->src[i].src_type == nir_tex_src_coord) {
71f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         switch (tex->coord_components) {
72f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         case 4:
73f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark            projected = nir_vec4(b,
74f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, projected, 0),
75f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, projected, 1),
76f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, projected, 2),
77f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, unprojected, 3));
78f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark            break;
79f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         case 3:
80f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark            projected = nir_vec3(b,
81f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, projected, 0),
82f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, projected, 1),
83f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, unprojected, 2));
84f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark            break;
85f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         case 2:
86f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark            projected = nir_vec2(b,
87f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, projected, 0),
88f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                                 nir_channel(b, unprojected, 1));
89f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark            break;
90f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         default:
91f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark            unreachable("bad texture coord count for array");
92f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark            break;
93f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark         }
94f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      }
95f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark
96f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark      nir_instr_rewrite_src(&tex->instr,
97f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                            &tex->src[i].src,
98f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark                            nir_src_for_ssa(projected));
99f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark   }
100f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark
1011a8424cebaeaf46a01000624a46764f3e84dad85Rob Clark   nir_tex_instr_remove_src(tex, proj_index);
102f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark}
103f83ba7bc41a381a0e52c456431dbe1a15176ffb4Rob Clark
104d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrandstatic bool
105d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrandlower_offset(nir_builder *b, nir_tex_instr *tex)
106d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand{
1072c3f9662762f6e45b47ea5d3047f5596b555f29cRob Clark   int offset_index = nir_tex_instr_src_index(tex, nir_tex_src_offset);
108d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   if (offset_index < 0)
109d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      return false;
110d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
1112c3f9662762f6e45b47ea5d3047f5596b555f29cRob Clark   int coord_index = nir_tex_instr_src_index(tex, nir_tex_src_coord);
112d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   assert(coord_index >= 0);
113d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
114d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   assert(tex->src[offset_index].src.is_ssa);
115d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   assert(tex->src[coord_index].src.is_ssa);
116d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   nir_ssa_def *offset = tex->src[offset_index].src.ssa;
117d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   nir_ssa_def *coord = tex->src[coord_index].src.ssa;
118d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
119d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   b->cursor = nir_before_instr(&tex->instr);
120d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
121d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   nir_ssa_def *offset_coord;
122d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   if (nir_tex_instr_src_type(tex, coord_index) == nir_type_float) {
123d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      assert(tex->sampler_dim == GLSL_SAMPLER_DIM_RECT);
124d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      offset_coord = nir_fadd(b, coord, nir_i2f(b, offset));
125d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   } else {
126d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      offset_coord = nir_iadd(b, coord, offset);
127d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   }
128d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
129d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   if (tex->is_array) {
130d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      /* The offset is not applied to the array index */
131d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      if (tex->coord_components == 2) {
132d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand         offset_coord = nir_vec2(b, nir_channel(b, offset_coord, 0),
133d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand                                    nir_channel(b, coord, 1));
134d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      } else if (tex->coord_components == 3) {
135d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand         offset_coord = nir_vec3(b, nir_channel(b, offset_coord, 0),
136d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand                                    nir_channel(b, offset_coord, 1),
137d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand                                    nir_channel(b, coord, 2));
138d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      } else {
139d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand         unreachable("Invalid number of components");
140d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      }
141d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   }
142d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
143d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   nir_instr_rewrite_src(&tex->instr, &tex->src[coord_index].src,
144d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand                         nir_src_for_ssa(offset_coord));
145d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
1461a8424cebaeaf46a01000624a46764f3e84dad85Rob Clark   nir_tex_instr_remove_src(tex, offset_index);
147d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
148d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand   return true;
149d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand}
150d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
151d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
1521ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clarkstatic nir_ssa_def *
1531ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clarkget_texture_size(nir_builder *b, nir_tex_instr *tex)
1541ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark{
1551ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   b->cursor = nir_before_instr(&tex->instr);
1561ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
1571ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   nir_tex_instr *txs;
1581ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
1591ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   txs = nir_tex_instr_create(b->shader, 1);
1601ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   txs->op = nir_texop_txs;
161bac303c286de2a07912333a775bf4af18cd04e7aIago Toral Quiroga   txs->sampler_dim = tex->sampler_dim;
162bac303c286de2a07912333a775bf4af18cd04e7aIago Toral Quiroga   txs->is_array = tex->is_array;
163bac303c286de2a07912333a775bf4af18cd04e7aIago Toral Quiroga   txs->is_shadow = tex->is_shadow;
164bac303c286de2a07912333a775bf4af18cd04e7aIago Toral Quiroga   txs->is_new_style_shadow = tex->is_new_style_shadow;
165ee85014b90af1d94d637ec763a803479e9bac5dcJason Ekstrand   txs->texture_index = tex->texture_index;
166134a5ad31c8d39219f241f7a7cad246a6864c74bJason Ekstrand   txs->texture = nir_deref_var_clone(tex->texture, txs);
167bac303c286de2a07912333a775bf4af18cd04e7aIago Toral Quiroga   txs->sampler_index = tex->sampler_index;
168134a5ad31c8d39219f241f7a7cad246a6864c74bJason Ekstrand   txs->sampler = nir_deref_var_clone(tex->sampler, txs);
169042fa75e48118e4d7643e1f42b5a983df1274acbJason Ekstrand   txs->dest_type = nir_type_int;
1701ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
1711ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   /* only single src, the lod: */
1721ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   txs->src[0].src = nir_src_for_ssa(nir_imm_int(b, 0));
1731ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   txs->src[0].src_type = nir_tex_src_lod;
1741ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
175bac303c286de2a07912333a775bf4af18cd04e7aIago Toral Quiroga   nir_ssa_dest_init(&txs->instr, &txs->dest, tex->coord_components, 32, NULL);
1761ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   nir_builder_instr_insert(b, &txs->instr);
1771ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
1781ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   return nir_i2f(b, &txs->dest.ssa);
1791ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark}
1801ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
1811ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clarkstatic void
1821ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clarklower_rect(nir_builder *b, nir_tex_instr *tex)
1831ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark{
1841ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   nir_ssa_def *txs = get_texture_size(b, tex);
1851ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   nir_ssa_def *scale = nir_frcp(b, txs);
1861ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
1871ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   /* Walk through the sources normalizing the requested arguments. */
1881ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   for (unsigned i = 0; i < tex->num_srcs; i++) {
1891ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark      if (tex->src[i].src_type != nir_tex_src_coord)
1901ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark         continue;
1911ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
1921ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark      nir_ssa_def *coords =
1931ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark         nir_ssa_for_src(b, tex->src[i].src, tex->coord_components);
1941ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark      nir_instr_rewrite_src(&tex->instr,
1951ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark                            &tex->src[i].src,
1961ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark                            nir_src_for_ssa(nir_fmul(b, coords, scale)));
1971ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   }
1981ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
1991ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark   tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
2001ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark}
2011ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark
202a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsbergstatic nir_ssa_def *
203a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsbergsample_plane(nir_builder *b, nir_tex_instr *tex, int plane)
204a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg{
205a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   assert(tex->dest.is_ssa);
206a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   assert(nir_tex_instr_dest_size(tex) == 4);
207a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   assert(nir_alu_type_get_base_type(tex->dest_type) == nir_type_float);
208a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   assert(tex->op == nir_texop_tex);
209a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   assert(tex->coord_components == 2);
210a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
211a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_tex_instr *plane_tex = nir_tex_instr_create(b->shader, 2);
212a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_src_copy(&plane_tex->src[0].src, &tex->src[0].src, plane_tex);
213a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   plane_tex->src[0].src_type = nir_tex_src_coord;
214a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   plane_tex->src[1].src = nir_src_for_ssa(nir_imm_int(b, plane));
215a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   plane_tex->src[1].src_type = nir_tex_src_plane;
216a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   plane_tex->op = nir_texop_tex;
217bff90aedf1d06c7e746b2d56319b19a624594febRob Clark   plane_tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
218a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   plane_tex->dest_type = nir_type_float;
219a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   plane_tex->coord_components = 2;
220a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
221a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   plane_tex->texture_index = tex->texture_index;
222134a5ad31c8d39219f241f7a7cad246a6864c74bJason Ekstrand   plane_tex->texture = nir_deref_var_clone(tex->texture, plane_tex);
223a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   plane_tex->sampler_index = tex->sampler_index;
224134a5ad31c8d39219f241f7a7cad246a6864c74bJason Ekstrand   plane_tex->sampler = nir_deref_var_clone(tex->sampler, plane_tex);
225a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
226a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_dest_init(&plane_tex->instr, &plane_tex->dest, 4, 32, NULL);
227a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
228a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_builder_instr_insert(b, &plane_tex->instr);
229a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
230a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   return &plane_tex->dest.ssa;
231a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg}
232a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
233a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsbergstatic void
234a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsbergconvert_yuv_to_rgb(nir_builder *b, nir_tex_instr *tex,
235a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                   nir_ssa_def *y, nir_ssa_def *u, nir_ssa_def *v)
236a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg{
237a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_const_value m[3] = {
238a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      { .f32 = { 1.0f,  0.0f,         1.59602678f, 0.0f } },
239a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      { .f32 = { 1.0f, -0.39176229f, -0.81296764f, 0.0f } },
240a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      { .f32 = { 1.0f,  2.01723214f,  0.0f,        0.0f } }
241a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   };
242a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
243a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *yuv =
244a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      nir_vec4(b,
245a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg               nir_fmul(b, nir_imm_float(b, 1.16438356f),
246a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                        nir_fadd(b, y, nir_imm_float(b, -0.0625f))),
247a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg               nir_channel(b, nir_fadd(b, u, nir_imm_float(b, -0.5f)), 0),
248a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg               nir_channel(b, nir_fadd(b, v, nir_imm_float(b, -0.5f)), 0),
249a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg               nir_imm_float(b, 0.0));
250a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
251a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *red = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[0]));
252a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *green = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[1]));
253a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *blue = nir_fdot4(b, yuv, nir_build_imm(b, 4, 32, m[2]));
254a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
255a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *result = nir_vec4(b, red, green, blue, nir_imm_float(b, 1.0f));
256a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
257a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def_rewrite_uses(&tex->dest.ssa, nir_src_for_ssa(result));
258a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg}
259a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
260a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsbergstatic void
261a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberglower_y_uv_external(nir_builder *b, nir_tex_instr *tex)
262a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg{
263a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   b->cursor = nir_after_instr(&tex->instr);
264a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
265a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *y = sample_plane(b, tex, 0);
266a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *uv = sample_plane(b, tex, 1);
267a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
268a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   convert_yuv_to_rgb(b, tex,
269a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, y, 0),
270a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, uv, 0),
271a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, uv, 1));
272a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg}
273a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
274a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsbergstatic void
275a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberglower_y_u_v_external(nir_builder *b, nir_tex_instr *tex)
276a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg{
277a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   b->cursor = nir_after_instr(&tex->instr);
278a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
279a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *y = sample_plane(b, tex, 0);
280a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *u = sample_plane(b, tex, 1);
281a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *v = sample_plane(b, tex, 2);
282a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
283a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   convert_yuv_to_rgb(b, tex,
284a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, y, 0),
285a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, u, 0),
286a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, v, 0));
287a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg}
288a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
289a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsbergstatic void
290a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberglower_yx_xuxv_external(nir_builder *b, nir_tex_instr *tex)
291a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg{
292a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   b->cursor = nir_after_instr(&tex->instr);
293a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
294a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *y = sample_plane(b, tex, 0);
295a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   nir_ssa_def *xuxv = sample_plane(b, tex, 1);
296a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
297a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg   convert_yuv_to_rgb(b, tex,
298a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, y, 0),
299a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, xuxv, 1),
300a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg                      nir_channel(b, xuxv, 3));
301a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg}
302a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
303a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga/*
304a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga * Emits a textureLod operation used to replace an existing
305a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga * textureGrad instruction.
306a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga */
307a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quirogastatic void
308a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quirogareplace_gradient_with_lod(nir_builder *b, nir_ssa_def *lod, nir_tex_instr *tex)
309a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga{
310a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* We are going to emit a textureLod() with the same parameters except that
311a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * we replace ddx/ddy with lod.
312a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    */
313a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   int num_srcs = tex->num_srcs - 1;
314a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_tex_instr *txl = nir_tex_instr_create(b->shader, num_srcs);
315a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
316a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->op = nir_texop_txl;
317a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->sampler_dim = tex->sampler_dim;
318a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->texture_index = tex->texture_index;
319a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->dest_type = tex->dest_type;
320a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->is_array = tex->is_array;
321a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->is_shadow = tex->is_shadow;
322a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->is_new_style_shadow = tex->is_new_style_shadow;
323a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->sampler_index = tex->sampler_index;
324134a5ad31c8d39219f241f7a7cad246a6864c74bJason Ekstrand   txl->texture = nir_deref_var_clone(tex->texture, txl);
325134a5ad31c8d39219f241f7a7cad246a6864c74bJason Ekstrand   txl->sampler = nir_deref_var_clone(tex->sampler, txl);
326a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->coord_components = tex->coord_components;
327a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
328a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_dest_init(&txl->instr, &txl->dest, 4, 32, NULL);
329a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
330a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   int src_num = 0;
331a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   for (int i = 0; i < tex->num_srcs; i++) {
332a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      if (tex->src[i].src_type == nir_tex_src_ddx ||
333a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga          tex->src[i].src_type == nir_tex_src_ddy)
334a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga         continue;
335a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      nir_src_copy(&txl->src[src_num].src, &tex->src[i].src, txl);
336a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      txl->src[src_num].src_type = tex->src[i].src_type;
337a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      src_num++;
338a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   }
339a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
340a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->src[src_num].src = nir_src_for_ssa(lod);
341a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   txl->src[src_num].src_type = nir_tex_src_lod;
342a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   src_num++;
343a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
344a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   assert(src_num == num_srcs);
345a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
34647351b843a8213e931bbd70cb6a2501b87cb525eIago Toral Quiroga   nir_ssa_dest_init(&txl->instr, &txl->dest,
34747351b843a8213e931bbd70cb6a2501b87cb525eIago Toral Quiroga                     tex->dest.ssa.num_components, 32, NULL);
348a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_builder_instr_insert(b, &txl->instr);
349a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
350a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def_rewrite_uses(&tex->dest.ssa, nir_src_for_ssa(&txl->dest.ssa));
351a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
352a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_instr_remove(&tex->instr);
353a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga}
354a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
355a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quirogastatic void
356a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quirogalower_gradient_cube_map(nir_builder *b, nir_tex_instr *tex)
357a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga{
358a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   assert(tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE);
359a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   assert(tex->op == nir_texop_txd);
360a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   assert(tex->dest.is_ssa);
361a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
362a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* Use textureSize() to get the width and height of LOD 0 */
363a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *size = get_texture_size(b, tex);
364a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
365a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* Cubemap texture lookups first generate a texture coordinate normalized
366a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * to [-1, 1] on the appropiate face. The appropiate face is determined
367a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * by which component has largest magnitude and its sign. The texture
368a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * coordinate is the quotient of the remaining texture coordinates against
369a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * that absolute value of the component of largest magnitude. This
370a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * division requires that the computing of the derivative of the texel
371a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * coordinate must use the quotient rule. The high level GLSL code is as
372a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * follows:
373a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *
374a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * Step 1: selection
375a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *
376a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * vec3 abs_p, Q, dQdx, dQdy;
377a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * abs_p = abs(ir->coordinate);
378a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * if (abs_p.x >= max(abs_p.y, abs_p.z)) {
379a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    Q = ir->coordinate.yzx;
380a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    dQdx = ir->lod_info.grad.dPdx.yzx;
381a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    dQdy = ir->lod_info.grad.dPdy.yzx;
382a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * }
383a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * if (abs_p.y >= max(abs_p.x, abs_p.z)) {
384a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    Q = ir->coordinate.xzy;
385a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    dQdx = ir->lod_info.grad.dPdx.xzy;
386a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    dQdy = ir->lod_info.grad.dPdy.xzy;
387a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * }
388a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * if (abs_p.z >= max(abs_p.x, abs_p.y)) {
389a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    Q = ir->coordinate;
390a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    dQdx = ir->lod_info.grad.dPdx;
391a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *    dQdy = ir->lod_info.grad.dPdy;
392a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * }
393a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *
394a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * Step 2: use quotient rule to compute derivative. The normalized to
395a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * [-1, 1] texel coordinate is given by Q.xy / (sign(Q.z) * Q.z). We are
396a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * only concerned with the magnitudes of the derivatives whose values are
397a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * not affected by the sign. We drop the sign from the computation.
398a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *
399a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * vec2 dx, dy;
400a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * float recip;
401a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *
402a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * recip = 1.0 / Q.z;
403a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * dx = recip * ( dQdx.xy - Q.xy * (dQdx.z * recip) );
404a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * dy = recip * ( dQdy.xy - Q.xy * (dQdy.z * recip) );
405a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *
406a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * Step 3: compute LOD. At this point we have the derivatives of the
407a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * texture coordinates normalized to [-1,1]. We take the LOD to be
408a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *  result = log2(max(sqrt(dot(dx, dx)), sqrt(dy, dy)) * 0.5 * L)
409a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *         = -1.0 + log2(max(sqrt(dot(dx, dx)), sqrt(dy, dy)) * L)
410a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *         = -1.0 + log2(sqrt(max(dot(dx, dx), dot(dy,dy))) * L)
411a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *         = -1.0 + log2(sqrt(L * L * max(dot(dx, dx), dot(dy,dy))))
412a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *         = -1.0 + 0.5 * log2(L * L * max(dot(dx, dx), dot(dy,dy)))
413a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * where L is the dimension of the cubemap. The code is:
414a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    *
415a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * float M, result;
416a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * M = max(dot(dx, dx), dot(dy, dy));
417a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * L = textureSize(sampler, 0).x;
418a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * result = -1.0 + 0.5 * log2(L * L * M);
419a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    */
420a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
421a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* coordinate */
422a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *p =
423a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      tex->src[nir_tex_instr_src_index(tex, nir_tex_src_coord)].src.ssa;
424a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
425a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* unmodified dPdx, dPdy values */
426a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *dPdx =
427a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      tex->src[nir_tex_instr_src_index(tex, nir_tex_src_ddx)].src.ssa;
428a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *dPdy =
429a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      tex->src[nir_tex_instr_src_index(tex, nir_tex_src_ddy)].src.ssa;
430a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
431a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *abs_p = nir_fabs(b, p);
432a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *abs_p_x = nir_channel(b, abs_p, 0);
433a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *abs_p_y = nir_channel(b, abs_p, 1);
434a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *abs_p_z = nir_channel(b, abs_p, 2);
435a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
436a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* 1. compute selector */
437a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *Q, *dQdx, *dQdy;
438a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
439a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *cond_z = nir_fge(b, abs_p_z, nir_fmax(b, abs_p_x, abs_p_y));
440a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *cond_y = nir_fge(b, abs_p_y, nir_fmax(b, abs_p_x, abs_p_z));
441a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
442a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   unsigned yzx[4] = { 1, 2, 0, 0 };
443a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   unsigned xzy[4] = { 0, 2, 1, 0 };
444a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
445a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   Q = nir_bcsel(b, cond_z,
446a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                 p,
447a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                 nir_bcsel(b, cond_y,
448a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                           nir_swizzle(b, p, xzy, 3, false),
449a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                           nir_swizzle(b, p, yzx, 3, false)));
450a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
451a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   dQdx = nir_bcsel(b, cond_z,
452a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                    dPdx,
453a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                    nir_bcsel(b, cond_y,
454a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                              nir_swizzle(b, dPdx, xzy, 3, false),
455a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                              nir_swizzle(b, dPdx, yzx, 3, false)));
456a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
457a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   dQdy = nir_bcsel(b, cond_z,
458a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                    dPdy,
459a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                    nir_bcsel(b, cond_y,
460a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                              nir_swizzle(b, dPdy, xzy, 3, false),
461a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                              nir_swizzle(b, dPdy, yzx, 3, false)));
462a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
463a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* 2. quotient rule */
464a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
465a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* tmp = Q.xy * recip;
466a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * dx = recip * ( dQdx.xy - (tmp * dQdx.z) );
467a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    * dy = recip * ( dQdy.xy - (tmp * dQdy.z) );
468a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga    */
469a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *rcp_Q_z = nir_frcp(b, nir_channel(b, Q, 2));
470a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
471a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   unsigned xy[4] = { 0, 1, 0, 0 };
472a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *Q_xy = nir_swizzle(b, Q, xy, 2, false);
473a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *tmp = nir_fmul(b, Q_xy, rcp_Q_z);
474a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
475a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *dQdx_xy = nir_swizzle(b, dQdx, xy, 2, false);
476a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *dQdx_z = nir_channel(b, dQdx, 2);
477a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *dx =
478a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      nir_fmul(b, rcp_Q_z, nir_fsub(b, dQdx_xy, nir_fmul(b, tmp, dQdx_z)));
479a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
480a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *dQdy_xy = nir_swizzle(b, dQdy, xy, 2, false);
481a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *dQdy_z = nir_channel(b, dQdy, 2);
482a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *dy =
483a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      nir_fmul(b, rcp_Q_z, nir_fsub(b, dQdy_xy, nir_fmul(b, tmp, dQdy_z)));
484a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
485a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* M = max(dot(dx, dx), dot(dy, dy)); */
486a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *M = nir_fmax(b, nir_fdot(b, dx, dx), nir_fdot(b, dy, dy));
487a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
488a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* size has textureSize() of LOD 0 */
489a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *L = nir_channel(b, size, 0);
490a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
491a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* lod = -1.0 + 0.5 * log2(L * L * M); */
492a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   nir_ssa_def *lod =
493a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      nir_fadd(b,
494a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga               nir_imm_float(b, -1.0f),
495a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga               nir_fmul(b,
496a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                        nir_imm_float(b, 0.5f),
497a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga                        nir_flog2(b, nir_fmul(b, L, nir_fmul(b, L, M)))));
498a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
499a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   /* 3. Replace the gradient instruction with an equivalent lod instruction */
500a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga   replace_gradient_with_lod(b, lod, tex);
501a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga}
502a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
5033745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clarkstatic void
5045be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quirogalower_gradient_shadow(nir_builder *b, nir_tex_instr *tex)
5055be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga{
5065be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   assert(tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE);
5075be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   assert(tex->is_shadow);
5085be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   assert(tex->op == nir_texop_txd);
5095be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   assert(tex->dest.is_ssa);
5105be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
5115be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   /* Use textureSize() to get the width and height of LOD 0 */
5125be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   unsigned component_mask;
5135be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   switch (tex->sampler_dim) {
5145be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   case GLSL_SAMPLER_DIM_3D:
5155be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      component_mask = 7;
5165be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      break;
5175be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   case GLSL_SAMPLER_DIM_1D:
5185be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      component_mask = 1;
5195be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      break;
5205be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   default:
5215be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      component_mask = 3;
5225be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      break;
5235be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   }
5245be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
5255be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   nir_ssa_def *size =
5265be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      nir_channels(b, get_texture_size(b, tex), component_mask);
5275be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
5285be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   /* Scale the gradients by width and height.  Effectively, the incoming
5295be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga    * gradients are s'(x,y), t'(x,y), and r'(x,y) from equation 3.19 in the
5305be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga    * GL 3.0 spec; we want u'(x,y), which is w_t * s'(x,y).
5315be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga    */
5325be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   nir_ssa_def *ddx =
5335be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      tex->src[nir_tex_instr_src_index(tex, nir_tex_src_ddx)].src.ssa;
5345be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   nir_ssa_def *ddy =
5355be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      tex->src[nir_tex_instr_src_index(tex, nir_tex_src_ddy)].src.ssa;
5365be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
5375be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   nir_ssa_def *dPdx = nir_fmul(b, ddx, size);
5385be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   nir_ssa_def *dPdy = nir_fmul(b, ddy, size);
5395be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
5405be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   nir_ssa_def *rho;
5415be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   if (dPdx->num_components == 1) {
5425be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      rho = nir_fmax(b, nir_fabs(b, dPdx), nir_fabs(b, dPdy));
5435be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   } else {
5445be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      rho = nir_fmax(b,
5455be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga                     nir_fsqrt(b, nir_fdot(b, dPdx, dPdx)),
5465be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga                     nir_fsqrt(b, nir_fdot(b, dPdy, dPdy)));
5475be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   }
5485be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
5495be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   /* lod = log2(rho).  We're ignoring GL state biases for now. */
5505be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   nir_ssa_def *lod = nir_flog2(b, rho);
5515be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
5525be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   /* Replace the gradient instruction with an equivalent lod instruction */
5535be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga   replace_gradient_with_lod(b, lod, tex);
5545be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga}
5555be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
5565be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quirogastatic void
5573745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clarksaturate_src(nir_builder *b, nir_tex_instr *tex, unsigned sat_mask)
5583745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark{
5593745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark   b->cursor = nir_before_instr(&tex->instr);
5603745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
5613745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark   /* Walk through the sources saturating the requested arguments. */
5623745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark   for (unsigned i = 0; i < tex->num_srcs; i++) {
5633745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      if (tex->src[i].src_type != nir_tex_src_coord)
5643745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         continue;
5653745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
5663745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      nir_ssa_def *src =
5673745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         nir_ssa_for_src(b, tex->src[i].src, tex->coord_components);
5683745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
5693745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      /* split src into components: */
5703745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      nir_ssa_def *comp[4];
5713745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
572fcd6b3f42be904d162b78fe75ba14c6415cdb815Rob Clark      assume(tex->coord_components >= 1);
573fcd6b3f42be904d162b78fe75ba14c6415cdb815Rob Clark
5743745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      for (unsigned j = 0; j < tex->coord_components; j++)
5753745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         comp[j] = nir_channel(b, src, j);
5763745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
5773745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      /* clamp requested components, array index does not get clamped: */
5783745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      unsigned ncomp = tex->coord_components;
5793745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      if (tex->is_array)
5803745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         ncomp--;
5813745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
5823745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      for (unsigned j = 0; j < ncomp; j++) {
5833745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         if ((1 << j) & sat_mask) {
5843745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark            if (tex->sampler_dim == GLSL_SAMPLER_DIM_RECT) {
5853745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark               /* non-normalized texture coords, so clamp to texture
5863745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark                * size rather than [0.0, 1.0]
5873745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark                */
5883745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark               nir_ssa_def *txs = get_texture_size(b, tex);
5893745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark               comp[j] = nir_fmax(b, comp[j], nir_imm_float(b, 0.0));
5903745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark               comp[j] = nir_fmin(b, comp[j], nir_channel(b, txs, j));
5913745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark            } else {
5923745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark               comp[j] = nir_fsat(b, comp[j]);
5933745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark            }
5943745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         }
5953745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      }
5963745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
5973745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      /* and move the result back into a single vecN: */
598e4dfcdcbecee9d11709e85524222d748d0e27112Rob Clark      src = nir_vec(b, comp, tex->coord_components);
5993745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
6003745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      nir_instr_rewrite_src(&tex->instr,
6013745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark                            &tex->src[i].src,
6023745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark                            nir_src_for_ssa(src));
6033745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark   }
6043745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark}
6053745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
6068537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrandstatic nir_ssa_def *
6078537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrandget_zero_or_one(nir_builder *b, nir_alu_type type, uint8_t swizzle_val)
6088537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand{
6098537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   nir_const_value v;
6108537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
6118537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   memset(&v, 0, sizeof(v));
6128537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
6138537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   if (swizzle_val == 4) {
614084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga      v.u32[0] = v.u32[1] = v.u32[2] = v.u32[3] = 0;
6158537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   } else {
6168537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      assert(swizzle_val == 5);
6178537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      if (type == nir_type_float)
618084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga         v.f32[0] = v.f32[1] = v.f32[2] = v.f32[3] = 1.0;
6198537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      else
620084b24f5582567ebf5aa94b7f40ae3bdcb71316bIago Toral Quiroga         v.u32[0] = v.u32[1] = v.u32[2] = v.u32[3] = 1;
6218537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   }
6228537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
6233a150683ce2f1245fc6f5a02f4a1c2197353962cSamuel Iglesias Gonsálvez   return nir_build_imm(b, 4, 32, v);
6248537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand}
6258537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
6268537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrandstatic void
6278537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrandswizzle_result(nir_builder *b, nir_tex_instr *tex, const uint8_t swizzle[4])
6288537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand{
6298537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   assert(tex->dest.is_ssa);
6308537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
6318537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   b->cursor = nir_after_instr(&tex->instr);
6328537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
6338537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   nir_ssa_def *swizzled;
6348537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   if (tex->op == nir_texop_tg4) {
6358537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      if (swizzle[tex->component] < 4) {
6368537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         /* This one's easy */
6378537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         tex->component = swizzle[tex->component];
6388537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         return;
6398537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      } else {
6408537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         swizzled = get_zero_or_one(b, tex->dest_type, swizzle[tex->component]);
6418537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      }
6428537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   } else {
6438537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      assert(nir_tex_instr_dest_size(tex) == 4);
6448537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      if (swizzle[0] < 4 && swizzle[1] < 4 &&
6458537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand          swizzle[2] < 4 && swizzle[3] < 4) {
6468537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         unsigned swiz[4] = { swizzle[0], swizzle[1], swizzle[2], swizzle[3] };
6478537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         /* We have no 0's or 1's, just emit a swizzling MOV */
6488537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         swizzled = nir_swizzle(b, &tex->dest.ssa, swiz, 4, false);
6498537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      } else {
6508537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         nir_ssa_def *srcs[4];
6518537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         for (unsigned i = 0; i < 4; i++) {
6528537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand            if (swizzle[i] < 4) {
6538537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand               srcs[i] = nir_channel(b, &tex->dest.ssa, swizzle[i]);
6548537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand            } else {
6558537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand               srcs[i] = get_zero_or_one(b, tex->dest_type, swizzle[i]);
6568537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand            }
6578537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         }
6588537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand         swizzled = nir_vec(b, srcs, 4);
6598537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      }
6608537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   }
6618537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
6628537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand   nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, nir_src_for_ssa(swizzled),
6638537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand                                  swizzled->parent_instr);
6648537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand}
6658537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
666eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clarkstatic void
667eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clarklinearize_srgb_result(nir_builder *b, nir_tex_instr *tex)
668eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark{
669eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   assert(tex->dest.is_ssa);
670eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   assert(nir_tex_instr_dest_size(tex) == 4);
671eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   assert(nir_alu_type_get_base_type(tex->dest_type) == nir_type_float);
672eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark
673eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   b->cursor = nir_after_instr(&tex->instr);
674eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark
675eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   static const unsigned swiz[4] = {0, 1, 2, 0};
676eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   nir_ssa_def *comp = nir_swizzle(b, &tex->dest.ssa, swiz, 3, true);
677eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark
678eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   /* Formula is:
679eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark    *    (comp <= 0.04045) ?
680eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark    *          (comp / 12.92) :
681eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark    *          pow((comp + 0.055) / 1.055, 2.4)
682eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark    */
683eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   nir_ssa_def *low  = nir_fmul(b, comp, nir_imm_float(b, 1.0 / 12.92));
684eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   nir_ssa_def *high = nir_fpow(b,
685eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                nir_fmul(b,
686eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                         nir_fadd(b,
687eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                                  comp,
688eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                                  nir_imm_float(b, 0.055)),
689eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                         nir_imm_float(b, 1.0 / 1.055)),
690eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                nir_imm_float(b, 2.4));
691eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   nir_ssa_def *cond = nir_fge(b, nir_imm_float(b, 0.04045), comp);
692eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   nir_ssa_def *rgb  = nir_bcsel(b, cond, low, high);
693eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark
694eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   /* alpha is untouched: */
695eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   nir_ssa_def *result = nir_vec4(b,
696eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                  nir_channel(b, rgb, 0),
697eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                  nir_channel(b, rgb, 1),
698eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                  nir_channel(b, rgb, 2),
699eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                  nir_channel(b, &tex->dest.ssa, 3));
700eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark
701eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark   nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, nir_src_for_ssa(result),
702eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark                                  result->parent_instr);
703eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark}
704eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark
705ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholtstatic bool
706d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbottnir_lower_tex_block(nir_block *block, nir_builder *b,
707d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott                    const nir_lower_tex_options *options)
708ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt{
709d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   bool progress = false;
710ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
711707e72f13bb78869ee95d3286980bf1709cba6cfJason Ekstrand   nir_foreach_instr_safe(instr, block) {
712ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt      if (instr->type != nir_instr_type_tex)
713ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt         continue;
714ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
715ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt      nir_tex_instr *tex = nir_instr_as_tex(instr);
71652ccc6349fe42a8a480d7472c61c8eb069aadb6bRob Clark      bool lower_txp = !!(options->lower_txp & (1 << tex->sampler_dim));
717faf5f174ddbc7680f6947ceababb94fdb552bcdbRob Clark
7183745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      /* mask of src coords to saturate (clamp): */
7193745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      unsigned sat_mask = 0;
7203745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
72152ccc6349fe42a8a480d7472c61c8eb069aadb6bRob Clark      if ((1 << tex->sampler_index) & options->saturate_r)
7223745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         sat_mask |= (1 << 2);    /* .z */
72352ccc6349fe42a8a480d7472c61c8eb069aadb6bRob Clark      if ((1 << tex->sampler_index) & options->saturate_t)
7243745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         sat_mask |= (1 << 1);    /* .y */
72552ccc6349fe42a8a480d7472c61c8eb069aadb6bRob Clark      if ((1 << tex->sampler_index) & options->saturate_s)
7263745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         sat_mask |= (1 << 0);    /* .x */
7273745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
7283745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark      /* If we are clamping any coords, we must lower projector first
7293745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark       * as clamping happens *after* projection:
7303745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark       */
7311417f6a216b46dbbaa1bfe0cef97e2b4a48224c0Jason Ekstrand      if (lower_txp || sat_mask) {
732faf5f174ddbc7680f6947ceababb94fdb552bcdbRob Clark         project_src(b, tex);
733d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott         progress = true;
7341417f6a216b46dbbaa1bfe0cef97e2b4a48224c0Jason Ekstrand      }
735ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
736d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      if ((tex->op == nir_texop_txf && options->lower_txf_offset) ||
737d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand          (tex->sampler_dim == GLSL_SAMPLER_DIM_RECT &&
738d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand           options->lower_rect_offset)) {
739d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand         progress = lower_offset(b, tex) || progress;
740d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand      }
741d9156efc5292b4ac7cea9d12e68882fc7b5da5fdJason Ekstrand
74252ccc6349fe42a8a480d7472c61c8eb069aadb6bRob Clark      if ((tex->sampler_dim == GLSL_SAMPLER_DIM_RECT) && options->lower_rect) {
7431ce8060c25c7f2c7a54159fab6a6974c0ba182a8Rob Clark         lower_rect(b, tex);
744d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott         progress = true;
7451417f6a216b46dbbaa1bfe0cef97e2b4a48224c0Jason Ekstrand      }
7463745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark
747a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      if ((1 << tex->texture_index) & options->lower_y_uv_external) {
748a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg         lower_y_uv_external(b, tex);
749a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg         progress = true;
750a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      }
751a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
752a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      if ((1 << tex->texture_index) & options->lower_y_u_v_external) {
753a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg         lower_y_u_v_external(b, tex);
754a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg         progress = true;
755a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      }
756a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
757a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      if ((1 << tex->texture_index) & options->lower_yx_xuxv_external) {
758a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg         lower_yx_xuxv_external(b, tex);
759a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg         progress = true;
760a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg      }
761a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
762a41b57679fd659dda1b6df3286b34c13cac7811aKristian Høgsberg
7631417f6a216b46dbbaa1bfe0cef97e2b4a48224c0Jason Ekstrand      if (sat_mask) {
7643745c38425b3e1da5c94a5f900eb5fdc44da9439Rob Clark         saturate_src(b, tex, sat_mask);
765d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott         progress = true;
7661417f6a216b46dbbaa1bfe0cef97e2b4a48224c0Jason Ekstrand      }
7678537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand
76852ccc6349fe42a8a480d7472c61c8eb069aadb6bRob Clark      if (((1 << tex->texture_index) & options->swizzle_result) &&
7698537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand          !nir_tex_instr_is_query(tex) &&
7708537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand          !(tex->is_shadow && tex->is_new_style_shadow)) {
77152ccc6349fe42a8a480d7472c61c8eb069aadb6bRob Clark         swizzle_result(b, tex, options->swizzles[tex->texture_index]);
772d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott         progress = true;
7738537b4ab762ec4249acf23164e0e5a943d2d05afJason Ekstrand      }
774eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark
775eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark      /* should be after swizzle so we know which channels are rgb: */
776eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark      if (((1 << tex->texture_index) & options->lower_srgb) &&
777eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark          !nir_tex_instr_is_query(tex) && !tex->is_shadow) {
778eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark         linearize_srgb_result(b, tex);
779d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott         progress = true;
780eddfc977096c63dc9699b63b05ad0e1212680fb1Rob Clark      }
781a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga
782da3389a331b07d3e58aa9ad8df6864cc04f877e4Iago Toral Quiroga      if (tex->op == nir_texop_txd &&
783da3389a331b07d3e58aa9ad8df6864cc04f877e4Iago Toral Quiroga          tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE &&
784da3389a331b07d3e58aa9ad8df6864cc04f877e4Iago Toral Quiroga          (options->lower_txd_cube_map ||
785da3389a331b07d3e58aa9ad8df6864cc04f877e4Iago Toral Quiroga           (tex->is_shadow && options->lower_txd_shadow))) {
786a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga         lower_gradient_cube_map(b, tex);
787a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga         progress = true;
788a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga         continue;
789a8e740c3547b0209d04b505d95a79794db31ce0bIago Toral Quiroga      }
7905be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga
7915be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      if (tex->op == nir_texop_txd && options->lower_txd_shadow &&
7925be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga          tex->is_shadow && tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE) {
7935be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga         lower_gradient_shadow(b, tex);
7945be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga         progress = true;
7955be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga         continue;
7965be2e785b1df2160424eb73e53cca340e0130020Iago Toral Quiroga      }
797ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt   }
798ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
799d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   return progress;
800ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt}
801ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
802d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbottstatic bool
803d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbottnir_lower_tex_impl(nir_function_impl *impl,
804d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott                   const nir_lower_tex_options *options)
805ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt{
806d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   bool progress = false;
807d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   nir_builder builder;
808d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   nir_builder_init(&builder, impl);
809ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
810d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   nir_foreach_block(block, impl) {
811d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott      progress |= nir_lower_tex_block(block, &builder, options);
812d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   }
813ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
814ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt   nir_metadata_preserve(impl, nir_metadata_block_index |
815ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt                               nir_metadata_dominance);
816d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   return progress;
817ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt}
818ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt
8191417f6a216b46dbbaa1bfe0cef97e2b4a48224c0Jason Ekstrandbool
820faf5f174ddbc7680f6947ceababb94fdb552bcdbRob Clarknir_lower_tex(nir_shader *shader, const nir_lower_tex_options *options)
821ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt{
822d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   bool progress = false;
8231417f6a216b46dbbaa1bfe0cef97e2b4a48224c0Jason Ekstrand
8249464d8c49813aba77285e7465b96e92a91ed327cJason Ekstrand   nir_foreach_function(function, shader) {
825237f2f2d8b45d9d956102eec6f9be63193e5269bJason Ekstrand      if (function->impl)
826d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott         progress |= nir_lower_tex_impl(function->impl, options);
827ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt   }
8281417f6a216b46dbbaa1bfe0cef97e2b4a48224c0Jason Ekstrand
829d40fbbc27ecd9a7c1d8ed0ebcb43b4dfcd2d3df7Connor Abbott   return progress;
830ea811b7868d4039499dddf53c109cf0b9da98967Eric Anholt}
831