//----------------------------------------------------------------------------------- void CompositorPass::addResourceTransition( ResourceLayoutMap::iterator currentLayout, ResourceLayout::Layout newLayout, uint32 readBarrierBits ) { ResourceTransition transition; //transition.resource = ; TODO transition.oldLayout = currentLayout->second; transition.newLayout = newLayout; transition.writeBarrierBits = transitionWriteBarrierBits( transition.oldLayout ); transition.readBarrierBits = readBarrierBits; RenderSystem *renderSystem = mParentNode->getRenderSystem(); const RenderSystemCapabilities *caps = renderSystem->getCapabilities(); if( !caps->hasCapability( RSC_EXPLICIT_API ) ) { //OpenGL. Merge the bits and use only one global barrier. //Keep the extra barriers uninitialized for debugging purposes, //but we won't be really using them. if( mResourceTransitions.empty() ) { ResourceTransition globalBarrier; globalBarrier.oldLayout = ResourceLayout::Undefined; globalBarrier.newLayout = ResourceLayout::Undefined; globalBarrier.writeBarrierBits = transition.writeBarrierBits; globalBarrier.readBarrierBits = transition.readBarrierBits; globalBarrier.mRsData = 0; renderSystem->_resourceTransitionCreated( &globalBarrier ); mResourceTransitions.push_back( globalBarrier ); } else { ResourceTransition &globalBarrier = mResourceTransitions.front(); renderSystem->_resourceTransitionDestroyed( &globalBarrier ); globalBarrier.writeBarrierBits |= transition.writeBarrierBits; globalBarrier.readBarrierBits |= transition.readBarrierBits; renderSystem->_resourceTransitionCreated( &globalBarrier ); } mNumValidResourceTransitions = 1; } else { //D3D12, Vulkan, Mantle. Takes advantage of per-resource barriers renderSystem->_resourceTransitionCreated( &transition ); ++mNumValidResourceTransitions; } mResourceTransitions.push_back( transition ); currentLayout->second = transition.newLayout; }
//----------------------------------------------------------------------------------- void CompositorPass::_removeAllBarriers(void) { assert( mNumValidResourceTransitions <= mResourceTransitions.size() ); RenderSystem *renderSystem = mParentNode->getRenderSystem(); ResourceTransitionVec::iterator itor = mResourceTransitions.begin(); for( size_t i=0; i<mNumValidResourceTransitions; ++i ) { renderSystem->_resourceTransitionDestroyed( &(*itor) ); ++itor; } mNumValidResourceTransitions = 0; mResourceTransitions.clear(); }