summaryrefslogtreecommitdiff
path: root/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
diff options
context:
space:
mode:
authorStenzek <stenzek@gmail.com>2019-10-01 01:10:08 +1000
committerStenzek <stenzek@gmail.com>2019-10-31 22:45:59 +1000
commit16f103ab42c6faca0cb2c4ce6e93546d22feb1a4 (patch)
treef09efa7bee413d3f2e03c0391c73ebfed93923de /Source/Core/VideoBackends/Vulkan/VulkanContext.cpp
parent6fc6444687a7cdd7ece0ce4841f59323b00c3df6 (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.cpp87
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