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

Author: Mike Blumenkrantz <[email protected]>
Date:   Tue Oct 18 11:38:18 2022 -0400

zink: emit explicit samplers in ntv based on sampler_mask

not actually used yet

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19327>

---

 .../drivers/zink/nir_to_spirv/nir_to_spirv.c       | 39 +++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

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 3a1bfcbccdf..ad0d55b8764 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
@@ -64,6 +64,7 @@ struct ntv_context {
    SpvId images[PIPE_MAX_SHADER_IMAGES];
    SpvId sampler_types[PIPE_MAX_SHADER_SAMPLER_VIEWS];
    SpvId samplers[PIPE_MAX_SHADER_SAMPLER_VIEWS];
+   SpvId cl_samplers[PIPE_MAX_SAMPLERS];
    nir_variable *sampler_var[PIPE_MAX_SHADER_SAMPLER_VIEWS]; /* 
driver_location -> variable */
    unsigned last_sampler;
    nir_variable *image_var[PIPE_MAX_SHADER_IMAGES]; /* driver_location -> 
variable */
@@ -1054,6 +1055,29 @@ emit_image(struct ntv_context *ctx, struct nir_variable 
*var, SpvId image_type,
    return var_id;
 }
 
+static void
+emit_sampler(struct ntv_context *ctx, unsigned sampler_index, unsigned 
desc_set)
+{
+   SpvId type = spirv_builder_type_sampler(&ctx->builder);
+   SpvId pointer_type = spirv_builder_type_pointer(&ctx->builder,
+                                                   
SpvStorageClassUniformConstant,
+                                                   type);
+
+   SpvId var_id = spirv_builder_emit_var(&ctx->builder, pointer_type,
+                                         SpvStorageClassUniformConstant);
+   char buf[128];
+   snprintf(buf, sizeof(buf), "sampler_%u", sampler_index);
+   spirv_builder_emit_name(&ctx->builder, var_id, buf);
+   spirv_builder_emit_descriptor_set(&ctx->builder, var_id, desc_set);
+   spirv_builder_emit_binding(&ctx->builder, var_id, sampler_index);
+   ctx->cl_samplers[sampler_index] = var_id;
+   if (ctx->spirv_1_4_interfaces) {
+      assert(ctx->num_entry_ifaces < ARRAY_SIZE(ctx->entry_ifaces));
+      ctx->entry_ifaces[ctx->num_entry_ifaces++] = var_id;
+   }
+
+}
+
 static SpvId
 get_sized_uint_array_type(struct ntv_context *ctx, unsigned array_size, 
unsigned bitsize)
 {
@@ -4515,7 +4539,20 @@ nir_to_spirv(struct nir_shader *s, const struct 
zink_shader_info *sinfo, uint32_
          ctx.last_sampler = MAX2(ctx.last_sampler, var->data.driver_location);
       }
    }
-   nir_foreach_variable_with_modes(var, s, nir_var_uniform | nir_var_image) {
+   if (sinfo->sampler_mask) {
+      assert(s->info.stage == MESA_SHADER_KERNEL);
+      int desc_set = -1;
+      nir_foreach_variable_with_modes(var, s, nir_var_uniform) {
+         if (glsl_type_is_sampler(glsl_without_array(var->type))) {
+            desc_set = var->data.descriptor_set;
+            break;
+         }
+      }
+      assert(desc_set != -1);
+      u_foreach_bit(sampler, sinfo->sampler_mask)
+         emit_sampler(&ctx, sampler, desc_set);
+   }
+   nir_foreach_variable_with_modes(var, s, nir_var_image | nir_var_uniform) {
       const struct glsl_type *type = glsl_without_array(var->type);
       if (glsl_type_is_sampler(type))
          emit_image(&ctx, var, get_bare_image_type(&ctx, var, true), false);

Reply via email to