From f5ab1a1f00c1495da7c3b9cb645f268041c42f50 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Tue, 4 Aug 2020 14:21:00 -0400 Subject: [PATCH] zink: add set_shader_buffers pipe_context method Reviewed-by: Erik Faye-Lund Part-of: --- src/gallium/drivers/zink/zink_context.c | 25 +++++++++++++++++++++++++ src/gallium/drivers/zink/zink_context.h | 1 + 2 files changed, 26 insertions(+) diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 8d5d4e6415b..42d882967bb 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -574,6 +574,30 @@ zink_set_constant_buffer(struct pipe_context *pctx, } } +static void +zink_set_shader_buffers(struct pipe_context *pctx, + enum pipe_shader_type p_stage, + unsigned start_slot, unsigned count, + const struct pipe_shader_buffer *buffers, + unsigned writable_bitmask) +{ + struct zink_context *ctx = zink_context(pctx); + + for (unsigned i = 0; i < count; i++) { + struct pipe_shader_buffer *ssbo = &ctx->ssbos[p_stage][start_slot + i]; + if (buffers && buffers[i].buffer) { + struct zink_resource *res = zink_resource(buffers[i].buffer); + pipe_resource_reference(&ssbo->buffer, &res->base); + ssbo->buffer_offset = buffers[i].buffer_offset; + ssbo->buffer_size = MIN2(buffers[i].buffer_size, res->size - ssbo->buffer_offset); + } else { + pipe_resource_reference(&ssbo->buffer, NULL); + ssbo->buffer_offset = 0; + ssbo->buffer_size = 0; + } + } +} + static void zink_set_sampler_views(struct pipe_context *pctx, enum pipe_shader_type shader_type, @@ -1308,6 +1332,7 @@ zink_context_create(struct pipe_screen *pscreen, void *priv, unsigned flags) ctx->base.set_viewport_states = zink_set_viewport_states; ctx->base.set_scissor_states = zink_set_scissor_states; ctx->base.set_constant_buffer = zink_set_constant_buffer; + ctx->base.set_shader_buffers = zink_set_shader_buffers; ctx->base.set_framebuffer_state = zink_set_framebuffer_state; ctx->base.set_stencil_ref = zink_set_stencil_ref; ctx->base.set_clip_state = zink_set_clip_state; diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h index 3c0352e5eb6..a1879d344cf 100644 --- a/src/gallium/drivers/zink/zink_context.h +++ b/src/gallium/drivers/zink/zink_context.h @@ -91,6 +91,7 @@ struct zink_context { VkQueue queue; struct pipe_constant_buffer ubos[PIPE_SHADER_TYPES][PIPE_MAX_CONSTANT_BUFFERS]; + struct pipe_shader_buffer ssbos[PIPE_SHADER_TYPES][PIPE_MAX_SHADER_BUFFERS]; struct pipe_framebuffer_state fb_state; struct zink_vertex_elements_state *element_state;