diff --git a/src/gallium/drivers/zink/zink_batch.c b/src/gallium/drivers/zink/zink_batch.c index 9e132640da7..276997f8d14 100644 --- a/src/gallium/drivers/zink/zink_batch.c +++ b/src/gallium/drivers/zink/zink_batch.c @@ -36,8 +36,7 @@ zink_reset_batch_state(struct zink_context *ctx, struct zink_batch_state *bs) /* unref all used resources */ set_foreach_remove(bs->resources, entry) { struct zink_resource_object *obj = (struct zink_resource_object *)entry->key; - zink_batch_usage_unset(&obj->reads, bs); - zink_batch_usage_unset(&obj->writes, bs); + zink_resource_object_usage_unset(obj, bs); zink_resource_object_reference(screen, &obj, NULL); } diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index 9df354f9fe4..18edf0e7da2 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3232,8 +3232,7 @@ zink_resource_commit(struct pipe_context *pctx, struct pipe_resource *pres, unsi struct zink_screen *screen = zink_screen(pctx->screen); /* if any current usage exists, flush the queue */ - if (zink_batch_usage_is_unflushed(res->obj->reads) || - zink_batch_usage_is_unflushed(res->obj->writes)) + if (zink_resource_has_unflushed_usage(res)) zink_flush_queue(ctx); uint8_t *mem = malloc(sizeof(VkBindSparseInfo) + sizeof(VkSparseBufferMemoryBindInfo) + sizeof(VkSparseMemoryBind) + sizeof(void*)); @@ -3339,8 +3338,7 @@ zink_context_replace_buffer_storage(struct pipe_context *pctx, struct pipe_resou assert(d->internal_format == s->internal_format); util_idalloc_mt_free(&zink_screen(pctx->screen)->buffer_ids, delete_buffer_id); - if (zink_batch_usage_is_unflushed(d->obj->reads) || - zink_batch_usage_is_unflushed(d->obj->writes)) + if (zink_resource_has_unflushed_usage(d)) zink_batch_reference_resource(&zink_context(pctx)->batch, d); zink_resource_object_reference(zink_screen(pctx->screen), &d->obj, s->obj); d->access = s->access; diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index ee9f752905e..b4a975bbcbd 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -1174,13 +1174,11 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne if ((usage & PIPE_MAP_WRITE) && (usage & PIPE_MAP_DISCARD_RANGE || (!(usage & PIPE_MAP_READ) && zink_resource_has_usage(res))) && ((!res->obj->host_visible) || !(usage & (PIPE_MAP_UNSYNCHRONIZED | PIPE_MAP_PERSISTENT)))) { - /* Check if mapping this buffer would cause waiting for the GPU. */ if (!res->obj->host_visible || - !zink_batch_usage_check_completion(ctx, res->obj->reads) || - !zink_batch_usage_check_completion(ctx, res->obj->writes)) { + !zink_resource_usage_check_completion(screen, res, ZINK_RESOURCE_ACCESS_RW)) { /* Do a wait-free write-only transfer using a temporary buffer. */ unsigned offset; @@ -1208,7 +1206,7 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne /* sparse/device-local will always need to wait since it has to copy */ if (!res->obj->host_visible) return NULL; - if (!zink_batch_usage_check_completion(ctx, res->obj->writes)) + if (!zink_resource_usage_check_completion(screen, res, ZINK_RESOURCE_ACCESS_WRITE)) return NULL; } else if (!res->obj->host_visible) { trans->staging_res = pipe_buffer_create(&screen->base, PIPE_BIND_LINEAR, PIPE_USAGE_STAGING, box->x + box->width); @@ -1219,7 +1217,7 @@ buffer_transfer_map(struct zink_context *ctx, struct zink_resource *res, unsigne res = staging_res; zink_fence_wait(&ctx->base); } else - zink_batch_usage_wait(ctx, res->obj->writes); + zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_WRITE); } if (!ptr) { @@ -1330,8 +1328,8 @@ zink_transfer_map(struct pipe_context *pctx, if (usage & PIPE_MAP_READ) { /* force multi-context sync */ - if (zink_batch_usage_is_unflushed(res->obj->writes)) - zink_batch_usage_wait(ctx, res->obj->writes); + if (zink_resource_usage_is_unflushed_write(res)) + zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_WRITE); zink_transfer_copy_bufimage(ctx, staging_res, res, trans); /* need to wait for rendering to finish */ zink_fence_wait(pctx); @@ -1349,7 +1347,7 @@ zink_transfer_map(struct pipe_context *pctx, if (usage & PIPE_MAP_WRITE) zink_fence_wait(pctx); else - zink_batch_usage_wait(ctx, res->obj->writes); + zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_WRITE); } VkImageSubresource isr = { res->obj->modifier_aspect ? res->obj->modifier_aspect : res->aspect, @@ -1551,7 +1549,7 @@ zink_resource_object_init_storage(struct zink_context *ctx, struct zink_resource struct zink_resource staging = *res; staging.obj = old_obj; bool needs_unref = true; - if (get_resource_usage(res)) { + if (zink_resource_has_usage(res)) { zink_batch_reference_resource_move(&ctx->batch, res); needs_unref = false; }