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)
{
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++) {
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) {
} 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;
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;
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;