Mesa (master): zink: emit ssbo variables in ntv
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Thu Jan 14 18:35:22 UTC 2021
Module: Mesa
Branch: master
Commit: 3dd5500f7b2957563a116228b8d29453cd981783
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=3dd5500f7b2957563a116228b8d29453cd981783
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue Aug 4 14:26:22 2020 -0400
zink: emit ssbo variables in ntv
we're structuring these the same as ubos so we can reuse the same load
function later
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8330>
---
.../drivers/zink/nir_to_spirv/nir_to_spirv.c | 47 ++++++++++++++++++++++
1 file changed, 47 insertions(+)
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 b1fab09446b..76fa0646f32 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
@@ -43,6 +43,8 @@ struct ntv_context {
SpvId ubos[128];
size_t num_ubos;
+
+ SpvId ssbos[PIPE_MAX_SHADER_BUFFERS];
SpvId image_types[PIPE_MAX_SAMPLERS];
SpvId samplers[PIPE_MAX_SAMPLERS];
unsigned char sampler_array_sizes[PIPE_MAX_SAMPLERS];
@@ -619,6 +621,46 @@ emit_sampler(struct ntv_context *ctx, struct nir_variable *var)
spirv_builder_emit_binding(&ctx->builder, var_id, binding);
}
+static void
+emit_ssbo(struct ntv_context *ctx, struct nir_variable *var)
+{
+ SpvId vec4_type = get_uvec_type(ctx, 32, 4);
+ SpvId array_type = spirv_builder_type_runtime_array(&ctx->builder, vec4_type);
+ spirv_builder_emit_array_stride(&ctx->builder, array_type, 16);
+
+ SpvId struct_type = spirv_builder_type_struct(&ctx->builder, &array_type, 1);
+ if (var->name) {
+ char struct_name[100];
+ snprintf(struct_name, sizeof(struct_name), "struct_%s", var->name);
+ spirv_builder_emit_name(&ctx->builder, struct_type, struct_name);
+ }
+
+ spirv_builder_emit_decoration(&ctx->builder, struct_type,
+ SpvDecorationBlock);
+ spirv_builder_emit_member_offset(&ctx->builder, struct_type, 0, 0);
+
+ SpvId pointer_type = spirv_builder_type_pointer(&ctx->builder,
+ SpvStorageClassStorageBuffer,
+ struct_type);
+
+ SpvId var_id = spirv_builder_emit_var(&ctx->builder, pointer_type,
+ SpvStorageClassStorageBuffer);
+ if (var->name) {
+ char struct_name[100];
+ snprintf(struct_name, sizeof(struct_name), "%s", var->name);
+ spirv_builder_emit_name(&ctx->builder, var_id, var->name);
+ }
+
+ assert(var->data.binding < ARRAY_SIZE(ctx->ssbos));
+ ctx->ssbos[var->data.binding] = var_id;
+
+ spirv_builder_emit_descriptor_set(&ctx->builder, var_id, 0);
+ int binding = zink_binding(ctx->stage,
+ VK_DESCRIPTOR_TYPE_STORAGE_BUFFER,
+ var->data.binding);
+ spirv_builder_emit_binding(&ctx->builder, var_id, binding);
+}
+
static void
emit_ubo(struct ntv_context *ctx, struct nir_variable *var)
{
@@ -685,6 +727,8 @@ emit_uniform(struct ntv_context *ctx, struct nir_variable *var)
{
if (var->data.mode == nir_var_mem_ubo)
emit_ubo(ctx, var);
+ else if (var->data.mode == nir_var_mem_ssbo)
+ emit_ssbo(ctx, var);
else {
assert(var->data.mode == nir_var_uniform);
if (glsl_type_is_sampler(glsl_without_array(var->type)))
@@ -2740,6 +2784,9 @@ nir_to_spirv(struct nir_shader *s, const struct zink_so_info *so_info,
unreachable("invalid stage");
}
+ if (s->info.num_ssbos)
+ spirv_builder_emit_extension(&ctx.builder, "SPV_KHR_storage_buffer_storage_class");
+
if (s->info.outputs_written & BITFIELD64_BIT(VARYING_SLOT_VIEWPORT)) {
if (s->info.stage < MESA_SHADER_GEOMETRY)
spirv_builder_emit_cap(&ctx.builder, SpvCapabilityShaderViewportIndex);
More information about the mesa-commit
mailing list