@@ -29,6 +29,8 @@ void ProxyDirect3DDevice9::UpdateScaledResolution() {
2929 m_pFakeBackBuffer->SetInternalSurface (pRealSurf);
3030 }
3131
32+ m_pReal->SetRenderTarget (0 , pRealSurf);
33+
3234 if (pRealSurf)
3335 pRealSurf->Release (); // Proxy holds a ref
3436 Logger::info (" Proxy: Fake backbuffer re-created at {}x{}" , m_renderW, m_renderH);
@@ -64,6 +66,7 @@ ProxyDirect3DDevice9::ProxyDirect3DDevice9(
6466 IDirect3DSurface9* pRealSurf = nullptr ;
6567 m_pFakeBackBufferTex->GetSurfaceLevel (0 , &pRealSurf);
6668 m_pFakeBackBuffer = new ProxySurface9 (pRealSurf, this , m_displayW, m_displayH);
69+ m_pReal->SetRenderTarget (0 , pRealSurf);
6770 if (pRealSurf)
6871 pRealSurf->Release ();
6972 Logger::info (" Proxy: Fake backbuffer created at native {}x{}" , m_renderW, m_renderH);
@@ -159,14 +162,14 @@ STDMETHODIMP_(BOOL) ProxyDirect3DDevice9::ShowCursor(BOOL bShow) {
159162STDMETHODIMP ProxyDirect3DDevice9::CreateAdditionalSwapChain (D3DPRESENT_PARAMETERS* pPP, IDirect3DSwapChain9** ppSC) {
160163 HRESULT hr = m_pReal->CreateAdditionalSwapChain (pPP, ppSC);
161164 if (SUCCEEDED (hr) && ppSC && *ppSC)
162- *ppSC = new ProxyDirect3DSwapChain9 (*ppSC, (IDirect3DDevice9*)this );
165+ *ppSC = new ProxyDirect3DSwapChain9 (*ppSC, (IDirect3DDevice9*)this , m_pReal-> GetNumberOfSwapChains () - 1 );
163166 return hr;
164167}
165168
166169STDMETHODIMP ProxyDirect3DDevice9::GetSwapChain (UINT iSC, IDirect3DSwapChain9** ppSC) {
167170 HRESULT hr = m_pReal->GetSwapChain (iSC, ppSC);
168171 if (SUCCEEDED (hr) && ppSC && *ppSC)
169- *ppSC = new ProxyDirect3DSwapChain9 (*ppSC, (IDirect3DDevice9*)this );
172+ *ppSC = new ProxyDirect3DSwapChain9 (*ppSC, (IDirect3DDevice9*)this , iSC );
170173 return hr;
171174}
172175
@@ -186,24 +189,32 @@ STDMETHODIMP ProxyDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPP) {
186189 m_pFakeBackBufferTex = nullptr ;
187190 }
188191
189- int scaledW = pPP->BackBufferWidth ;
190- int scaledH = pPP->BackBufferHeight ;
191- GetScaledResolution (scaledW, scaledH);
192+ int requestedW = pPP->BackBufferWidth ;
193+ int requestedH = pPP->BackBufferHeight ;
192194
193195 int nativeW = Config::Get ().GetTargetWidth ();
194196 int nativeH = Config::Get ().GetTargetHeight ();
195197
196198 if (nativeW <= 0 || nativeH <= 0 ) {
197- D3DDISPLAYMODE dm;
198- if (SUCCEEDED (m_pReal->GetDisplayMode (0 , &dm))) {
199- nativeW = dm.Width ;
200- nativeH = dm.Height ;
199+ if (m_isUpscaling && requestedW == (int )m_renderW && requestedH == (int )m_renderH) {
200+ nativeW = m_displayW;
201+ nativeH = m_displayH;
201202 } else {
202- nativeW = pPP->BackBufferWidth ;
203- nativeH = pPP->BackBufferHeight ;
203+ D3DDISPLAYMODE dm;
204+ if (SUCCEEDED (m_pReal->GetDisplayMode (0 , &dm))) {
205+ nativeW = dm.Width ;
206+ nativeH = dm.Height ;
207+ } else {
208+ nativeW = requestedW;
209+ nativeH = requestedH;
210+ }
204211 }
205212 }
206213
214+ int scaledW = nativeW;
215+ int scaledH = nativeH;
216+ GetScaledResolution (scaledW, scaledH);
217+
207218 D3DPRESENT_PARAMETERS realPP = *pPP;
208219 realPP.BackBufferWidth = nativeW;
209220 realPP.BackBufferHeight = nativeH;
@@ -214,8 +225,8 @@ STDMETHODIMP ProxyDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPP) {
214225 m_displayH = nativeH;
215226 m_isUpscaling = true ;
216227
217- Logger::info (" Reset: Game requested {}x{}, Proxy created device at {}x{}, Game sees {}x{}" , pPP-> BackBufferWidth , pPP-> BackBufferHeight ,
218- nativeW, nativeH, scaledW, scaledH);
228+ Logger::info (" Reset: Game requested {}x{}, Proxy created device at {}x{}, Game sees {}x{}" , requestedW, requestedH, nativeW, nativeH ,
229+ scaledW, scaledH);
219230
220231 HRESULT hr = m_pReal->Reset (&realPP);
221232 if (SUCCEEDED (hr)) {
@@ -235,6 +246,7 @@ STDMETHODIMP ProxyDirect3DDevice9::Reset(D3DPRESENT_PARAMETERS* pPP) {
235246 } else {
236247 m_pFakeBackBuffer->SetInternalSurface (pRealSurf);
237248 }
249+ m_pReal->SetRenderTarget (0 , pRealSurf);
238250 if (pRealSurf)
239251 pRealSurf->Release ();
240252 Logger::info (" Proxy: Fake backbuffer re-created at {}x{} (Reset path)" , m_renderW, m_renderH);
@@ -933,28 +945,74 @@ STDMETHODIMP ProxyDirect3DDevice9::CreateDepthStencilSurfaceEx(
933945STDMETHODIMP ProxyDirect3DDevice9::ResetEx (D3DPRESENT_PARAMETERS* pPP, D3DDISPLAYMODEEX* pFDM) {
934946 OverlayRenderer::Get ().OnReset ();
935947 UpscalerManager::Get ().OnReset ();
948+ if (m_pFakeBackBuffer) {
949+ m_pFakeBackBuffer->Release ();
950+ m_pFakeBackBuffer = nullptr ;
951+ }
952+ if (m_pFakeBackBufferTex) {
953+ m_pFakeBackBufferTex->Release ();
954+ m_pFakeBackBufferTex = nullptr ;
955+ }
936956
937- int scaledW = pPP->BackBufferWidth ;
938- int scaledH = pPP->BackBufferHeight ;
939- GetScaledResolution (scaledW, scaledH);
957+ int requestedW = pPP->BackBufferWidth ;
958+ int requestedH = pPP->BackBufferHeight ;
940959
941960 int nativeW = Config::Get ().GetTargetWidth ();
942961 int nativeH = Config::Get ().GetTargetHeight ();
943- if (nativeW <= 0 )
944- nativeW = pPP->BackBufferWidth ;
945- if (nativeH <= 0 )
946- nativeH = pPP->BackBufferHeight ;
962+
963+ if (nativeW <= 0 || nativeH <= 0 ) {
964+ if (m_isUpscaling && requestedW == (int )m_renderW && requestedH == (int )m_renderH) {
965+ nativeW = m_displayW;
966+ nativeH = m_displayH;
967+ } else {
968+ nativeW = requestedW;
969+ nativeH = requestedH;
970+ }
971+ }
972+
973+ int scaledW = nativeW;
974+ int scaledH = nativeH;
975+ GetScaledResolution (scaledW, scaledH);
947976
948977 D3DPRESENT_PARAMETERS realPP = *pPP;
949978 realPP.BackBufferWidth = nativeW;
950979 realPP.BackBufferHeight = nativeH;
951980
981+ m_renderW = scaledW;
982+ m_renderH = scaledH;
983+ m_displayW = nativeW;
984+ m_displayH = nativeH;
985+ m_isUpscaling = true ;
986+
987+ Logger::info (" ResetEx: Game requested {}x{}, Proxy created device at {}x{}, Game sees {}x{}" , requestedW, requestedH, nativeW, nativeH,
988+ scaledW, scaledH);
989+
952990 if (!m_pRealEx)
953991 return E_NOTIMPL;
954992 HRESULT hr = m_pRealEx->ResetEx (&realPP, pFDM);
955993 if (SUCCEEDED (hr)) {
956994 pPP->BackBufferWidth = scaledW;
957995 pPP->BackBufferHeight = scaledH;
996+ if (m_isUpscaling) {
997+ if (m_pFakeBackBufferTex) {
998+ m_pFakeBackBufferTex->Release ();
999+ m_pFakeBackBufferTex = nullptr ;
1000+ }
1001+ if (SUCCEEDED (m_pReal->CreateTexture (
1002+ m_renderW, m_renderH, 1 , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &m_pFakeBackBufferTex, nullptr ))) {
1003+ IDirect3DSurface9* pRealSurf = nullptr ;
1004+ m_pFakeBackBufferTex->GetSurfaceLevel (0 , &pRealSurf);
1005+ if (!m_pFakeBackBuffer) {
1006+ m_pFakeBackBuffer = new ProxySurface9 (pRealSurf, this , m_displayW, m_displayH);
1007+ } else {
1008+ m_pFakeBackBuffer->SetInternalSurface (pRealSurf);
1009+ }
1010+ m_pReal->SetRenderTarget (0 , pRealSurf);
1011+ if (pRealSurf)
1012+ pRealSurf->Release ();
1013+ Logger::info (" Proxy: Fake backbuffer re-created at {}x{} (ResetEx path)" , m_renderW, m_renderH);
1014+ }
1015+ }
9581016 OverlayRenderer::Get ().OnPostReset ();
9591017 }
9601018 return hr;
0 commit comments