diff options
| author | Stenzek <stenzek@gmail.com> | 2019-10-01 01:10:08 +1000 |
|---|---|---|
| committer | Stenzek <stenzek@gmail.com> | 2019-10-31 22:45:59 +1000 |
| commit | 16f103ab42c6faca0cb2c4ce6e93546d22feb1a4 (patch) | |
| tree | f09efa7bee413d3f2e03c0391c73ebfed93923de /Source/Core/VideoBackends/Vulkan/VulkanContext.cpp | |
| parent | 6fc6444687a7cdd7ece0ce4841f59323b00c3df6 (diff) | |
Vulkan: Exclusive fullscreen support via VK_EXT_full_screen_exclusive
Diffstat (limited to 'Source/Core/VideoBackends/Vulkan/VulkanContext.cpp')
| -rw-r--r-- | Source/Core/VideoBackends/Vulkan/VulkanContext.cpp | 87 |
1 files changed, 72 insertions, 15 deletions
diff --git a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp index ded3ed9996..dc24839f88 100644 --- a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp +++ b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp @@ -223,6 +223,7 @@ bool VulkanContext::SelectInstanceExtensions(std::vector<const char*>* extension WARN_LOG(VIDEO, "Vulkan: Debug report requested, but extension is not available."); AddExtension(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, false); + AddExtension(VK_KHR_GET_SURFACE_CAPABILITIES_2_EXTENSION_NAME, false); return true; } @@ -253,26 +254,26 @@ VulkanContext::GPUList VulkanContext::EnumerateGPUs(VkInstance instance) void VulkanContext::PopulateBackendInfo(VideoConfig* config) { config->backend_info.api_type = APIType::Vulkan; - config->backend_info.bSupportsExclusiveFullscreen = false; // Currently WSI does not allow this. - config->backend_info.bSupports3DVision = false; // D3D-exclusive. - config->backend_info.bSupportsOversizedViewports = true; // Assumed support. - config->backend_info.bSupportsEarlyZ = true; // Assumed support. - config->backend_info.bSupportsPrimitiveRestart = true; // Assumed support. - config->backend_info.bSupportsBindingLayout = false; // Assumed support. - config->backend_info.bSupportsPaletteConversion = true; // Assumed support. - config->backend_info.bSupportsClipControl = true; // Assumed support. - config->backend_info.bSupportsMultithreading = true; // Assumed support. - config->backend_info.bSupportsComputeShaders = true; // Assumed support. - config->backend_info.bSupportsGPUTextureDecoding = true; // Assumed support. - config->backend_info.bSupportsBitfield = true; // Assumed support. - config->backend_info.bSupportsPartialDepthCopies = true; // Assumed support. - config->backend_info.bSupportsShaderBinaries = true; // Assumed support. - config->backend_info.bSupportsPipelineCacheData = false; // Handled via pipeline caches. + config->backend_info.bSupports3DVision = false; // D3D-exclusive. + config->backend_info.bSupportsOversizedViewports = true; // Assumed support. + config->backend_info.bSupportsEarlyZ = true; // Assumed support. + config->backend_info.bSupportsPrimitiveRestart = true; // Assumed support. + config->backend_info.bSupportsBindingLayout = false; // Assumed support. + config->backend_info.bSupportsPaletteConversion = true; // Assumed support. + config->backend_info.bSupportsClipControl = true; // Assumed support. + config->backend_info.bSupportsMultithreading = true; // Assumed support. + config->backend_info.bSupportsComputeShaders = true; // Assumed support. + config->backend_info.bSupportsGPUTextureDecoding = true; // Assumed support. + config->backend_info.bSupportsBitfield = true; // Assumed support. + config->backend_info.bSupportsPartialDepthCopies = true; // Assumed support. + config->backend_info.bSupportsShaderBinaries = true; // Assumed support. + config->backend_info.bSupportsPipelineCacheData = false; // Handled via pipeline caches. config->backend_info.bSupportsDynamicSamplerIndexing = true; // Assumed support. config->backend_info.bSupportsPostProcessing = true; // Assumed support. config->backend_info.bSupportsBackgroundCompiling = true; // Assumed support. config->backend_info.bSupportsCopyToVram = true; // Assumed support. config->backend_info.bSupportsReversedDepthRange = true; // Assumed support. + config->backend_info.bSupportsExclusiveFullscreen = false; // Dependent on OS and features. config->backend_info.bSupportsDualSourceBlend = false; // Dependent on features. config->backend_info.bSupportsGeometryShaders = false; // Dependent on features. config->backend_info.bSupportsGSInstancing = false; // Dependent on features. @@ -468,6 +469,12 @@ bool VulkanContext::SelectDeviceExtensions(bool enable_surface) if (enable_surface && !AddExtension(VK_KHR_SWAPCHAIN_EXTENSION_NAME, true)) return false; +#ifdef SUPPORTS_VULKAN_EXCLUSIVE_FULLSCREEN + // VK_EXT_full_screen_exclusive + if (AddExtension(VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME, true)) + INFO_LOG(VIDEO, "Using VK_EXT_full_screen_exclusive for exclusive fullscreen."); +#endif + return true; } @@ -937,4 +944,54 @@ void VulkanContext::PopulateShaderSubgroupSupport() (subgroup_properties.supportedOperations & required_operations) == required_operations && subgroup_properties.supportedStages & VK_SHADER_STAGE_FRAGMENT_BIT; } + +bool VulkanContext::SupportsExclusiveFullscreen(const WindowSystemInfo& wsi, VkSurfaceKHR surface) +{ +#ifdef SUPPORTS_VULKAN_EXCLUSIVE_FULLSCREEN + if (!surface || !vkGetPhysicalDeviceSurfaceCapabilities2KHR || + !SupportsDeviceExtension(VK_EXT_FULL_SCREEN_EXCLUSIVE_EXTENSION_NAME)) + { + return false; + } + + VkPhysicalDeviceSurfaceInfo2KHR si = {}; + si.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SURFACE_INFO_2_KHR; + si.surface = surface; + + auto platform_info = GetPlatformExclusiveFullscreenInfo(wsi); + si.pNext = &platform_info; + + VkSurfaceCapabilities2KHR caps = {}; + caps.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_2_KHR; + + VkSurfaceCapabilitiesFullScreenExclusiveEXT fullscreen_caps = {}; + fullscreen_caps.sType = VK_STRUCTURE_TYPE_SURFACE_CAPABILITIES_FULL_SCREEN_EXCLUSIVE_EXT; + fullscreen_caps.fullScreenExclusiveSupported = VK_TRUE; + caps.pNext = &fullscreen_caps; + + VkResult res = vkGetPhysicalDeviceSurfaceCapabilities2KHR(m_physical_device, &si, &caps); + if (res != VK_SUCCESS) + { + LOG_VULKAN_ERROR(res, "vkGetPhysicalDeviceSurfaceCapabilities2KHR failed:"); + return false; + } + + return fullscreen_caps.fullScreenExclusiveSupported; +#else + return false; +#endif +} + +#ifdef WIN32 +VkSurfaceFullScreenExclusiveWin32InfoEXT +VulkanContext::GetPlatformExclusiveFullscreenInfo(const WindowSystemInfo& wsi) +{ + VkSurfaceFullScreenExclusiveWin32InfoEXT info = {}; + info.sType = VK_STRUCTURE_TYPE_SURFACE_FULL_SCREEN_EXCLUSIVE_WIN32_INFO_EXT; + info.hmonitor = + MonitorFromWindow(static_cast<HWND>(wsi.render_surface), MONITOR_DEFAULTTOPRIMARY); + return info; +} +#endif + } // namespace Vulkan |
