[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