bool RenderTexTargetBinManager::setTargetSize(const Point2I &newTargetSize)
{
   if( GFX->getAdapterType() != OpenGL && // Targets need to match up exactly in size on OpenGL.
       mTargetSize.x >= newTargetSize.x &&
       mTargetSize.y >= newTargetSize.y )
      return true;

   mTargetSize = newTargetSize;
   mNamedTarget.setViewport( RectI( Point2I::Zero, mTargetSize ) );

   return _updateTargets();
}
bool RenderTexTargetBinManager::setTargetFormat(const GFXFormat &newTargetFormat)
{
   if(mTargetFormat == newTargetFormat)
      return true;

   mTargetFormat = newTargetFormat;
   ConditionerFeature *conditioner = mNamedTarget.getConditioner();
   if(conditioner)
      conditioner->setBufferFormat(mTargetFormat);

   return _updateTargets();
}
void RenderFormatToken::process(SceneState *state, RenderPassStateBin *callingBin)
{
   switch(mFCState)
   {
   case FTSWaiting:
      {
         GFXDEBUGEVENT_SCOPE_EX(RFT_Waiting, ColorI::BLUE, avar("[%s Activate] (%s)", getName(), GFXStringTextureFormat[mColorFormat]));
         mFCState = FTSActive;

         mViewportRect = GFX->getViewport();

         // Update targets
         _updateTargets();

         // If we have a copy PostEffect then get the active backbuffer copy 
         // now before we swap the render targets.
         GFXTexHandle curBackBuffer;
         if(mCopyPostEffect.isValid())
            curBackBuffer = PFXMGR->getBackBufferTex();

         // Push target
         GFX->pushActiveRenderTarget();
         GFX->setActiveRenderTarget(mTargetChain[mTargetChainIdx]);

         // Set viewport
         GFX->setViewport(mViewportRect);

         // Clear
         GFX->clear(GFXClearTarget | GFXClearZBuffer | GFXClearStencil, gCanvasClearColor, 1.0f, 0);

         // Set active z target on render pass
         if(mTargetDepthStencilTexture[mTargetChainIdx].isValid())
         {
            if(callingBin->getParentManager()->getDepthTargetTexture() != GFXTextureTarget::sDefaultDepthStencil)
               mStoredPassZTarget = callingBin->getParentManager()->getDepthTargetTexture();
            else
               mStoredPassZTarget = NULL;

            callingBin->getParentManager()->setDepthTargetTexture(mTargetDepthStencilTexture[mTargetChainIdx]);
         }

         // Run the PostEffect which copies data into the new target.
         if ( mCopyPostEffect.isValid() )
            mCopyPostEffect->process( state, curBackBuffer, &mViewportRect );
      }
      break;

   case FTSActive:
      {
         GFXDEBUGEVENT_SCOPE_EX(RFT_Active, ColorI::BLUE, avar("[%s Deactivate]", getName()));
         mFCState = FTSComplete;

         // Pop target
         AssertFatal(GFX->getActiveRenderTarget() == mTargetChain[mTargetChainIdx], "Render target stack went wrong somewhere");
         mTargetChain[mTargetChainIdx]->resolve();
         GFX->popActiveRenderTarget();

         // This is the GFX viewport when we were first processed.
         GFX->setViewport(mViewportRect);

         // Restore active z-target
         if(mTargetDepthStencilTexture[mTargetChainIdx].isValid())
         {
            callingBin->getParentManager()->setDepthTargetTexture(mStoredPassZTarget.getPointer());
            mStoredPassZTarget = NULL;
         }

         // Run the PostEffect which copies data to the backbuffer
         if(mResolvePostEffect.isValid())
         {
		      // Need to create a texhandle here, since inOutTex gets assigned during process()
            GFXTexHandle inOutTex = mTargetColorTexture[mTargetChainIdx];
            mResolvePostEffect->process( state, inOutTex, &mViewportRect );
         }
      }
      break;

   case FTSComplete:
      AssertFatal(false, "process() called on a RenderFormatToken which was already complete.");
      // fall through
   case FTSDisabled:
      break;
   }
}