zink: break out barrier transitioning in update_descriptors
this hopefully makes the code a little more readable Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8945>
This commit is contained in:
parent
017dbd63fb
commit
4b2fb61831
|
@ -225,8 +225,29 @@ get_gfx_program(struct zink_context *ctx)
|
|||
return ctx->curr_program;
|
||||
}
|
||||
|
||||
struct zink_transition {
|
||||
struct zink_resource *res;
|
||||
unsigned layout;
|
||||
VkPipelineStageFlagBits stage;
|
||||
};
|
||||
|
||||
#define MAX_DESCRIPTORS (PIPE_SHADER_TYPES * (PIPE_MAX_CONSTANT_BUFFERS + PIPE_MAX_SAMPLERS + PIPE_MAX_SHADER_BUFFERS + PIPE_MAX_SHADER_IMAGES))
|
||||
|
||||
static inline void
|
||||
add_transition(struct zink_resource *res, unsigned layout, enum pipe_shader_type stage, struct zink_transition *t, int *num_transitions)
|
||||
{
|
||||
VkPipelineStageFlags pipeline = zink_pipeline_flags_from_stage(zink_shader_stage(stage));
|
||||
if (res->base.target == PIPE_BUFFER && !zink_resource_buffer_needs_barrier(res, layout, pipeline))
|
||||
return;
|
||||
else if (res->base.target != PIPE_BUFFER && !zink_resource_image_needs_barrier(res, layout, pipeline))
|
||||
return;
|
||||
|
||||
t->layout = layout;
|
||||
t->stage = pipeline;
|
||||
t->res = res;
|
||||
(*num_transitions)++;
|
||||
}
|
||||
|
||||
static void
|
||||
update_descriptors(struct zink_context *ctx, struct zink_screen *screen, bool is_compute)
|
||||
{
|
||||
|
@ -246,11 +267,7 @@ update_descriptors(struct zink_context *ctx, struct zink_screen *screen, bool is
|
|||
else
|
||||
stages = &ctx->gfx_stages[0];
|
||||
|
||||
struct {
|
||||
struct zink_resource *res;
|
||||
unsigned layout;
|
||||
VkPipelineStageFlagBits stage;
|
||||
} transitions[MAX_DESCRIPTORS] = {};
|
||||
struct zink_transition transitions[MAX_DESCRIPTORS];
|
||||
int num_transitions = 0;
|
||||
|
||||
for (int i = 0; i < num_stages; i++) {
|
||||
|
@ -283,11 +300,8 @@ update_descriptors(struct zink_context *ctx, struct zink_screen *screen, bool is
|
|||
zink_resource(ctx->dummy_vertex_buffer)->buffer);
|
||||
buffer_infos[num_buffer_info].offset = res ? ctx->ubos[stage][index].buffer_offset : 0;
|
||||
buffer_infos[num_buffer_info].range = res ? ctx->ubos[stage][index].buffer_size : VK_WHOLE_SIZE;
|
||||
if (res && res->access != VK_ACCESS_UNIFORM_READ_BIT) {
|
||||
transitions[num_transitions].layout = VK_ACCESS_UNIFORM_READ_BIT;
|
||||
transitions[num_transitions].stage = zink_pipeline_flags_from_stage(zink_shader_stage(stage));
|
||||
transitions[num_transitions++].res = res;
|
||||
}
|
||||
if (res)
|
||||
add_transition(res, VK_ACCESS_UNIFORM_READ_BIT, stage, &transitions[num_transitions], &num_transitions);
|
||||
wds[num_wds].pBufferInfo = buffer_infos + num_buffer_info;
|
||||
++num_buffer_info;
|
||||
} else if (shader->bindings[j].type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER) {
|
||||
|
@ -302,11 +316,7 @@ update_descriptors(struct zink_context *ctx, struct zink_screen *screen, bool is
|
|||
} else {
|
||||
read_desc_resources[num_wds] = res;
|
||||
}
|
||||
if (res->access != flag) {
|
||||
transitions[num_transitions].layout = flag;
|
||||
transitions[num_transitions].stage = zink_pipeline_flags_from_stage(zink_shader_stage(stage));
|
||||
transitions[num_transitions++].res = res;
|
||||
}
|
||||
add_transition(res, flag, stage, &transitions[num_transitions], &num_transitions);
|
||||
buffer_infos[num_buffer_info].buffer = res->buffer;
|
||||
buffer_infos[num_buffer_info].offset = ctx->ssbos[stage][index].buffer_offset;
|
||||
buffer_infos[num_buffer_info].range = ctx->ssbos[stage][index].buffer_size;
|
||||
|
@ -339,11 +349,7 @@ update_descriptors(struct zink_context *ctx, struct zink_screen *screen, bool is
|
|||
else {
|
||||
imageview =sampler_view->image_view;
|
||||
layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
|
||||
if (res->layout != VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL) {
|
||||
transitions[num_transitions].layout = layout;
|
||||
transitions[num_transitions].stage = zink_pipeline_flags_from_stage(zink_shader_stage(stage));
|
||||
transitions[num_transitions++].res = res;
|
||||
}
|
||||
add_transition(res, layout, stage, &transitions[num_transitions], &num_transitions);
|
||||
sampler = ctx->samplers[stage][index + k];
|
||||
}
|
||||
read_desc_resources[num_wds] = res;
|
||||
|
@ -362,13 +368,8 @@ update_descriptors(struct zink_context *ctx, struct zink_screen *screen, bool is
|
|||
wds[num_wds].pTexelBufferView = &image_view->buffer_view;
|
||||
} else {
|
||||
imageview = image_view->surface->image_view;
|
||||
layout = res->layout;
|
||||
if (res->layout != VK_IMAGE_LAYOUT_GENERAL &&
|
||||
res->layout != VK_IMAGE_LAYOUT_SHARED_PRESENT_KHR) {
|
||||
transitions[num_transitions].layout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
transitions[num_transitions].stage = zink_pipeline_flags_from_stage(zink_shader_stage(stage));
|
||||
transitions[num_transitions++].res = res;
|
||||
}
|
||||
layout = VK_IMAGE_LAYOUT_GENERAL;
|
||||
add_transition(res, layout, stage, &transitions[num_transitions], &num_transitions);
|
||||
}
|
||||
if (image_view->base.access & PIPE_IMAGE_ACCESS_WRITE)
|
||||
write_desc_resources[num_wds] = res;
|
||||
|
|
Loading…
Reference in New Issue