Skip to content

Commit 19207e0

Browse files
committed
d3d9 merge
1 parent f2c75bd commit 19207e0

2 files changed

Lines changed: 50 additions & 4 deletions

File tree

src/d3d9/d3d9_proxy.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,27 @@ void GetScaledResolution(int& outW, int& outH) {
2020
// Poll current target from config (refreshed by overlay UI)
2121
int targetWidth = cfg.GetTargetWidth();
2222
int targetHeight = cfg.GetTargetHeight();
23+
24+
if (targetWidth <= 0 || targetHeight <= 0) {
25+
targetWidth = gameW;
26+
targetHeight = gameH;
27+
}
28+
2329
if (targetWidth > 0 && targetHeight > 0) {
2430
UpscalerManager& mgr = UpscalerManager::Get();
2531
bool nativeRendering = mgr.IsNativeRenderingEnabled();
2632
int quality = mgr.GetUpscaleQuality();
2733
bool upscaling = mgr.IsUpscalingEnabled();
28-
34+
2935
static int lastQ = -1;
3036
static int lastN = -1;
3137
static int lastU = -1;
3238
if (quality != lastQ || (int)nativeRendering != lastN || (int)upscaling != lastU) {
33-
Logger::info("GetScaledResolution: mgr={:p}, quality={}, native={}, upscaling={}", (void*)&mgr, quality, nativeRendering, upscaling);
34-
lastQ = quality; lastN = (int)nativeRendering; lastU = (int)upscaling;
39+
Logger::info(
40+
"GetScaledResolution: mgr={:p}, quality={}, native={}, upscaling={}", (void*)&mgr, quality, nativeRendering, upscaling);
41+
lastQ = quality;
42+
lastN = (int)nativeRendering;
43+
lastU = (int)upscaling;
3544
}
3645

3746
if (!nativeRendering && upscaling) {

src/d3d9/d3d9_proxy_device.cpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "d3d9_proxy_device.h"
22
#include "d3d9_proxy_surface.h"
33
#include "d3d9_proxy_swapchain.h"
4+
#include "upscaler_manager.h"
45

56
void ProxyDirect3DDevice9::UpdateScaledResolution() {
67
int sw = m_displayW;
@@ -54,6 +55,21 @@ ProxyDirect3DDevice9::ProxyDirect3DDevice9(
5455
m_displayH, m_isUpscaling, (void*)m_pRealEx);
5556

5657
OverlayRenderer::Get().Init((IDirect3DDevice9*)this);
58+
59+
if (m_isUpscaling) {
60+
if (UpscalerManager::Get().LoadUpscaler()) {
61+
UpscalerManager::Get().InitUpscaler((void*)m_pReal);
62+
if (SUCCEEDED(m_pReal->CreateTexture(
63+
m_renderW, m_renderH, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pFakeBackBufferTex, nullptr))) {
64+
IDirect3DSurface9* pRealSurf = nullptr;
65+
m_pFakeBackBufferTex->GetSurfaceLevel(0, &pRealSurf);
66+
m_pFakeBackBuffer = new ProxySurface9(pRealSurf, this, m_displayW, m_displayH);
67+
if (pRealSurf)
68+
pRealSurf->Release();
69+
Logger::info("Proxy: Fake backbuffer created at native {}x{}", m_renderW, m_renderH);
70+
}
71+
}
72+
}
5773
}
5874

5975
ProxyDirect3DDevice9::~ProxyDirect3DDevice9() {
@@ -160,6 +176,7 @@ STDMETHODIMP_(UINT) ProxyDirect3DDevice9::GetNumberOfSwapChains() {
160176

161177
STDMETHODIMP ProxyDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPP) {
162178
OverlayRenderer::Get().OnReset();
179+
UpscalerManager::Get().OnReset();
163180
if (m_pFakeBackBuffer) {
164181
m_pFakeBackBuffer->Release();
165182
m_pFakeBackBuffer = nullptr;
@@ -234,7 +251,18 @@ STDMETHODIMP ProxyDirect3DDevice9::Present(CONST RECT* pSR, CONST RECT* pDR, HWN
234251
IDirect3DSurface9* pRBB = nullptr;
235252
if (SUCCEEDED(m_pReal->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pRBB))) {
236253
if (m_isUpscaling && m_pFakeBackBuffer) {
237-
m_pReal->StretchRect(m_pFakeBackBuffer->GetInternalSurface(), NULL, pRBB, NULL, D3DTEXF_LINEAR);
254+
bool upscalerHandled = false;
255+
if (UpscalerManager::Get().IsUpscalingEnabled()) {
256+
g_InUpscalerPass = true;
257+
UpscalerManager::Get().RenderFrame((void*)m_pReal, (void*)m_pFakeBackBuffer->GetInternalSurface(), (void*)pRBB, m_displayW,
258+
m_displayH, m_renderW, m_renderH);
259+
g_InUpscalerPass = false;
260+
upscalerHandled = true;
261+
}
262+
263+
if (!upscalerHandled) {
264+
m_pReal->StretchRect(m_pFakeBackBuffer->GetInternalSurface(), NULL, pRBB, NULL, D3DTEXF_LINEAR);
265+
}
238266
}
239267
IDirect3DSurface9* pOldRT = nullptr;
240268
m_pReal->GetRenderTarget(0, &pOldRT);
@@ -811,6 +839,14 @@ STDMETHODIMP ProxyDirect3DDevice9::PresentEx(CONST RECT* pSR, CONST RECT* pDR, H
811839
if (SUCCEEDED(m_pReal->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pRBB))) {
812840
if (m_isUpscaling && m_pFakeBackBuffer) {
813841
bool upscalerHandled = false;
842+
if (UpscalerManager::Get().IsUpscalingEnabled()) {
843+
g_InUpscalerPass = true;
844+
UpscalerManager::Get().RenderFrame((void*)m_pReal, (void*)m_pFakeBackBuffer->GetInternalSurface(), (void*)pRBB, m_displayW,
845+
m_displayH, m_renderW, m_renderH);
846+
g_InUpscalerPass = false;
847+
upscalerHandled = true;
848+
}
849+
814850
if (!upscalerHandled) {
815851
m_pReal->StretchRect(m_pFakeBackBuffer->GetInternalSurface(), NULL, pRBB, NULL, D3DTEXF_LINEAR);
816852
}
@@ -896,6 +932,7 @@ STDMETHODIMP ProxyDirect3DDevice9::CreateDepthStencilSurfaceEx(
896932

897933
STDMETHODIMP ProxyDirect3DDevice9::ResetEx(D3DPRESENT_PARAMETERS* pPP, D3DDISPLAYMODEEX* pFDM) {
898934
OverlayRenderer::Get().OnReset();
935+
UpscalerManager::Get().OnReset();
899936

900937
int scaledW = pPP->BackBufferWidth;
901938
int scaledH = pPP->BackBufferHeight;

0 commit comments

Comments
 (0)