Signed-off-by: Józef Kucia jkucia@codeweavers.com --- dlls/winevulkan/vulkan.c | 19 ++++++++++++++----- dlls/winevulkan/vulkan_private.h | 6 ++++++ 2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c index e4c04df059bd..886b345a1510 100644 --- a/dlls/winevulkan/vulkan.c +++ b/dlls/winevulkan/vulkan.c @@ -580,6 +580,8 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev, } }
+ object->quirks = phys_dev->instance->quirks; + *device = object; return VK_SUCCESS; } @@ -587,8 +589,9 @@ VkResult WINAPI wine_vkCreateDevice(VkPhysicalDevice phys_dev, VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, const VkAllocationCallbacks *allocator, VkInstance *instance) { - struct VkInstance_T *object = NULL; VkInstanceCreateInfo create_info_host; + const VkApplicationInfo *app_info; + struct VkInstance_T *object; VkResult res;
TRACE("create_info %p, allocator %p, instance %p\n", create_info, allocator, instance); @@ -635,6 +638,13 @@ VkResult WINAPI wine_vkCreateInstance(const VkInstanceCreateInfo *create_info, return res; }
+ if ((app_info = create_info->pApplicationInfo) && app_info->pApplicationName) + { + if (!strcmp(app_info->pApplicationName, "DOOM") + || !strcmp(app_info->pApplicationName, "Wolfenstein II The New Colossus")) + object->quirks |= WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR; + } + *instance = object; TRACE("Done, instance=%p native_instance=%p\n", object, object->instance); return VK_SUCCESS; @@ -808,13 +818,12 @@ PFN_vkVoidFunction WINAPI wine_vkGetDeviceProcAddr(VkDevice device, const char * * subdevice objects. The games don't actually use the function pointers and if they * did, they would crash as VkInstance / VkPhysicalDevice parameters need unwrapping. * Khronos clarified behavior in the Vulkan spec and expects drivers to get updated, - * however it would require both driver and game fixes. Since it are major titles - * it is not clear what will happen. At least for now we need the hack below. + * however it would require both driver and game fixes. * https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/issues/2323 * https://github.com/KhronosGroup/Vulkan-Docs/issues/655 */ - func = wine_vk_get_instance_proc_addr(name); - if (func) + if (device->quirks & WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR + && (func = wine_vk_get_instance_proc_addr(name))) { WARN("Returning instance function %s.\n", debugstr_a(name)); return func; diff --git a/dlls/winevulkan/vulkan_private.h b/dlls/winevulkan/vulkan_private.h index a7239e7616f4..30ab62547f74 100644 --- a/dlls/winevulkan/vulkan_private.h +++ b/dlls/winevulkan/vulkan_private.h @@ -34,6 +34,8 @@ #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0])) #endif
+#define WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR 0x00000001 + struct vulkan_func { const char *name; @@ -70,6 +72,8 @@ struct VkDevice_T struct VkQueue_T **queues;
VkDevice device; /* native device */ + + unsigned int quirks; };
struct VkInstance_T @@ -84,6 +88,8 @@ struct VkInstance_T struct VkPhysicalDevice_T **phys_devs;
VkInstance instance; /* native instance */ + + unsigned int quirks; };
struct VkPhysicalDevice_T