zink: tighten emitted image spir-v caps
authorErik Faye-Lund <erik.faye-lund@collabora.com>
Fri, 26 Mar 2021 13:22:01 +0000 (14:22 +0100)
committerMarge Bot <eric+marge@anholt.net>
Fri, 26 Mar 2021 14:30:46 +0000 (14:30 +0000)
We might only need to emit a read or write cap for a given image. This
could provide the Vulkan driver with the chance to optimize things
slightly.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9855>

src/gallium/drivers/zink/nir_to_spirv/nir_to_spirv.c

index c1fb1ea..6a7cd61 100644 (file)
@@ -773,8 +773,10 @@ emit_image(struct ntv_context *ctx, struct nir_variable *var)
    bool is_sampler = glsl_type_is_sampler(type);
 
    if (!is_sampler && !var->data.image.format) {
-      spirv_builder_emit_cap(&ctx->builder, SpvCapabilityStorageImageWriteWithoutFormat);
-      spirv_builder_emit_cap(&ctx->builder, SpvCapabilityStorageImageReadWithoutFormat);
+      if (!(var->data.access & ACCESS_NON_WRITEABLE))
+         spirv_builder_emit_cap(&ctx->builder, SpvCapabilityStorageImageWriteWithoutFormat);
+      if (!(var->data.access & ACCESS_NON_READABLE))
+         spirv_builder_emit_cap(&ctx->builder, SpvCapabilityStorageImageReadWithoutFormat);
    }
 
    SpvDim dimension = type_to_dim(glsl_get_sampler_dim(type), &is_ms);