From 6e22f52ba121c85d38b55bc3c1713250f3827f65 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 4 Aug 2020 14:22:52 -0400 Subject: [PATCH] zink: hook up ssbo shader bindings this is just the struct zink_shader binding point stuff, but nothing is using it yet Reviewed-by: Erik Faye-Lund Part-of: --- .../drivers/zink/nir_to_spirv/nir_to_spirv.c | 7 ++++++- src/gallium/drivers/zink/zink_compiler.c | 9 +++++++++ src/gallium/drivers/zink/zink_draw.c | 17 ++++++++++++++--- 3 files changed, 29 insertions(+), 4 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 beb03efbe3d..b1fab09446b 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 @@ -547,7 +547,8 @@ zink_binding(gl_shader_stage stage, VkDescriptorType type, int index) unreachable("not supported"); } else { uint32_t stage_offset = (uint32_t)stage * (PIPE_MAX_CONSTANT_BUFFERS + - PIPE_MAX_SAMPLERS); + PIPE_MAX_SAMPLERS + + PIPE_MAX_SHADER_BUFFERS); switch (type) { case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER: @@ -559,6 +560,10 @@ zink_binding(gl_shader_stage stage, VkDescriptorType type, int index) assert(index < PIPE_MAX_SAMPLERS); return stage_offset + PIPE_MAX_CONSTANT_BUFFERS + index; + case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER: + assert(index < PIPE_MAX_SHADER_BUFFERS); + return stage_offset + PIPE_MAX_CONSTANT_BUFFERS + PIPE_MAX_SHADER_SAMPLER_VIEWS + index; + default: unreachable("unexpected type"); } diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 832ba9a210e..58d9bdd8d9d 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -488,6 +488,15 @@ zink_shader_create(struct zink_screen *screen, struct nir_shader *nir, ret->bindings[ret->num_bindings].size = 1; ret->num_bindings++; } + } else if (var->data.mode == nir_var_mem_ssbo) { + int binding = zink_binding(nir->info.stage, + VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, + var->data.binding); + ret->bindings[ret->num_bindings].index = var->data.binding; + ret->bindings[ret->num_bindings].binding = binding; + ret->bindings[ret->num_bindings].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; + ret->bindings[ret->num_bindings].size = 1; + ret->num_bindings++; } else { assert(var->data.mode == nir_var_uniform); const struct glsl_type *type = glsl_without_array(var->type); diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index 542140de606..b7db788b2e3 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -309,9 +309,9 @@ zink_draw_vbo(struct pipe_context *pctx, } } - VkWriteDescriptorSet wds[PIPE_SHADER_TYPES * PIPE_MAX_CONSTANT_BUFFERS + PIPE_SHADER_TYPES * PIPE_MAX_SAMPLERS]; - struct zink_resource *write_desc_resources[PIPE_SHADER_TYPES * PIPE_MAX_CONSTANT_BUFFERS + PIPE_SHADER_TYPES * PIPE_MAX_SAMPLERS]; - VkDescriptorBufferInfo buffer_infos[PIPE_SHADER_TYPES * PIPE_MAX_CONSTANT_BUFFERS]; + VkWriteDescriptorSet wds[PIPE_SHADER_TYPES * (PIPE_MAX_CONSTANT_BUFFERS + PIPE_MAX_SAMPLERS + PIPE_MAX_SHADER_BUFFERS)]; + struct zink_resource *write_desc_resources[PIPE_SHADER_TYPES * (PIPE_MAX_CONSTANT_BUFFERS + PIPE_MAX_SAMPLERS + PIPE_MAX_SHADER_BUFFERS)]; + VkDescriptorBufferInfo buffer_infos[PIPE_SHADER_TYPES * (PIPE_MAX_CONSTANT_BUFFERS + PIPE_MAX_SHADER_BUFFERS)]; VkDescriptorImageInfo image_infos[PIPE_SHADER_TYPES * PIPE_MAX_SAMPLERS]; VkBufferView buffer_view[] = {VK_NULL_HANDLE}; int num_wds = 0, num_buffer_info = 0, num_image_info = 0; @@ -350,6 +350,17 @@ zink_draw_vbo(struct pipe_context *pctx, buffer_infos[num_buffer_info].range = res ? ctx->ubos[i][index].buffer_size : VK_WHOLE_SIZE; wds[num_wds].pBufferInfo = buffer_infos + num_buffer_info; ++num_buffer_info; + } else if (shader->bindings[j].type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) { + assert(ctx->ssbos[i][index].buffer_size > 0); + assert(ctx->ssbos[i][index].buffer_size <= screen->info.props.limits.maxStorageBufferRange); + assert(ctx->ssbos[i][index].buffer); + struct zink_resource *res = zink_resource(ctx->ssbos[i][index].buffer); + write_desc_resources[num_wds] = res; + buffer_infos[num_buffer_info].buffer = res->buffer; + buffer_infos[num_buffer_info].offset = ctx->ssbos[i][index].buffer_offset; + buffer_infos[num_buffer_info].range = ctx->ssbos[i][index].buffer_size; + wds[num_wds].pBufferInfo = buffer_infos + num_buffer_info; + ++num_buffer_info; } else { for (unsigned k = 0; k < shader->bindings[j].size; k++) { struct pipe_sampler_view *psampler_view = ctx->image_views[i][index + k];