[PATCH 3/3] winevulkan: Fake support for VK_EXT_full_screen_exclusive

Georg Lehmann dadschoorse at gmail.com
Tue Oct 13 16:40:57 CDT 2020


On 13.10.20 03:51, Joshua Ashton wrote:
> Signed-off-by: Joshua Ashton <joshua at froggi.es>
> ---
>  dlls/winevulkan/make_vulkan |  8 ++++-
>  dlls/winevulkan/vulkan.c    | 59 +++++++++++++++++++++++++++++++++++--
>  2 files changed, 64 insertions(+), 3 deletions(-)
>
> diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan
> index 70d8fa5516..fa2f9edf73 100755
> --- a/dlls/winevulkan/make_vulkan
> +++ b/dlls/winevulkan/make_vulkan
> @@ -101,7 +101,6 @@ UNSUPPORTED_EXTENSIONS = [
>      # Device extensions
>      "VK_AMD_display_native_hdr",
>      "VK_EXT_display_control", # Requires VK_EXT_display_surface_counter
> -    "VK_EXT_full_screen_exclusive",
>      "VK_EXT_hdr_metadata", # Needs WSI work.
>      "VK_EXT_pipeline_creation_feedback",
>      "VK_GOOGLE_display_timing",
> @@ -225,6 +224,12 @@ FUNCTION_OVERRIDES = {
>      # VK_EXT_calibrated_timestamps
>      "vkGetPhysicalDeviceCalibrateableTimeDomainsEXT" : {"dispatch" : 
> True, "driver" : False, "thunk" : False},
>      "vkGetCalibratedTimestampsEXT" : {"dispatch" : True, "driver" : 
> False, "thunk" : False},
> +
> +    # VK_EXT_full_screen_exclusive
> +    "vkGetPhysicalDeviceSurfacePresentModes2EXT" : {"dispatch" : 
> True, "driver" : False, "thunk" : False},
> +    "vkGetDeviceGroupSurfacePresentModes2EXT" : {"dispatch" : True, 
> "driver" : False, "thunk" : False},
> +    "vkAcquireFullScreenExclusiveModeEXT" : {"dispatch" : True, 
> "driver" : False, "thunk" : False},
> +    "vkReleaseFullScreenExclusiveModeEXT" : {"dispatch" : True, 
> "driver" : False, "thunk" : False},
>  }
>
>  STRUCT_CHAIN_CONVERSIONS = [
> @@ -235,6 +240,7 @@ STRUCT_CHAIN_CONVERSIONS = [
>  # List of device extensions to ensure that we support regardless of 
> whether
>  # the actual driver supports them or not.
>  FAKED_EXTENSIONS = [
> +    {"name": "VK_EXT_full_screen_exclusive", "version": 4}
>  ]
>
>  class Direction(Enum):
> diff --git a/dlls/winevulkan/vulkan.c b/dlls/winevulkan/vulkan.c
> index 177aa3a8bf..fa18209cbd 100644
> --- a/dlls/winevulkan/vulkan.c
> +++ b/dlls/winevulkan/vulkan.c
> @@ -1640,15 +1640,30 @@ VkResult WINAPI 
> wine_vkGetPhysicalDeviceSurfaceCapabilitiesKHR(VkPhysicalDevice
>  VkResult WINAPI 
> wine_vkGetPhysicalDeviceSurfaceCapabilities2KHR(VkPhysicalDevice phys_dev,
>          const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, 
> VkSurfaceCapabilities2KHR *capabilities)
>  {
> +    VkPhysicalDeviceSurfaceInfo2KHR surface_info_modified;
>      VkResult res;
>
>      TRACE("%p, %p, %p\n", phys_dev, surface_info, capabilities);
>
> -    res = thunk_vkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev, 
> surface_info, capabilities);
> +    /* Toss out VkSurfaceFullScreenExclusiveInfoEXT
> +     * and VkSurfaceFullScreenExclusiveWin32InfoEXT */
> +    surface_info_modified.sType   = surface_info->sType;
> +    surface_info_modified.pNext   = NULL;
> +    surface_info_modified.surface = surface_info->surface;
> +
> +    res = thunk_vkGetPhysicalDeviceSurfaceCapabilities2KHR(phys_dev, 
> &surface_info_modified, capabilities);
>
>      if (res == VK_SUCCESS)
> +    {
> +        VkSurfaceCapabilitiesFullScreenExclusiveEXT 
> *full_screen_exclusive_caps;


white space error


> +
>          adjust_max_image_count(phys_dev, 
> &capabilities->surfaceCapabilities);
>
> +        /* Lie and say we support exclusive fullscreen. */
> +        if ((full_screen_exclusive_caps = 
> wine_vk_find_struct(capabilities, 
> SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT)))
> + full_screen_exclusive_caps->fullScreenExclusiveSupported = VK_TRUE;
> +    }
> +
>      return res;
>  }
>
> @@ -1656,15 +1671,55 @@ VkResult WINAPI 
> wine_vkGetPhysicalDeviceSurfaceFormats2KHR(VkPhysicalDevice phys
>          const VkPhysicalDeviceSurfaceInfo2KHR *surface_info, uint32_t 
> *surface_format_count,
>          VkSurfaceFormat2KHR *surface_formats)
>  {
> +    VkPhysicalDeviceSurfaceInfo2KHR surface_info_modified;
>      VkResult res;
>
>      TRACE("%p, %p, %p, %p\n", phys_dev, surface_info, 
> surface_format_count, surface_formats);
>
> -    res = thunk_vkGetPhysicalDeviceSurfaceFormats2KHR(phys_dev, 
> surface_info, surface_format_count, surface_formats);
> +    /* Toss out VkSurfaceFullScreenExclusiveInfoEXT
> +     * and VkSurfaceFullScreenExclusiveWin32InfoEXT */
> +    surface_info_modified.sType   = surface_info->sType;
> +    surface_info_modified.pNext   = NULL;


This is going to  break if there's another extension that uses this 
function.

Generating a chain conversion function might be a better idea, but I 
think StructChainConversionFunction doesn't support output chains yet.

Otherwise, at least put a TODO or FIXME comment here.


Thanks,


Georg Lehmann


> +    surface_info_modified.surface = surface_info->surface;
> +
> +    res = thunk_vkGetPhysicalDeviceSurfaceFormats2KHR(phys_dev, 
> &surface_info_modified, surface_format_count, surface_formats);
>
>      return res;
>  }
>
> +VkResult WINAPI 
> wine_vkGetPhysicalDeviceSurfacePresentModesKHR(VkPhysicalDevice 
> physicalDevice, VkSurfaceKHR surface, uint32_t *pPresentModeCount, 
> VkPresentModeKHR *pPresentModes);
> +VkResult WINAPI wine_vkGetDeviceGroupSurfacePresentModesKHR(VkDevice 
> device, VkSurfaceKHR surface, VkDeviceGroupPresentModeFlagsKHR *pModes);
> +
> +VkResult WINAPI wine_vkGetPhysicalDeviceSurfacePresentModes2EXT(
> +    VkPhysicalDevice phys_dev, const VkPhysicalDeviceSurfaceInfo2KHR 
> *surface_info,
> +    uint32_t *present_mode_count, VkPresentModeKHR *present_modes)
> +{
> +    TRACE("%p, %p, %p, %p", phys_dev, surface_info, 
> present_mode_count, present_modes);
> +    return wine_vkGetPhysicalDeviceSurfacePresentModesKHR(phys_dev, 
> surface_info->surface, present_mode_count, present_modes);
> +}
> +
> +VkResult WINAPI wine_vkGetDeviceGroupSurfacePresentModes2EXT(
> +    VkDevice device, const VkPhysicalDeviceSurfaceInfo2KHR *surface_info,
> +    VkDeviceGroupPresentModeFlagsKHR *modes)
> +{
> +    TRACE("%p, %p, %p", device, surface_info, modes);
> +    return wine_vkGetDeviceGroupSurfacePresentModesKHR(device, 
> surface_info->surface, modes);
> +}
> +
> +VkResult WINAPI wine_vkAcquireFullScreenExclusiveModeEXT(
> +    VkDevice device, VkSwapchainKHR swapchain)
> +{
> +    TRACE("%p, %s", device, wine_dbgstr_longlong(swapchain));
> +    return VK_SUCCESS;
> +}
> +
> +VkResult WINAPI wine_vkReleaseFullScreenExclusiveModeEXT(
> +    VkDevice device, VkSwapchainKHR swapchain)
> +{
> +    TRACE("%p, %s", device, wine_dbgstr_longlong(swapchain));
> +    return VK_SUCCESS;
> +}
> +
>  BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, void *reserved)
>  {
>      TRACE("%p, %u, %p\n", hinst, reason, reserved);




More information about the wine-devel mailing list