lavapipe: add host ptr support.

This actually doesn't need any backend support.

Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12316>
This commit is contained in:
Dave Airlie 2021-08-11 05:18:10 +10:00
parent 9a57dceeb7
commit c198adf718
3 changed files with 70 additions and 11 deletions

View file

@ -130,6 +130,7 @@ static const struct vk_device_extension_table lvp_device_extensions_supported =
.EXT_conditional_rendering = true, .EXT_conditional_rendering = true,
.EXT_extended_dynamic_state = true, .EXT_extended_dynamic_state = true,
.EXT_extended_dynamic_state2 = true, .EXT_extended_dynamic_state2 = true,
.EXT_external_memory_host = true,
.EXT_host_query_reset = true, .EXT_host_query_reset = true,
.EXT_index_type_uint8 = true, .EXT_index_type_uint8 = true,
.EXT_multi_draw = true, .EXT_multi_draw = true,
@ -980,6 +981,12 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceProperties2(
properties->lineSubPixelPrecisionBits = 4; properties->lineSubPixelPrecisionBits = 4;
break; 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: { case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBGROUP_PROPERTIES: {
VkPhysicalDeviceSubgroupProperties *properties = VkPhysicalDeviceSubgroupProperties *properties =
(VkPhysicalDeviceSubgroupProperties*)ext; (VkPhysicalDeviceSubgroupProperties*)ext;
@ -1088,6 +1095,23 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceMemoryProperties2(
&pMemoryProperties->memoryProperties); &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( VKAPI_ATTR PFN_vkVoidFunction VKAPI_CALL lvp_GetInstanceProcAddr(
VkInstance _instance, VkInstance _instance,
const char* pName) const char* pName)
@ -1657,6 +1681,8 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_AllocateMemory(
LVP_FROM_HANDLE(lvp_device, device, _device); LVP_FROM_HANDLE(lvp_device, device, _device);
struct lvp_device_memory *mem; struct lvp_device_memory *mem;
assert(pAllocateInfo->sType == VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); 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) { if (pAllocateInfo->allocationSize == 0) {
/* Apparently, this is allowed */ /* 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_base_init(&device->vk, &mem->base,
VK_OBJECT_TYPE_DEVICE_MEMORY); VK_OBJECT_TYPE_DEVICE_MEMORY);
mem->pmem = device->pscreen->allocate_memory(device->pscreen, pAllocateInfo->allocationSize);
if (!mem->pmem) { if (!host_ptr_info) {
vk_free2(&device->vk.alloc, pAllocator, mem); mem->pmem = device->pscreen->allocate_memory(device->pscreen, pAllocateInfo->allocationSize);
return vk_error(device->instance, VK_ERROR_OUT_OF_HOST_MEMORY); 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; mem->type_index = pAllocateInfo->memoryTypeIndex;
@ -1695,7 +1728,8 @@ VKAPI_ATTR void VKAPI_CALL lvp_FreeMemory(
if (mem == NULL) if (mem == NULL)
return; 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_object_base_finish(&mem->base);
vk_free2(&device->vk.alloc, pAllocator, mem); vk_free2(&device->vk.alloc, pAllocator, mem);

View file

@ -335,10 +335,22 @@ VKAPI_ATTR VkResult VKAPI_CALL lvp_GetPhysicalDeviceImageFormatProperties2(
} }
if (external_info && external_info->handleType != 0) { 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) { external_props->externalMemoryProperties = (VkExternalMemoryProperties) {
.externalMemoryFeatures = 0, .externalMemoryFeatures = flags,
.exportFromImportedHandleTypes = 0, .exportFromImportedHandleTypes = export_flags,
.compatibleHandleTypes = 0, .compatibleHandleTypes = compat_flags,
}; };
} }
if (ycbcr_props) if (ycbcr_props)
@ -375,9 +387,21 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceExternalBufferProperties(
const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo, const VkPhysicalDeviceExternalBufferInfo *pExternalBufferInfo,
VkExternalBufferProperties *pExternalBufferProperties) 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) { pExternalBufferProperties->externalMemoryProperties = (VkExternalMemoryProperties) {
.externalMemoryFeatures = 0, .externalMemoryFeatures = flags,
.exportFromImportedHandleTypes = 0, .exportFromImportedHandleTypes = export_flags,
.compatibleHandleTypes = 0, .compatibleHandleTypes = compat_flags,
}; };
} }

View file

@ -219,6 +219,7 @@ struct lvp_device_memory {
uint32_t type_index; uint32_t type_index;
VkDeviceSize map_size; VkDeviceSize map_size;
void * map; void * map;
bool is_user_ptr;
}; };
struct lvp_image { struct lvp_image {