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 <alyssa.rosenzweig@collabora.com> Reviewed-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user