144 lines
6.6 KiB
Diff
144 lines
6.6 KiB
Diff
From b900d4998b95a8bdfb01600f81635ff76810cfe6 Mon Sep 17 00:00:00 2001
|
|
From: Brendan King <Brendan.King@imgtec.com>
|
|
Date: Tue, 16 Feb 2021 20:17:32 +0000
|
|
Subject: [PATCH 57/67] vulkan/wsi: Allow host visible memory to be requested
|
|
|
|
Allow host visible memory to be explicitly requested when allocating
|
|
native images.
|
|
|
|
For a software driver on X11, we need to be able to map the memory on
|
|
the host, in order to present the contents to the X Server.
|
|
---
|
|
src/vulkan/wsi/wsi_common_display.c | 2 +-
|
|
src/vulkan/wsi/wsi_common_drm.c | 17 +++++++++++++----
|
|
src/vulkan/wsi/wsi_common_private.h | 1 +
|
|
src/vulkan/wsi/wsi_common_wayland.c | 3 ++-
|
|
src/vulkan/wsi/wsi_common_x11.c | 1 +
|
|
5 files changed, 18 insertions(+), 6 deletions(-)
|
|
|
|
diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c
|
|
index aa07cada107..71a84e54079 100644
|
|
--- a/src/vulkan/wsi/wsi_common_display.c
|
|
+++ b/src/vulkan/wsi/wsi_common_display.c
|
|
@@ -1031,7 +1031,7 @@ wsi_display_image_init(VkDevice device_h,
|
|
return VK_ERROR_DEVICE_LOST;
|
|
|
|
VkResult result = wsi_create_native_image(&chain->base, create_info,
|
|
- 0, NULL, NULL,
|
|
+ 0, NULL, NULL, false,
|
|
&image->base);
|
|
if (result != VK_SUCCESS)
|
|
return result;
|
|
diff --git a/src/vulkan/wsi/wsi_common_drm.c b/src/vulkan/wsi/wsi_common_drm.c
|
|
index 70d934aef13..aabb761908c 100644
|
|
--- a/src/vulkan/wsi/wsi_common_drm.c
|
|
+++ b/src/vulkan/wsi/wsi_common_drm.c
|
|
@@ -66,6 +66,7 @@ wsi_device_matches_drm_fd(const struct wsi_device *wsi, int drm_fd)
|
|
static uint32_t
|
|
select_memory_type(const struct wsi_device *wsi,
|
|
bool want_device_local,
|
|
+ bool want_host_visible,
|
|
uint32_t type_bits)
|
|
{
|
|
assert(type_bits);
|
|
@@ -74,8 +75,10 @@ select_memory_type(const struct wsi_device *wsi,
|
|
for (uint32_t i = 0; i < wsi->memory_props.memoryTypeCount; i++) {
|
|
const VkMemoryType type = wsi->memory_props.memoryTypes[i];
|
|
bool local = type.propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
|
|
+ bool host = type.propertyFlags & VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
|
|
|
|
- if ((type_bits & (1 << i)) && local == want_device_local)
|
|
+ if ((type_bits & (1 << i)) && local == want_device_local &&
|
|
+ (!want_host_visible || host))
|
|
return i;
|
|
all_local &= local;
|
|
}
|
|
@@ -83,6 +86,8 @@ select_memory_type(const struct wsi_device *wsi,
|
|
/* ignore want_device_local when all memory types are device-local */
|
|
if (all_local) {
|
|
assert(!want_device_local);
|
|
+ /* currently, host visibility is only needed with device local */
|
|
+ assert(!want_host_visible);
|
|
return ffs(type_bits) - 1;
|
|
}
|
|
|
|
@@ -107,6 +112,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
|
|
uint32_t num_modifier_lists,
|
|
const uint32_t *num_modifiers,
|
|
const uint64_t *const *modifiers,
|
|
+ bool host_visible,
|
|
struct wsi_image *image)
|
|
{
|
|
const struct wsi_device *wsi = chain->wsi;
|
|
@@ -317,7 +323,8 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
|
|
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
|
|
.pNext = &memory_dedicated_info,
|
|
.allocationSize = reqs.size,
|
|
- .memoryTypeIndex = select_memory_type(wsi, true, reqs.memoryTypeBits),
|
|
+ .memoryTypeIndex = select_memory_type(wsi, true, host_visible,
|
|
+ reqs.memoryTypeBits),
|
|
};
|
|
result = wsi->AllocateMemory(chain->device, &memory_info,
|
|
&chain->alloc, &image->memory);
|
|
@@ -488,7 +495,8 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
|
|
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
|
|
.pNext = &prime_memory_dedicated_info,
|
|
.allocationSize = linear_size,
|
|
- .memoryTypeIndex = select_memory_type(wsi, false, reqs.memoryTypeBits),
|
|
+ .memoryTypeIndex = select_memory_type(wsi, false, false,
|
|
+ reqs.memoryTypeBits),
|
|
};
|
|
result = wsi->AllocateMemory(chain->device, &prime_memory_info,
|
|
&chain->alloc, &image->prime.memory);
|
|
@@ -542,7 +550,8 @@ wsi_create_prime_image(const struct wsi_swapchain *chain,
|
|
.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO,
|
|
.pNext = &memory_dedicated_info,
|
|
.allocationSize = reqs.size,
|
|
- .memoryTypeIndex = select_memory_type(wsi, true, reqs.memoryTypeBits),
|
|
+ .memoryTypeIndex = select_memory_type(wsi, true, false,
|
|
+ reqs.memoryTypeBits),
|
|
};
|
|
result = wsi->AllocateMemory(chain->device, &memory_info,
|
|
&chain->alloc, &image->memory);
|
|
diff --git a/src/vulkan/wsi/wsi_common_private.h b/src/vulkan/wsi/wsi_common_private.h
|
|
index 1fe8211f9cb..5ad087b32e0 100644
|
|
--- a/src/vulkan/wsi/wsi_common_private.h
|
|
+++ b/src/vulkan/wsi/wsi_common_private.h
|
|
@@ -94,6 +94,7 @@ wsi_create_native_image(const struct wsi_swapchain *chain,
|
|
uint32_t num_modifier_lists,
|
|
const uint32_t *num_modifiers,
|
|
const uint64_t *const *modifiers,
|
|
+ bool host_visible,
|
|
struct wsi_image *image);
|
|
|
|
VkResult
|
|
diff --git a/src/vulkan/wsi/wsi_common_wayland.c b/src/vulkan/wsi/wsi_common_wayland.c
|
|
index 40f5338314f..983833e880b 100644
|
|
--- a/src/vulkan/wsi/wsi_common_wayland.c
|
|
+++ b/src/vulkan/wsi/wsi_common_wayland.c
|
|
@@ -1074,7 +1074,8 @@ wsi_wl_image_init(struct wsi_wl_swapchain *chain,
|
|
result = wsi_create_native_image(&chain->base, pCreateInfo,
|
|
chain->num_drm_modifiers > 0 ? 1 : 0,
|
|
&chain->num_drm_modifiers,
|
|
- &chain->drm_modifiers, &image->base);
|
|
+ &chain->drm_modifiers, false,
|
|
+ &image->base);
|
|
|
|
if (result != VK_SUCCESS)
|
|
return result;
|
|
diff --git a/src/vulkan/wsi/wsi_common_x11.c b/src/vulkan/wsi/wsi_common_x11.c
|
|
index 9eb624df640..eb639d6c265 100644
|
|
--- a/src/vulkan/wsi/wsi_common_x11.c
|
|
+++ b/src/vulkan/wsi/wsi_common_x11.c
|
|
@@ -1315,6 +1315,7 @@ x11_image_init(VkDevice device_h, struct x11_swapchain *chain,
|
|
} else {
|
|
result = wsi_create_native_image(&chain->base, pCreateInfo,
|
|
num_tranches, num_modifiers, modifiers,
|
|
+ chain->base.wsi->sw,
|
|
&image->base);
|
|
}
|
|
if (result < 0)
|
|
--
|
|
2.25.1
|
|
|