HostDisplay: Add virtual method for getting resolutions

This commit is contained in:
Connor McLaughlin 2021-02-14 00:33:35 +10:00
parent e7fc904cf4
commit 5a66639d78
8 changed files with 50 additions and 31 deletions

View File

@ -3,6 +3,7 @@
#include "common/window_info.h" #include "common/window_info.h"
#include "types.h" #include "types.h"
#include <memory> #include <memory>
#include <string>
#include <string_view> #include <string_view>
#include <tuple> #include <tuple>
#include <vector> #include <vector>
@ -52,6 +53,12 @@ public:
RightOrBottom RightOrBottom
}; };
struct AdapterAndModeList
{
std::vector<std::string> adapter_names;
std::vector<std::string> fullscreen_modes;
};
virtual ~HostDisplay(); virtual ~HostDisplay();
ALWAYS_INLINE s32 GetWindowWidth() const { return static_cast<s32>(m_window_info.surface_width); } ALWAYS_INLINE s32 GetWindowWidth() const { return static_cast<s32>(m_window_info.surface_width); }
@ -85,6 +92,7 @@ public:
virtual bool SupportsFullscreen() const = 0; virtual bool SupportsFullscreen() const = 0;
virtual bool IsFullscreen() = 0; virtual bool IsFullscreen() = 0;
virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) = 0; virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) = 0;
virtual AdapterAndModeList GetAdapterAndModeList() = 0;
virtual bool CreateResources() = 0; virtual bool CreateResources() = 0;
virtual void DestroyResources() = 0; virtual void DestroyResources() = 0;

View File

@ -171,24 +171,19 @@ void DisplaySettingsWidget::setupAdditionalUi()
void DisplaySettingsWidget::populateGPUAdaptersAndResolutions() void DisplaySettingsWidget::populateGPUAdaptersAndResolutions()
{ {
std::vector<std::string> adapter_names; HostDisplay::AdapterAndModeList aml;
std::vector<std::string> fullscreen_modes;
bool thread_supported = false; bool thread_supported = false;
bool threaded_presentation_supported = false; bool threaded_presentation_supported = false;
switch (static_cast<GPURenderer>(m_ui.renderer->currentIndex())) switch (static_cast<GPURenderer>(m_ui.renderer->currentIndex()))
{ {
#ifdef WIN32 #ifdef WIN32
case GPURenderer::HardwareD3D11: case GPURenderer::HardwareD3D11:
{ aml = FrontendCommon::D3D11HostDisplay::StaticGetAdapterAndModeList();
FrontendCommon::D3D11HostDisplay::AdapterInfo adapter_info = FrontendCommon::D3D11HostDisplay::GetAdapterInfo(); break;
adapter_names = std::move(adapter_info.adapter_names);
fullscreen_modes = std::move(adapter_info.fullscreen_modes);
}
break;
#endif #endif
case GPURenderer::HardwareVulkan: case GPURenderer::HardwareVulkan:
adapter_names = FrontendCommon::VulkanHostDisplay::EnumerateAdapterNames(); aml = FrontendCommon::VulkanHostDisplay::StaticGetAdapterAndModeList();
threaded_presentation_supported = true; threaded_presentation_supported = true;
break; break;
@ -209,7 +204,7 @@ void DisplaySettingsWidget::populateGPUAdaptersAndResolutions()
m_ui.adapter->addItem(tr("(Default)")); m_ui.adapter->addItem(tr("(Default)"));
// add the other adapters // add the other adapters
for (const std::string& adapter_name : adapter_names) for (const std::string& adapter_name : aml.adapter_names)
{ {
m_ui.adapter->addItem(QString::fromStdString(adapter_name)); m_ui.adapter->addItem(QString::fromStdString(adapter_name));
@ -218,7 +213,7 @@ void DisplaySettingsWidget::populateGPUAdaptersAndResolutions()
} }
// disable it if we don't have a choice // disable it if we don't have a choice
m_ui.adapter->setEnabled(!adapter_names.empty()); m_ui.adapter->setEnabled(!aml.adapter_names.empty());
} }
{ {
@ -229,7 +224,7 @@ void DisplaySettingsWidget::populateGPUAdaptersAndResolutions()
m_ui.fullscreenMode->addItem(tr("Borderless Fullscreen")); m_ui.fullscreenMode->addItem(tr("Borderless Fullscreen"));
m_ui.fullscreenMode->setCurrentIndex(0); m_ui.fullscreenMode->setCurrentIndex(0);
for (const std::string& mode_name : fullscreen_modes) for (const std::string& mode_name : aml.fullscreen_modes)
{ {
m_ui.fullscreenMode->addItem(QString::fromStdString(mode_name)); m_ui.fullscreenMode->addItem(QString::fromStdString(mode_name));
@ -238,7 +233,7 @@ void DisplaySettingsWidget::populateGPUAdaptersAndResolutions()
} }
// disable it if we don't have a choice // disable it if we don't have a choice
m_ui.fullscreenMode->setEnabled(!fullscreen_modes.empty()); m_ui.fullscreenMode->setEnabled(!aml.fullscreen_modes.empty());
} }
m_ui.gpuThread->setEnabled(thread_supported); m_ui.gpuThread->setEnabled(thread_supported);

View File

@ -256,7 +256,7 @@ bool D3D11HostDisplay::CreateRenderDevice(const WindowInfo& wi, std::string_view
u32 adapter_index; u32 adapter_index;
if (!adapter_name.empty()) if (!adapter_name.empty())
{ {
AdapterInfo adapter_info = GetAdapterInfo(temp_dxgi_factory.Get()); AdapterAndModeList adapter_info(GetAdapterAndModeList(temp_dxgi_factory.Get()));
for (adapter_index = 0; adapter_index < static_cast<u32>(adapter_info.adapter_names.size()); adapter_index++) for (adapter_index = 0; adapter_index < static_cast<u32>(adapter_info.adapter_names.size()); adapter_index++)
{ {
if (adapter_name == adapter_info.adapter_names[adapter_index]) if (adapter_name == adapter_info.adapter_names[adapter_index])
@ -795,19 +795,19 @@ void D3D11HostDisplay::RenderSoftwareCursor(s32 left, s32 top, s32 width, s32 he
m_context->Draw(3, 0); m_context->Draw(3, 0);
} }
D3D11HostDisplay::AdapterInfo D3D11HostDisplay::GetAdapterInfo() HostDisplay::AdapterAndModeList D3D11HostDisplay::StaticGetAdapterAndModeList()
{ {
ComPtr<IDXGIFactory> dxgi_factory; ComPtr<IDXGIFactory> dxgi_factory;
HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(dxgi_factory.GetAddressOf())); HRESULT hr = CreateDXGIFactory(IID_PPV_ARGS(dxgi_factory.GetAddressOf()));
if (FAILED(hr)) if (FAILED(hr))
return {}; return {};
return GetAdapterInfo(dxgi_factory.Get()); return GetAdapterAndModeList(dxgi_factory.Get());
} }
D3D11HostDisplay::AdapterInfo D3D11HostDisplay::GetAdapterInfo(IDXGIFactory* dxgi_factory) HostDisplay::AdapterAndModeList D3D11HostDisplay::GetAdapterAndModeList(IDXGIFactory* dxgi_factory)
{ {
AdapterInfo adapter_info; AdapterAndModeList adapter_info;
ComPtr<IDXGIAdapter> current_adapter; ComPtr<IDXGIAdapter> current_adapter;
while (SUCCEEDED(dxgi_factory->EnumAdapters(static_cast<UINT>(adapter_info.adapter_names.size()), while (SUCCEEDED(dxgi_factory->EnumAdapters(static_cast<UINT>(adapter_info.adapter_names.size()),
current_adapter.ReleaseAndGetAddressOf()))) current_adapter.ReleaseAndGetAddressOf())))
@ -873,6 +873,11 @@ D3D11HostDisplay::AdapterInfo D3D11HostDisplay::GetAdapterInfo(IDXGIFactory* dxg
return adapter_info; return adapter_info;
} }
HostDisplay::AdapterAndModeList D3D11HostDisplay::GetAdapterAndModeList()
{
return GetAdapterAndModeList(m_dxgi_factory.Get());
}
bool D3D11HostDisplay::SetPostProcessingChain(const std::string_view& config) bool D3D11HostDisplay::SetPostProcessingChain(const std::string_view& config)
{ {
if (config.empty()) if (config.empty())

View File

@ -46,6 +46,7 @@ public:
virtual bool SupportsFullscreen() const override; virtual bool SupportsFullscreen() const override;
virtual bool IsFullscreen() override; virtual bool IsFullscreen() override;
virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override; virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override;
virtual AdapterAndModeList GetAdapterAndModeList() override;
virtual void DestroyRenderSurface() override; virtual void DestroyRenderSurface() override;
virtual bool SetPostProcessingChain(const std::string_view& config) override; virtual bool SetPostProcessingChain(const std::string_view& config) override;
@ -68,17 +69,12 @@ public:
virtual bool Render() override; virtual bool Render() override;
struct AdapterInfo static AdapterAndModeList StaticGetAdapterAndModeList();
{
std::vector<std::string> adapter_names;
std::vector<std::string> fullscreen_modes;
};
static AdapterInfo GetAdapterInfo();
protected: protected:
static constexpr u32 DISPLAY_UNIFORM_BUFFER_SIZE = 16; static constexpr u32 DISPLAY_UNIFORM_BUFFER_SIZE = 16;
static AdapterInfo GetAdapterInfo(IDXGIFactory* dxgi_factory); static AdapterAndModeList GetAdapterAndModeList(IDXGIFactory* dxgi_factory);
virtual bool CreateResources() override; virtual bool CreateResources() override;
virtual void DestroyResources() override; virtual void DestroyResources() override;

View File

@ -510,6 +510,11 @@ bool OpenGLHostDisplay::SetFullscreen(bool fullscreen, u32 width, u32 height, fl
return false; return false;
} }
HostDisplay::AdapterAndModeList OpenGLHostDisplay::GetAdapterAndModeList()
{
return {};
}
void OpenGLHostDisplay::DestroyRenderSurface() void OpenGLHostDisplay::DestroyRenderSurface()
{ {
if (!m_gl_context) if (!m_gl_context)

View File

@ -44,6 +44,7 @@ public:
virtual bool SupportsFullscreen() const override; virtual bool SupportsFullscreen() const override;
virtual bool IsFullscreen() override; virtual bool IsFullscreen() override;
virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override; virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override;
virtual AdapterAndModeList GetAdapterAndModeList() override;
virtual void DestroyRenderSurface() override; virtual void DestroyRenderSurface() override;
virtual bool SetPostProcessingChain(const std::string_view& config) override; virtual bool SetPostProcessingChain(const std::string_view& config) override;

View File

@ -139,6 +139,11 @@ bool VulkanHostDisplay::SetFullscreen(bool fullscreen, u32 width, u32 height, fl
return false; return false;
} }
HostDisplay::AdapterAndModeList VulkanHostDisplay::GetAdapterAndModeList()
{
return StaticGetAdapterAndModeList();
}
void VulkanHostDisplay::DestroyRenderSurface() void VulkanHostDisplay::DestroyRenderSurface()
{ {
m_window_info = {}; m_window_info = {};
@ -747,12 +752,15 @@ void VulkanHostDisplay::RenderSoftwareCursor(s32 left, s32 top, s32 width, s32 h
vkCmdDraw(cmdbuffer, 3, 1, 0, 0); vkCmdDraw(cmdbuffer, 3, 1, 0, 0);
} }
std::vector<std::string> VulkanHostDisplay::EnumerateAdapterNames() HostDisplay::AdapterAndModeList VulkanHostDisplay::StaticGetAdapterAndModeList()
{ {
if (g_vulkan_context) AdapterAndModeList ret;
return Vulkan::Context::EnumerateGPUNames(g_vulkan_context->GetVulkanInstance());
if (Vulkan::LoadVulkanLibrary()) if (g_vulkan_context)
{
ret.adapter_names = Vulkan::Context::EnumerateGPUNames(g_vulkan_context->GetVulkanInstance());
}
else if (Vulkan::LoadVulkanLibrary())
{ {
Common::ScopeGuard lib_guard([]() { Vulkan::UnloadVulkanLibrary(); }); Common::ScopeGuard lib_guard([]() { Vulkan::UnloadVulkanLibrary(); });
@ -762,7 +770,7 @@ std::vector<std::string> VulkanHostDisplay::EnumerateAdapterNames()
Common::ScopeGuard instance_guard([&instance]() { vkDestroyInstance(instance, nullptr); }); Common::ScopeGuard instance_guard([&instance]() { vkDestroyInstance(instance, nullptr); });
if (Vulkan::LoadVulkanInstanceFunctions(instance)) if (Vulkan::LoadVulkanInstanceFunctions(instance))
return Vulkan::Context::EnumerateGPUNames(instance); ret.adapter_names = Vulkan::Context::EnumerateGPUNames(instance);
} }
} }

View File

@ -43,6 +43,7 @@ public:
virtual bool SupportsFullscreen() const override; virtual bool SupportsFullscreen() const override;
virtual bool IsFullscreen() override; virtual bool IsFullscreen() override;
virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override; virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override;
virtual AdapterAndModeList GetAdapterAndModeList() override;
virtual void DestroyRenderSurface() override; virtual void DestroyRenderSurface() override;
virtual bool SetPostProcessingChain(const std::string_view& config) override; virtual bool SetPostProcessingChain(const std::string_view& config) override;
@ -64,7 +65,7 @@ public:
virtual bool Render() override; virtual bool Render() override;
static std::vector<std::string> EnumerateAdapterNames(); static AdapterAndModeList StaticGetAdapterAndModeList();
protected: protected:
struct PushConstants struct PushConstants