llvmpipe: pass ssbo write mask down into setup.

this will be used to keep track of ssbo buffer references.

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14923>
This commit is contained in:
Dave Airlie 2022-02-09 15:34:06 +10:00 committed by Marge Bot
parent 403f9aea0e
commit ef34719459
6 changed files with 10 additions and 4 deletions

View file

@ -90,7 +90,7 @@ struct llvmpipe_context {
struct pipe_shader_buffer ssbos[PIPE_SHADER_TYPES][LP_MAX_TGSI_SHADER_BUFFERS];
struct pipe_image_view images[PIPE_SHADER_TYPES][LP_MAX_TGSI_SHADER_IMAGES];
uint32_t fs_ssbo_write_mask;
unsigned num_samplers[PIPE_SHADER_TYPES];
unsigned num_sampler_views[PIPE_SHADER_TYPES];
unsigned num_images[PIPE_SHADER_TYPES];

View file

@ -703,7 +703,8 @@ lp_setup_set_fs_constants(struct lp_setup_context *setup,
void
lp_setup_set_fs_ssbos(struct lp_setup_context *setup,
unsigned num,
struct pipe_shader_buffer *buffers)
struct pipe_shader_buffer *buffers,
uint32_t ssbo_write_mask)
{
unsigned i;
@ -717,6 +718,7 @@ lp_setup_set_fs_ssbos(struct lp_setup_context *setup,
for (; i < ARRAY_SIZE(setup->ssbos); i++) {
util_copy_shader_buffer(&setup->ssbos[i].current, NULL);
}
setup->ssbo_write_mask = ssbo_write_mask;
setup->dirty |= LP_SETUP_NEW_SSBOS;
}

View file

@ -111,7 +111,8 @@ lp_setup_set_fs_constants(struct lp_setup_context *setup,
void
lp_setup_set_fs_ssbos(struct lp_setup_context *setup,
unsigned num,
struct pipe_shader_buffer *buffers);
struct pipe_shader_buffer *buffers,
uint32_t ssbo_write_mask);
void
lp_setup_set_fs_images(struct lp_setup_context *setup,

View file

@ -159,6 +159,7 @@ struct lp_setup_context
struct {
struct pipe_shader_buffer current;
} ssbos[LP_MAX_TGSI_SHADER_BUFFERS];
uint32_t ssbo_write_mask;
struct {
struct pipe_image_view current;

View file

@ -332,7 +332,7 @@ void llvmpipe_update_derived( struct llvmpipe_context *llvmpipe )
if (llvmpipe->dirty & LP_NEW_FS_SSBOS)
lp_setup_set_fs_ssbos(llvmpipe->setup,
ARRAY_SIZE(llvmpipe->ssbos[PIPE_SHADER_FRAGMENT]),
llvmpipe->ssbos[PIPE_SHADER_FRAGMENT]);
llvmpipe->ssbos[PIPE_SHADER_FRAGMENT], llvmpipe->fs_ssbo_write_mask);
if (llvmpipe->dirty & LP_NEW_FS_IMAGES)
lp_setup_set_fs_images(llvmpipe->setup,

View file

@ -4057,6 +4057,8 @@ llvmpipe_set_shader_buffers(struct pipe_context *pipe,
} else if (shader == PIPE_SHADER_COMPUTE) {
llvmpipe->cs_dirty |= LP_CSNEW_SSBOS;
} else if (shader == PIPE_SHADER_FRAGMENT) {
llvmpipe->fs_ssbo_write_mask &= ~(((1 << count) - 1) << start_slot);
llvmpipe->fs_ssbo_write_mask |= writable_bitmask << start_slot;
llvmpipe->dirty |= LP_NEW_FS_SSBOS;
}
}