[PATCH v5 3/4] winevulkan: Implement VK_KHR_external_memory_win32 for buffers.

Derek Lesho dlesho at codeweavers.com
Thu May 20 15:16:32 CDT 2021


On 5/20/21 3:41 PM, Georg Lehmann wrote:
>
>
> On 20.05.21 20:31, Derek Lesho wrote:
>>
>>   +static inline void 
>> wine_vk_normalize_handle_types_win(VkExternalMemoryHandleTypeFlags 
>> *types)
>> +{
>> +    *types &=
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT |
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT_BIT |
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_BIT |
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_TEXTURE_KMT_BIT |
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP_BIT |
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE_BIT |
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT |
>> + VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT;
>> +}
>> +
>> +static inline void 
>> wine_vk_normalize_handle_types_host(VkExternalMemoryHandleTypeFlags 
>> *types)
>> +{
>> +    *types &=
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT |
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT |
>> +/*      predicated on VK_KHR_external_memory_dma_buf
>> +        VK_EXTERNAL_MEMORY_HANDLE_TYPE_DMA_BUF_BIT_EXT | */
>
> Why is this here?
Because VK_KHR_external_memory_dma_buf is blacklisted, and the enum 
value is not defined.  I put the comment here to note that, if we ever 
need to back another handle type w/ the DMA BUF handle type, and thereby 
un-blacklist the extension, we should add the bit.
>
>> + VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_MAPPED_FOREIGN_MEMORY_BIT_EXT;
>> +}
>> +
>> +static void 
>> wine_vk_get_physical_device_external_buffer_properties(VkPhysicalDevice 
>> phys_dev,
>> +        void 
>> (*p_vkGetPhysicalDeviceExternalBufferProperties)(VkPhysicalDevice, 
>> const VkPhysicalDeviceExternalBufferInfo *, 
>> VkExternalBufferProperties *),
>> +        const VkPhysicalDeviceExternalBufferInfo *buffer_info, 
>> VkExternalBufferProperties *properties)
>> +{
>> +    VkPhysicalDeviceExternalBufferInfo buffer_info_dup = *buffer_info;
>> +
>> +    if (buffer_info_dup.handleType == 
>> VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_BIT)
>> +        buffer_info_dup.handleType = 
>> VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
>> + wine_vk_normalize_handle_types_host(&buffer_info_dup.handleType);
>
> This allows the application to query with FD_BIT. Before you modify 
> any bits you should check if handleType &~ (all the types that we 
> support) and set all the results to 0 if true.

True, it looks like the spec doesn't forbid applications from calling 
this function with non-native bits.  I suppose I could run a 
wine_vk_normalize_handle_types_win on the input parameter then error out 
if that cases the resulting handle type to be 0.  I'm guessing you 
didn't comment on the lack of such a validation in vkAllocateMemory's 
handling of VkExportMemoryAllocateInfo::handleTypes because there it 
would be undefined behavior.  (Since the invalid types wouldn't be 
exposed here).



More information about the wine-devel mailing list