From 4b2fb618316c1c5d9286cde388572cc230f216f3 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 19 Aug 2020 11:47:08 -0400 Subject: [PATCH] zink: break out barrier transitioning in update_descriptors this hopefully makes the code a little more readable Reviewed-by: Bas Nieuwenhuizen Part-of: --- src/gallium/drivers/zink/zink_draw.c | 55 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 27 deletions(-) diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c index ef6290b19a7..7089106915c 100644 --- a/src/gallium/drivers/zink/zink_draw.c +++ b/src/gallium/drivers/zink/zink_draw.c @@ -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;