On 03/17/2017 09:05 AM, Bas Nieuwenhuizen wrote: > On Wed, Mar 15, 2017 at 1:25 AM, Dave Airlie <airl...@gmail.com> wrote: >> From: Dave Airlie <airl...@redhat.com> >> >> This adds support for exporting 2D images, to an >> opaque fd. >> >> This implements the: >> VK_KHX_external_memory_capabilities >> VK_KHX_external_memory >> VK_KHX_external_memory_fd >> >> extensions. >> >> These are used by SteamVR, we should work with anv >> to decide if we should ship these under an env >> var or something. >> >> Signed-off-by: Dave Airlie <airl...@redhat.com> >> --- >> src/amd/vulkan/radv_device.c | 85 ++++++++++++++++++++++----- >> src/amd/vulkan/radv_entrypoints_gen.py | 3 + >> src/amd/vulkan/radv_formats.c | 104 >> ++++++++++++++++++++++++++++++++- >> 3 files changed, 178 insertions(+), 14 deletions(-) >> >> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c >> index d1fd58d..7266d0a 100644 >> --- a/src/amd/vulkan/radv_device.c >> +++ b/src/amd/vulkan/radv_device.c >> @@ -84,6 +84,18 @@ static const VkExtensionProperties instance_extensions[] >> = { >> .specVersion = 5, >> }, >> #endif >> + { >> + .extensionName = >> VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, >> + .specVersion = 1, >> + }, > > Why is this in here? Even if it turns out we want this, can we put it > in a separate patch.
Oh good spot, I didn't see that maybe this hulk got conflated in by accident. With that left out, the rest still LGTM. Edward. > > >> + { >> + .extensionName = >> VK_KHX_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, >> + .specVersion = 1, >> + }, >> + { >> + .extensionName = >> VK_KHX_EXTERNAL_SEMAPHORE_CAPABILITIES_EXTENSION_NAME, >> + .specVersion = 1, >> + }, >> }; >> >> static const VkExtensionProperties common_device_extensions[] = { >> @@ -115,6 +127,18 @@ static const VkExtensionProperties >> common_device_extensions[] = { >> .extensionName = VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME, >> .specVersion = 1, >> }, >> + { >> + .extensionName = >> VK_KHX_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME, >> + .specVersion = 1, >> + }, >> + { >> + .extensionName = VK_KHX_EXTERNAL_MEMORY_EXTENSION_NAME, >> + .specVersion = 1, >> + }, >> + { >> + .extensionName = VK_KHX_EXTERNAL_MEMORY_FD_EXTENSION_NAME, >> + .specVersion = 1, >> + }, >> }; >> >> static VkResult >> @@ -255,7 +279,6 @@ radv_physical_device_finish(struct radv_physical_device >> *device) >> close(device->local_fd); >> } >> >> - >> static void * >> default_alloc_func(void *pUserData, size_t size, size_t align, >> VkSystemAllocationScope allocationScope) >> @@ -1694,7 +1717,7 @@ VkResult radv_AllocateMemory( >> VkResult result; >> enum radeon_bo_domain domain; >> uint32_t flags = 0; >> - const VkDedicatedAllocationMemoryAllocateInfoNV *dedicate_info = >> NULL; >> + >> assert(pAllocateInfo->sType == >> VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO); >> >> if (pAllocateInfo->allocationSize == 0) { >> @@ -1703,15 +1726,10 @@ VkResult radv_AllocateMemory( >> return VK_SUCCESS; >> } >> >> - vk_foreach_struct(ext, pAllocateInfo->pNext) { >> - switch (ext->sType) { >> - case >> VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV: >> - dedicate_info = (const >> VkDedicatedAllocationMemoryAllocateInfoNV *)ext; >> - break; >> - default: >> - break; >> - } >> - } >> + const VkImportMemoryFdInfoKHX *import_info = >> + vk_find_struct_const(pAllocateInfo->pNext, >> IMPORT_MEMORY_FD_INFO_KHX); >> + const VkDedicatedAllocationMemoryAllocateInfoNV *dedicate_info = >> + vk_find_struct_const(pAllocateInfo->pNext, >> DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV); >> >> mem = vk_alloc2(&device->alloc, pAllocator, sizeof(*mem), 8, >> VK_SYSTEM_ALLOCATION_SCOPE_OBJECT); >> @@ -1726,6 +1744,17 @@ VkResult radv_AllocateMemory( >> mem->buffer = NULL; >> } >> >> + if (import_info) { >> + assert(import_info->handleType == >> + VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX); >> + mem->bo = device->ws->buffer_from_fd(device->ws, >> import_info->fd, >> + NULL, NULL); >> + if (!mem->bo) >> + goto fail; >> + else >> + goto out_success; >> + } >> + >> uint64_t alloc_size = align_u64(pAllocateInfo->allocationSize, 4096); >> if (pAllocateInfo->memoryTypeIndex == >> RADV_MEM_TYPE_GTT_WRITE_COMBINE || >> pAllocateInfo->memoryTypeIndex == RADV_MEM_TYPE_GTT_CACHED) >> @@ -1749,7 +1778,7 @@ VkResult radv_AllocateMemory( >> goto fail; >> } >> mem->type_index = pAllocateInfo->memoryTypeIndex; >> - >> +out_success: > > maybe put this a bit ealirer, so we init mem->type_index? > >> *pMem = radv_device_memory_to_handle(mem); >> >> return VK_SUCCESS; >> @@ -2695,7 +2724,6 @@ void radv_DestroySampler( >> vk_free2(&device->alloc, pAllocator, sampler); >> } >> >> - >> /* vk_icd.h does not declare this function, so we declare it here to >> * suppress Wmissing-prototypes. >> */ >> @@ -2739,3 +2767,34 @@ vk_icdNegotiateLoaderICDInterfaceVersion(uint32_t >> *pSupportedVersion) >> *pSupportedVersion = MIN2(*pSupportedVersion, 3u); >> return VK_SUCCESS; >> } >> + >> +VkResult radv_GetMemoryFdKHX(VkDevice _device, >> + VkDeviceMemory _memory, >> + VkExternalMemoryHandleTypeFlagsKHX handleType, >> + int *pFD) >> +{ >> + RADV_FROM_HANDLE(radv_device, device, _device); >> + RADV_FROM_HANDLE(radv_device_memory, memory, _memory); >> + >> + /* We support only one handle type. */ >> + assert(handleType == >> VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX); >> + >> + bool ret = radv_get_memory_fd(device, memory, pFD); >> + if (ret == false) >> + return VK_ERROR_OUT_OF_DEVICE_MEMORY; >> + return VK_SUCCESS; >> +} >> + >> +VkResult radv_GetMemoryFdPropertiesKHX(VkDevice _device, >> + VkExternalMemoryHandleTypeFlagBitsKHX >> handleType, >> + int fd, >> + VkMemoryFdPropertiesKHX >> *pMemoryFdProperties) >> +{ >> + /* The valid usage section for this function says: >> + * >> + * "handleType must not be one of the handle types defined as opaque." >> + * >> + * Since we only handle opaque handles for now, there are no FD >> properties. >> + */ >> + return VK_ERROR_INVALID_EXTERNAL_HANDLE_KHX; >> +} >> diff --git a/src/amd/vulkan/radv_entrypoints_gen.py >> b/src/amd/vulkan/radv_entrypoints_gen.py >> index b7b2bcf..c2eee4e 100644 >> --- a/src/amd/vulkan/radv_entrypoints_gen.py >> +++ b/src/amd/vulkan/radv_entrypoints_gen.py >> @@ -39,6 +39,9 @@ supported_extensions = [ >> 'VK_KHR_wayland_surface', >> 'VK_KHR_xcb_surface', >> 'VK_KHR_xlib_surface', >> + 'VK_KHX_external_memory_capabilities', >> + 'VK_KHX_external_memory', >> + 'VK_KHX_external_memory_fd', >> ] >> >> # We generate a static hash table for entry point lookup >> diff --git a/src/amd/vulkan/radv_formats.c b/src/amd/vulkan/radv_formats.c >> index e4cc4ba..4c3fba1 100644 >> --- a/src/amd/vulkan/radv_formats.c >> +++ b/src/amd/vulkan/radv_formats.c >> @@ -28,6 +28,7 @@ >> #include "sid.h" >> #include "r600d_common.h" >> >> +#include "util/vk_util.h" >> #include "util/u_half.h" >> #include "util/format_srgb.h" >> #include "util/format_r11g11b10f.h" >> @@ -1140,14 +1141,107 @@ VkResult >> radv_GetPhysicalDeviceImageFormatProperties( >> pImageFormatProperties); >> } >> >> +static void >> +get_external_image_format_properties(const >> VkPhysicalDeviceImageFormatInfo2KHR *pImageFormatInfo, >> + VkExternalMemoryPropertiesKHX >> *external_properties) >> +{ >> + VkExternalMemoryFeatureFlagBitsKHX flags = 0; >> + VkExternalMemoryHandleTypeFlagsKHX export_flags = 0; >> + VkExternalMemoryHandleTypeFlagsKHX compat_flags = 0; >> + switch (pImageFormatInfo->type) { >> + case VK_IMAGE_TYPE_2D: >> + flags = >> VK_EXTERNAL_MEMORY_FEATURE_DEDICATED_ONLY_BIT_KHX|VK_EXTERNAL_MEMORY_FEATURE_EXPORTABLE_BIT_KHX|VK_EXTERNAL_MEMORY_FEATURE_IMPORTABLE_BIT_KHX; >> + compat_flags = export_flags = >> VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX; >> + break; >> + default: >> + break; >> + } >> + >> + *external_properties = (VkExternalMemoryPropertiesKHX) { >> + .externalMemoryFeatures = flags, >> + .exportFromImportedHandleTypes = export_flags, >> + .compatibleHandleTypes = compat_flags, >> + }; >> +} >> + >> VkResult radv_GetPhysicalDeviceImageFormatProperties2KHR( >> VkPhysicalDevice physicalDevice, >> const VkPhysicalDeviceImageFormatInfo2KHR *base_info, >> VkImageFormatProperties2KHR *base_props) >> { >> RADV_FROM_HANDLE(radv_physical_device, physical_device, >> physicalDevice); >> - return radv_get_image_format_properties(physical_device, base_info, >> + const VkPhysicalDeviceExternalImageFormatInfoKHX *external_info = >> NULL; >> + VkExternalImageFormatPropertiesKHX *external_props = NULL; >> + VkResult result; >> + >> + result = radv_get_image_format_properties(physical_device, base_info, >> >> &base_props->imageFormatProperties); >> + if (result != VK_SUCCESS) >> + return result; >> + >> + /* Extract input structs */ >> + vk_foreach_struct_const(s, base_info->pNext) { >> + switch (s->sType) { >> + case >> VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_IMAGE_FORMAT_INFO_KHX: >> + external_info = (const void *) s; >> + break; >> + default: >> + break; >> + } >> + } >> + >> + /* Extract output structs */ >> + vk_foreach_struct(s, base_props->pNext) { >> + switch (s->sType) { >> + case VK_STRUCTURE_TYPE_EXTERNAL_IMAGE_FORMAT_PROPERTIES_KHX: >> + external_props = (void *) s; >> + break; >> + default: >> + break; >> + } >> + } >> + >> + /* From the Vulkan 1.0.42 spec: >> + * >> + * If handleType is 0, >> vkGetPhysicalDeviceImageFormatProperties2KHR will >> + * behave as if VkPhysicalDeviceExternalImageFormatInfoKHX was not >> + * present and VkExternalImageFormatPropertiesKHX will be ignored. >> + */ >> + if (external_info && external_info->handleType != 0) { >> + switch (external_info->handleType) { >> + case VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT_KHX: >> + get_external_image_format_properties(base_info, >> &external_props->externalMemoryProperties); >> + break; >> + default: >> + /* From the Vulkan 1.0.42 spec: >> + * >> + * If handleType is not compatible with the >> [parameters] specified >> + * in VkPhysicalDeviceImageFormatInfo2KHR, then >> + * vkGetPhysicalDeviceImageFormatProperties2KHR >> returns >> + * VK_ERROR_FORMAT_NOT_SUPPORTED. >> + */ >> + result = vk_errorf(VK_ERROR_FORMAT_NOT_SUPPORTED, >> + "unsupported >> VkExternalMemoryTypeFlagBitsKHX 0x%x", >> + external_info->handleType); >> + goto fail; >> + } >> + } >> + >> + return VK_SUCCESS; >> + >> +fail: >> + if (result == VK_ERROR_FORMAT_NOT_SUPPORTED) { >> + /* From the Vulkan 1.0.42 spec: >> + * >> + * If the combination of parameters to >> + * vkGetPhysicalDeviceImageFormatProperties2KHR is not >> supported by >> + * the implementation for use in vkCreateImage, then all >> members of >> + * imageFormatProperties will be filled with zero. >> + */ >> + base_props->imageFormatProperties = >> (VkImageFormatProperties) {0}; >> + } >> + >> + return result; >> } >> >> void radv_GetPhysicalDeviceSparseImageFormatProperties( >> @@ -1173,3 +1267,11 @@ void >> radv_GetPhysicalDeviceSparseImageFormatProperties2KHR( >> /* Sparse images are not yet supported. */ >> *pPropertyCount = 0; >> } >> + >> +void radv_GetPhysicalDeviceExternalBufferPropertiesKHX( >> + VkPhysicalDevice physicalDevice, >> + const VkPhysicalDeviceExternalBufferInfoKHX *pExternalBufferInfo, >> + VkExternalBufferPropertiesKHX >> *pExternalBufferProperties) >> +{ >> + > > At least put a todo & print a warning here? > >> +} >> -- >> 2.7.4 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev >
signature.asc
Description: OpenPGP digital signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev