HostDisplay: Move Windows fallback for refresh rate query to HostInterface

This commit is contained in:
Connor McLaughlin 2021-01-11 15:11:57 +10:00
parent fd166a4485
commit 13cba122ef
3 changed files with 48 additions and 38 deletions

View File

@ -5,6 +5,7 @@
#include "common/log.h" #include "common/log.h"
#include "common/string_util.h" #include "common/string_util.h"
#include "common/timer.h" #include "common/timer.h"
#include "host_interface.h"
#include "stb_image.h" #include "stb_image.h"
#include "stb_image_resize.h" #include "stb_image_resize.h"
#include "stb_image_write.h" #include "stb_image_write.h"
@ -15,11 +16,6 @@
#include <vector> #include <vector>
Log_SetChannel(HostDisplay); Log_SetChannel(HostDisplay);
#ifdef _WIN32
#include "common/windows_headers.h"
#include <dwmapi.h>
#endif
HostDisplayTexture::~HostDisplayTexture() = default; HostDisplayTexture::~HostDisplayTexture() = default;
HostDisplay::~HostDisplay() = default; HostDisplay::~HostDisplay() = default;
@ -92,39 +88,7 @@ bool HostDisplay::SetDisplayPixels(HostDisplayPixelFormat format, u32 width, u32
bool HostDisplay::GetHostRefreshRate(float* refresh_rate) bool HostDisplay::GetHostRefreshRate(float* refresh_rate)
{ {
#ifdef _WIN32 return g_host_interface->GetMainDisplayRefreshRate(refresh_rate);
static HMODULE dwm_module = nullptr;
static HRESULT(STDAPICALLTYPE * get_timing_info)(HWND hwnd, DWM_TIMING_INFO * pTimingInfo) = nullptr;
static bool load_tried = false;
if (!load_tried)
{
load_tried = true;
dwm_module = LoadLibrary("dwmapi.dll");
if (dwm_module)
{
std::atexit([]() {
FreeLibrary(dwm_module);
dwm_module = nullptr;
});
get_timing_info =
reinterpret_cast<decltype(get_timing_info)>(GetProcAddress(dwm_module, "DwmGetCompositionTimingInfo"));
}
}
DWM_TIMING_INFO ti = {};
ti.cbSize = sizeof(ti);
HRESULT hr = get_timing_info(nullptr, &ti);
if (SUCCEEDED(hr))
{
if (ti.rateRefresh.uiNumerator == 0 || ti.rateRefresh.uiDenominator == 0)
return false;
*refresh_rate = static_cast<float>(ti.rateRefresh.uiNumerator) / static_cast<float>(ti.rateRefresh.uiDenominator);
return true;
}
#endif
return false;
} }
void HostDisplay::SetSoftwareCursor(std::unique_ptr<HostDisplayTexture> texture, float scale /*= 1.0f*/) void HostDisplay::SetSoftwareCursor(std::unique_ptr<HostDisplayTexture> texture, float scale /*= 1.0f*/)

View File

@ -24,6 +24,11 @@
#include <stdlib.h> #include <stdlib.h>
Log_SetChannel(HostInterface); Log_SetChannel(HostInterface);
#ifdef _WIN32
#include "common/windows_headers.h"
#include <dwmapi.h>
#endif
HostInterface* g_host_interface; HostInterface* g_host_interface;
HostInterface::HostInterface() HostInterface::HostInterface()
@ -931,6 +936,43 @@ std::string HostInterface::TranslateStdString(const char* context, const char* s
return str; return str;
} }
bool HostInterface::GetMainDisplayRefreshRate(float* refresh_rate)
{
#ifdef _WIN32
static HMODULE dwm_module = nullptr;
static HRESULT(STDAPICALLTYPE * get_timing_info)(HWND hwnd, DWM_TIMING_INFO * pTimingInfo) = nullptr;
static bool load_tried = false;
if (!load_tried)
{
load_tried = true;
dwm_module = LoadLibrary("dwmapi.dll");
if (dwm_module)
{
std::atexit([]() {
FreeLibrary(dwm_module);
dwm_module = nullptr;
});
get_timing_info =
reinterpret_cast<decltype(get_timing_info)>(GetProcAddress(dwm_module, "DwmGetCompositionTimingInfo"));
}
}
DWM_TIMING_INFO ti = {};
ti.cbSize = sizeof(ti);
HRESULT hr = get_timing_info(nullptr, &ti);
if (SUCCEEDED(hr))
{
if (ti.rateRefresh.uiNumerator == 0 || ti.rateRefresh.uiDenominator == 0)
return false;
*refresh_rate = static_cast<float>(ti.rateRefresh.uiNumerator) / static_cast<float>(ti.rateRefresh.uiDenominator);
return true;
}
#endif
return false;
}
void HostInterface::ToggleSoftwareRendering() void HostInterface::ToggleSoftwareRendering()
{ {
if (System::IsShutdown() || g_settings.gpu_renderer == GPURenderer::Software) if (System::IsShutdown() || g_settings.gpu_renderer == GPURenderer::Software)

View File

@ -119,6 +119,10 @@ public:
virtual TinyString TranslateString(const char* context, const char* str) const; virtual TinyString TranslateString(const char* context, const char* str) const;
virtual std::string TranslateStdString(const char* context, const char* str) const; virtual std::string TranslateStdString(const char* context, const char* str) const;
/// Returns the refresh rate for the "main" display. Use when it's not possible to query the graphics API for the
/// refresh rate of the monitor the window is running in.
virtual bool GetMainDisplayRefreshRate(float* refresh_rate);
/// Returns the path to the directory to search for BIOS images. /// Returns the path to the directory to search for BIOS images.
virtual std::string GetBIOSDirectory(); virtual std::string GetBIOSDirectory();