@@ -384,9 +384,6 @@ static void wine_vk_device_get_queues(struct VkDevice_T *device,
384384static void wine_vk_device_free_create_info (VkDeviceCreateInfo * create_info )
385385{
386386 free_VkDeviceCreateInfo_struct_chain (create_info );
387-
388- if (create_info -> enabledExtensionCount )
389- free ((void * )create_info -> ppEnabledExtensionNames );
390387}
391388
392389static char * * parse_xr_extensions (unsigned int * len )
@@ -448,8 +445,7 @@ static char **parse_xr_extensions(unsigned int *len)
448445static VkResult wine_vk_device_convert_create_info (const VkDeviceCreateInfo * src ,
449446 VkDeviceCreateInfo * dst , BOOL * must_free_extensions )
450447{
451- unsigned int i , append_xr = 0 , wine_extension_count ;
452- const char * * enabled_extensions ;
448+ unsigned int i , append_xr = 0 , replace_win32 = 0 , wine_extension_count ;
453449 VkResult res ;
454450
455451 static const char * wine_xr_extension_name = "VK_WINE_openxr_device_extensions" ;
@@ -475,23 +471,38 @@ static VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src
475471 break ;
476472 }
477473 }
478-
479- if (append_xr )
474+ for (i = 0 ; i < src -> enabledExtensionCount ; i ++ )
475+ {
476+ if (!strcmp (src -> ppEnabledExtensionNames [i ], "VK_KHR_external_memory_win32" ))
477+ {
478+ replace_win32 = 1 ;
479+ break ;
480+ }
481+ }
482+ if (append_xr || replace_win32 )
480483 {
481- unsigned int xr_extensions_len , o = 0 ;
482- char * * xr_extensions_list = parse_xr_extensions (& xr_extensions_len );
484+ unsigned int xr_extensions_len = 0 , o = 0 ;
485+ char * * xr_extensions_list = NULL ;
486+ char * * new_extensions_list ;
483487
484- char * * new_extensions_list = malloc (sizeof (char * ) * (dst -> enabledExtensionCount + xr_extensions_len ));
488+ if (append_xr )
489+ xr_extensions_list = parse_xr_extensions (& xr_extensions_len );
485490
486- if (!xr_extensions_list )
491+ new_extensions_list = malloc (sizeof (char * ) * (dst -> enabledExtensionCount + xr_extensions_len ));
492+
493+ if (append_xr && !xr_extensions_list )
487494 WARN ("Requested to use XR extensions, but none are set!\n" );
488495
489496 for (i = 0 ; i < dst -> enabledExtensionCount ; i ++ )
490497 {
491- if (strcmp (dst -> ppEnabledExtensionNames [i ], wine_xr_extension_name ) != 0 )
492- {
493- new_extensions_list [o ++ ] = strdup (dst -> ppEnabledExtensionNames [i ]);
494- }
498+ if (append_xr && !strcmp (dst -> ppEnabledExtensionNames [i ], wine_xr_extension_name ))
499+ continue ;
500+
501+ if (replace_win32 && !strcmp (src -> ppEnabledExtensionNames [i ], "VK_KHR_external_memory_win32" ))
502+ new_extensions_list [o ] = strdup ("VK_KHR_external_memory_fd" );
503+ else
504+ new_extensions_list [o ] = strdup (dst -> ppEnabledExtensionNames [i ]);
505+ ++ o ;
495506 }
496507
497508 TRACE ("appending XR extensions:\n" );
@@ -518,29 +529,6 @@ static VkResult wine_vk_device_convert_create_info(const VkDeviceCreateInfo *src
518529 TRACE ("Extension %u: %s.\n" , i , debugstr_a (dst -> ppEnabledExtensionNames [i ]));
519530 }
520531
521- if (src -> enabledExtensionCount > 0 )
522- {
523- enabled_extensions = calloc (src -> enabledExtensionCount , sizeof (* src -> ppEnabledExtensionNames ));
524- if (!enabled_extensions )
525- {
526- free_VkDeviceCreateInfo_struct_chain (dst );
527- return VK_ERROR_OUT_OF_HOST_MEMORY ;
528- }
529-
530- for (i = 0 ; i < src -> enabledExtensionCount ; i ++ )
531- {
532- if (!strcmp (src -> ppEnabledExtensionNames [i ], "VK_KHR_external_memory_win32" ))
533- {
534- enabled_extensions [i ] = "VK_KHR_external_memory_fd" ;
535- }
536- else
537- {
538- enabled_extensions [i ] = src -> ppEnabledExtensionNames [i ];
539- }
540- }
541- dst -> ppEnabledExtensionNames = enabled_extensions ;
542- }
543-
544532 return VK_SUCCESS ;
545533}
546534
0 commit comments