//----------------------------------------------------------------------------- // Reset D3D device //----------------------------------------------------------------------------- void GFXPCD3D9Device::reset( D3DPRESENT_PARAMETERS &d3dpp ) { if(!mD3DDevice) return; mInitialized = false; mMultisampleType = d3dpp.MultiSampleType; mMultisampleLevel = d3dpp.MultiSampleQuality; _validateMultisampleParams(d3dpp.BackBufferFormat, mMultisampleType, mMultisampleLevel); // Clean up some commonly dangling state. This helps prevents issues with // items that are destroyed by the texture manager callbacks and recreated // later, but still left bound. setVertexBuffer(NULL); setPrimitiveBuffer(NULL); for(S32 i=0; i<getNumSamplers(); i++) setTexture(i, NULL); // Deal with the depth/stencil buffer. if(mDeviceDepthStencil) { Con::printf("GFXPCD3D9Device::reset - depthstencil %x has %d ref's", mDeviceDepthStencil, mDeviceDepthStencil->AddRef()-1); mDeviceDepthStencil->Release(); } // First release all the stuff we allocated from D3DPOOL_DEFAULT releaseDefaultPoolResources(); // reset device Con::printf( "--- Resetting D3D Device ---" ); HRESULT hres = S_OK; hres = mD3DDevice->Reset( &d3dpp ); if( FAILED( hres ) ) { while( mD3DDevice->TestCooperativeLevel() == D3DERR_DEVICELOST ) { Sleep( 100 ); } hres = mD3DDevice->Reset( &d3dpp ); } D3D9Assert( hres, "GFXD3D9Device::reset - Failed to create D3D Device!" ); mInitialized = true; // Setup default states initStates(); // Now re aquire all the resources we trashed earlier reacquireDefaultPoolResources(); // Mark everything dirty and flush to card, for sanity. updateStates(true); }
GFXD3D9Device::~GFXD3D9Device() { // Release our refcount on the current stateblock object mCurrentStateBlock = NULL; releaseDefaultPoolResources(); // Free the vertex declarations. VertexDeclMap::Iterator iter = mVertexDecls.begin(); for ( ; iter != mVertexDecls.end(); iter++ ) SAFE_RELEASE( iter->value ); // Check up on things Con::printf("Cur. D3DDevice ref count=%d", mD3DDevice->AddRef() - 1); mD3DDevice->Release(); // Forcibly clean up the pools mVolatileVBList.setSize(0); mDynamicPB = NULL; // And release our D3D resources. SAFE_RELEASE( mDeviceDepthStencil ); SAFE_RELEASE( mDeviceBackbuffer ) SAFE_RELEASE( mDeviceColor ); SAFE_RELEASE( mD3D ); SAFE_RELEASE( mD3DDevice ); #ifdef TORQUE_DEBUG logVertexBuffers(); #endif if( mCardProfiler ) { delete mCardProfiler; mCardProfiler = NULL; } if( gScreenShot ) { delete gScreenShot; gScreenShot = NULL; } }