void GFXD3D9Device::reacquireDefaultPoolResources() { // Now do the dynamic index buffers if( mDynamicPB == NULL ) mDynamicPB = new GFXD3D9PrimitiveBuffer(this, 0, 0, GFXBufferTypeDynamic); D3D9Assert( mD3DDevice->CreateIndexBuffer( sizeof( U16 ) * MAX_DYNAMIC_INDICES, #ifdef TORQUE_OS_XENON D3DUSAGE_WRITEONLY, #else D3DUSAGE_WRITEONLY | D3DUSAGE_DYNAMIC, #endif GFXD3D9IndexFormat[GFXIndexFormat16], D3DPOOL_DEFAULT, &mDynamicPB->ib, NULL ), "Failed to allocate dynamic IB" ); // Grab the depth-stencil... SAFE_RELEASE(mDeviceDepthStencil); D3D9Assert(mD3DDevice->GetDepthStencilSurface(&mDeviceDepthStencil), "GFXD3D9Device::reacquireDefaultPoolResources - couldn't grab reference to device's depth-stencil surface."); SAFE_RELEASE(mDeviceBackbuffer); mD3DDevice->GetBackBuffer( 0, 0, D3DBACKBUFFER_TYPE_MONO, &mDeviceBackbuffer ); // Walk the resource list and zombify everything. GFXResource *walk = mResourceListHead; while(walk) { walk->resurrect(); walk = walk->getNextResource(); } if(mTextureManager) mTextureManager->resurrect(); }
void GFXD3D9Device::releaseDefaultPoolResources() { // Release all the dynamic vertex buffer arrays // Forcibly clean up the pools for( U32 i=0; i<mVolatileVBList.size(); i++ ) { // Con::printf("Trying to release volatile vb with COM refcount of %d and internal refcount of %d", mVolatileVBList[i]->vb->AddRef() - 1, mVolatileVBList[i]->mRefCount); // mVolatileVBList[i]->vb->Release(); mVolatileVBList[i]->vb->Release(); mVolatileVBList[i]->vb = NULL; mVolatileVBList[i] = NULL; } mVolatileVBList.setSize(0); // We gotta clear the current const buffer else the next // activate may erroneously think the device is still holding // this state and fail to set it. mCurrentConstBuffer = NULL; // Set current VB to NULL and set state dirty for ( U32 i=0; i < MAX_VERTEX_STREAM_COUNT; i++ ) { mCurrentVertexBuffer[i] = NULL; mVertexBufferDirty[i] = true; mVertexBufferFrequency[i] = 0; mVertexBufferFrequencyDirty[i] = true; } // Release dynamic index buffer if( mDynamicPB != NULL ) { SAFE_RELEASE( mDynamicPB->ib ); } // Set current PB/IB to NULL and set state dirty mCurrentPrimitiveBuffer = NULL; mCurrentPB = NULL; mPrimitiveBufferDirty = true; // Zombify texture manager (for D3D this only modifies default pool textures) if( mTextureManager ) mTextureManager->zombify(); // Kill off other potentially dangling references... SAFE_RELEASE( mDeviceDepthStencil ); SAFE_RELEASE( mDeviceBackbuffer ); mD3DDevice->SetDepthStencilSurface(NULL); // Set global dirty state so the IB/PB and VB get reset mStateDirty = true; // Walk the resource list and zombify everything. GFXResource *walk = mResourceListHead; while(walk) { walk->zombify(); walk = walk->getNextResource(); } }
bool GFXPCD3D9Device::beginSceneInternal() { // Make sure we have a device HRESULT res = mD3DDevice->TestCooperativeLevel(); S32 attempts = 0; const S32 MaxAttempts = 40; const S32 SleepMsPerAttempt = 50; while(res == D3DERR_DEVICELOST && attempts < MaxAttempts) { // Lost device! Just keep querying res = mD3DDevice->TestCooperativeLevel(); Con::warnf("GFXPCD3D9Device::beginScene - Device needs to be reset, waiting on device..."); Sleep(SleepMsPerAttempt); attempts++; } if (attempts >= MaxAttempts && res == D3DERR_DEVICELOST) { Con::errorf("GFXPCD3D9Device::beginScene - Device lost and reset wait time exceeded, skipping reset (will retry later)"); mCanCurrentlyRender = false; return false; } // Trigger a reset if we can't get a good result from TestCooperativeLevel. if(res == D3DERR_DEVICENOTRESET) { Con::warnf("GFXPCD3D9Device::beginScene - Device needs to be reset, resetting device..."); // Reset the device! GFXResource *walk = mResourceListHead; while(walk) { // Find the window target with implicit flag set and reset the device with its presentation params. if(GFXPCD3D9WindowTarget *gdwt = dynamic_cast<GFXPCD3D9WindowTarget*>(walk)) { if(gdwt->mImplicit) { reset(gdwt->mPresentationParams); break; } } walk = walk->getNextResource(); } } // Call parent return Parent::beginSceneInternal(); }
void GFXGLDevice::resurrect() { GFXResource* walk = mResourceListHead; while(walk) { walk->resurrect(); walk = walk->getNextResource(); } for(int i = 0; i < VERTEX_STREAM_COUNT; ++i) if(mCurrentVB[i]) mCurrentVB[i]->prepare(); if(mCurrentPB) mCurrentPB->prepare(); mTextureManager->resurrect(); }
GFXGLDevice::~GFXGLDevice() { mCurrentStateBlock = NULL; for(int i = 0; i < VERTEX_STREAM_COUNT; ++i) mCurrentVB[i] = NULL; mCurrentPB = NULL; for(U32 i = 0; i < mVolatileVBs.size(); i++) mVolatileVBs[i] = NULL; for(U32 i = 0; i < mVolatilePBs.size(); i++) mVolatilePBs[i] = NULL; // Clear out our current texture references for (U32 i = 0; i < TEXTURE_STAGE_COUNT; i++) { mCurrentTexture[i] = NULL; mNewTexture[i] = NULL; mCurrentCubemap[i] = NULL; mNewCubemap[i] = NULL; } mRTStack.clear(); mCurrentRT = NULL; if( mTextureManager ) { mTextureManager->zombify(); mTextureManager->kill(); } GFXResource* walk = mResourceListHead; while(walk) { walk->zombify(); walk = walk->getNextResource(); } if( mCardProfiler ) SAFE_DELETE( mCardProfiler ); SAFE_DELETE( gScreenShot ); SAFE_DELETE( mOpenglStateCache ); }
void GFXGLDevice::zombify() { mTextureManager->zombify(); for(int i = 0; i < VERTEX_STREAM_COUNT; ++i) if(mCurrentVB[i]) mCurrentVB[i]->finish(); if(mCurrentPB) mCurrentPB->finish(); //mVolatileVBs.clear(); //mVolatilePBs.clear(); GFXResource* walk = mResourceListHead; while(walk) { walk->zombify(); walk = walk->getNextResource(); } }