Lines Matching refs:tex
100 project_src(nir_builder *b, nir_tex_instr *tex)
103 int proj_index = nir_tex_instr_src_index(tex, nir_tex_src_projector);
107 b->cursor = nir_before_instr(&tex->instr);
110 nir_frcp(b, nir_ssa_for_src(b, tex->src[proj_index].src, 1));
113 for (unsigned i = 0; i < tex->num_srcs; i++) {
114 switch (tex->src[i].src_type) {
122 nir_ssa_for_src(b, tex->src[i].src, nir_tex_instr_src_size(tex, i));
128 if (tex->is_array && tex->src[i].src_type == nir_tex_src_coord) {
129 switch (tex->coord_components) {
154 nir_instr_rewrite_src(&tex->instr,
155 &tex->src[i].src,
159 nir_tex_instr_remove_src(tex, proj_index);
164 lower_offset(nir_builder *b, nir_tex_instr *tex)
166 int offset_index = nir_tex_instr_src_index(tex, nir_tex_src_offset);
170 int coord_index = nir_tex_instr_src_index(tex, nir_tex_src_coord);
173 assert(tex->src[offset_index].src.is_ssa);
174 assert(tex->src[coord_index].src.is_ssa);
175 nir_ssa_def *offset = tex->src[offset_index].src.ssa;
176 nir_ssa_def *coord = tex->src[coord_index].src.ssa;
178 b->cursor = nir_before_instr(&tex->instr);
181 if (nir_tex_instr_src_type(tex, coord_index) == nir_type_float) {
182 if (tex->sampler_dim == GLSL_SAMPLER_DIM_RECT) {
185 nir_ssa_def *txs = nir_i2f32(b, nir_get_texture_size(b, tex));
197 if (tex->is_array) {
199 if (tex->coord_components == 2) {
202 } else if (tex->coord_components == 3) {
211 nir_instr_rewrite_src(&tex->instr, &tex->src[coord_index].src,
214 nir_tex_instr_remove_src(tex, offset_index);
220 lower_rect(nir_builder *b, nir_tex_instr *tex)
225 tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
227 nir_ssa_def *txs = nir_i2f32(b, nir_get_texture_size(b, tex));
229 int coord_index = nir_tex_instr_src_index(tex, nir_tex_src_coord);
233 nir_ssa_for_src(b, tex->src[coord_index].src, tex->coord_components);
234 nir_instr_rewrite_src(&tex->instr,
235 &tex->src[coord_index].src,
241 lower_rect_tex_scale(nir_builder *b, nir_tex_instr *tex)
243 b->cursor = nir_before_instr(&tex->instr);
245 nir_ssa_def *idx = nir_imm_int(b, tex->texture_index);
247 int coord_index = nir_tex_instr_src_index(tex, nir_tex_src_coord);
251 nir_ssa_for_src(b, tex->src[coord_index].src, tex->coord_components);
252 nir_instr_rewrite_src(&tex->instr,
253 &tex->src[coord_index].src,
259 lower_lod(nir_builder *b, nir_tex_instr *tex, nir_ssa_def *lod)
261 assert(tex->op == nir_texop_tex || tex->op == nir_texop_txb);
262 assert(nir_tex_instr_src_index(tex, nir_tex_src_lod) < 0);
263 assert(nir_tex_instr_src_index(tex, nir_tex_src_ddx) < 0);
264 assert(nir_tex_instr_src_index(tex, nir_tex_src_ddy) < 0);
266 int bias_idx = nir_tex_instr_src_index(tex, nir_tex_src_bias);
269 lod = nir_fadd(b, lod, nir_ssa_for_src(b, tex->src[bias_idx].src, 1));
270 nir_tex_instr_remove_src(tex, bias_idx);
273 int min_lod_idx = nir_tex_instr_src_index(tex, nir_tex_src_min_lod);
276 lod = nir_fmax(b, lod, nir_ssa_for_src(b, tex->src[min_lod_idx].src, 1));
277 nir_tex_instr_remove_src(tex, min_lod_idx);
280 nir_tex_instr_add_src(tex, nir_tex_src_lod, nir_src_for_ssa(lod));
281 tex->op = nir_texop_txl;
285 lower_implicit_lod(nir_builder *b, nir_tex_instr *tex)
287 b->cursor = nir_before_instr(&tex->instr);
288 lower_lod(b, tex, nir_get_texture_lod(b, tex));
292 lower_zero_lod(nir_builder *b, nir_tex_instr *tex)
294 b->cursor = nir_before_instr(&tex->instr);
296 if (tex->op == nir_texop_lod) {
297 nir_ssa_def_rewrite_uses(&tex->dest.ssa, nir_imm_int(b, 0));
298 nir_instr_remove(&tex->instr);
302 lower_lod(b, tex, nir_imm_int(b, 0));
306 sample_plane(nir_builder *b, nir_tex_instr *tex, int plane,
309 assert(tex->dest.is_ssa);
310 assert(nir_tex_instr_dest_size(tex) == 4);
311 assert(nir_alu_type_get_base_type(tex->dest_type) == nir_type_float);
312 assert(tex->op == nir_texop_tex);
313 assert(tex->coord_components == 2);
316 nir_tex_instr_create(b->shader, tex->num_srcs + 1);
317 for (unsigned i = 0; i < tex->num_srcs; i++) {
318 nir_src_copy(&plane_tex->src[i].src, &tex->src[i].src);
319 plane_tex->src[i].src_type = tex->src[i].src_type;
321 plane_tex->src[tex->num_srcs].src = nir_src_for_ssa(nir_imm_int(b, plane));
322 plane_tex->src[tex->num_srcs].src_type = nir_tex_src_plane;
325 plane_tex->dest_type = nir_type_float | nir_dest_bit_size(tex->dest);
328 plane_tex->texture_index = tex->texture_index;
329 plane_tex->sampler_index = tex->sampler_index;
332 nir_dest_bit_size(tex->dest), NULL);
337 if (options->scale_factors[tex->texture_index])
339 options->scale_factors[tex->texture_index]);
345 convert_yuv_to_rgb(nir_builder *b, nir_tex_instr *tex,
379 unsigned bit_size = nir_dest_bit_size(tex->dest);
397 nir_ssa_def_rewrite_uses(&tex->dest.ssa, result);
401 lower_y_uv_external(nir_builder *b, nir_tex_instr *tex,
405 b->cursor = nir_after_instr(&tex->instr);
407 nir_ssa_def *y = sample_plane(b, tex, 0, options);
408 nir_ssa_def *uv = sample_plane(b, tex, 1, options);
410 convert_yuv_to_rgb(b, tex,
420 lower_y_u_v_external(nir_builder *b, nir_tex_instr *tex,
424 b->cursor = nir_after_instr(&tex->instr);
426 nir_ssa_def *y = sample_plane(b, tex, 0, options);
427 nir_ssa_def *u = sample_plane(b, tex, 1, options);
428 nir_ssa_def *v = sample_plane(b, tex, 2, options);
430 convert_yuv_to_rgb(b, tex,
440 lower_yx_xuxv_external(nir_builder *b, nir_tex_instr *tex,
444 b->cursor = nir_after_instr(&tex->instr);
446 nir_ssa_def *y = sample_plane(b, tex, 0, options);
447 nir_ssa_def *xuxv = sample_plane(b, tex, 1, options);
449 convert_yuv_to_rgb(b, tex,
459 lower_xy_uxvx_external(nir_builder *b, nir_tex_instr *tex,
463 b->cursor = nir_after_instr(&tex->instr);
465 nir_ssa_def *y = sample_plane(b, tex, 0, options);
466 nir_ssa_def *uxvx = sample_plane(b, tex, 1, options);
468 convert_yuv_to_rgb(b, tex,
478 lower_ayuv_external(nir_builder *b, nir_tex_instr *tex,
482 b->cursor = nir_after_instr(&tex->instr);
484 nir_ssa_def *ayuv = sample_plane(b, tex, 0, options);
486 convert_yuv_to_rgb(b, tex,
496 lower_y41x_external(nir_builder *b, nir_tex_instr *tex,
500 b->cursor = nir_after_instr(&tex->instr);
502 nir_ssa_def *y41x = sample_plane(b, tex, 0, options);
504 convert_yuv_to_rgb(b, tex,
514 lower_xyuv_external(nir_builder *b, nir_tex_instr *tex,
518 b->cursor = nir_after_instr(&tex->instr);
520 nir_ssa_def *xyuv = sample_plane(b, tex, 0, options);
522 convert_yuv_to_rgb(b, tex,
532 lower_yuv_external(nir_builder *b, nir_tex_instr *tex,
536 b->cursor = nir_after_instr(&tex->instr);
538 nir_ssa_def *yuv = sample_plane(b, tex, 0, options);
540 convert_yuv_to_rgb(b, tex,
550 lower_yu_yv_external(nir_builder *b, nir_tex_instr *tex,
554 b->cursor = nir_after_instr(&tex->instr);
556 nir_ssa_def *yuv = sample_plane(b, tex, 0, options);
558 convert_yuv_to_rgb(b, tex,
572 replace_gradient_with_lod(nir_builder *b, nir_ssa_def *lod, nir_tex_instr *tex)
574 assert(tex->op == nir_texop_txd);
576 nir_tex_instr_remove_src(tex, nir_tex_instr_src_index(tex, nir_tex_src_ddx));
577 nir_tex_instr_remove_src(tex, nir_tex_instr_src_index(tex, nir_tex_src_ddy));
579 int min_lod_idx = nir_tex_instr_src_index(tex, nir_tex_src_min_lod);
582 lod = nir_fmax(b, lod, nir_ssa_for_src(b, tex->src[min_lod_idx].src, 1));
583 nir_tex_instr_remove_src(tex, min_lod_idx);
586 nir_tex_instr_add_src(tex, nir_tex_src_lod, nir_src_for_ssa(lod));
587 tex->op = nir_texop_txl;
591 lower_gradient_cube_map(nir_builder *b, nir_tex_instr *tex)
593 assert(tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE);
594 assert(tex->op == nir_texop_txd);
595 assert(tex->dest.is_ssa);
598 nir_ssa_def *size = nir_i2f32(b, nir_get_texture_size(b, tex));
658 tex->src[nir_tex_instr_src_index(tex, nir_tex_src_coord)].src.ssa;
662 tex->src[nir_tex_instr_src_index(tex, nir_tex_src_ddx)].src.ssa;
664 tex->src[nir_tex_instr_src_index(tex, nir_tex_src_ddy)].src.ssa;
734 replace_gradient_with_lod(b, lod, tex);
738 lower_gradient(nir_builder *b, nir_tex_instr *tex)
741 if (tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE) {
742 lower_gradient_cube_map(b, tex);
746 assert(tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE);
747 assert(tex->op == nir_texop_txd);
748 assert(tex->dest.is_ssa);
752 switch (tex->sampler_dim) {
765 nir_channels(b, nir_i2f32(b, nir_get_texture_size(b, tex)),
773 tex->src[nir_tex_instr_src_index(tex, nir_tex_src_ddx)].src.ssa;
775 tex->src[nir_tex_instr_src_index(tex, nir_tex_src_ddy)].src.ssa;
793 replace_gradient_with_lod(b, lod, tex);
796 /* tex(s, coord) = txd(s, coord, dfdx(coord), dfdy(coord)) */
798 lower_tex_to_txd(nir_builder *b, nir_tex_instr *tex)
800 b->cursor = nir_after_instr(&tex->instr);
801 nir_tex_instr *txd = nir_tex_instr_create(b->shader, tex->num_srcs + 2);
804 txd->sampler_dim = tex->sampler_dim;
805 txd->dest_type = tex->dest_type;
806 txd->coord_components = tex->coord_components;
807 txd->texture_index = tex->texture_index;
808 txd->sampler_index = tex->sampler_index;
809 txd->is_array = tex->is_array;
810 txd->is_shadow = tex->is_shadow;
811 txd->is_new_style_shadow = tex->is_new_style_shadow;
814 for (unsigned i = 0; i < tex->num_srcs; i++) {
815 nir_src_copy(&txd->src[i].src, &tex->src[i].src);
816 txd->src[i].src_type = tex->src[i].src_type;
818 int coord = nir_tex_instr_src_index(tex, nir_tex_src_coord);
820 nir_ssa_def *dfdx = nir_fddx(b, tex->src[coord].src.ssa);
821 nir_ssa_def *dfdy = nir_fddy(b, tex->src[coord].src.ssa);
822 txd->src[tex->num_srcs].src = nir_src_for_ssa(dfdx);
823 txd->src[tex->num_srcs].src_type = nir_tex_src_ddx;
824 txd->src[tex->num_srcs + 1].src = nir_src_for_ssa(dfdy);
825 txd->src[tex->num_srcs + 1].src_type = nir_tex_src_ddy;
827 nir_ssa_dest_init(&txd->instr, &txd->dest, nir_dest_num_components(tex->dest),
828 nir_dest_bit_size(tex->dest), NULL);
830 nir_ssa_def_rewrite_uses(&tex->dest.ssa, &txd->dest.ssa);
831 nir_instr_remove(&tex->instr);
837 lower_txb_to_txl(nir_builder *b, nir_tex_instr *tex)
839 b->cursor = nir_after_instr(&tex->instr);
840 nir_tex_instr *txl = nir_tex_instr_create(b->shader, tex->num_srcs);
843 txl->sampler_dim = tex->sampler_dim;
844 txl->dest_type = tex->dest_type;
845 txl->coord_components = tex->coord_components;
846 txl->texture_index = tex->texture_index;
847 txl->sampler_index = tex->sampler_index;
848 txl->is_array = tex->is_array;
849 txl->is_shadow = tex->is_shadow;
850 txl->is_new_style_shadow = tex->is_new_style_shadow;
854 if (tex->src[i].src_type != nir_tex_src_bias) {
855 nir_src_copy(&txl->src[i].src, &tex->src[i].src);
856 txl->src[i].src_type = tex->src[i].src_type;
861 int bias_idx = nir_tex_instr_src_index(tex, nir_tex_src_bias);
863 lod = nir_fadd(b, nir_channel(b, lod, 1), nir_ssa_for_src(b, tex->src[bias_idx].src, 1));
864 txl->src[tex->num_srcs - 1].src = nir_src_for_ssa(lod);
865 txl->src[tex->num_srcs - 1].src_type = nir_tex_src_lod;
867 nir_ssa_dest_init(&txl->instr, &txl->dest, nir_dest_num_components(tex->dest),
868 nir_dest_bit_size(tex->dest), NULL);
870 nir_ssa_def_rewrite_uses(&tex->dest.ssa, &txl->dest.ssa);
871 nir_instr_remove(&tex->instr);
876 saturate_src(nir_builder *b, nir_tex_instr *tex, unsigned sat_mask)
878 if (tex->op == nir_texop_tex)
879 tex = lower_tex_to_txd(b, tex);
880 else if (tex->op == nir_texop_txb)
881 tex = lower_txb_to_txl(b, tex);
883 b->cursor = nir_before_instr(&tex->instr);
884 int coord_index = nir_tex_instr_src_index(tex, nir_tex_src_coord);
888 nir_ssa_for_src(b, tex->src[coord_index].src, tex->coord_components);
893 assume(tex->coord_components >= 1);
895 for (unsigned j = 0; j < tex->coord_components; j++)
899 unsigned ncomp = tex->coord_components;
900 if (tex->is_array)
905 if (tex->sampler_dim == GLSL_SAMPLER_DIM_RECT) {
909 nir_ssa_def *txs = nir_i2f32(b, nir_get_texture_size(b, tex));
919 src = nir_vec(b, comp, tex->coord_components);
921 nir_instr_rewrite_src(&tex->instr,
922 &tex->src[coord_index].src,
925 return tex;
949 swizzle_tg4_broadcom(nir_builder *b, nir_tex_instr *tex)
951 assert(tex->dest.is_ssa);
953 b->cursor = nir_after_instr(&tex->instr);
955 assert(nir_tex_instr_dest_size(tex) == 4);
957 nir_ssa_def *swizzled = nir_swizzle(b, &tex->dest.ssa, swiz, 4);
959 nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, swizzled,
964 swizzle_result(nir_builder *b, nir_tex_instr *tex, const uint8_t swizzle[4])
966 assert(tex->dest.is_ssa);
968 b->cursor = nir_after_instr(&tex->instr);
971 if (tex->op == nir_texop_tg4) {
972 if (swizzle[tex->component] < 4) {
974 tex->component = swizzle[tex->component];
977 swizzled = get_zero_or_one(b, tex->dest_type, swizzle[tex->component]);
980 assert(nir_tex_instr_dest_size(tex) == 4);
985 swizzled = nir_swizzle(b, &tex->dest.ssa, swiz, 4);
990 srcs[i] = nir_get_ssa_scalar(&tex->dest.ssa, swizzle[i]);
992 srcs[i] = nir_get_ssa_scalar(get_zero_or_one(b, tex->dest_type, swizzle[i]), 0);
999 nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, swizzled,
1004 linearize_srgb_result(nir_builder *b, nir_tex_instr *tex)
1006 assert(tex->dest.is_ssa);
1007 assert(nir_tex_instr_dest_size(tex) == 4);
1008 assert(nir_alu_type_get_base_type(tex->dest_type) == nir_type_float);
1010 b->cursor = nir_after_instr(&tex->instr);
1013 nir_format_srgb_to_linear(b, nir_channels(b, &tex->dest.ssa, 0x7));
1020 nir_channel(b, &tex->dest.ssa, 3));
1022 nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, result,
1036 lower_tex_packing(nir_builder *b, nir_tex_instr *tex,
1039 nir_ssa_def *color = &tex->dest.ssa;
1041 b->cursor = nir_after_instr(&tex->instr);
1043 switch (options->lower_tex_packing[tex->sampler_index]) {
1050 switch (nir_alu_type_get_base_type(tex->dest_type)) {
1052 switch (nir_tex_instr_dest_size(tex)) {
1054 assert(tex->is_shadow && tex->is_new_style_shadow);
1094 assert(nir_alu_type_get_base_type(tex->dest_type) == nir_type_float);
1099 nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, color,
1104 lower_array_layer_round_even(nir_builder *b, nir_tex_instr *tex)
1106 int coord_index = nir_tex_instr_src_index(tex, nir_tex_src_coord);
1107 if (coord_index < 0 || nir_tex_instr_src_type(tex, coord_index) != nir_type_float)
1110 assert(tex->src[coord_index].src.is_ssa);
1111 nir_ssa_def *coord = tex->src[coord_index].src.ssa;
1113 b->cursor = nir_before_instr(&tex->instr);
1115 unsigned layer = tex->coord_components - 1;
1119 nir_instr_rewrite_src_ssa(&tex->instr, &tex->src[coord_index].src, new_coord);
1125 sampler_index_lt(nir_tex_instr *tex, unsigned max)
1127 assert(nir_tex_instr_src_index(tex, nir_tex_src_sampler_deref) == -1);
1129 unsigned sampler_index = tex->sampler_index;
1132 nir_tex_instr_src_index(tex, nir_tex_src_sampler_offset);
1134 if (!nir_src_is_const(tex->src[sampler_offset_idx].src))
1137 sampler_index += nir_src_as_uint(tex->src[sampler_offset_idx].src);
1144 lower_tg4_offsets(nir_builder *b, nir_tex_instr *tex)
1146 assert(tex->op == nir_texop_tg4);
1147 assert(nir_tex_instr_has_explicit_tg4_offsets(tex));
1148 assert(nir_tex_instr_src_index(tex, nir_tex_src_offset) == -1);
1150 b->cursor = nir_after_instr(&tex->instr);
1155 nir_tex_instr *tex_copy = nir_tex_instr_create(b->shader, tex->num_srcs + 1);
1156 tex_copy->op = tex->op;
1157 tex_copy->coord_components = tex->coord_components;
1158 tex_copy->sampler_dim = tex->sampler_dim;
1159 tex_copy->is_array = tex->is_array;
1160 tex_copy->is_shadow = tex->is_shadow;
1161 tex_copy->is_new_style_shadow = tex->is_new_style_shadow;
1162 tex_copy->is_sparse = tex->is_sparse;
1163 tex_copy->component = tex->component;
1164 tex_copy->dest_type = tex->dest_type;
1166 for (unsigned j = 0; j < tex->num_srcs; ++j) {
1167 nir_src_copy(&tex_copy->src[j].src, &tex->src[j].src);
1168 tex_copy->src[j].src_type = tex->src[j].src_type;
1172 src.src = nir_src_for_ssa(nir_imm_ivec2(b, tex->tg4_offsets[i][0],
1173 tex->tg4_offsets[i][1]));
1178 nir_tex_instr_dest_size(tex), 32, NULL);
1183 if (tex->is_sparse) {
1193 nir_ssa_def *res = nir_vec_scalars(b, dest, tex->dest.ssa.num_components);
1194 nir_ssa_def_rewrite_uses(&tex->dest.ssa, res);
1195 nir_instr_remove(&tex->instr);
1201 nir_lower_txs_lod(nir_builder *b, nir_tex_instr *tex)
1203 int lod_idx = nir_tex_instr_src_index(tex, nir_tex_src_lod);
1205 (nir_src_is_const(tex->src[lod_idx].src) &&
1206 nir_src_as_int(tex->src[lod_idx].src) == 0))
1209 unsigned dest_size = nir_tex_instr_dest_size(tex);
1211 b->cursor = nir_before_instr(&tex->instr);
1212 nir_ssa_def *lod = nir_ssa_for_src(b, tex->src[lod_idx].src, 1);
1215 nir_instr_rewrite_src(&tex->instr, &tex->src[lod_idx].src,
1222 b->cursor = nir_after_instr(&tex->instr);
1223 nir_ssa_def *minified = nir_imin(b, &tex->dest.ssa,
1224 nir_imax(b, nir_ushr(b, &tex->dest.ssa, lod),
1230 if (tex->is_array) {
1237 comp[dest_size - 1] = nir_channel(b, &tex->dest.ssa, dest_size - 1);
1241 nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, minified,
1247 nir_lower_txs_cube_array(nir_builder *b, nir_tex_instr *tex)
1249 assert(tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE && tex->is_array);
1250 tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
1252 b->cursor = nir_after_instr(&tex->instr);
1254 assert(tex->dest.is_ssa);
1255 assert(tex->dest.ssa.num_components == 3);
1256 nir_ssa_def *size = &tex->dest.ssa;
1262 nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, size, size->parent_instr);
1266 nir_lower_ms_txf_to_fragment_fetch(nir_builder *b, nir_tex_instr *tex)
1268 lower_offset(b, tex);
1270 b->cursor = nir_before_instr(&tex->instr);
1273 assert(tex->texture_index == 0);
1274 nir_tex_instr *fmask_fetch = nir_tex_instr_create(b->shader, tex->num_srcs - 1);
1276 fmask_fetch->coord_components = tex->coord_components;
1277 fmask_fetch->sampler_dim = tex->sampler_dim;
1278 fmask_fetch->is_array = tex->is_array;
1279 fmask_fetch->texture_non_uniform = tex->texture_non_uniform;
1284 for (unsigned i = 0; i < tex->num_srcs; i++) {
1285 if (tex->src[i].src_type == nir_tex_src_ms_index)
1288 src->src = nir_src_for_ssa(tex->src[i].src.ssa);
1289 src->src_type = tex->src[i].src_type;
1295 int ms_index = nir_tex_instr_src_index(tex, nir_tex_src_ms_index);
1297 nir_src sample = tex->src[ms_index].src;
1310 tex->op = nir_texop_fragment_fetch_amd;
1311 nir_instr_rewrite_src_ssa(&tex->instr, &tex->src[ms_index].src, new_sample);
1315 nir_lower_samples_identical_to_fragment_fetch(nir_builder *b, nir_tex_instr *tex)
1317 b->cursor = nir_after_instr(&tex->instr);
1319 nir_tex_instr *fmask_fetch = nir_instr_as_tex(nir_instr_clone(b->shader, &tex->instr));
1325 nir_ssa_def_rewrite_uses(&tex->dest.ssa, nir_ieq_imm(b, &fmask_fetch->dest.ssa, 0));
1326 nir_instr_remove_v(&tex->instr);
1330 nir_lower_lod_zero_width(nir_builder *b, nir_tex_instr *tex)
1332 int coord_index = nir_tex_instr_src_index(tex, nir_tex_src_coord);
1335 b->cursor = nir_after_instr(&tex->instr);
1338 for (unsigned i = 0; i < tex->coord_components; i++) {
1339 nir_ssa_def *coord = nir_channel(b, tex->src[coord_index].src.ssa, i);
1353 nir_channel(b, &tex->dest.ssa, 1));
1356 nir_vec2(b, nir_channel(b, &tex->dest.ssa, 0), adjusted_lod);
1358 nir_ssa_def_rewrite_uses_after(&tex->dest.ssa, def, def->parent_instr);
1372 nir_tex_instr *tex = nir_instr_as_tex(instr);
1373 bool lower_txp = !!(options->lower_txp & (1 << tex->sampler_dim));
1378 if ((1 << tex->sampler_index) & options->saturate_r)
1380 if ((1 << tex->sampler_index) & options->saturate_t)
1382 if ((1 << tex->sampler_index) & options->saturate_s)
1389 (options->lower_txp_array && tex->is_array)) {
1390 progress |= project_src(b, tex);
1393 if ((tex->op == nir_texop_txf && options->lower_txf_offset) ||
1394 (sat_mask && nir_tex_instr_src_index(tex, nir_tex_src_coord) >= 0) ||
1395 (tex->sampler_dim == GLSL_SAMPLER_DIM_RECT &&
1399 progress = lower_offset(b, tex) || progress;
1402 if ((tex->sampler_dim == GLSL_SAMPLER_DIM_RECT) && options->lower_rect &&
1403 tex->op != nir_texop_txf) {
1404 if (nir_tex_instr_is_query(tex))
1405 tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
1407 lower_rect(b, tex);
1409 lower_rect_tex_scale(b, tex);
1414 unsigned texture_index = tex->texture_index;
1416 int tex_index = nir_tex_instr_src_index(tex, nir_tex_src_texture_deref);
1418 nir_deref_instr *deref = nir_src_as_deref(tex->src[tex_index].src);
1425 lower_y_uv_external(b, tex, options, texture_index);
1430 lower_y_u_v_external(b, tex, options, texture_index);
1435 lower_yx_xuxv_external(b, tex, options, texture_index);
1440 lower_xy_uxvx_external(b, tex, options, texture_index);
1445 lower_ayuv_external(b, tex, options, texture_index);
1450 lower_xyuv_external(b, tex, options, texture_index);
1455 lower_yuv_external(b, tex, options, texture_index);
1459 if ((1 << tex->texture_index) & options->lower_yu_yv_external) {
1460 lower_yu_yv_external(b, tex, options, texture_index);
1464 if ((1 << tex->texture_index) & options->lower_y41x_external) {
1465 lower_y41x_external(b, tex, options, texture_index);
1470 tex = saturate_src(b, tex, sat_mask);
1474 if (tex->op == nir_texop_tg4 && options->lower_tg4_broadcom_swizzle) {
1475 swizzle_tg4_broadcom(b, tex);
1480 !nir_tex_instr_is_query(tex) &&
1481 !(tex->is_shadow && tex->is_new_style_shadow)) {
1482 swizzle_result(b, tex, options->swizzles[tex->texture_index]);
1488 !nir_tex_instr_is_query(tex) && !tex->is_shadow) {
1489 linearize_srgb_result(b, tex);
1494 nir_tex_instr_src_index(tex, nir_tex_src_min_lod) >= 0;
1496 nir_tex_instr_src_index(tex, nir_tex_src_offset) >= 0;
1498 if (tex->op == nir_texop_txb && tex->is_shadow && has_min_lod &&
1500 lower_implicit_lod(b, tex);
1504 if (options->lower_tex_packing[tex->sampler_index] !=
1506 tex->op != nir_texop_txs &&
1507 tex->op != nir_texop_query_levels &&
1508 tex->op != nir_texop_texture_samples) {
1509 lower_tex_packing(b, tex, options);
1513 if (options->lower_array_layer_round_even && tex->is_array &&
1514 tex->op != nir_texop_lod) {
1515 progress |= lower_array_layer_round_even(b, tex);
1518 if (tex->op == nir_texop_txd &&
1520 (options->lower_txd_shadow && tex->is_shadow) ||
1521 (options->lower_txd_shadow_clamp && tex->is_shadow && has_min_lod) ||
1524 nir_tex_instr_src_index(tex, nir_tex_src_sampler_handle) != -1) ||
1526 has_min_lod && !sampler_index_lt(tex, 16)) ||
1528 tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE) ||
1530 tex->sampler_dim == GLSL_SAMPLER_DIM_3D) ||
1531 (options->lower_txd_array && tex->is_array))) {
1532 lower_gradient(b, tex);
1540 if ((nir_tex_instr_src_index(tex, nir_tex_src_lod) == -1) &&
1541 (tex->op == nir_texop_txf || tex->op == nir_texop_txs ||
1542 tex->op == nir_texop_txl || tex->op == nir_texop_query_levels)) {
1543 b->cursor = nir_before_instr(&tex->instr);
1544 nir_tex_instr_add_src(tex, nir_tex_src_lod, nir_src_for_ssa(nir_imm_int(b, 0)));
1555 nir_tex_instr_has_implicit_derivative(tex) &&
1556 tex->sampler_dim != GLSL_SAMPLER_DIM_RECT &&
1558 lower_zero_lod(b, tex);
1562 if (options->lower_txs_lod && tex->op == nir_texop_txs) {
1563 progress |= nir_lower_txs_lod(b, tex);
1567 if (options->lower_txs_cube_array && tex->op == nir_texop_txs &&
1568 tex->sampler_dim == GLSL_SAMPLER_DIM_CUBE && tex->is_array) {
1569 nir_lower_txs_cube_array(b, tex);
1577 if (tex->op == nir_texop_tg4 &&
1578 nir_tex_instr_has_explicit_tg4_offsets(tex) &&
1580 progress |= lower_tg4_offsets(b, tex);
1584 if (options->lower_to_fragment_fetch_amd && tex->op == nir_texop_txf_ms) {
1585 nir_lower_ms_txf_to_fragment_fetch(b, tex);
1590 if (options->lower_to_fragment_fetch_amd && tex->op == nir_texop_samples_identical) {
1591 nir_lower_samples_identical_to_fragment_fetch(b, tex);
1596 if (options->lower_lod_zero_width && tex->op == nir_texop_lod) {
1597 nir_lower_lod_zero_width(b, tex);