zink: remove struct zink_descriptor_resource from descriptor updating

this can be inferred from a resource's barrier usage, and then by merging
the batch-tracking for resources into the barrier loop, this deduplicates
calls for resources which are bound for multiple stages as well as removing
another iteration during descriptor updating

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9348>
This commit is contained in:
Mike Blumenkrantz 2020-10-12 12:13:02 -04:00 committed by Marge Bot
parent 4a3b344b23
commit 38e6e44262
1 changed files with 12 additions and 55 deletions

View File

@ -317,50 +317,21 @@ cmp_dynamic_offset_binding(const void *a, const void *b)
return *binding_a - *binding_b;
}
struct zink_descriptor_resource {
struct zink_resource *res;
bool write;
};
static inline void
read_descriptor_resource(struct zink_descriptor_resource *resource, struct zink_resource *res, unsigned *num_resources)
{
resource->res = res;
resource->write = false;
(*num_resources)++;
}
static inline void
write_descriptor_resource(struct zink_descriptor_resource *resource, struct zink_resource *res, unsigned *num_resources)
{
resource->res = res;
resource->write = true;
(*num_resources)++;
}
static bool
write_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zds, unsigned num_wds, VkWriteDescriptorSet *wds,
unsigned num_resources, struct zink_descriptor_resource *resources,
bool is_compute, bool cache_hit)
bool is_compute, bool cache_hit)
{
bool need_flush = false;
struct zink_batch *batch = is_compute ? &ctx->compute_batch : zink_curr_batch(ctx);
struct zink_screen *screen = zink_screen(ctx->base.screen);
assert(zds->desc_set);
unsigned check_flush_id = is_compute ? 0 : ZINK_COMPUTE_BATCH_ID;
for (int i = 0; i < num_resources; ++i) {
assert(num_resources <= zds->pool->num_resources);
struct zink_resource *res = resources[i].res;
if (res) {
need_flush |= zink_batch_reference_resource_rw(batch, res, resources[i].write) == check_flush_id;
}
}
if (!cache_hit && num_wds)
vkUpdateDescriptorSets(screen->dev, num_wds, wds, 0, NULL);
for (int i = 0; zds->pool->key.num_descriptors && i < util_dynarray_num_elements(&zds->barriers, struct zink_descriptor_barrier); ++i) {
struct zink_descriptor_barrier *barrier = util_dynarray_element(&zds->barriers, struct zink_descriptor_barrier, i);
need_flush |= zink_batch_reference_resource_rw(batch, barrier->res, zink_resource_access_is_write(barrier->access)) == check_flush_id;
zink_resource_barrier(ctx, NULL, barrier->res,
barrier->layout, barrier->access, barrier->stage);
}
@ -390,7 +361,6 @@ update_ubo_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zds
unsigned num_descriptors = pg->pool[zds->pool->type]->key.num_descriptors;
unsigned num_bindings = zds->pool->num_resources;
VkWriteDescriptorSet wds[num_descriptors];
struct zink_descriptor_resource resources[num_bindings];
VkDescriptorBufferInfo buffer_infos[num_bindings];
unsigned num_wds = 0;
unsigned num_buffer_info = 0;
@ -425,8 +395,7 @@ update_ubo_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zds
assert(!res || ctx->ubos[stage][index].buffer_size > 0);
assert(!res || ctx->ubos[stage][index].buffer);
assert(num_resources < num_bindings);
desc_set_res_add(zds, res, num_resources, cache_hit);
read_descriptor_resource(&resources[num_resources], res, &num_resources);
desc_set_res_add(zds, res, num_resources++, cache_hit);
assert(num_buffer_info < num_bindings);
buffer_infos[num_buffer_info].buffer = res ? res->buffer :
(screen->info.rb2_feats.nullDescriptor ?
@ -462,7 +431,7 @@ update_ubo_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zds
dynamic_offsets[i] = dynamic_buffers[i].offset;
*dynamic_offset_idx = dynamic_offset_count;
return write_descriptors(ctx, zds, num_wds, wds, num_resources, resources, is_compute, cache_hit);
return write_descriptors(ctx, zds, num_wds, wds, is_compute, cache_hit);
}
static bool
@ -474,7 +443,6 @@ update_ssbo_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zd
unsigned num_descriptors = pg->pool[zds->pool->type]->key.num_descriptors;
unsigned num_bindings = zds->pool->num_resources;
VkWriteDescriptorSet wds[num_descriptors];
struct zink_descriptor_resource resources[num_bindings];
VkDescriptorBufferInfo buffer_infos[num_bindings];
unsigned num_wds = 0;
unsigned num_buffer_info = 0;
@ -499,18 +467,14 @@ update_ssbo_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zd
assert(shader->bindings[zds->pool->type][j].type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER);
assert(num_resources < num_bindings);
struct zink_resource *res = zink_resource(ctx->ssbos[stage][index].buffer);
desc_set_res_add(zds, res, num_resources, cache_hit);
desc_set_res_add(zds, res, num_resources++, cache_hit);
if (res) {
assert(ctx->ssbos[stage][index].buffer_size > 0);
assert(ctx->ssbos[stage][index].buffer_size <= screen->info.props.limits.maxStorageBufferRange);
assert(num_buffer_info < num_bindings);
unsigned flag = VK_ACCESS_SHADER_READ_BIT;
if (ctx->writable_ssbos[stage] & (1 << index)) {
write_descriptor_resource(&resources[num_resources], res, &num_resources);
if (ctx->writable_ssbos[stage] & (1 << index))
flag |= VK_ACCESS_SHADER_WRITE_BIT;
} else {
read_descriptor_resource(&resources[num_resources], res, &num_resources);
}
if (!cache_hit)
add_barrier(res, 0, flag, stage, &zds->barriers, ht);
buffer_infos[num_buffer_info].buffer = res->buffer;
@ -529,7 +493,7 @@ update_ssbo_descriptors(struct zink_context *ctx, struct zink_descriptor_set *zd
}
}
_mesa_set_destroy(ht, NULL);
return write_descriptors(ctx, zds, num_wds, wds, num_resources, resources, is_compute, cache_hit);
return write_descriptors(ctx, zds, num_wds, wds, is_compute, cache_hit);
}
static void
@ -580,7 +544,6 @@ update_sampler_descriptors(struct zink_context *ctx, struct zink_descriptor_set
unsigned num_descriptors = pg->pool[zds->pool->type]->key.num_descriptors;
unsigned num_bindings = zds->pool->num_resources;
VkWriteDescriptorSet wds[num_descriptors];
struct zink_descriptor_resource resources[num_bindings];
VkDescriptorImageInfo image_infos[num_bindings];
VkBufferView buffer_view[] = {VK_NULL_HANDLE};
unsigned num_wds = 0;
@ -623,11 +586,10 @@ update_sampler_descriptors(struct zink_context *ctx, struct zink_descriptor_set
sampler = ctx->sampler_states[stage][index + k];
}
assert(num_resources < num_bindings);
desc_set_sampler_add(zds, sampler_view, sampler, num_resources, cache_hit);
desc_set_sampler_add(zds, sampler_view, sampler, num_resources++, cache_hit);
if (res) {
if (!cache_hit)
add_barrier(res, layout, VK_ACCESS_SHADER_READ_BIT, stage, &zds->barriers, ht);
read_descriptor_resource(&resources[num_resources], res, &num_resources);
}
assert(num_image_info < num_bindings);
handle_image_descriptor(screen, res, zds->pool->type, shader->bindings[zds->pool->type][j].type,
@ -644,7 +606,7 @@ update_sampler_descriptors(struct zink_context *ctx, struct zink_descriptor_set
}
}
_mesa_set_destroy(ht, NULL);
return write_descriptors(ctx, zds, num_wds, wds, num_resources, resources, is_compute, cache_hit);
return write_descriptors(ctx, zds, num_wds, wds, is_compute, cache_hit);
}
static bool
@ -656,7 +618,6 @@ update_image_descriptors(struct zink_context *ctx, struct zink_descriptor_set *z
unsigned num_descriptors = pg->pool[zds->pool->type]->key.num_descriptors;
unsigned num_bindings = zds->pool->num_resources;
VkWriteDescriptorSet wds[num_descriptors];
struct zink_descriptor_resource resources[num_bindings];
VkDescriptorImageInfo image_infos[num_bindings];
VkBufferView buffer_view[] = {VK_NULL_HANDLE};
unsigned num_wds = 0;
@ -697,7 +658,7 @@ update_image_descriptors(struct zink_context *ctx, struct zink_descriptor_set *z
layout = VK_IMAGE_LAYOUT_GENERAL;
}
assert(num_resources < num_bindings);
desc_set_image_add(zds, image_view, num_resources, cache_hit);
desc_set_image_add(zds, image_view, num_resources++, cache_hit);
if (res) {
VkAccessFlags flags = 0;
if (image_view->base.access & PIPE_IMAGE_ACCESS_READ)
@ -706,12 +667,8 @@ update_image_descriptors(struct zink_context *ctx, struct zink_descriptor_set *z
flags |= VK_ACCESS_SHADER_WRITE_BIT;
if (!cache_hit)
add_barrier(res, layout, flags, stage, &zds->barriers, ht);
if (image_view->base.access & PIPE_IMAGE_ACCESS_WRITE)
write_descriptor_resource(&resources[num_resources], res, &num_resources);
else
read_descriptor_resource(&resources[num_resources], res, &num_resources);
}
assert(num_image_info < num_bindings);
handle_image_descriptor(screen, res, zds->pool->type, shader->bindings[zds->pool->type][j].type,
&wds[num_wds], layout, &num_image_info, &image_infos[num_image_info],
@ -727,7 +684,7 @@ update_image_descriptors(struct zink_context *ctx, struct zink_descriptor_set *z
}
}
_mesa_set_destroy(ht, NULL);
return write_descriptors(ctx, zds, num_wds, wds, num_resources, resources, is_compute, cache_hit);
return write_descriptors(ctx, zds, num_wds, wds, is_compute, cache_hit);
}
static void