mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-06-17 04:28:28 +02:00
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:
parent
9a57dceeb7
commit
c198adf718
3 changed files with 70 additions and 11 deletions
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue