[PATCH v2] winevulkan: Avoid returning 0 for swapchain maxImageCount.

Joshua Ashton joshua at froggi.es
Fri Jul 31 10:48:28 CDT 2020


Signed-off-by: Joshua Ashton <joshua at froggi.es>

On 31/07/2020 10:48, Liam Middlebrook wrote:
> Signed-off-by: Liam Middlebrook <lmiddlebrook at nvidia.com>
> 
> On 7/31/20 2:13 AM, Georg Lehmann wrote:
>> Many Windows games do not expect that maxImageCount can be set to 0.
>> A value of 0 means that there is no limit on the number of images.
>> Nvidia reports 8 on Windows, AMD 16.
>>
>> Based on a patch by Józef Kucia.
>>
>> Signed-off-by: Georg Lehmann <dadschoorse at gmail.com>
>> ---
>>   dlls/winevulkan/make_vulkan      |  4 +--
>>   dlls/winevulkan/vulkan.c         | 47 ++++++++++++++++++++++++++++++++
>>   dlls/winevulkan/vulkan_private.h |  1 +
>>   dlls/winevulkan/vulkan_thunks.c  |  8 ++----
>>   dlls/winevulkan/vulkan_thunks.h  |  4 +++
>>   5 files changed, 56 insertions(+), 8 deletions(-)
>>
>> diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
>> index fc0e2182dd..6a039bd268 100755
>> --- a/dlls/winevulkan/make_vulkan
>> +++ b/dlls/winevulkan/make_vulkan
>> @@ -183,12 +183,12 @@ FUNCTION_OVERRIDES = {
>>       # VK_KHR_surface
>>       "vkDestroySurfaceKHR" : {"dispatch" : True, "driver" : True, 
>> "thunk" : True},
>>       "vkGetPhysicalDeviceSurfaceSupportKHR" : {"dispatch" : True, 
>> "driver" : True, "thunk" : True},
>> -    "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" : {"dispatch" : True, 
>> "driver" : True, "thunk" : True},
>> +    "vkGetPhysicalDeviceSurfaceCapabilitiesKHR" : {"dispatch" : True, 
>> "driver" : True, "thunk" : False, "private_thunk" : True},
>>       "vkGetPhysicalDeviceSurfaceFormatsKHR" : {"dispatch" : True, 
>> "driver" : True, "thunk" : True},
>>       "vkGetPhysicalDeviceSurfacePresentModesKHR" : {"dispatch" : 
>> True, "driver" : True, "thunk" : True},
>>       # VK_KHR_get_surface_capabilities2
>> -    "vkGetPhysicalDeviceSurfaceCapabilities2KHR" : {"dispatch" : 
>> True, "driver" : True, "thunk" : True},
>> +    "vkGetPhysicalDeviceSurfaceCapabilities2KHR" : {"dispatch" : 
>> True, "driver" : True, "thunk" : False, "private_thunk" : True},
>>       "vkGetPhysicalDeviceSurfaceFormats2KHR" : {"dispatch" : True, 
>> "driver" : True, "thunk" : True},
>>       # VK_KHR_win32_surface
>> diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
>> index be614f1cef..5f8046f1ba 100644
>> --- a/dlls/winevulkan/vulkan.c
>> +++ b/dlls/winevulkan/vulkan.c
>> @@ -723,6 +723,8 @@ VkResult WINAPI wine_vkCreateInstance(const 
>> VkInstanceCreateInfo *create_info,
>>               object->quirks |= WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR;
>>       }
>> +    object->quirks |= WINEVULKAN_QUIRK_ADJUST_MAX_IMAGE_COUNT;
>> +
>>       *instance = object;
>>       TRACE("Created instance %p (native instance %p).\n", object, 
>> object->instance);
>>       return VK_SUCCESS;
>> @@ -1555,6 +1557,51 @@ void WINAPI wine_vkGetPrivateDataEXT(VkDevice 
>> device, VkObjectType object_type,
>>       device->funcs.p_vkGetPrivateDataEXT(device->device, object_type, 
>> object_handle, private_data_slot, data);
>>   }
>> +static inline void adjust_max_image_count(VkPhysicalDevice phys_dev, 
>> VkSurfaceCapabilitiesKHR* capabilities)
>> +{
>> +    /* Many Windows games, for example Strange Brigade, No Man's Sky, 
>> Path of Exile
>> +     * and World War Z, do not expect that maxImageCount can be set 
>> to 0.
>> +     * A value of 0 means that there is no limit on the number of 
>> images.
>> +     * Nvidia reports 8 on Windows, AMD 16.
>> +     * https://vulkan.gpuinfo.org/displayreport.php?id=9122#surface
>> +     * https://vulkan.gpuinfo.org/displayreport.php?id=9121#surface
>> +     */
>> +    if ((phys_dev->instance->quirks & 
>> WINEVULKAN_QUIRK_ADJUST_MAX_IMAGE_COUNT) && !capabilities->maxImageCount)
>> +    {
>> +        capabilities->maxImageCount = 
>> max(capabilities->minImageCount, 16);
>> +    }
>> +}
>> +
>> +VkResult WINAPI 
>> wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice phys_dev,
>> +        VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR *capabilities)
>> +{
>> +    VkResult res;
>> +
>> +    TRACE("%p, 0x%s, %p\n", phys_dev, wine_dbgstr_longlong(surface), 
>> capabilities);
>> +
>> +    res = thunk_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(phys_dev, 
>> surface, capabilities);
>> +
>> +    if (res == VK_SUCCESS)
>> +        adjust_max_image_count(phys_dev, capabilities);
>> +
>> +    return res;
>> +}
>> +
>> +VkResult WINAPI 
>> wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice 
>> phys_dev,
>> +        const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, 
>> VkSurfaceCapabilities2KHR *capabilities)
>> +{
>> +    VkResult res;
>> +
>> +    TRACE("%p, %p, %p\n", phys_dev, surface_info, capabilities);
>> +
>> +    res = thunk_vkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev, 
>> surface_info, capabilities);
>> +
>> +    if (res == VK_SUCCESS)
>> +        adjust_max_image_count(phys_dev, 
>> &capabilities->surfaceCapabilities);
>> +
>> +    return res;
>> +}
>> +
>>   BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved)
>>   {
>>       TRACE("%p, %u, %p\n", hinst, reason, reserved);
>> diff --git a/dlls/winevulkan/vulkan_private.h 
>> b/dlls/winevulkan/vulkan_private.h
>> index 17072d2341..b048108f7a 100644
>> --- a/dlls/winevulkan/vulkan_private.h
>> +++ b/dlls/winevulkan/vulkan_private.h
>> @@ -38,6 +38,7 @@
>>   #define VULKAN_ICD_MAGIC_VALUE 0x01CDC0DE
>>   #define WINEVULKAN_QUIRK_GET_DEVICE_PROC_ADDR 0x00000001
>> +#define WINEVULKAN_QUIRK_ADJUST_MAX_IMAGE_COUNT 0x00000002
>>   struct vulkan_func
>>   {
>> diff --git a/dlls/winevulkan/vulkan_thunks.c 
>> b/dlls/winevulkan/vulkan_thunks.c
>> index fcefa6a767..4f75a4ec7c 100644
>> --- a/dlls/winevulkan/vulkan_thunks.c
>> +++ b/dlls/winevulkan/vulkan_thunks.c
>> @@ -4998,26 +4998,22 @@ static VkResult WINAPI 
>> wine_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesC
>>       return 
>> physicalDevice->instance->funcs.p_vkGetPhysicalDeviceSupportedFramebufferMixedSamplesCombinationsNV(physicalDevice->phys_dev, 
>> pCombinationCount, pCombinations);
>>   }
>> -VkResult WINAPI 
>> wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice 
>> physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, 
>> VkSurfaceCapabilities2KHR *pSurfaceCapabilities)
>> +VkResult 
>> thunk_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice 
>> physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, 
>> VkSurfaceCapabilities2KHR *pSurfaceCapabilities)
>>   {
>>   #if defined(USE_STRUCT_CONVERSION)
>>       VkResult result;
>>       VkPhysicalDeviceSurfaceInfo2KHR_host pSurfaceInfo_host;
>> -    TRACE("%p, %p, %p\n", physicalDevice, pSurfaceInfo, 
>> pSurfaceCapabilities);
>> -
>>       
>> convert_VkPhysicalDeviceSurfaceInfo2KHR_win_to_host(pSurfaceInfo, 
>> &pSurfaceInfo_host);
>>       result = 
>> physicalDevice->instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice->phys_dev, 
>> &pSurfaceInfo_host, pSurfaceCapabilities);
>>       return result;
>>   #else
>> -    TRACE("%p, %p, %p\n", physicalDevice, pSurfaceInfo, 
>> pSurfaceCapabilities);
>>       return 
>> physicalDevice->instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilities2KHR(physicalDevice->phys_dev, 
>> pSurfaceInfo, pSurfaceCapabilities);
>>   #endif
>>   }
>> -VkResult WINAPI 
>> wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice 
>> physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR 
>> *pSurfaceCapabilities)
>> +VkResult 
>> thunk_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice 
>> physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR 
>> *pSurfaceCapabilities)
>>   {
>> -    TRACE("%p, 0x%s, %p\n", physicalDevice, 
>> wine_dbgstr_longlong(surface), pSurfaceCapabilities);
>>       return 
>> physicalDevice->instance->funcs.p_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(physicalDevice->phys_dev, 
>> surface, pSurfaceCapabilities);
>>   }
>> diff --git a/dlls/winevulkan/vulkan_thunks.h 
>> b/dlls/winevulkan/vulkan_thunks.h
>> index f2d650decf..d35e8c4269 100644
>> --- a/dlls/winevulkan/vulkan_thunks.h
>> +++ b/dlls/winevulkan/vulkan_thunks.h
>> @@ -42,6 +42,8 @@ VkResult WINAPI 
>> wine_vkGetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice
>>   VkResult WINAPI 
>> wine_vkGetPhysicalDeviceImageFormatProperties2KHR(VkPhysicalDevice 
>> physicalDevice, const VkPhysicalDeviceImageFormatInfo2 
>> *pImageFormatInfo, VkImageFormatProperties2 *pImageFormatProperties) 
>> DECLSPEC_HIDDEN;
>>   void WINAPI wine_vkGetPhysicalDeviceProperties2(VkPhysicalDevice 
>> physicalDevice, VkPhysicalDeviceProperties2 *pProperties);
>>   void WINAPI wine_vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice 
>> physicalDevice, VkPhysicalDeviceProperties2 *pProperties) 
>> DECLSPEC_HIDDEN;
>> +VkResult WINAPI 
>> wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice 
>> physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, 
>> VkSurfaceCapabilities2KHR *pSurfaceCapabilities);
>> +VkResult WINAPI 
>> wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice 
>> physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR 
>> *pSurfaceCapabilities);
>>   void WINAPI wine_vkGetPrivateDataEXT(VkDevice device, VkObjectType 
>> objectType, uint64_t objectHandle, VkPrivateDataSlotEXT 
>> privateDataSlot, uint64_t *pData) DECLSPEC_HIDDEN;
>>   VkResult WINAPI wine_vkQueueSubmit(VkQueue queue, uint32_t 
>> submitCount, const VkSubmitInfo *pSubmits, VkFence fence);
>>   VkResult WINAPI wine_vkSetPrivateDataEXT(VkDevice device, 
>> VkObjectType objectType, uint64_t objectHandle, VkPrivateDataSlotEXT 
>> privateDataSlot, uint64_t data) DECLSPEC_HIDDEN;
>> @@ -51,6 +53,8 @@ VkResult 
>> thunk_vkGetPhysicalDeviceImageFormatProperties2(VkPhysicalDevice physic
>>   VkResult 
>> thunk_vkGetPhysicalDeviceImageFormatProperties2KHR(VkPhysicalDevice 
>> physicalDevice, const VkPhysicalDeviceImageFormatInfo2 
>> *pImageFormatInfo, VkImageFormatProperties2 *pImageFormatProperties) 
>> DECLSPEC_HIDDEN;
>>   void thunk_vkGetPhysicalDeviceProperties2(VkPhysicalDevice 
>> physicalDevice, VkPhysicalDeviceProperties2 *pProperties) 
>> DECLSPEC_HIDDEN;
>>   void thunk_vkGetPhysicalDeviceProperties2KHR(VkPhysicalDevice 
>> physicalDevice, VkPhysicalDeviceProperties2 *pProperties) 
>> DECLSPEC_HIDDEN;
>> +VkResult 
>> thunk_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice 
>> physicalDevice, const VkPhysicalDeviceSurfaceInfo2KHR *pSurfaceInfo, 
>> VkSurfaceCapabilities2KHR *pSurfaceCapabilities) DECLSPEC_HIDDEN;
>> +VkResult 
>> thunk_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice 
>> physicalDevice, VkSurfaceKHR surface, VkSurfaceCapabilitiesKHR 
>> *pSurfaceCapabilities) DECLSPEC_HIDDEN;
>>   typedef struct VkAcquireNextImageInfoKHR_host
>>   {
>>
> 



More information about the wine-devel mailing list