[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: [PATCH v2] winevulkan: Avoid returning 0 for swapchain maxImageCount.
From:       Joshua Ashton <joshua () froggi ! es>
Date:       2020-07-31 15:48:28
Message-ID: be269426-f0f4-d684-8cc9-fdd6a1144ac1 () froggi ! es
[Download RAW message or body]

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

On 31/07/2020 10:48, Liam Middlebrook wrote:
> Signed-off-by: Liam Middlebrook <lmiddlebrook@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@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
> > {
> > 
> 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic