Mesa (main): lavapipe: add host ptr support.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Aug 11 00:37:07 UTC 2021
Module: Mesa
Branch: main
Commit: c198adf718192674a8200f25b97665e48e777a0c
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c198adf718192674a8200f25b97665e48e777a0c
Author: Dave Airlie <airlied at redhat.com>
Date: Wed Aug 11 05:18:10 2021 +1000
lavapipe: add host ptr support.
This actually doesn't need any backend support.
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12316>
---
src/gallium/frontends/lavapipe/lvp_device.c | 44 ++++++++++++++++++++++++----
src/gallium/frontends/lavapipe/lvp_formats.c | 36 +++++++++++++++++++----
src/gallium/frontends/lavapipe/lvp_private.h | 1 +
3 files changed, 70 insertions(+), 11 deletions(-)
diff --git a/src/gallium/frontends/lavapipe/lvp_device.c b/src/gallium/frontends/lavapipe/lvp_device.c
index 0a987311967..6883501ce81 100644
--- a/src/gallium/frontends/lavapipe/lvp_device.c
+++ b/src/gallium/frontends/lavapipe/lvp_device.c
@@ -130,6 +130,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported =
.EXT_conditional_rendering = true,
.EXT_extended_dynamic_state = true,
.EXT_extended_dynamic_state2 = true,
+ .EXT_external_memory_host = true,
.EXT_host_query_reset = true,
.EXT_index_type_uint8 = true,
.EXT_multi_draw = true,
@@ -980,6 +981,12 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceProperties2(
properties->lineSubPixelPrecisionBits = 4;
break;
}
+ case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_HOST_PROPERTIES_EXT: {
+ VkPhysicalDeviceExternalMemoryHostPropertiesEXT *properties =
+ (VkPhysicalDeviceExternalMemoryHostPropertiesEXT *)ext;
+ properties->minImportedHostPointerAlignment = 4096;
+ break;
+ }
case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
VkPhysicalDeviceSubgroupProperties *properties =
(VkPhysicalDeviceSubgroupProperties*)ext;
@@ -1088,6 +1095,23 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceMemoryProperties2(
&pMemoryProperties->memoryProperties);
}
+VkResult
+lvp_GetMemoryHostPointerPropertiesEXT(
+ VkDevice _device,
+ VkExternalMemoryHandleTypeFlagBits handleType,
+ const void *pHostPointer,
+ VkMemoryHostPointerPropertiesEXT *pMemoryHostPointerProperties)
+{
+ switch (handleType) {
+ case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT: {
+ pMemoryHostPointerProperties->memoryTypeBits = 1;
+ return VK_SUCCESS;
+ }
+ default:
+ return VK_ERROR_INVALID_EXTERNAL_HANDLE;
+ }
+}
+
VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL lvp_GetInstanceProcAddr(
VkInstance _instance,
const char* pName)
@@ -1657,6 +1681,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_AllocateMemory(
LVP_FROM_HANDLE(lvp_device, device, _device);
struct lvp_device_memory *mem;
assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO);
+ const VkImportMemoryHostPointerInfoEXT *host_ptr_info =
+ vk_find_struct_const(pAllocateInfo->pNext, IMPORT_MEMORY_HOST_POINTER_INFO_EXT);
if (pAllocateInfo->allocationSize == 0) {
/* Apparently, this is allowed */
@@ -1671,10 +1697,17 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_AllocateMemory(
vk_object_base_init(&device->vk, &mem->base,
VK_OBJECT_TYPE_DEVICE_MEMORY);
- mem->pmem = device->pscreen->allocate_memory(device->pscreen, pAllocateInfo->allocationSize);
- if (!mem->pmem) {
- vk_free2(&device->vk.alloc, pAllocator, mem);
- return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
+
+ if (!host_ptr_info) {
+ mem->pmem = device->pscreen->allocate_memory(device->pscreen, pAllocateInfo->allocationSize);
+ if (!mem->pmem) {
+ vk_free2(&device->vk.alloc, pAllocator, mem);
+ return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY);
+ }
+ mem->is_user_ptr = false;
+ } else {
+ mem->is_user_ptr = true;
+ mem->pmem = host_ptr_info->pHostPointer;
}
mem->type_index = pAllocateInfo->memoryTypeIndex;
@@ -1695,7 +1728,8 @@ VKAPI_ATTR void VKAPI_CALL lvp_FreeMemory(
if (mem == NULL)
return;
- device->pscreen->free_memory(device->pscreen, mem->pmem);
+ if (!mem->is_user_ptr)
+ device->pscreen->free_memory(device->pscreen, mem->pmem);
vk_object_base_finish(&mem->base);
vk_free2(&device->vk.alloc, pAllocator, mem);
diff --git a/src/gallium/frontends/lavapipe/lvp_formats.c b/src/gallium/frontends/lavapipe/lvp_formats.c
index ac2ba4b67e4..69e1808daba 100644
--- a/src/gallium/frontends/lavapipe/lvp_formats.c
+++ b/src/gallium/frontends/lavapipe/lvp_formats.c
@@ -335,10 +335,22 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetPhysicalDeviceImageFormatProperties2(
}
if (external_info && external_info->handleType != 0) {
+ VkExternalMemoryFeatureFlagBits flags = 0;
+ VkExternalMemoryHandleTypeFlags export_flags = 0;
+ VkExternalMemoryHandleTypeFlags compat_flags = 0;
+
+ switch (external_info->handleType) {
+ case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
+ flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
+ compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
+ break;
+ default:
+ break;
+ }
external_props->externalMemoryProperties = (VkExternalMemoryProperties) {
- .externalMemoryFeatures = 0,
- .exportFromImportedHandleTypes = 0,
- .compatibleHandleTypes = 0,
+ .externalMemoryFeatures = flags,
+ .exportFromImportedHandleTypes = export_flags,
+ .compatibleHandleTypes = compat_flags,
};
}
if (ycbcr_props)
@@ -375,9 +387,21 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceExternalBufferProperties(
const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
VkExternalBufferProperties *pExternalBufferProperties)
{
+ VkExternalMemoryFeatureFlagBits flags = 0;
+ VkExternalMemoryHandleTypeFlags export_flags = 0;
+ VkExternalMemoryHandleTypeFlags compat_flags = 0;
+ switch (pExternalBufferInfo->handleType) {
+ case VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT:
+ flags = VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT;
+ compat_flags = VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT;
+ break;
+ default:
+ break;
+ }
+
pExternalBufferProperties->externalMemoryProperties = (VkExternalMemoryProperties) {
- .externalMemoryFeatures = 0,
- .exportFromImportedHandleTypes = 0,
- .compatibleHandleTypes = 0,
+ .externalMemoryFeatures = flags,
+ .exportFromImportedHandleTypes = export_flags,
+ .compatibleHandleTypes = compat_flags,
};
}
diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h
index b035a236990..5ad0bc94916 100644
--- a/src/gallium/frontends/lavapipe/lvp_private.h
+++ b/src/gallium/frontends/lavapipe/lvp_private.h
@@ -219,6 +219,7 @@ struct lvp_device_memory {
uint32_t type_index;
VkDeviceSize map_size;
void * map;
+ bool is_user_ptr;
};
struct lvp_image {
More information about the mesa-commit
mailing list