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