RenderFormatToken::~RenderFormatToken()
{
   GFXTextureManager::removeEventDelegate(this, &RenderFormatToken::_onTextureEvent);
   GFXDevice::getDeviceEventSignal().remove(this, &RenderFormatToken::_handleGFXEvent);

   _teardownTargets();
}
RenderTexTargetBinManager::~RenderTexTargetBinManager()
{
   _teardownTargets();

   GFXTextureManager::removeEventDelegate( this, &RenderTexTargetBinManager::_onTextureEvent );
   GFXDevice::getDeviceEventSignal().remove(this, &RenderTexTargetBinManager::_handleGFXEvent);
}
void GuiOffscreenCanvas::_setupTargets()
{
   _teardownTargets();

   if (!mTarget.isValid())
   {
      mTarget = GFX->allocRenderToTextureTarget();
   }

   // Update color
   if (!mTargetTexture.isValid() || mTargetSize != mTargetTexture.getWidthHeight())
   {
      mTargetTexture.set( mTargetSize.x, mTargetSize.y, mTargetFormat, &GFXDefaultRenderTargetProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ), 1, 0 );
   }

   // Update depth if needed
   if (mUseDepth && (!mTargetDepth.isValid() || mTargetSize != mTargetDepth.getWidthHeight()))
   {
      mTargetDepth.set( mTargetSize.x, mTargetSize.y, GFXFormatD24S8, &GFXDefaultZTargetProfile, avar( "%s() - (line %d)", __FUNCTION__, __LINE__ ), 1, 0 );
      mTarget->attachTexture( GFXTextureTarget::RenderSlot(GFXTextureTarget::DepthStencil), mTargetDepth );
   }

   mTarget->attachTexture( GFXTextureTarget::RenderSlot(GFXTextureTarget::Color0), mTargetTexture );
   mNamedTarget.setTexture(0, mTargetTexture);
}
void RenderFormatToken::_onTextureEvent( GFXTexCallbackCode code )
{
   if(code == GFXZombify)
   {
      _teardownTargets();
      mTargetUpdatePending = true;
   }
}
void RenderTexTargetBinManager::_onTextureEvent( GFXTexCallbackCode code )
{
   switch(code)
   {
      case GFXZombify:
         _teardownTargets();
         break;

      case GFXResurrect:
         _setupTargets();
         break;
   }
}
void GuiOffscreenCanvas::_onTextureEvent( GFXTexCallbackCode code )
{
   switch(code)
   {
      case GFXZombify:
         _teardownTargets();
         break;

      case GFXResurrect:
         _setupTargets();
         break;
   }
}
bool RenderTexTargetBinManager::_setupTargets()
{
   _teardownTargets();

   mTargetChain = new GFXTextureTargetRef[mTargetChainLength];
   mTargetChainTextures = new GFXTexHandle*[mTargetChainLength];

   for( U32 i = 0; i < mTargetChainLength; i++ )
      mTargetChainTextures[i] = new GFXTexHandle[mNumRenderTargets];

   mTargetChainIdx = 0;

   mTargetSize = Point2I::Zero;

   return true;
}
void GuiOffscreenCanvas::onRemove()
{
   GFXTextureManager::removeEventDelegate( this, &GuiOffscreenCanvas::_onTextureEvent );

   _teardownTargets();

   U32 idx = sList.find_next(this);
   if (idx != (U32)-1)
   {
      sList.erase(idx);
   }

   mTarget = NULL;
   mTargetTexture = NULL;
   mTargetDepth = NULL;

   Parent::onRemove();
}