diff --git a/src/gx/d3d/CGxDeviceD3d.cpp b/src/gx/d3d/CGxDeviceD3d.cpp index 4db6117..4e1e125 100644 --- a/src/gx/d3d/CGxDeviceD3d.cpp +++ b/src/gx/d3d/CGxDeviceD3d.cpp @@ -499,8 +499,29 @@ void CGxDeviceD3d::DeviceWM(EGxWM wm, uintptr_t param1, uintptr_t param2) { this->DeviceSetDefWindow(windowRect); if (this->m_d3dDevice && this->m_context) { - // TODO + this->IReleaseD3dResources(0); + + D3DPRESENT_PARAMETERS d3dpp; + this->ISetPresentParms(d3dpp, this->m_format); + + if (SUCCEEDED(this->m_d3dDevice->Reset(&d3dpp))) { + this->IStateSetD3dDefaults(); + // TODO + + this->m_context = 1; + this->intF5C = 0; + + // TODO + + this->intF6C = 1; + + return; + } else { + this->m_context = 0; + } } + + this->intF6C = 1; } break; @@ -971,6 +992,58 @@ void CGxDeviceD3d::IDestroyD3dDevice() { // TODO } +void CGxDeviceD3d::IReleaseD3dPools(int32_t a2) { + for (auto pool = this->m_poolList.Head(); pool; pool = this->m_poolList.Next(pool)) { + if (!a2) { + if (pool->m_usage != GxPoolUsage_Dynamic && pool->m_usage != GxPoolUsage_Stream) { + continue; + } + } + + if (pool->m_usage == GxPoolUsage_Stream) { + pool->unk1C = 0; + } + + pool->Invalidate(); + + if (pool->m_apiSpecific) { + if (pool->m_target == GxPoolTarget_Vertex) { + auto d3dBuf = static_cast(pool->m_apiSpecific); + d3dBuf->Release(); + } else if (pool->m_target == GxPoolTarget_Index) { + auto d3dBuf = static_cast(pool->m_apiSpecific); + d3dBuf->Release(); + } + + pool->m_apiSpecific = nullptr; + } + } +} + +void CGxDeviceD3d::IReleaseD3dResources(int32_t a2) { + // TODO + + this->IReleaseD3dPools(a2); + + memset(this->m_deviceStates, 0xFF, sizeof(this->m_deviceStates)); + + if (this->m_defColorSurface) { + this->m_defColorSurface->Release(); + this->m_defColorSurface = nullptr; + } + + if (this->m_defDepthSurface) { + this->m_defDepthSurface->Release(); + this->m_defDepthSurface = nullptr; + } + + // TODO + + if (this->m_d3dDevice) { + this->m_d3dDevice->ShowCursor(false); + } +} + void CGxDeviceD3d::IRsSendToHw(EGxRenderState which) { auto state = &this->m_appRenderStates[which]; @@ -1481,6 +1554,9 @@ void CGxDeviceD3d::IStateSetD3dDefaults() { this->m_d3dVertexStreamStride[i] = -1; } + this->m_d3dDevice->GetRenderTarget(0, &this->m_defColorSurface); + this->m_d3dDevice->GetDepthStencilSurface(&this->m_defDepthSurface); + // TODO this->ISceneBegin(); diff --git a/src/gx/d3d/CGxDeviceD3d.hpp b/src/gx/d3d/CGxDeviceD3d.hpp index 34718a6..fa39c94 100644 --- a/src/gx/d3d/CGxDeviceD3d.hpp +++ b/src/gx/d3d/CGxDeviceD3d.hpp @@ -233,6 +233,8 @@ class CGxDeviceD3d : public CGxDevice { D3DDISPLAYMODE m_desktopDisplayMode; int32_t m_inScene; D3DFORMAT m_devAdapterFormat; + LPDIRECT3DSURFACE9 m_defColorSurface = nullptr; + LPDIRECT3DSURFACE9 m_defDepthSurface = nullptr; LPDIRECT3DVERTEXDECLARATION9 m_d3dCurrentVertexDecl; LPDIRECT3DINDEXBUFFER9 m_d3dCurrentIndexBuf; LPDIRECT3DVERTEXBUFFER9 m_d3dVertexStreamBuf[8]; @@ -274,6 +276,8 @@ class CGxDeviceD3d : public CGxDevice { void ISetPresentParms(D3DPRESENT_PARAMETERS& d3dpp, const CGxFormat& format); void IDestroyD3d(); void IDestroyD3dDevice(); + void IReleaseD3dPools(int32_t a2); + void IReleaseD3dResources(int32_t a2); void ISceneBegin(); void ISceneEnd(); void ISetCaps(const CGxFormat& format);