radv: Use deref instructions for tex derefs in meta shaders.
authorBas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Sun, 25 Mar 2018 11:10:07 +0000 (13:10 +0200)
committerJason Ekstrand <jason.ekstrand@intel.com>
Sat, 23 Jun 2018 03:54:00 +0000 (20:54 -0700)
Acked-by: Rob Clark <robdclark@gmail.com>
Acked-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Acked-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/amd/vulkan/radv_meta.c
src/amd/vulkan/radv_meta_blit.c
src/amd/vulkan/radv_meta_blit2d.c
src/amd/vulkan/radv_meta_bufimage.c
src/amd/vulkan/radv_meta_fast_clear.c

index 56b72d1c99ba32131c7fbbb41a0d46cbdc0150cb..00a20d155e72d20209a3dbcf7439f2f6e0c40636 100644 (file)
@@ -515,18 +515,20 @@ void radv_meta_build_resolve_shader_core(nir_builder *b,
        nir_ssa_def *tmp;
        nir_if *outer_if = NULL;
 
-       nir_tex_instr *tex = nir_tex_instr_create(b->shader, 2);
+       nir_ssa_def *input_img_deref = &nir_build_deref_var(b, input_img)->dest.ssa;
+
+       nir_tex_instr *tex = nir_tex_instr_create(b->shader, 3);
        tex->sampler_dim = GLSL_SAMPLER_DIM_MS;
        tex->op = nir_texop_txf_ms;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(img_coord);
        tex->src[1].src_type = nir_tex_src_ms_index;
        tex->src[1].src = nir_src_for_ssa(nir_imm_int(b, 0));
+       tex->src[2].src_type = nir_tex_src_texture_deref;
+       tex->src[2].src = nir_src_for_ssa(input_img_deref);
        tex->dest_type = nir_type_float;
        tex->is_array = false;
        tex->coord_components = 2;
-       tex->texture = nir_deref_var_create(tex, input_img);
-       tex->sampler = NULL;
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(b, &tex->instr);
@@ -534,16 +536,16 @@ void radv_meta_build_resolve_shader_core(nir_builder *b,
        tmp = &tex->dest.ssa;
 
        if (!is_integer && samples > 1) {
-               nir_tex_instr *tex_all_same = nir_tex_instr_create(b->shader, 1);
+               nir_tex_instr *tex_all_same = nir_tex_instr_create(b->shader, 2);
                tex_all_same->sampler_dim = GLSL_SAMPLER_DIM_MS;
                tex_all_same->op = nir_texop_samples_identical;
                tex_all_same->src[0].src_type = nir_tex_src_coord;
                tex_all_same->src[0].src = nir_src_for_ssa(img_coord);
+               tex_all_same->src[1].src_type = nir_tex_src_texture_deref;
+               tex_all_same->src[1].src = nir_src_for_ssa(input_img_deref);
                tex_all_same->dest_type = nir_type_float;
                tex_all_same->is_array = false;
                tex_all_same->coord_components = 2;
-               tex_all_same->texture = nir_deref_var_create(tex_all_same, input_img);
-               tex_all_same->sampler = NULL;
 
                nir_ssa_dest_init(&tex_all_same->instr, &tex_all_same->dest, 1, 32, "tex");
                nir_builder_instr_insert(b, &tex_all_same->instr);
@@ -555,18 +557,18 @@ void radv_meta_build_resolve_shader_core(nir_builder *b,
 
                b->cursor = nir_after_cf_list(&if_stmt->then_list);
                for (int i = 1; i < samples; i++) {
-                       nir_tex_instr *tex_add = nir_tex_instr_create(b->shader, 2);
+                       nir_tex_instr *tex_add = nir_tex_instr_create(b->shader, 3);
                        tex_add->sampler_dim = GLSL_SAMPLER_DIM_MS;
                        tex_add->op = nir_texop_txf_ms;
                        tex_add->src[0].src_type = nir_tex_src_coord;
                        tex_add->src[0].src = nir_src_for_ssa(img_coord);
                        tex_add->src[1].src_type = nir_tex_src_ms_index;
                        tex_add->src[1].src = nir_src_for_ssa(nir_imm_int(b, i));
+                       tex_add->src[2].src_type = nir_tex_src_texture_deref;
+                       tex_add->src[2].src = nir_src_for_ssa(input_img_deref);
                        tex_add->dest_type = nir_type_float;
                        tex_add->is_array = false;
                        tex_add->coord_components = 2;
-                       tex_add->texture = nir_deref_var_create(tex_add, input_img);
-                       tex_add->sampler = NULL;
 
                        nir_ssa_dest_init(&tex_add->instr, &tex_add->dest, 4, 32, "tex");
                        nir_builder_instr_insert(b, &tex_add->instr);
index 3ff48498d80871c16588fe1cf85425818a1e4b48..a6ee0cb7e9337925b5e2503ef6c6b1790dbffa95 100644 (file)
@@ -131,16 +131,20 @@ build_nir_copy_fragment_shader(enum glsl_sampler_dim tex_dim)
        sampler->data.descriptor_set = 0;
        sampler->data.binding = 0;
 
-       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 1);
+       nir_ssa_def *tex_deref = &nir_build_deref_var(&b, sampler)->dest.ssa;
+
+       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);
        tex->sampler_dim = tex_dim;
        tex->op = nir_texop_tex;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(tex_pos);
+       tex->src[1].src_type = nir_tex_src_texture_deref;
+       tex->src[1].src = nir_src_for_ssa(tex_deref);
+       tex->src[2].src_type = nir_tex_src_sampler_deref;
+       tex->src[2].src = nir_src_for_ssa(tex_deref);
        tex->dest_type = nir_type_float; /* TODO */
        tex->is_array = glsl_sampler_type_is_array(sampler_type);
        tex->coord_components = tex_pos->num_components;
-       tex->texture = nir_deref_var_create(tex, sampler);
-       tex->sampler = nir_deref_var_create(tex, sampler);
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(&b, &tex->instr);
@@ -185,16 +189,20 @@ build_nir_copy_fragment_shader_depth(enum glsl_sampler_dim tex_dim)
        sampler->data.descriptor_set = 0;
        sampler->data.binding = 0;
 
-       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 1);
+       nir_ssa_def *tex_deref = &nir_build_deref_var(&b, sampler)->dest.ssa;
+
+       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);
        tex->sampler_dim = tex_dim;
        tex->op = nir_texop_tex;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(tex_pos);
+       tex->src[1].src_type = nir_tex_src_texture_deref;
+       tex->src[1].src = nir_src_for_ssa(tex_deref);
+       tex->src[2].src_type = nir_tex_src_sampler_deref;
+       tex->src[2].src = nir_src_for_ssa(tex_deref);
        tex->dest_type = nir_type_float; /* TODO */
        tex->is_array = glsl_sampler_type_is_array(sampler_type);
        tex->coord_components = tex_pos->num_components;
-       tex->texture = nir_deref_var_create(tex, sampler);
-       tex->sampler = nir_deref_var_create(tex, sampler);
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(&b, &tex->instr);
@@ -239,16 +247,20 @@ build_nir_copy_fragment_shader_stencil(enum glsl_sampler_dim tex_dim)
        sampler->data.descriptor_set = 0;
        sampler->data.binding = 0;
 
-       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 1);
+       nir_ssa_def *tex_deref = &nir_build_deref_var(&b, sampler)->dest.ssa;
+
+       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);
        tex->sampler_dim = tex_dim;
        tex->op = nir_texop_tex;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(tex_pos);
+       tex->src[1].src_type = nir_tex_src_texture_deref;
+       tex->src[1].src = nir_src_for_ssa(tex_deref);
+       tex->src[2].src_type = nir_tex_src_sampler_deref;
+       tex->src[2].src = nir_src_for_ssa(tex_deref);
        tex->dest_type = nir_type_float; /* TODO */
        tex->is_array = glsl_sampler_type_is_array(sampler_type);
        tex->coord_components = tex_pos->num_components;
-       tex->texture = nir_deref_var_create(tex, sampler);
-       tex->sampler = nir_deref_var_create(tex, sampler);
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(&b, &tex->instr);
index 4a718c639d015c071468cbd9764779619bea8dba..85e2d4678e95f38553febb7289b9374116d75e2f 100644 (file)
@@ -485,22 +485,25 @@ build_nir_texel_fetch(struct nir_builder *b, struct radv_device *device,
                nir_ssa_dest_init(&sample_idx->instr, &sample_idx->dest, 1, 32, "sample_idx");
                nir_builder_instr_insert(b, &sample_idx->instr);
        }
-       nir_tex_instr *tex = nir_tex_instr_create(b->shader, is_multisampled ? 3 : 2);
+
+       nir_ssa_def *tex_deref = &nir_build_deref_var(b, sampler)->dest.ssa;
+
+       nir_tex_instr *tex = nir_tex_instr_create(b->shader, is_multisampled ? 4 : 3);
        tex->sampler_dim = dim;
        tex->op = is_multisampled ? nir_texop_txf_ms : nir_texop_txf;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(is_3d ? tex_pos_3d : tex_pos);
        tex->src[1].src_type = is_multisampled ? nir_tex_src_ms_index : nir_tex_src_lod;
        tex->src[1].src = nir_src_for_ssa(is_multisampled ? &sample_idx->dest.ssa : nir_imm_int(b, 0));
+       tex->src[2].src_type = nir_tex_src_texture_deref;
+       tex->src[2].src = nir_src_for_ssa(tex_deref);
        if (is_multisampled) {
-               tex->src[2].src_type = nir_tex_src_lod;
-               tex->src[2].src = nir_src_for_ssa(nir_imm_int(b, 0));
+               tex->src[3].src_type = nir_tex_src_lod;
+               tex->src[3].src = nir_src_for_ssa(nir_imm_int(b, 0));
        }
        tex->dest_type = nir_type_uint;
        tex->is_array = false;
        tex->coord_components = is_3d ? 3 : 2;
-       tex->texture = nir_deref_var_create(tex, sampler);
-       tex->sampler = NULL;
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(b, &tex->instr);
@@ -534,16 +537,18 @@ build_nir_buffer_fetch(struct nir_builder *b, struct radv_device *device,
        pos_x = nir_iadd(b, pos_x, pos_y);
        //pos_x = nir_iadd(b, pos_x, nir_imm_int(b, 100000));
 
-       nir_tex_instr *tex = nir_tex_instr_create(b->shader, 1);
+       nir_ssa_def *tex_deref = &nir_build_deref_var(b, sampler)->dest.ssa;
+
+       nir_tex_instr *tex = nir_tex_instr_create(b->shader, 2);
        tex->sampler_dim = GLSL_SAMPLER_DIM_BUF;
        tex->op = nir_texop_txf;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(pos_x);
+       tex->src[1].src_type = nir_tex_src_texture_deref;
+       tex->src[1].src = nir_src_for_ssa(tex_deref);
        tex->dest_type = nir_type_uint;
        tex->is_array = false;
        tex->coord_components = 1;
-       tex->texture = nir_deref_var_create(tex, sampler);
-       tex->sampler = NULL;
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(b, &tex->instr);
index 69e15d32135807c1519b815599890b7509c11399..147d2ea46ef287ff534902a53fc311921ae66a9d 100644 (file)
@@ -88,18 +88,20 @@ build_nir_itob_compute_shader(struct radv_device *dev, bool is_3d)
        nir_builder_instr_insert(&b, &stride->instr);
 
        nir_ssa_def *img_coord = nir_iadd(&b, global_id, &offset->dest.ssa);
-       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 2);
+       nir_ssa_def *input_img_deref = &nir_build_deref_var(&b, input_img)->dest.ssa;
+
+       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);
        tex->sampler_dim = dim;
        tex->op = nir_texop_txf;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(nir_channels(&b, img_coord, is_3d ? 0x7 : 0x3));
        tex->src[1].src_type = nir_tex_src_lod;
        tex->src[1].src = nir_src_for_ssa(nir_imm_int(&b, 0));
+       tex->src[2].src_type = nir_tex_src_texture_deref;
+       tex->src[2].src = nir_src_for_ssa(input_img_deref);
        tex->dest_type = nir_type_float;
        tex->is_array = false;
        tex->coord_components = is_3d ? 3 : 2;
-       tex->texture = nir_deref_var_create(tex, input_img);
-       tex->sampler = NULL;
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(&b, &tex->instr);
@@ -320,19 +322,20 @@ build_nir_btoi_compute_shader(struct radv_device *dev, bool is_3d)
        nir_ssa_def *buf_coord = nir_vec4(&b, tmp, tmp, tmp, tmp);
 
        nir_ssa_def *img_coord = nir_iadd(&b, global_id, &offset->dest.ssa);
+       nir_ssa_def *input_img_deref = &nir_build_deref_var(&b, input_img)->dest.ssa;
 
-       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 2);
+       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);
        tex->sampler_dim = GLSL_SAMPLER_DIM_BUF;
        tex->op = nir_texop_txf;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(nir_channels(&b, buf_coord, 1));
        tex->src[1].src_type = nir_tex_src_lod;
        tex->src[1].src = nir_src_for_ssa(nir_imm_int(&b, 0));
+       tex->src[2].src_type = nir_tex_src_texture_deref;
+       tex->src[2].src = nir_src_for_ssa(input_img_deref);
        tex->dest_type = nir_type_float;
        tex->is_array = false;
        tex->coord_components = 1;
-       tex->texture = nir_deref_var_create(tex, input_img);
-       tex->sampler = NULL;
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(&b, &tex->instr);
@@ -532,21 +535,22 @@ build_nir_itoi_compute_shader(struct radv_device *dev, bool is_3d)
        nir_builder_instr_insert(&b, &dst_offset->instr);
 
        nir_ssa_def *src_coord = nir_iadd(&b, global_id, &src_offset->dest.ssa);
+       nir_ssa_def *input_img_deref = &nir_build_deref_var(&b, input_img)->dest.ssa;
 
        nir_ssa_def *dst_coord = nir_iadd(&b, global_id, &dst_offset->dest.ssa);
 
-       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 2);
+       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);
        tex->sampler_dim = dim;
        tex->op = nir_texop_txf;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(nir_channels(&b, src_coord, is_3d ? 0x7 : 0x3));
        tex->src[1].src_type = nir_tex_src_lod;
        tex->src[1].src = nir_src_for_ssa(nir_imm_int(&b, 0));
+       tex->src[2].src_type = nir_tex_src_texture_deref;
+       tex->src[2].src = nir_src_for_ssa(input_img_deref);
        tex->dest_type = nir_type_float;
        tex->is_array = false;
        tex->coord_components = is_3d ? 3 : 2;
-       tex->texture = nir_deref_var_create(tex, input_img);
-       tex->sampler = NULL;
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(&b, &tex->instr);
index d5af7a1b0cfcc43929689679d8c4c8d5da8ff923..411d02f231ff74287fa67685d5c1858566966b8e 100644 (file)
@@ -66,19 +66,20 @@ build_dcc_decompress_compute_shader(struct radv_device *dev)
                                                b.shader->info.cs.local_size[2], 0);
 
        nir_ssa_def *global_id = nir_iadd(&b, nir_imul(&b, wg_id, block_size), invoc_id);
+       nir_ssa_def *input_img_deref = &nir_build_deref_var(&b, input_img)->dest.ssa;
 
-       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 2);
+       nir_tex_instr *tex = nir_tex_instr_create(b.shader, 3);
        tex->sampler_dim = GLSL_SAMPLER_DIM_2D;
        tex->op = nir_texop_txf;
        tex->src[0].src_type = nir_tex_src_coord;
        tex->src[0].src = nir_src_for_ssa(nir_channels(&b, global_id, 3));
        tex->src[1].src_type = nir_tex_src_lod;
        tex->src[1].src = nir_src_for_ssa(nir_imm_int(&b, 0));
+       tex->src[2].src_type = nir_tex_src_texture_deref;
+       tex->src[2].src = nir_src_for_ssa(input_img_deref);
        tex->dest_type = nir_type_float;
        tex->is_array = false;
        tex->coord_components = 2;
-       tex->texture = nir_deref_var_create(tex, input_img);
-       tex->sampler = NULL;
 
        nir_ssa_dest_init(&tex->instr, &tex->dest, 4, 32, "tex");
        nir_builder_instr_insert(&b, &tex->instr);