mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-27 08:05:41 +00:00
HostDisplay: Move Windows fallback for refresh rate query to HostInterface
This commit is contained in:
parent
fd166a4485
commit
13cba122ef
|
@ -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*/)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue