winevulkan: Avoid returning 0 for swapchain maxImageCount.
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> Signed-off-by: Joshua Ashton <joshua@froggi.es> Signed-off-by: Liam Middlebrook <lmiddlebrook@nvidia.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
70b2d181b1
commit
1e074c39f6
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue