diff --git a/src/virtio/vulkan/vn_device_memory.c b/src/virtio/vulkan/vn_device_memory.c index 213830aa9be..d1e1bac9c85 100644 --- a/src/virtio/vulkan/vn_device_memory.c +++ b/src/virtio/vulkan/vn_device_memory.c @@ -93,8 +93,8 @@ vn_device_memory_bo_init(struct vn_device *dev, struct vn_device_memory *mem) const VkMemoryType *mem_type = &dev->physical_device->memory_properties .memoryTypes[mem_vk->memory_type_index]; return vn_renderer_bo_create_from_device_memory( - dev->renderer, mem_vk->size, mem->base.id, mem_type->propertyFlags, - mem_vk->export_handle_types, &mem->base_bo); + dev->renderer, NULL, mem_vk->size, mem->base.id, + mem_type->propertyFlags, mem_vk->export_handle_types, &mem->base_bo); } static inline void @@ -168,7 +168,7 @@ vn_device_memory_alloc_guest_vram(struct vn_device *dev, flags |= VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT; VkResult result = vn_renderer_bo_create_from_device_memory( - dev->renderer, mem_vk->size, mem->base.id, flags, + dev->renderer, NULL, mem_vk->size, mem->base.id, flags, mem_vk->export_handle_types, &mem->base_bo); if (result != VK_SUCCESS) { return result; diff --git a/src/virtio/vulkan/vn_renderer.h b/src/virtio/vulkan/vn_renderer.h index 08f34df0454..a182efc69e2 100644 --- a/src/virtio/vulkan/vn_renderer.h +++ b/src/virtio/vulkan/vn_renderer.h @@ -148,6 +148,7 @@ struct vn_renderer_shmem_ops { struct vn_renderer_bo_ops { VkResult (*create_from_device_memory)( struct vn_renderer *renderer, + struct vn_renderer_submit_batch *batch, VkDeviceSize size, vn_object_id mem_id, VkMemoryPropertyFlags flags, @@ -315,6 +316,7 @@ vn_renderer_shmem_unref(struct vn_renderer *renderer, static inline VkResult vn_renderer_bo_create_from_device_memory( struct vn_renderer *renderer, + struct vn_renderer_submit_batch *batch, VkDeviceSize size, vn_object_id mem_id, VkMemoryPropertyFlags flags, @@ -323,7 +325,7 @@ vn_renderer_bo_create_from_device_memory( { struct vn_renderer_bo *bo; VkResult result = renderer->bo_ops.create_from_device_memory( - renderer, size, mem_id, flags, external_handles, &bo); + renderer, batch, size, mem_id, flags, external_handles, &bo); if (result != VK_SUCCESS) return result; diff --git a/src/virtio/vulkan/vn_renderer_virtgpu.c b/src/virtio/vulkan/vn_renderer_virtgpu.c index 9e233b560d3..dacddeeab62 100644 --- a/src/virtio/vulkan/vn_renderer_virtgpu.c +++ b/src/virtio/vulkan/vn_renderer_virtgpu.c @@ -629,6 +629,7 @@ virtgpu_ioctl_context_init(struct virtgpu *gpu, uint32_t capset_id) static uint32_t virtgpu_ioctl_resource_create_blob(struct virtgpu *gpu, + struct vn_renderer_submit_batch *batch, uint32_t blob_mem, uint32_t blob_flags, size_t blob_size, @@ -643,6 +644,8 @@ virtgpu_ioctl_resource_create_blob(struct virtgpu *gpu, .blob_mem = blob_mem, .blob_flags = blob_flags, .size = blob_size, + .cmd_size = batch ? batch->cs_size : 0, + .cmd = batch ? (uintptr_t)batch->cs_data : 0, .blob_id = blob_id, }; @@ -1298,6 +1301,7 @@ fail: static VkResult virtgpu_bo_create_from_device_memory( struct vn_renderer *renderer, + struct vn_renderer_submit_batch *batch, VkDeviceSize size, vn_object_id mem_id, VkMemoryPropertyFlags flags, @@ -1310,7 +1314,7 @@ virtgpu_bo_create_from_device_memory( uint32_t res_id; uint32_t gem_handle = virtgpu_ioctl_resource_create_blob( - gpu, gpu->bo_blob_mem, blob_flags, size, mem_id, &res_id); + gpu, batch, gpu->bo_blob_mem, blob_flags, size, mem_id, &res_id); if (!gem_handle) return VK_ERROR_OUT_OF_DEVICE_MEMORY; @@ -1394,7 +1398,7 @@ virtgpu_shmem_create(struct vn_renderer *renderer, size_t size) uint32_t res_id; uint32_t gem_handle = virtgpu_ioctl_resource_create_blob( - gpu, gpu->shmem_blob_mem, VIRTGPU_BLOB_FLAG_USE_MAPPABLE, size, 0, + gpu, NULL, gpu->shmem_blob_mem, VIRTGPU_BLOB_FLAG_USE_MAPPABLE, size, 0, &res_id); if (!gem_handle) return NULL; diff --git a/src/virtio/vulkan/vn_renderer_vtest.c b/src/virtio/vulkan/vn_renderer_vtest.c index 5fad0b02f84..ae27d5bfe59 100644 --- a/src/virtio/vulkan/vn_renderer_vtest.c +++ b/src/virtio/vulkan/vn_renderer_vtest.c @@ -746,6 +746,7 @@ vtest_bo_blob_flags(VkMemoryPropertyFlags flags, static VkResult vtest_bo_create_from_device_memory( struct vn_renderer *renderer, + struct vn_renderer_submit_batch *batch, VkDeviceSize size, vn_object_id mem_id, VkMemoryPropertyFlags flags, @@ -756,6 +757,14 @@ vtest_bo_create_from_device_memory( const uint32_t blob_flags = vtest_bo_blob_flags(flags, external_handles); mtx_lock(&vtest->sock_mutex); + if (batch) { + const struct vn_renderer_submit submit = { + .batches = batch, + .batch_count = 1, + }; + vtest_vcmd_submit_cmd2(vtest, &submit); + } + int res_fd; uint32_t res_id = vtest_vcmd_resource_create_blob( vtest, VCMD_BLOB_TYPE_HOST3D, blob_flags, size, mem_id, &res_fd);