diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index a3636438d31..c181f225f1c 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -3744,10 +3744,10 @@ zink_resource_image_barrier(struct zink_context *ctx, struct zink_resource *res, if (res->obj->needs_zs_evaluate) imb.pNext = &res->obj->zs_evaluate; res->obj->needs_zs_evaluate = false; - if (res->dmabuf_acquire) { - imb.srcQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT; + if (res->queue != zink_screen(ctx->base.screen)->gfx_queue && res->queue != VK_QUEUE_FAMILY_IGNORED) { + imb.srcQueueFamilyIndex = res->queue; imb.dstQueueFamilyIndex = zink_screen(ctx->base.screen)->gfx_queue; - res->dmabuf_acquire = false; + res->queue = VK_QUEUE_FAMILY_IGNORED; } bool marker = zink_cmd_debug_marker_begin(ctx, cmdbuf, "image_barrier(%s->%s)", vk_ImageLayout_to_str(res->layout), vk_ImageLayout_to_str(new_layout)); VKCTX(CmdPipelineBarrier)( @@ -3791,10 +3791,10 @@ zink_resource_image_barrier2(struct zink_context *ctx, struct zink_resource *res if (res->obj->needs_zs_evaluate) imb.pNext = &res->obj->zs_evaluate; res->obj->needs_zs_evaluate = false; - if (res->dmabuf_acquire) { - imb.srcQueueFamilyIndex = VK_QUEUE_FAMILY_FOREIGN_EXT; + if (res->queue != zink_screen(ctx->base.screen)->gfx_queue && res->queue != VK_QUEUE_FAMILY_IGNORED) { + imb.srcQueueFamilyIndex = res->queue; imb.dstQueueFamilyIndex = zink_screen(ctx->base.screen)->gfx_queue; - res->dmabuf_acquire = false; + res->queue = VK_QUEUE_FAMILY_IGNORED; } VkDependencyInfo dep = { VK_STRUCTURE_TYPE_DEPENDENCY_INFO, @@ -4366,7 +4366,7 @@ zink_flush_resource(struct pipe_context *pctx, } ctx->batch.swapchain = res; } else if (res->dmabuf) - res->dmabuf_acquire = true; + res->queue = VK_QUEUE_FAMILY_FOREIGN_EXT; } static struct pipe_stream_output_target * diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index e41ce7f0a95..c379a670593 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -1232,8 +1232,10 @@ resource_create(struct pipe_screen *pscreen, res->need_2D = (screen->need_2D_zs && util_format_is_depth_or_stencil(templ->format)) || (screen->need_2D_sparse && (templ->flags & PIPE_RESOURCE_FLAG_SPARSE)); } - res->dmabuf = res->dmabuf_acquire = whandle && whandle->type == WINSYS_HANDLE_TYPE_FD; - res->layout = res->dmabuf_acquire ? VK_IMAGE_LAYOUT_PREINITIALIZED : VK_IMAGE_LAYOUT_UNDEFINED; + res->dmabuf = whandle && whandle->type == WINSYS_HANDLE_TYPE_FD; + if (res->dmabuf) + res->queue = VK_QUEUE_FAMILY_FOREIGN_EXT; + res->layout = res->dmabuf ? VK_IMAGE_LAYOUT_PREINITIALIZED : VK_IMAGE_LAYOUT_UNDEFINED; res->linear = linear; res->aspect = aspect_from_format(templ->format); } diff --git a/src/gallium/drivers/zink/zink_types.h b/src/gallium/drivers/zink/zink_types.h index 2eee620d0ca..4f5251c45a0 100644 --- a/src/gallium/drivers/zink/zink_types.h +++ b/src/gallium/drivers/zink/zink_types.h @@ -1236,7 +1236,6 @@ struct zink_resource { }; bool swapchain; - bool dmabuf_acquire; bool dmabuf; unsigned dt_stride;