From 898a18ea89ff29d5eb6fb9c6f0ddeae5de8ba7a7 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Thu, 1 Aug 2019 10:30:40 -0700 Subject: [PATCH] gallium/util: Add util_set_shader_buffers_mask helper Conceptually follows util_set_vertex_buffers_mask but for SSBOs. v2: Fix missing ~ when clearing mask. Adjust mask behaviour to match freedreno/v3d when buffer == NULL. Signed-off-by: Alyssa Rosenzweig Reviewed-by: Eric Anholt --- src/gallium/auxiliary/util/u_helpers.c | 37 ++++++++++++++++++++++++++ src/gallium/auxiliary/util/u_helpers.h | 5 ++++ 2 files changed, 42 insertions(+) diff --git a/src/gallium/auxiliary/util/u_helpers.c b/src/gallium/auxiliary/util/u_helpers.c index 821242c0181..f28685f80d9 100644 --- a/src/gallium/auxiliary/util/u_helpers.c +++ b/src/gallium/auxiliary/util/u_helpers.c @@ -101,6 +101,43 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst, *dst_count = util_last_bit(enabled_buffers); } +/** + * This function is used to copy an array of pipe_shader_buffer structures, + * while properly referencing the pipe_shader_buffer::buffer member. + * + * \sa util_set_vertex_buffer_mask + */ +void util_set_shader_buffers_mask(struct pipe_shader_buffer *dst, + uint32_t *enabled_buffers, + const struct pipe_shader_buffer *src, + unsigned start_slot, unsigned count) +{ + unsigned i; + + dst += start_slot; + + if (src) { + for (i = 0; i < count; i++) { + pipe_resource_reference(&dst[i].buffer, src[i].buffer); + + if (src[i].buffer) + *enabled_buffers |= (1ull << (start_slot + i)); + else + *enabled_buffers &= ~(1ull << (start_slot + i)); + } + + /* Copy over the other members of pipe_shader_buffer. */ + memcpy(dst, src, count * sizeof(struct pipe_shader_buffer)); + } + else { + /* Unreference the buffers. */ + for (i = 0; i < count; i++) + pipe_resource_reference(&dst[i].buffer, NULL); + + *enabled_buffers &= ~(((1ull << count) - 1) << start_slot); + } +} + /** * Given a user index buffer, save the structure to "saved", and upload it. */ diff --git a/src/gallium/auxiliary/util/u_helpers.h b/src/gallium/auxiliary/util/u_helpers.h index ed8467291ba..16c4295deb5 100644 --- a/src/gallium/auxiliary/util/u_helpers.h +++ b/src/gallium/auxiliary/util/u_helpers.h @@ -46,6 +46,11 @@ void util_set_vertex_buffers_count(struct pipe_vertex_buffer *dst, const struct pipe_vertex_buffer *src, unsigned start_slot, unsigned count); +void util_set_shader_buffers_mask(struct pipe_shader_buffer *dst, + uint32_t *enabled_buffers, + const struct pipe_shader_buffer *src, + unsigned start_slot, unsigned count); + bool util_upload_index_buffer(struct pipe_context *pipe, const struct pipe_draw_info *info, struct pipe_resource **out_buffer, -- 2.30.2