mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-29 23:10:11 +01:00
zink: add a mechanism to trigger copy box resets from batch state reset
the resource isn't available during batch state reset, so a new flag is needed to force a reset the next time the copy boxes would be used Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21779>
This commit is contained in:
parent
aaca91eb79
commit
46f98da188
4 changed files with 7 additions and 0 deletions
|
|
@ -33,6 +33,7 @@ reset_obj(struct zink_screen *screen, struct zink_batch_state *bs, struct zink_r
|
|||
obj->access = 0;
|
||||
obj->last_write = 0;
|
||||
obj->access_stage = 0;
|
||||
obj->copies_need_reset = true;
|
||||
/* also prune dead view objects */
|
||||
simple_mtx_lock(&obj->view_lock);
|
||||
if (obj->is_buffer) {
|
||||
|
|
|
|||
|
|
@ -3834,6 +3834,8 @@ zink_check_transfer_dst_barrier(struct zink_resource *res, unsigned level, const
|
|||
void
|
||||
zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_resource *res, unsigned level, const struct pipe_box *box)
|
||||
{
|
||||
if (res->obj->copies_need_reset)
|
||||
zink_resource_copies_reset(res);
|
||||
/* skip TRANSFER_DST barrier if no intersection from previous copies */
|
||||
if (res->layout != VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL || zink_resource_copy_box_intersects(res, level, box)) {
|
||||
zink_screen(ctx->base.screen)->image_barrier(ctx, res, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT);
|
||||
|
|
@ -3848,6 +3850,8 @@ zink_resource_image_transfer_dst_barrier(struct zink_context *ctx, struct zink_r
|
|||
void
|
||||
zink_resource_buffer_transfer_dst_barrier(struct zink_context *ctx, struct zink_resource *res, unsigned offset, unsigned size)
|
||||
{
|
||||
if (res->obj->copies_need_reset)
|
||||
zink_resource_copies_reset(res);
|
||||
struct pipe_box box = {offset, 0, 0, size, 0, 0};
|
||||
/* must barrier if something read the valid buffer range */
|
||||
bool valid_read = res->obj->access && util_ranges_intersect(&res->valid_buffer_range, offset, offset + size) && !unordered_res_exec(ctx, res, true);
|
||||
|
|
|
|||
|
|
@ -2364,6 +2364,7 @@ zink_resource_copies_reset(struct zink_resource *res)
|
|||
for (unsigned i = 0; i < max_level; i++)
|
||||
util_dynarray_clear(&res->obj->copies[i]);
|
||||
res->obj->copies_valid = false;
|
||||
res->obj->copies_need_reset = false;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -1120,6 +1120,7 @@ struct zink_resource_object {
|
|||
bool unordered_read;
|
||||
bool unordered_write;
|
||||
bool copies_valid;
|
||||
bool copies_need_reset; //for use with batch state resets
|
||||
|
||||
unsigned persistent_maps; //if nonzero, requires vkFlushMappedMemoryRanges during batch use
|
||||
struct util_dynarray copies[16]; //regions being copied to; for barrier omission
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue