|
1 | 1 | #include "d3d9_proxy_device.h" |
2 | 2 | #include "d3d9_proxy_surface.h" |
3 | 3 | #include "d3d9_proxy_swapchain.h" |
| 4 | +#include "upscaler_manager.h" |
4 | 5 |
|
5 | 6 | void ProxyDirect3DDevice9::UpdateScaledResolution() { |
6 | 7 | int sw = m_displayW; |
@@ -54,6 +55,21 @@ ProxyDirect3DDevice9::ProxyDirect3DDevice9( |
54 | 55 | m_displayH, m_isUpscaling, (void*)m_pRealEx); |
55 | 56 |
|
56 | 57 | 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 | + } |
57 | 73 | } |
58 | 74 |
|
59 | 75 | ProxyDirect3DDevice9::~ProxyDirect3DDevice9() { |
@@ -160,6 +176,7 @@ STDMETHODIMP_(UINT) ProxyDirect3DDevice9::GetNumberOfSwapChains() { |
160 | 176 |
|
161 | 177 | STDMETHODIMP ProxyDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPP) { |
162 | 178 | OverlayRenderer::Get().OnReset(); |
| 179 | + UpscalerManager::Get().OnReset(); |
163 | 180 | if (m_pFakeBackBuffer) { |
164 | 181 | m_pFakeBackBuffer->Release(); |
165 | 182 | m_pFakeBackBuffer = nullptr; |
@@ -234,7 +251,18 @@ STDMETHODIMP ProxyDirect3DDevice9::Present(CONST RECT* pSR, CONST RECT* pDR, HWN |
234 | 251 | IDirect3DSurface9* pRBB = nullptr; |
235 | 252 | if (SUCCEEDED(m_pReal->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pRBB))) { |
236 | 253 | 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 | + } |
238 | 266 | } |
239 | 267 | IDirect3DSurface9* pOldRT = nullptr; |
240 | 268 | m_pReal->GetRenderTarget(0, &pOldRT); |
@@ -811,6 +839,14 @@ STDMETHODIMP ProxyDirect3DDevice9::PresentEx(CONST RECT* pSR, CONST RECT* pDR, H |
811 | 839 | if (SUCCEEDED(m_pReal->GetBackBuffer(0, 0, D3DBACKBUFFER_TYPE_MONO, &pRBB))) { |
812 | 840 | if (m_isUpscaling && m_pFakeBackBuffer) { |
813 | 841 | 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 | + |
814 | 850 | if (!upscalerHandled) { |
815 | 851 | m_pReal->StretchRect(m_pFakeBackBuffer->GetInternalSurface(), NULL, pRBB, NULL, D3DTEXF_LINEAR); |
816 | 852 | } |
@@ -896,6 +932,7 @@ STDMETHODIMP ProxyDirect3DDevice9::CreateDepthStencilSurfaceEx( |
896 | 932 |
|
897 | 933 | STDMETHODIMP ProxyDirect3DDevice9::ResetEx(D3DPRESENT_PARAMETERS* pPP, D3DDISPLAYMODEEX* pFDM) { |
898 | 934 | OverlayRenderer::Get().OnReset(); |
| 935 | + UpscalerManager::Get().OnReset(); |
899 | 936 |
|
900 | 937 | int scaledW = pPP->BackBufferWidth; |
901 | 938 | int scaledH = pPP->BackBufferHeight; |
|
0 commit comments