zink: move barrier info to resource object struct

this is a bit more accurate

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12845>
This commit is contained in:
Mike Blumenkrantz
2021-09-08 15:25:01 -04:00
committed by Marge Bot
parent cb65ac9bdf
commit ecf5d706ef
4 changed files with 33 additions and 39 deletions
+1 -1
View File
@@ -489,7 +489,7 @@ copy_scanout(struct zink_batch_state *bs, struct zink_resource *res)
zink_resource_image_barrier_init(&imb1, res, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
VKCTX(CmdPipelineBarrier)(
bs->cmdbuf,
res->access_stage ? res->access_stage : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
res->obj->access_stage ? res->obj->access_stage : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT,
0,
0, NULL,
+26 -29
View File
@@ -2254,9 +2254,9 @@ zink_resource_image_needs_barrier(struct zink_resource *res, VkImageLayout new_l
pipeline = pipeline_dst_stage(new_layout);
if (!flags)
flags = access_dst_flags(new_layout);
return res->layout != new_layout || (res->access_stage & pipeline) != pipeline ||
(res->access & flags) != flags ||
zink_resource_access_is_write(res->access) ||
return res->layout != new_layout || (res->obj->access_stage & pipeline) != pipeline ||
(res->obj->access & flags) != flags ||
zink_resource_access_is_write(res->obj->access) ||
zink_resource_access_is_write(flags);
}
@@ -2276,7 +2276,7 @@ zink_resource_image_barrier_init(VkImageMemoryBarrier *imb, struct zink_resource
*imb = (VkImageMemoryBarrier){
VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
NULL,
res->access ? res->access : access_src_flags(res->layout),
res->obj->access ? res->obj->access : access_src_flags(res->layout),
flags,
res->layout,
new_layout,
@@ -2316,12 +2316,12 @@ resource_check_defer_buffer_barrier(struct zink_context *ctx, struct zink_resour
static inline VkCommandBuffer
get_cmdbuf(struct zink_context *ctx, struct zink_resource *res)
{
if ((res->access && !res->unordered_barrier) || !ctx->batch.in_rp) {
if ((res->obj->access && !res->obj->unordered_barrier) || !ctx->batch.in_rp) {
zink_batch_no_rp(ctx);
res->unordered_barrier = false;
res->obj->unordered_barrier = false;
return ctx->batch.state->cmdbuf;
}
res->unordered_barrier = true;
res->obj->unordered_barrier = true;
ctx->batch.state->has_barriers = true;
return ctx->batch.state->barrier_cmdbuf;
}
@@ -2375,7 +2375,7 @@ zink_resource_image_barrier(struct zink_context *ctx, struct zink_resource *res,
}
VKCTX(CmdPipelineBarrier)(
cmdbuf,
res->access_stage ? res->access_stage : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
res->obj->access_stage ? res->obj->access_stage : VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
pipeline,
0,
0, NULL,
@@ -2385,12 +2385,12 @@ zink_resource_image_barrier(struct zink_context *ctx, struct zink_resource *res,
resource_check_defer_image_barrier(ctx, res, new_layout, pipeline);
if (res->unordered_barrier) {
res->access |= imb.dstAccessMask;
res->access_stage |= pipeline;
if (res->obj->unordered_barrier) {
res->obj->access |= imb.dstAccessMask;
res->obj->access_stage |= pipeline;
} else {
res->access = imb.dstAccessMask;
res->access_stage = pipeline;
res->obj->access = imb.dstAccessMask;
res->obj->access_stage = pipeline;
}
res->layout = new_layout;
}
@@ -2438,21 +2438,21 @@ pipeline_access_stage(VkAccessFlags flags)
ALWAYS_INLINE static bool
zink_resource_buffer_needs_barrier(struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline)
{
if (!res->access || !res->access_stage)
if (!res->obj->access || !res->obj->access_stage)
return true;
if (!pipeline)
pipeline = pipeline_access_stage(flags);
return zink_resource_access_is_write(res->access) ||
return zink_resource_access_is_write(res->obj->access) ||
zink_resource_access_is_write(flags) ||
((res->access_stage & pipeline) != pipeline && !(res->access_stage & (pipeline - 1))) ||
(res->access & flags) != flags;
((res->obj->access_stage & pipeline) != pipeline && !(res->obj->access_stage & (pipeline - 1))) ||
(res->obj->access & flags) != flags;
}
void
zink_fake_buffer_barrier(struct zink_resource *res, VkAccessFlags flags, VkPipelineStageFlags pipeline)
{
res->access = flags;
res->access_stage = pipeline;
res->obj->access = flags;
res->obj->access_stage = pipeline;
}
void
@@ -2466,13 +2466,13 @@ zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_resource *res
bmb.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
bmb.pNext = NULL;
bmb.srcAccessMask = res->access;
bmb.srcAccessMask = res->obj->access;
bmb.dstAccessMask = flags;
VkCommandBuffer cmdbuf = get_cmdbuf(ctx, res);
/* only barrier if we're changing layout or doing something besides read -> read */
VKCTX(CmdPipelineBarrier)(
cmdbuf,
res->access_stage ? res->access_stage : pipeline_access_stage(res->access),
res->obj->access_stage ? res->obj->access_stage : pipeline_access_stage(res->obj->access),
pipeline,
0,
1, &bmb,
@@ -2482,12 +2482,12 @@ zink_resource_buffer_barrier(struct zink_context *ctx, struct zink_resource *res
resource_check_defer_buffer_barrier(ctx, res, pipeline);
if (res->unordered_barrier) {
res->access |= bmb.dstAccessMask;
res->access_stage |= pipeline;
if (res->obj->unordered_barrier) {
res->obj->access |= bmb.dstAccessMask;
res->obj->access_stage |= pipeline;
} else {
res->access = bmb.dstAccessMask;
res->access_stage = pipeline;
res->obj->access = bmb.dstAccessMask;
res->obj->access_stage = pipeline;
}
}
@@ -3448,9 +3448,6 @@ zink_context_replace_buffer_storage(struct pipe_context *pctx, struct pipe_resou
else
zink_resource_object_reference(screen, &d->obj, NULL);
d->obj = s->obj;
d->access = s->access;
d->access_stage = s->access_stage;
d->unordered_barrier = s->unordered_barrier;
/* force counter buffer reset */
d->so_valid = false;
if (num_rebinds && rebind_buffer(ctx, d, rebind_mask, num_rebinds) != num_rebinds)
+2 -5
View File
@@ -988,9 +988,6 @@ invalidate_buffer(struct zink_context *ctx, struct zink_resource *res)
/* this ref must be transferred before rebind or else BOOM */
zink_batch_reference_resource_move(&ctx->batch, res);
res->obj = new_obj;
res->access_stage = 0;
res->access = 0;
res->unordered_barrier = false;
zink_resource_rebind(ctx, res);
zink_descriptor_set_refs_clear(&old_obj->desc_set_refs, old_obj);
return true;
@@ -1227,8 +1224,8 @@ zink_buffer_map(struct pipe_context *pctx,
zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_RW);
else
zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_WRITE);
res->access = 0;
res->access_stage = 0;
res->obj->access = 0;
res->obj->access_stage = 0;
}
if (!ptr) {
+4 -4
View File
@@ -54,6 +54,10 @@ struct mem_key {
struct zink_resource_object {
struct pipe_reference reference;
VkPipelineStageFlagBits access_stage;
VkAccessFlags access;
bool unordered_barrier;
unsigned persistent_maps; //if nonzero, requires vkFlushMappedMemoryRanges during batch use
struct zink_descriptor_refs desc_set_refs;
@@ -89,10 +93,6 @@ struct zink_resource {
enum pipe_format internal_format:16;
VkPipelineStageFlagBits access_stage;
VkAccessFlags access;
bool unordered_barrier;
struct zink_resource_object *obj;
struct zink_resource_object *scanout_obj; //TODO: remove for wsi
bool scanout_obj_init;