lavapipe: lower images to non-derefs in vulkan side
authorDave Airlie <airlied@redhat.com>
Thu, 6 May 2021 02:27:35 +0000 (12:27 +1000)
committerMarge Bot <emma+marge@anholt.net>
Fri, 5 Aug 2022 06:18:44 +0000 (06:18 +0000)
Reviewed-by: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10641>

src/gallium/frontends/lavapipe/lvp_lower_vulkan_resource.c

index 64dee4d..ff7a38b 100644 (file)
@@ -254,8 +254,10 @@ static void lower_vri_instr_tex(struct nir_builder *b,
                              BITSET_SIZE(b->shader->info.textures_used));
 }
 
-static void lower_vri_intrin_image(struct nir_builder *b,
-                                   nir_intrinsic_instr *intrin, void *data_cb)
+static void
+lower_image_intrinsic(nir_builder *b,
+                      nir_intrinsic_instr *intrin,
+                      void *data_cb)
 {
    const struct lvp_pipeline_layout *layout = data_cb;
    gl_shader_stage stage = b->shader->info.stage;
@@ -266,6 +268,7 @@ static void lower_vri_intrin_image(struct nir_builder *b,
    unsigned binding_idx = var->data.binding;
    const struct lvp_descriptor_set_binding_layout *binding =
       get_binding_layout(layout, desc_set_idx, binding_idx);
+   nir_ssa_def *index = NULL;
 
    int value = 0;
    for (unsigned s = 0; s < desc_set_idx; s++) {
@@ -275,20 +278,26 @@ static void lower_vri_intrin_image(struct nir_builder *b,
    }
    value += binding->stage[stage].image_index;
 
+   b->cursor = nir_before_instr(&intrin->instr);
    if (deref->deref_type == nir_deref_type_array) {
       assert(glsl_type_is_array(var->type));
       assert(value >= 0);
       if (nir_src_is_const(deref->arr.index)) {
          value += nir_src_as_uint(deref->arr.index);
          BITSET_SET(b->shader->info.images_used, value);
+         index = nir_imm_int(b, value);
       } else {
          unsigned size = glsl_get_aoa_size(var->type);
          BITSET_SET_RANGE(b->shader->info.images_used,
                           value, value + size - 1);
+         index = nir_iadd_imm(b, deref->arr.index.ssa, value);
       }
    } else {
       BITSET_SET(b->shader->info.images_used, value);
+      index = nir_imm_int(b, value);
    }
+
+   nir_rewrite_image_intrinsic(intrin, index, false);
 }
 
 static nir_ssa_def *lower_vri_instr(struct nir_builder *b,
@@ -316,7 +325,6 @@ static nir_ssa_def *lower_vri_instr(struct nir_builder *b,
                                nir_src_for_ssa(index));
          return NULL;
       }
-
       case nir_intrinsic_image_deref_sparse_load:
       case nir_intrinsic_image_deref_load:
       case nir_intrinsic_image_deref_store:
@@ -333,7 +341,7 @@ static nir_ssa_def *lower_vri_instr(struct nir_builder *b,
       case nir_intrinsic_image_deref_atomic_fadd:
       case nir_intrinsic_image_deref_size:
       case nir_intrinsic_image_deref_samples:
-         lower_vri_intrin_image(b, intrin, data_cb);
+         lower_image_intrinsic(b, intrin, data_cb);
          return NULL;
 
       default: