diff --git a/src/virtio/vulkan/vn_buffer.h b/src/virtio/vulkan/vn_buffer.h index 998dde8d449..50181070ec2 100644 --- a/src/virtio/vulkan/vn_buffer.h +++ b/src/virtio/vulkan/vn_buffer.h @@ -48,6 +48,11 @@ struct vn_buffer { struct vn_object_base base; struct vn_buffer_memory_requirements requirements; + + struct { + /* buffer is prime blit dst */ + struct vn_device_memory *mem; + } wsi; }; VK_DEFINE_NONDISP_HANDLE_CASTS(vn_buffer, base.vk, diff --git a/src/virtio/vulkan/vn_command_buffer.c b/src/virtio/vulkan/vn_command_buffer.c index 84c3c1b60a9..3a34f8835f5 100644 --- a/src/virtio/vulkan/vn_command_buffer.c +++ b/src/virtio/vulkan/vn_command_buffer.c @@ -1481,6 +1481,19 @@ vn_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, uint32_t regionCount, const VkBufferImageCopy *pRegions) { + struct vn_image *img = vn_image_from_handle(srcImage); + struct vn_buffer *buf = vn_buffer_from_handle(dstBuffer); + + /* The prime blit dst buffer is internal to common wsi layer. Only the + * corresponding wsi image can blit to it. + */ + if (buf->wsi.mem) { + assert(img->wsi.is_wsi); + assert(img->wsi.is_prime_blit_src); + assert(!img->wsi.blit_mem); + img->wsi.blit_mem = buf->wsi.mem; + } + VN_CMD_ENQUEUE(vkCmdCopyImageToBuffer, commandBuffer, srcImage, srcImageLayout, dstBuffer, regionCount, pRegions); } diff --git a/src/virtio/vulkan/vn_device_memory.c b/src/virtio/vulkan/vn_device_memory.c index 19b4a91219f..7aec50aad19 100644 --- a/src/virtio/vulkan/vn_device_memory.c +++ b/src/virtio/vulkan/vn_device_memory.c @@ -363,14 +363,18 @@ vn_AllocateMemory(VkDevice device, const VkImportMemoryFdInfoKHR *import_fd_info = NULL; const VkMemoryDedicatedAllocateInfo *dedicated_info = NULL; + const struct wsi_memory_allocate_info *wsi_info = NULL; vk_foreach_struct_const(pnext, pAllocateInfo->pNext) { - switch (pnext->sType) { + switch ((uint32_t)pnext->sType) { case VK_STRUCTURE_TYPE_IMPORT_MEMORY_FD_INFO_KHR: import_fd_info = (const void *)pnext; break; case VK_STRUCTURE_TYPE_MEMORY_DEDICATED_ALLOCATE_INFO: dedicated_info = (const void *)pnext; break; + case VK_STRUCTURE_TYPE_WSI_MEMORY_ALLOCATE_INFO_MESA: + wsi_info = (const void *)pnext; + break; default: break; } @@ -391,6 +395,16 @@ vn_AllocateMemory(VkDevice device, import_fd_info->fd); } else { result = vn_device_memory_alloc(dev, mem, pAllocateInfo); + + /* track prime blit dst buffer memory */ + if (wsi_info && result == VK_SUCCESS) { + assert(dedicated_info); + if (dedicated_info->buffer != VK_NULL_HANDLE) { + struct vn_buffer *buf = + vn_buffer_from_handle(dedicated_info->buffer); + buf->wsi.mem = mem; + } + } } vn_device_memory_emit_report(dev, mem, /* is_alloc */ true, result); diff --git a/src/virtio/vulkan/vn_image.h b/src/virtio/vulkan/vn_image.h index 54bf16f191f..f524a08000d 100644 --- a/src/virtio/vulkan/vn_image.h +++ b/src/virtio/vulkan/vn_image.h @@ -79,6 +79,9 @@ struct vn_image { struct vn_device_memory *memory; + /* memory backing the prime blit dst buffer */ + struct vn_device_memory *blit_mem; + /* For VK_ANDROID_native_buffer, the WSI image owns the memory. */ bool memory_owned; } wsi;