1
0
mirror of https://github.com/narzoul/DDrawCompat synced 2024-12-30 08:55:36 +01:00

Added DisplayRefreshRate setting

This commit is contained in:
narzoul 2022-02-12 20:53:30 +01:00
parent 0d85ab5dc6
commit 408ccee3d8
7 changed files with 107 additions and 6 deletions

View File

@ -7,6 +7,7 @@ namespace Config
Settings::CpuAffinity cpuAffinity; Settings::CpuAffinity cpuAffinity;
Settings::DesktopColorDepth desktopColorDepth; Settings::DesktopColorDepth desktopColorDepth;
Settings::DisplayFilter displayFilter; Settings::DisplayFilter displayFilter;
Settings::DisplayRefreshRate displayRefreshRate;
Settings::DisplayResolution displayResolution; Settings::DisplayResolution displayResolution;
Settings::RenderColorDepth renderColorDepth; Settings::RenderColorDepth renderColorDepth;
Settings::ResolutionScale resolutionScale; Settings::ResolutionScale resolutionScale;

View File

@ -5,6 +5,7 @@
#include <Config/Settings/CpuAffinity.h> #include <Config/Settings/CpuAffinity.h>
#include <Config/Settings/DesktopColorDepth.h> #include <Config/Settings/DesktopColorDepth.h>
#include <Config/Settings/DisplayFilter.h> #include <Config/Settings/DisplayFilter.h>
#include <Config/Settings/DisplayRefreshRate.h>
#include <Config/Settings/DisplayResolution.h> #include <Config/Settings/DisplayResolution.h>
#include <Config/Settings/RenderColorDepth.h> #include <Config/Settings/RenderColorDepth.h>
#include <Config/Settings/ResolutionScale.h> #include <Config/Settings/ResolutionScale.h>
@ -22,6 +23,7 @@ namespace Config
extern Settings::CpuAffinity cpuAffinity; extern Settings::CpuAffinity cpuAffinity;
extern Settings::DesktopColorDepth desktopColorDepth; extern Settings::DesktopColorDepth desktopColorDepth;
extern Settings::DisplayFilter displayFilter; extern Settings::DisplayFilter displayFilter;
extern Settings::DisplayRefreshRate displayRefreshRate;
extern Settings::DisplayResolution displayResolution; extern Settings::DisplayResolution displayResolution;
extern Settings::RenderColorDepth renderColorDepth; extern Settings::RenderColorDepth renderColorDepth;
extern Settings::ResolutionScale resolutionScale; extern Settings::ResolutionScale resolutionScale;

View File

@ -0,0 +1,36 @@
#include <Config/Settings/DisplayRefreshRate.h>
namespace Config
{
namespace Settings
{
DisplayRefreshRate::DisplayRefreshRate()
: MappedSetting("DisplayRefreshRate", "app", { {"app", APP}, {"desktop", DESKTOP} })
{
}
std::string DisplayRefreshRate::getValueStr() const
{
try
{
return MappedSetting::getValueStr();
}
catch (const ParsingError&)
{
return std::to_string(m_value);
}
}
void DisplayRefreshRate::setValue(const std::string& value)
{
try
{
MappedSetting::setValue(value);
}
catch (const ParsingError&)
{
m_value = Parser::parseInt(value, 1, MAXINT);
}
}
}
}

View File

@ -0,0 +1,22 @@
#pragma once
#include <Config/MappedSetting.h>
namespace Config
{
namespace Settings
{
class DisplayRefreshRate : public MappedSetting<int>
{
public:
static const int APP = 0;
static const int DESKTOP = -1;
DisplayRefreshRate();
protected:
std::string getValueStr() const override;
void setValue(const std::string& value) override;
};
}
}

View File

@ -220,6 +220,7 @@
<ClInclude Include="Config\Settings\CpuAffinity.h" /> <ClInclude Include="Config\Settings\CpuAffinity.h" />
<ClInclude Include="Config\Settings\DesktopColorDepth.h" /> <ClInclude Include="Config\Settings\DesktopColorDepth.h" />
<ClInclude Include="Config\Settings\DisplayFilter.h" /> <ClInclude Include="Config\Settings\DisplayFilter.h" />
<ClInclude Include="Config\Settings\DisplayRefreshRate.h" />
<ClInclude Include="Config\Settings\DisplayResolution.h" /> <ClInclude Include="Config\Settings\DisplayResolution.h" />
<ClInclude Include="Config\Settings\RenderColorDepth.h" /> <ClInclude Include="Config\Settings\RenderColorDepth.h" />
<ClInclude Include="Config\Settings\ResolutionScale.h" /> <ClInclude Include="Config\Settings\ResolutionScale.h" />
@ -343,6 +344,7 @@
<ClCompile Include="Config\Settings\Antialiasing.cpp" /> <ClCompile Include="Config\Settings\Antialiasing.cpp" />
<ClCompile Include="Config\Settings\CpuAffinity.cpp" /> <ClCompile Include="Config\Settings\CpuAffinity.cpp" />
<ClCompile Include="Config\Settings\DisplayFilter.cpp" /> <ClCompile Include="Config\Settings\DisplayFilter.cpp" />
<ClCompile Include="Config\Settings\DisplayRefreshRate.cpp" />
<ClCompile Include="Config\Settings\DisplayResolution.cpp" /> <ClCompile Include="Config\Settings\DisplayResolution.cpp" />
<ClCompile Include="Config\Settings\ResolutionScale.cpp" /> <ClCompile Include="Config\Settings\ResolutionScale.cpp" />
<ClCompile Include="Config\Settings\SupportedResolutions.cpp" /> <ClCompile Include="Config\Settings\SupportedResolutions.cpp" />

View File

@ -516,6 +516,9 @@
<ClInclude Include="Gdi\GuiThread.h"> <ClInclude Include="Gdi\GuiThread.h">
<Filter>Header Files\Gdi</Filter> <Filter>Header Files\Gdi</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Config\Settings\DisplayRefreshRate.h">
<Filter>Header Files\Config\Settings</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="Gdi\Gdi.cpp"> <ClCompile Include="Gdi\Gdi.cpp">
@ -815,6 +818,9 @@
<ClCompile Include="Gdi\GuiThread.cpp"> <ClCompile Include="Gdi\GuiThread.cpp">
<Filter>Source Files\Gdi</Filter> <Filter>Source Files\Gdi</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Config\Settings\DisplayRefreshRate.cpp">
<Filter>Source Files\Config\Settings</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="DDrawCompat.rc"> <ResourceCompile Include="DDrawCompat.rc">

View File

@ -63,6 +63,9 @@ namespace
BOOL WINAPI dwm8And16BitIsShimAppliedCallOut(); BOOL WINAPI dwm8And16BitIsShimAppliedCallOut();
BOOL WINAPI seComHookInterface(CLSID* clsid, GUID* iid, DWORD unk1, DWORD unk2); BOOL WINAPI seComHookInterface(CLSID* clsid, GUID* iid, DWORD unk1, DWORD unk2);
template <typename Char>
DWORD getConfiguredRefreshRate(const Char* deviceName);
template <typename Char> template <typename Char>
SIZE getConfiguredResolution(const Char* deviceName); SIZE getConfiguredResolution(const Char* deviceName);
@ -125,6 +128,11 @@ namespace
targetDevMode.dmFields |= DM_PELSHEIGHT; targetDevMode.dmFields |= DM_PELSHEIGHT;
targetDevMode.dmPelsHeight = currDevMode.dmPelsHeight; targetDevMode.dmPelsHeight = currDevMode.dmPelsHeight;
} }
if (!(targetDevMode.dmFields & DM_DISPLAYFREQUENCY))
{
targetDevMode.dmFields |= DM_DISPLAYFREQUENCY;
targetDevMode.dmDisplayFrequency = currDevMode.dmDisplayFrequency;
}
emulatedResolution = makeSize(targetDevMode.dmPelsWidth, targetDevMode.dmPelsHeight); emulatedResolution = makeSize(targetDevMode.dmPelsWidth, targetDevMode.dmPelsHeight);
auto supportedDisplayModeMap(getSupportedDisplayModeMap(lpszDeviceName, 0)); auto supportedDisplayModeMap(getSupportedDisplayModeMap(lpszDeviceName, 0));
@ -137,23 +145,31 @@ namespace
return DISP_CHANGE_BADMODE; return DISP_CHANGE_BADMODE;
} }
DevMode<Char> dm = targetDevMode;
SIZE resolutionOverride = getConfiguredResolution(lpszDeviceName); SIZE resolutionOverride = getConfiguredResolution(lpszDeviceName);
if (0 != resolutionOverride.cx) if (0 != resolutionOverride.cx)
{ {
DevMode<Char> dm = {};
dm.dmSize = sizeof(dm);
dm.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
dm.dmPelsWidth = resolutionOverride.cx; dm.dmPelsWidth = resolutionOverride.cx;
dm.dmPelsHeight = resolutionOverride.cy; dm.dmPelsHeight = resolutionOverride.cy;
}
DWORD refreshRateOverride = getConfiguredRefreshRate(lpszDeviceName);
if (0 != refreshRateOverride)
{
dm.dmDisplayFrequency = refreshRateOverride;
}
if (0 != resolutionOverride.cx || 0 != refreshRateOverride)
{
LONG result = origChangeDisplaySettingsEx(lpszDeviceName, &dm, nullptr, CDS_TEST, nullptr); LONG result = origChangeDisplaySettingsEx(lpszDeviceName, &dm, nullptr, CDS_TEST, nullptr);
if (DISP_CHANGE_SUCCESSFUL == result) if (DISP_CHANGE_SUCCESSFUL == result)
{ {
targetDevMode.dmPelsWidth = resolutionOverride.cx; targetDevMode = dm;
targetDevMode.dmPelsHeight = resolutionOverride.cy;
} }
else else
{ {
LOG_ONCE("Failed to apply setting: DisplayResolution = " << dm.dmPelsWidth << 'x' << dm.dmPelsHeight); LOG_ONCE("Failed to apply custom display mode: "
<< dm.dmPelsWidth << 'x' << dm.dmPelsHeight << '@' << dm.dmDisplayFrequency);
} }
} }
} }
@ -352,6 +368,22 @@ namespace
return CALL_ORIG_FUNC(GdiEntry13)() + g_displaySettingsUniquenessBias; return CALL_ORIG_FUNC(GdiEntry13)() + g_displaySettingsUniquenessBias;
} }
template <typename Char>
DWORD getConfiguredRefreshRate(const Char* deviceName)
{
auto refreshRate = Config::displayRefreshRate.get();
if (Config::Settings::DisplayRefreshRate::DESKTOP == refreshRate)
{
DevMode<Char> dm = {};
dm.dmSize = sizeof(dm);
if (origEnumDisplaySettingsEx(deviceName, ENUM_REGISTRY_SETTINGS, &dm, 0))
{
refreshRate = dm.dmDisplayFrequency;
}
}
return refreshRate;
}
template <typename Char> template <typename Char>
SIZE getConfiguredResolution(const Char* deviceName) SIZE getConfiguredResolution(const Char* deviceName)
{ {