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

Added ViewportEdgeFix setting

See issue #344.
This commit is contained in:
narzoul 2024-08-23 18:22:38 +02:00
parent f1ae0c7147
commit 76dfc38645
7 changed files with 53 additions and 8 deletions

View File

@ -50,6 +50,7 @@
#include <Config/Settings/ThreadPriorityBoost.h>
#include <Config/Settings/VertexBufferMemoryType.h>
#include <Config/Settings/VertexFixup.h>
#include <Config/Settings/ViewportEdgeFix.h>
#include <Config/Settings/VSync.h>
#include <Config/Settings/WinVersionLie.h>
@ -107,6 +108,7 @@ namespace Config
Settings::ThreadPriorityBoost threadPriorityBoost;
Settings::VertexBufferMemoryType vertexBufferMemoryType;
Settings::VertexFixup vertexFixup;
Settings::ViewportEdgeFix viewportEdgeFix;
Settings::VSync vSync;
Settings::WinVersionLie winVersionLie;
}

View File

@ -0,0 +1,32 @@
#pragma once
#include <Config/EnumSetting.h>
namespace Config
{
namespace Settings
{
class ViewportEdgeFix : public EnumSetting
{
public:
enum Values { OFF, SCALE };
ViewportEdgeFix()
: EnumSetting("ViewportEdgeFix", "off", { "off", "scale" })
{
}
virtual ParamInfo getParamInfo() const override
{
switch (m_value)
{
case SCALE:
return { "Gap", 1, 100, 50 };
}
return {};
}
};
}
extern Settings::ViewportEdgeFix viewportEdgeFix;
}

View File

@ -16,6 +16,7 @@
#include <D3dDdi/ShaderAssembler.h>
#include <Overlay/Steam.h>
#include <Shaders/VertexFixup.h>
#include <Config/Settings/ViewportEdgeFix.h>
#define LOG_DS LOG_DEBUG << "DeviceState::" << __func__ << ": "
@ -901,7 +902,7 @@ namespace D3dDdi
if (spriteMode != m_spriteMode)
{
m_spriteMode = spriteMode;
m_changedStates |= CS_RENDER_STATE | CS_TEXTURE_STAGE;
m_changedStates |= CS_RENDER_STATE | CS_RENDER_TARGET | CS_TEXTURE_STAGE;
m_changedRenderStates.set(D3DDDIRS_MULTISAMPLEANTIALIAS);
if (Config::Settings::SpriteTexCoord::ROUND == Config::spriteTexCoord.get())
{
@ -1353,17 +1354,21 @@ namespace D3dDdi
const float apc = Config::alternatePixelCenter.get();
const auto& zr = m_current.zRange;
const float viewportEdgeGap = m_spriteMode ? 0 : (Config::viewportEdgeFix.getParam() / 100.0f);
const float w = width - viewportEdgeGap;
const float h = height - viewportEdgeGap;
m_vertexFixupData.texCoordAdj[2] = stc;
m_vertexFixupData.texCoordAdj[3] = stc;
if (Config::Settings::VertexFixup::GPU == m_vertexFixupConfig)
{
m_vertexFixupData.offset[0] = 0.5f + apc - 0.5f / sx - width / 2;
m_vertexFixupData.offset[1] = 0.5f + apc - 0.5f / sy - height / 2;
m_vertexFixupData.offset[0] = 0.5f + apc - 0.5f / sx - w / 2;
m_vertexFixupData.offset[1] = 0.5f + apc - 0.5f / sy - h / 2;
m_vertexFixupData.offset[2] = -zr.MinZ;
m_vertexFixupData.multiplier[0] = 2.0f / width;
m_vertexFixupData.multiplier[1] = -2.0f / height;
m_vertexFixupData.multiplier[0] = 2.0f / w;
m_vertexFixupData.multiplier[1] = -2.0f / h;
m_vertexFixupData.multiplier[2] = 1.0f / (zr.MaxZ - zr.MinZ);
}
else
@ -1371,8 +1376,8 @@ namespace D3dDdi
m_vertexFixupData.offset[0] = 0.5f + apc - 0.5f / sx;
m_vertexFixupData.offset[1] = 0.5f + apc - 0.5f / sy;
m_vertexFixupData.multiplier[0] = sx;
m_vertexFixupData.multiplier[1] = sy;
m_vertexFixupData.multiplier[0] = sx * width / w;
m_vertexFixupData.multiplier[1] = sy * height / h;
}
m_changedStates |= CS_VERTEX_FIXUP;

View File

@ -216,6 +216,7 @@
<ClInclude Include="Config\Settings\ThreadPriorityBoost.h" />
<ClInclude Include="Config\Settings\VertexBufferMemoryType.h" />
<ClInclude Include="Config\Settings\VertexFixup.h" />
<ClInclude Include="Config\Settings\ViewportEdgeFix.h" />
<ClInclude Include="Config\Settings\VSync.h" />
<ClInclude Include="Config\Settings\WinVersionLie.h" />
<ClInclude Include="D3dDdi\Adapter.h" />

View File

@ -723,6 +723,9 @@
<ClInclude Include="Config\Settings\GdiStretchBltMode.h">
<Filter>Header Files\Config\Settings</Filter>
</ClInclude>
<ClInclude Include="Config\Settings\ViewportEdgeFix.h">
<Filter>Header Files\Config\Settings</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Gdi\Gdi.cpp">

View File

@ -27,6 +27,7 @@
#include <Config/Settings/StatsTransparency.h>
#include <Config/Settings/TextureFilter.h>
#include <Config/Settings/VertexFixup.h>
#include <Config/Settings/ViewportEdgeFix.h>
#include <Config/Settings/VSync.h>
#include <D3dDdi/Device.h>
#include <Gdi/Gdi.h>
@ -71,6 +72,7 @@ namespace
{ &Config::statsTransparency, [&]() { Gdi::GuiThread::getStatsWindow()->setAlpha(Config::statsTransparency.get()); }},
{ &Config::textureFilter, &D3dDdi::Device::updateAllConfig },
{ &Config::vertexFixup, &D3dDdi::Device::updateAllConfig },
{ &Config::viewportEdgeFix },
{ &Config::vSync }
};
}

View File

@ -318,7 +318,7 @@ namespace
LSTATUS WINAPI regEnumValueW(HKEY hKey, DWORD dwIndex, LPWSTR lpValueName, LPDWORD lpcchValueName,
LPDWORD lpReserved, LPDWORD lpType, LPBYTE lpData, LPDWORD lpcbData)
{
LOG_FUNC("RegEnumValueW", hKey, dwIndex, lpValueName, lpcchValueName, lpReserved, lpType, lpData, lpcbData);
LOG_FUNC("RegEnumValueW", hKey, dwIndex, Compat::out(lpValueName), lpcchValueName, lpReserved, lpType, lpData, lpcbData);
if (lpValueName && lpcchValueName && !lpReserved && !lpType && !lpData && !lpcbData)
{
auto keyName(getKeyName(hKey));