diff --git a/src/core/gpu_thread.cpp b/src/core/gpu_thread.cpp index 8a9e78494..13a5602e9 100644 --- a/src/core/gpu_thread.cpp +++ b/src/core/gpu_thread.cpp @@ -629,7 +629,7 @@ bool GPUThread::CreateDeviceOnThread(RenderAPI api, bool fullscreen, bool clear_ g_gpu_device = GPUDevice::CreateDeviceForAPI(api); std::optional fullscreen_mode; - if (fullscreen && g_gpu_device && g_gpu_device->SupportsExclusiveFullscreen()) + if (fullscreen && g_gpu_device && g_gpu_device->GetFeatures().exclusive_fullscreen) { fullscreen_mode = GPUDevice::ExclusiveFullscreenMode::Parse(Host::GetTinyStringSettingValue("GPU", "FullscreenMode", "")); @@ -1140,7 +1140,7 @@ void GPUThread::UpdateDisplayWindowOnThread(bool fullscreen) return; std::optional fullscreen_mode; - if (fullscreen && g_gpu_device->SupportsExclusiveFullscreen()) + if (fullscreen && g_gpu_device->GetFeatures().exclusive_fullscreen) { fullscreen_mode = GPUDevice::ExclusiveFullscreenMode::Parse(Host::GetTinyStringSettingValue("GPU", "FullscreenMode", "")); diff --git a/src/util/d3d11_device.cpp b/src/util/d3d11_device.cpp index d368156e6..a52295fa0 100644 --- a/src/util/d3d11_device.cpp +++ b/src/util/d3d11_device.cpp @@ -48,6 +48,7 @@ void SetD3DDebugObjectName(ID3D11DeviceChild* obj, std::string_view name) D3D11Device::D3D11Device() { m_render_api = RenderAPI::D3D11; + m_features.exclusive_fullscreen = true; // set so the caller can pass a mode to CreateDeviceAndSwapChain() } D3D11Device::~D3D11Device() @@ -186,6 +187,7 @@ void D3D11Device::SetFeatures(FeatureMask disabled_features) (!(disabled_features & FEATURE_MASK_COMPUTE_SHADERS) && feature_level >= D3D_FEATURE_LEVEL_11_0); m_features.partial_msaa_resolve = false; m_features.memory_import = false; + m_features.exclusive_fullscreen = true; m_features.explicit_present = false; m_features.timed_present = false; m_features.gpu_timing = true; @@ -470,11 +472,6 @@ std::unique_ptr D3D11Device::CreateSwapChain(const WindowInfo& wi, return ret; } -bool D3D11Device::SupportsExclusiveFullscreen() const -{ - return true; -} - std::string D3D11Device::GetDriverInfo() const { std::string ret = fmt::format("{} (Shader Model {})\n", D3DCommon::GetFeatureLevelString(m_render_api_version), diff --git a/src/util/d3d11_device.h b/src/util/d3d11_device.h index bc6edd829..d445574e1 100644 --- a/src/util/d3d11_device.h +++ b/src/util/d3d11_device.h @@ -37,8 +37,6 @@ public: ALWAYS_INLINE static IDXGIFactory5* GetDXGIFactory() { return GetInstance().m_dxgi_factory.Get(); } ALWAYS_INLINE static D3D_FEATURE_LEVEL GetMaxFeatureLevel() { return GetInstance().m_max_feature_level; } - bool SupportsExclusiveFullscreen() const override; - std::string GetDriverInfo() const override; void FlushCommands() override; diff --git a/src/util/d3d12_device.cpp b/src/util/d3d12_device.cpp index 9cec1a74a..3c00160bd 100644 --- a/src/util/d3d12_device.cpp +++ b/src/util/d3d12_device.cpp @@ -116,6 +116,7 @@ static constexpr const u32 s_mipmap_blit_ps[] = { D3D12Device::D3D12Device() { m_render_api = RenderAPI::D3D12; + m_features.exclusive_fullscreen = true; // set so the caller can pass a mode to CreateDeviceAndSwapChain() #ifdef ENABLE_GPU_OBJECT_NAMES s_debug_scope_depth = 0; @@ -1346,6 +1347,7 @@ void D3D12Device::SetFeatures(D3D_FEATURE_LEVEL feature_level, FeatureMask disab m_features.compute_shaders = !(disabled_features & FEATURE_MASK_COMPUTE_SHADERS); m_features.partial_msaa_resolve = true; m_features.memory_import = false; + m_features.exclusive_fullscreen = true; m_features.explicit_present = true; m_features.timed_present = false; m_features.gpu_timing = true; diff --git a/src/util/gpu_device.cpp b/src/util/gpu_device.cpp index 98b808b4e..d93342dcc 100644 --- a/src/util/gpu_device.cpp +++ b/src/util/gpu_device.cpp @@ -506,11 +506,6 @@ void GPUDevice::DestroyMainSwapChain() m_main_swap_chain.reset(); } -bool GPUDevice::SupportsExclusiveFullscreen() const -{ - return false; -} - void GPUDevice::OpenShaderCache(std::string_view base_path, u32 version) { if (m_features.shader_cache && !base_path.empty()) diff --git a/src/util/gpu_device.h b/src/util/gpu_device.h index db05c6784..60aed7465 100644 --- a/src/util/gpu_device.h +++ b/src/util/gpu_device.h @@ -596,6 +596,7 @@ public: bool compute_shaders : 1; bool partial_msaa_resolve : 1; bool memory_import : 1; + bool exclusive_fullscreen : 1; bool explicit_present : 1; bool timed_present : 1; bool gpu_timing : 1; @@ -740,8 +741,6 @@ public: std::optional exclusive_fullscreen_control, Error* error); void DestroyMainSwapChain(); - virtual bool SupportsExclusiveFullscreen() const; - virtual std::string GetDriverInfo() const = 0; // Flushes current command buffer, but does not wait for completion. diff --git a/src/util/metal_device.mm b/src/util/metal_device.mm index d9f458e0e..ac8ffe043 100644 --- a/src/util/metal_device.mm +++ b/src/util/metal_device.mm @@ -385,6 +385,7 @@ void MetalDevice::SetFeatures(FeatureMask disabled_features) m_features.geometry_shaders = false; m_features.partial_msaa_resolve = false; m_features.memory_import = true; + m_features.exclusive_fullscreen = false; m_features.explicit_present = false; m_features.timed_present = true; m_features.shader_cache = true; diff --git a/src/util/opengl_device.cpp b/src/util/opengl_device.cpp index 55e85a13b..c77d391a2 100644 --- a/src/util/opengl_device.cpp +++ b/src/util/opengl_device.cpp @@ -489,6 +489,7 @@ bool OpenGLDevice::CheckFeatures(FeatureMask disabled_features) (!GLAD_GL_EXT_disjoint_timer_query || !glGetQueryObjectivEXT || !glGetQueryObjectui64vEXT)); m_features.partial_msaa_resolve = true; m_features.memory_import = true; + m_features.exclusive_fullscreen = false; m_features.explicit_present = false; m_features.timed_present = false; diff --git a/src/util/vulkan_device.cpp b/src/util/vulkan_device.cpp index 9398b7b2c..e6a6ef1b4 100644 --- a/src/util/vulkan_device.cpp +++ b/src/util/vulkan_device.cpp @@ -2455,6 +2455,7 @@ void VulkanDevice::SetFeatures(FeatureMask disabled_features, const VkPhysicalDe m_features.partial_msaa_resolve = true; m_features.memory_import = m_optional_extensions.vk_ext_external_memory_host; + m_features.exclusive_fullscreen = false; m_features.explicit_present = true; m_features.timed_present = false; m_features.shader_cache = true;