venus: update create_from_device_memory to take a cmd payload

This is to leverage drm_virtgpu_resource_create_blob::cmd for expressing
the blob mem host resource dependency in the virtgpu backend, which can
avoid the execbuf. Similar for vtest backend.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/42003>
This commit is contained in:
Yiwei Zhang 2026-06-01 14:53:44 -07:00 committed by Marge Bot
parent 2b37a0b410
commit 77b73d8595
4 changed files with 21 additions and 6 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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);