result = vn_renderer_bo_create_from_device_memory(
dev->renderer, mem->size, mem->base.id, mem_flags, 0, &mem->base_bo);
- if (result != VK_SUCCESS)
+ if (result != VK_SUCCESS) {
+ assert(!mem->base_bo);
goto fail;
+ }
- vn_instance_roundtrip(dev->instance);
+ result =
+ vn_instance_submit_roundtrip(dev->instance, &mem->bo_roundtrip_seqno);
+ if (result != VK_SUCCESS)
+ goto fail;
+ mem->bo_roundtrip_seqno_valid = true;
*out_mem = mem;
return VK_SUCCESS;
fail:
+ if (mem->base_bo)
+ vn_renderer_bo_unref(dev->renderer, mem->base_bo);
if (mem_handle != VK_NULL_HANDLE)
vn_async_vkFreeMemory(dev->instance, dev_handle, mem_handle, NULL);
vn_object_base_fini(&mem->base);
if (!vn_renderer_bo_unref(dev->renderer, pool_mem->base_bo))
return;
+ /* wait on valid bo_roundtrip_seqno before vkFreeMemory */
+ if (pool_mem->bo_roundtrip_seqno_valid)
+ vn_instance_wait_roundtrip(dev->instance, pool_mem->bo_roundtrip_seqno);
+
vn_async_vkFreeMemory(dev->instance, vn_device_to_handle(dev),
vn_device_memory_to_handle(pool_mem), NULL);
vn_object_base_fini(&pool_mem->base);
return result;
}
- vn_instance_roundtrip(dev->instance);
+ result =
+ vn_instance_submit_roundtrip(dev->instance, &mem->bo_roundtrip_seqno);
+ if (result != VK_SUCCESS) {
+ vn_renderer_bo_unref(dev->renderer, mem->base_bo);
+ vn_async_vkFreeMemory(dev->instance, dev_handle, mem_handle, NULL);
+ return result;
+ }
+
+ mem->bo_roundtrip_seqno_valid = true;
return VK_SUCCESS;
}
} else {
if (mem->base_bo)
vn_renderer_bo_unref(dev->renderer, mem->base_bo);
+
+ if (mem->bo_roundtrip_seqno_valid)
+ vn_instance_wait_roundtrip(dev->instance, mem->bo_roundtrip_seqno);
+
vn_async_vkFreeMemory(dev->instance, device, memory, NULL);
}