blob: 3f88550e2b1b80d3fa07b3b85a5d493ea3a702db [file] [log] [blame]
From 97aa90dec2bdd5b8b1a0c274deb8c330aae7ae44 Mon Sep 17 00:00:00 2001
From: Yiwei Zhang <zzyiwei@chromium.org>
Date: Wed, 1 Sep 2021 21:30:36 +0000
Subject: [PATCH 2/2] venus: workaround a blob_mem mappable size check issue
For blob_mem allocated from virtgpu_virgl backend, the guest mappable
size queried can be smaller than the size returned from image memory
requirement query from the host side. Here we temporarily workaround
until we switch to use cross-domain backend in minigbm.
Cc: 21.2.3 mesa-stable
Signed-off-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Ryan Neph <ryanneph@google.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12687>
---
src/virtio/vulkan/vn_android.c | 11 +++++++++--
src/virtio/vulkan/vn_device_memory.c | 15 +++++++++------
src/virtio/vulkan/vn_device_memory.h | 1 +
3 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/src/virtio/vulkan/vn_android.c b/src/virtio/vulkan/vn_android.c
index 121f124853f..52901e75bd0 100644
--- a/src/virtio/vulkan/vn_android.c
+++ b/src/virtio/vulkan/vn_android.c
@@ -918,6 +918,7 @@ vn_android_device_import_ahb(struct vn_device *dev,
int dup_fd = -1;
uint64_t alloc_size = 0;
uint32_t mem_type_bits = 0;
+ bool force_unmappable = false;
VkResult result = VK_SUCCESS;
handle = AHardwareBuffer_getNativeHandle(ahb);
@@ -960,6 +961,12 @@ vn_android_device_import_ahb(struct vn_device *dev,
}
alloc_size = mem_req.size;
+
+ /* XXX Workaround before we use cross-domain backend in minigbm. The
+ * blob_mem allocated from virgl backend can have a queried guest mappable
+ * size smaller than the size returned from image memory requirement.
+ */
+ force_unmappable = true;
}
if (dedicated_info && dedicated_info->buffer != VK_NULL_HANDLE) {
@@ -999,8 +1006,8 @@ vn_android_device_import_ahb(struct vn_device *dev,
.allocationSize = alloc_size,
.memoryTypeIndex = alloc_info->memoryTypeIndex,
};
- result =
- vn_device_memory_import_dma_buf(dev, mem, &local_alloc_info, dup_fd);
+ result = vn_device_memory_import_dma_buf(dev, mem, &local_alloc_info,
+ force_unmappable, dup_fd);
if (result != VK_SUCCESS) {
close(dup_fd);
return result;
diff --git a/src/virtio/vulkan/vn_device_memory.c b/src/virtio/vulkan/vn_device_memory.c
index 89226dde332..5a38cb416f9 100644
--- a/src/virtio/vulkan/vn_device_memory.c
+++ b/src/virtio/vulkan/vn_device_memory.c
@@ -224,20 +224,23 @@ VkResult
vn_device_memory_import_dma_buf(struct vn_device *dev,
struct vn_device_memory *mem,
const VkMemoryAllocateInfo *alloc_info,
+ bool force_unmappable,
int fd)
{
VkDevice device = vn_device_to_handle(dev);
VkDeviceMemory memory = vn_device_memory_to_handle(mem);
const VkPhysicalDeviceMemoryProperties *mem_props =
&dev->physical_device->memory_properties.memoryProperties;
- const VkMemoryType *mem_type =
- &mem_props->memoryTypes[alloc_info->memoryTypeIndex];
+ VkMemoryPropertyFlags mem_flags =
+ mem_props->memoryTypes[alloc_info->memoryTypeIndex].propertyFlags;
struct vn_renderer_bo *bo;
VkResult result = VK_SUCCESS;
- result = vn_renderer_bo_create_from_dma_buf(dev->renderer,
- alloc_info->allocationSize, fd,
- mem_type->propertyFlags, &bo);
+ if (force_unmappable)
+ mem_flags &= ~VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
+
+ result = vn_renderer_bo_create_from_dma_buf(
+ dev->renderer, alloc_info->allocationSize, fd, mem_flags, &bo);
if (result != VK_SUCCESS)
return result;
@@ -355,7 +358,7 @@ vn_AllocateMemory(VkDevice device,
} else if (export_ahb) {
result = vn_android_device_allocate_ahb(dev, mem, pAllocateInfo, alloc);
} else if (import_fd_info) {
- result = vn_device_memory_import_dma_buf(dev, mem, pAllocateInfo,
+ result = vn_device_memory_import_dma_buf(dev, mem, pAllocateInfo, false,
import_fd_info->fd);
} else if (export_info) {
result = vn_device_memory_alloc(dev, mem, pAllocateInfo, true,
diff --git a/src/virtio/vulkan/vn_device_memory.h b/src/virtio/vulkan/vn_device_memory.h
index f480ad811bc..04f23d10541 100644
--- a/src/virtio/vulkan/vn_device_memory.h
+++ b/src/virtio/vulkan/vn_device_memory.h
@@ -47,6 +47,7 @@ VkResult
vn_device_memory_import_dma_buf(struct vn_device *dev,
struct vn_device_memory *mem,
const VkMemoryAllocateInfo *alloc_info,
+ bool force_unmappable,
int fd);
VkResult
--
2.33.0.153.gba50c8fa24-goog