Module: Mesa
Branch: master
Commit: dbbcf4e7800bca34a3c7c473aacdb4630a3345f3
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=dbbcf4e7800bca34a3c7c473aacdb4630a3345f3

Author: Mike Blumenkrantz <michael.blumenkra...@gmail.com>
Date:   Thu Dec 31 12:56:04 2020 -0500

zink: directly set nir variable bindings for reuse during ntv

this lets us prepopulate the binding values without "fetching" them
twice

Reviewed-by: Adam Jackson <a...@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9624>

---

 .../drivers/zink/nir_to_spirv/nir_to_spirv.c       | 22 +++++----------
 src/gallium/drivers/zink/zink_compiler.c           | 33 ++++++++++++----------
 2 files changed, 25 insertions(+), 30 deletions(-)

diff --git a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c 
b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
index 1a58d10aa3e..813fe7c63cb 100644
--- a/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
+++ b/src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c
@@ -819,7 +819,7 @@ emit_image(struct ntv_context *ctx, struct nir_variable 
*var)
                                                          image_type);
    SpvId var_type = is_sampler ? sampled_type : image_type;
 
-   int index = var->data.binding;
+   int index = var->data.driver_location;
    assert(!is_sampler || (!(ctx->samplers_used & (1 << index))));
    assert(!is_sampler || !ctx->sampler_types[index]);
    assert(is_sampler || !ctx->image_types[index]);
@@ -857,10 +857,7 @@ emit_image(struct ntv_context *ctx, struct nir_variable 
*var)
    ctx->entry_ifaces[ctx->num_entry_ifaces++] = var_id;
 
    spirv_builder_emit_descriptor_set(&ctx->builder, var_id, is_sampler ? 
ZINK_DESCRIPTOR_TYPE_SAMPLER_VIEW : ZINK_DESCRIPTOR_TYPE_IMAGE);
-   int binding = zink_binding(ctx->stage,
-                              is_sampler ? zink_sampler_type(type) : 
zink_image_type(type),
-                              var->data.binding);
-   spirv_builder_emit_binding(&ctx->builder, var_id, binding);
+   spirv_builder_emit_binding(&ctx->builder, var_id, var->data.binding);
 }
 
 static SpvId
@@ -1001,12 +998,7 @@ emit_bo(struct ntv_context *ctx, struct nir_variable *var)
       ctx->entry_ifaces[ctx->num_entry_ifaces++] = var_id;
 
       spirv_builder_emit_descriptor_set(&ctx->builder, var_id, ssbo ? 
ZINK_DESCRIPTOR_TYPE_SSBO : ZINK_DESCRIPTOR_TYPE_UBO);
-      int binding = zink_binding(ctx->stage,
-                                 ssbo ? VK_DESCRIPTOR_TYPE_STORAGE_BUFFER :
-                                        /* only make the first ubo dynamic to 
stay within driver limits */
-                                        (ctx->num_ubos == 1) ? 
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
-                                 var->data.binding + i);
-      spirv_builder_emit_binding(&ctx->builder, var_id, binding);
+      spirv_builder_emit_binding(&ctx->builder, var_id, var->data.binding + i);
    }
 }
 
@@ -2829,7 +2821,7 @@ emit_intrinsic(struct ntv_context *ctx, 
nir_intrinsic_instr *intr)
    case nir_intrinsic_image_deref_store: {
       SpvId img_var = get_src(ctx, &intr->src[0]);
       nir_variable *var = get_var_from_image(ctx, img_var);
-      SpvId img_type = ctx->image_types[var->data.binding];
+      SpvId img_type = ctx->image_types[var->data.driver_location];
       const struct glsl_type *type = glsl_without_array(var->type);
       SpvId base_type = get_glsl_basetype(ctx, 
glsl_get_sampler_result_type(type));
       SpvId img = spirv_builder_emit_load(&ctx->builder, img_type, img_var);
@@ -2846,7 +2838,7 @@ emit_intrinsic(struct ntv_context *ctx, 
nir_intrinsic_instr *intr)
    case nir_intrinsic_image_deref_load: {
       SpvId img_var = get_src(ctx, &intr->src[0]);
       nir_variable *var = get_var_from_image(ctx, img_var);
-      SpvId img_type = ctx->image_types[var->data.binding];
+      SpvId img_type = ctx->image_types[var->data.driver_location];
       const struct glsl_type *type = glsl_without_array(var->type);
       SpvId base_type = get_glsl_basetype(ctx, 
glsl_get_sampler_result_type(type));
       SpvId img = spirv_builder_emit_load(&ctx->builder, img_type, img_var);
@@ -2860,7 +2852,7 @@ emit_intrinsic(struct ntv_context *ctx, 
nir_intrinsic_instr *intr)
    case nir_intrinsic_image_deref_size: {
       SpvId img_var = get_src(ctx, &intr->src[0]);
       nir_variable *var = get_var_from_image(ctx, img_var);
-      SpvId img_type = ctx->image_types[var->data.binding];
+      SpvId img_type = ctx->image_types[var->data.driver_location];
       const struct glsl_type *type = glsl_without_array(var->type);
       SpvId img = spirv_builder_emit_load(&ctx->builder, img_type, img_var);
       SpvId result = spirv_builder_emit_image_query_size(&ctx->builder, 
get_uvec_type(ctx, 32, glsl_get_sampler_coordinate_components(type)), img, 0);
@@ -3280,7 +3272,7 @@ emit_deref_array(struct ntv_context *ctx, nir_deref_instr 
*deref)
       struct hash_entry *he = _mesa_hash_table_search(ctx->vars, var);
       assert(he);
       base = (SpvId)(intptr_t)he->data;
-      type = ctx->image_types[var->data.binding];
+      type = ctx->image_types[var->data.driver_location];
       break;
    }
 
diff --git a/src/gallium/drivers/zink/zink_compiler.c 
b/src/gallium/drivers/zink/zink_compiler.c
index 62a8acfd6cd..6c031e06e61 100644
--- a/src/gallium/drivers/zink/zink_compiler.c
+++ b/src/gallium/drivers/zink/zink_compiler.c
@@ -609,7 +609,6 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
       fprintf(stderr, "---8<---\n");
    }
 
-   uint32_t cur_ubo = 0;
    /* UBO buffers are zero-indexed, but buffer 0 is always the one created by 
nir_lower_uniforms_to_ubo,
     * which means there is no buffer 0 if there are no uniforms
     */
@@ -629,8 +628,11 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
             bool ubo_array = glsl_type_is_array(var->type) && 
glsl_type_is_interface(type);
             if (var->data.location && !ubo_array && var->type != 
var->interface_type)
                continue;
-            var->data.binding = cur_ubo;
             ztype = ZINK_DESCRIPTOR_TYPE_UBO;
+            var->data.driver_location = ret->num_bindings[ztype];
+            var->data.binding = zink_binding(nir->info.stage,
+                                             VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
+                                             var->data.driver_location);
             /* if this is a ubo array, create a binding point for each array 
member:
              * 
                "For uniform blocks declared as arrays, each individual array 
element
@@ -641,9 +643,7 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
              */
             for (unsigned i = 0; i < (ubo_array ? glsl_get_aoa_size(var->type) 
: 1); i++) {
                VkDescriptorType vktype = !ubo_index ? 
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC : VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
-               int binding = zink_binding(nir->info.stage,
-                                          vktype,
-                                          cur_ubo++);
+               int binding = var->data.binding + i;
                ret->bindings[ztype][ret->num_bindings[ztype]].index = 
ubo_index++;
                ret->bindings[ztype][ret->num_bindings[ztype]].binding = 
binding;
                ret->bindings[ztype][ret->num_bindings[ztype]].type = vktype;
@@ -657,13 +657,15 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
             if (var->data.location && !bo_array)
                continue;
             if (!var->data.explicit_binding) {
-               var->data.binding = ssbo_array_index;
-            }
+               var->data.driver_location = ssbo_array_index;
+            } else
+               var->data.driver_location = var->data.binding;
             ztype = ZINK_DESCRIPTOR_TYPE_SSBO;
+            var->data.binding = zink_binding(nir->info.stage,
+                                             VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+                                             var->data.driver_location);
             for (unsigned i = 0; i < (bo_array ? glsl_get_aoa_size(var->type) 
: 1); i++) {
-               int binding = zink_binding(nir->info.stage,
-                                          VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
-                                          var->data.binding + i);
+               int binding = var->data.binding + i;
                if (strcmp(glsl_get_type_name(var->interface_type), "counters"))
                   ret->bindings[ztype][ret->num_bindings[ztype]].index = 
ssbo_array_index++;
                else
@@ -679,11 +681,12 @@ zink_shader_create(struct zink_screen *screen, struct 
nir_shader *nir,
             if (glsl_type_is_sampler(type) || glsl_type_is_image(type)) {
                VkDescriptorType vktype = glsl_type_is_image(type) ? 
zink_image_type(type) : zink_sampler_type(type);
                ztype = zink_desc_type_from_vktype(vktype);
-               int binding = zink_binding(nir->info.stage,
-                                          vktype,
-                                          var->data.binding);
-               ret->bindings[ztype][ret->num_bindings[ztype]].index = 
var->data.binding;
-               ret->bindings[ztype][ret->num_bindings[ztype]].binding = 
binding;
+               var->data.driver_location = var->data.binding;
+               var->data.binding = zink_binding(nir->info.stage,
+                                                vktype,
+                                                var->data.driver_location);
+               ret->bindings[ztype][ret->num_bindings[ztype]].index = 
var->data.driver_location;
+               ret->bindings[ztype][ret->num_bindings[ztype]].binding = 
var->data.binding;
                ret->bindings[ztype][ret->num_bindings[ztype]].type = vktype;
                if (glsl_type_is_array(var->type))
                   ret->bindings[ztype][ret->num_bindings[ztype]].size = 
glsl_get_aoa_size(var->type);

_______________________________________________
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to