#include "BsRenderStateManager.h" #include "BsSamplerState.h" #include "BsDepthStencilState.h" #include "BsRasterizerState.h" #include "BsBlendState.h" namespace BansheeEngine { template void TRenderStateManager::notifySamplerStateCreated(const SAMPLER_STATE_DESC& desc, const SPtr& state) const { BS_LOCK_MUTEX(mMutex); mCachedSamplerStates[desc] = state; } template void TRenderStateManager::notifyBlendStateCreated(const BLEND_STATE_DESC& desc, const SPtr& state) const { BS_LOCK_MUTEX(mMutex); mCachedBlendStates[desc] = state; } template void TRenderStateManager::notifyRasterizerStateCreated(const RASTERIZER_STATE_DESC& desc, const SPtr& state) const { BS_LOCK_MUTEX(mMutex); mCachedRasterizerStates[desc] = state; } template void TRenderStateManager::notifyDepthStencilStateCreated(const DEPTH_STENCIL_STATE_DESC& desc, const SPtr& state) const { BS_LOCK_MUTEX(mMutex); mCachedDepthStencilStates[desc] = state; } template void TRenderStateManager::notifySamplerStateDestroyed(const SAMPLER_STATE_DESC& desc) const { BS_LOCK_MUTEX(mMutex); mCachedSamplerStates.erase(desc); } template void TRenderStateManager::notifyBlendStateDestroyed(const BLEND_STATE_DESC& desc) const { BS_LOCK_MUTEX(mMutex); mCachedBlendStates.erase(desc); } template void TRenderStateManager::notifyRasterizerStateDestroyed(const RASTERIZER_STATE_DESC& desc) const { BS_LOCK_MUTEX(mMutex); mCachedRasterizerStates.erase(desc); } template void TRenderStateManager::notifyDepthStencilStateDestroyed(const DEPTH_STENCIL_STATE_DESC& desc) const { BS_LOCK_MUTEX(mMutex); mCachedDepthStencilStates.erase(desc); } template SPtr::SamplerStateType> TRenderStateManager::findCachedState(const SAMPLER_STATE_DESC& desc) const { BS_LOCK_MUTEX(mMutex); auto iterFind = mCachedSamplerStates.find(desc); if (iterFind != mCachedSamplerStates.end()) return iterFind->second.lock(); return nullptr; } template SPtr::BlendStateType> TRenderStateManager::findCachedState(const BLEND_STATE_DESC& desc) const { BS_LOCK_MUTEX(mMutex); auto iterFind = mCachedBlendStates.find(desc); if (iterFind != mCachedBlendStates.end()) return iterFind->second.lock(); return nullptr; } template SPtr::RasterizerStateType> TRenderStateManager::findCachedState(const RASTERIZER_STATE_DESC& desc) const { BS_LOCK_MUTEX(mMutex); auto iterFind = mCachedRasterizerStates.find(desc); if (iterFind != mCachedRasterizerStates.end()) return iterFind->second.lock(); return nullptr; } template SPtr::DepthStencilStateType> TRenderStateManager::findCachedState(const DEPTH_STENCIL_STATE_DESC& desc) const { BS_LOCK_MUTEX(mMutex); auto iterFind = mCachedDepthStencilStates.find(desc); if (iterFind != mCachedDepthStencilStates.end()) return iterFind->second.lock(); return nullptr; } template class TRenderStateManager < true > ; template class TRenderStateManager < false >; SamplerStatePtr RenderStateManager::createSamplerState(const SAMPLER_STATE_DESC& desc) const { SPtr state = findCachedState(desc); if (state == nullptr) { state = bs_core_ptr(new (bs_alloc()) SamplerState(desc)); state->_setThisPtr(state); state->initialize(); notifySamplerStateCreated(desc, state); } return state; } DepthStencilStatePtr RenderStateManager::createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const { SPtr state = findCachedState(desc); if (state == nullptr) { state = bs_core_ptr(new (bs_alloc()) DepthStencilState(desc)); state->_setThisPtr(state); state->initialize(); notifyDepthStencilStateCreated(desc, state); } return state; } RasterizerStatePtr RenderStateManager::createRasterizerState(const RASTERIZER_STATE_DESC& desc) const { SPtr state = findCachedState(desc); if (state == nullptr) { state = bs_core_ptr(new (bs_alloc()) RasterizerState(desc)); state->_setThisPtr(state); state->initialize(); notifyRasterizerStateCreated(desc, state); } return state; } BlendStatePtr RenderStateManager::createBlendState(const BLEND_STATE_DESC& desc) const { SPtr state = findCachedState(desc); if (state == nullptr) { state = bs_core_ptr(new (bs_alloc()) BlendState(desc)); state->_setThisPtr(state); state->initialize(); notifyBlendStateCreated(desc, state); } return state; } SamplerStatePtr RenderStateManager::_createSamplerStatePtr(const SAMPLER_STATE_DESC& desc) const { SamplerStatePtr samplerState = bs_core_ptr( new (bs_alloc()) SamplerState(desc)); samplerState->_setThisPtr(samplerState); return samplerState; } DepthStencilStatePtr RenderStateManager::_createDepthStencilStatePtr(const DEPTH_STENCIL_STATE_DESC& desc) const { DepthStencilStatePtr depthStencilState = bs_core_ptr( new (bs_alloc()) DepthStencilState(desc)); depthStencilState->_setThisPtr(depthStencilState); return depthStencilState; } RasterizerStatePtr RenderStateManager::_createRasterizerStatePtr(const RASTERIZER_STATE_DESC& desc) const { RasterizerStatePtr rasterizerState = bs_core_ptr( new (bs_alloc()) RasterizerState(desc)); rasterizerState->_setThisPtr(rasterizerState); return rasterizerState; } BlendStatePtr RenderStateManager::_createBlendStatePtr(const BLEND_STATE_DESC& desc) const { BlendStatePtr blendState = bs_core_ptr( new (bs_alloc()) BlendState(desc)); blendState->_setThisPtr(blendState); return blendState; } const SamplerStatePtr& RenderStateManager::getDefaultSamplerState() const { if(mDefaultSamplerState == nullptr) mDefaultSamplerState = createSamplerState(SAMPLER_STATE_DESC()); return mDefaultSamplerState; } const BlendStatePtr& RenderStateManager::getDefaultBlendState() const { if(mDefaultBlendState == nullptr) mDefaultBlendState = createBlendState(BLEND_STATE_DESC()); return mDefaultBlendState; } const RasterizerStatePtr& RenderStateManager::getDefaultRasterizerState() const { if(mDefaultRasterizerState == nullptr) mDefaultRasterizerState = createRasterizerState(RASTERIZER_STATE_DESC()); return mDefaultRasterizerState; } const DepthStencilStatePtr& RenderStateManager::getDefaultDepthStencilState() const { if(mDefaultDepthStencilState == nullptr) mDefaultDepthStencilState = createDepthStencilState(DEPTH_STENCIL_STATE_DESC()); return mDefaultDepthStencilState; } SPtr RenderStateCoreManager::createSamplerState(const SAMPLER_STATE_DESC& desc) const { SPtr samplerState = createSamplerStateInternal(desc); samplerState->initialize(); return samplerState; } SPtr RenderStateCoreManager::createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const { SPtr depthStencilState = createDepthStencilStateInternal(desc); depthStencilState->initialize(); return depthStencilState; } SPtr RenderStateCoreManager::createRasterizerState(const RASTERIZER_STATE_DESC& desc) const { SPtr rasterizerState = createRasterizerStateInternal(desc); rasterizerState->initialize(); return rasterizerState; } SPtr RenderStateCoreManager::createBlendState(const BLEND_STATE_DESC& desc) const { SPtr blendState = createBlendStateInternal(desc); blendState->initialize(); return blendState; } const SPtr& RenderStateCoreManager::getDefaultSamplerState() const { if (mDefaultSamplerState == nullptr) mDefaultSamplerState = createSamplerState(SAMPLER_STATE_DESC()); return mDefaultSamplerState; } const SPtr& RenderStateCoreManager::getDefaultBlendState() const { if (mDefaultBlendState == nullptr) mDefaultBlendState = createBlendState(BLEND_STATE_DESC()); return mDefaultBlendState; } const SPtr& RenderStateCoreManager::getDefaultRasterizerState() const { if (mDefaultRasterizerState == nullptr) mDefaultRasterizerState = createRasterizerState(RASTERIZER_STATE_DESC()); return mDefaultRasterizerState; } const SPtr& RenderStateCoreManager::getDefaultDepthStencilState() const { if (mDefaultDepthStencilState == nullptr) mDefaultDepthStencilState = createDepthStencilState(DEPTH_STENCIL_STATE_DESC()); return mDefaultDepthStencilState; } SPtr RenderStateCoreManager::createSamplerStateInternal(const SAMPLER_STATE_DESC& desc) const { SPtr state = findCachedState(desc); if (state == nullptr) { state = bs_shared_ptr(new (bs_alloc()) SamplerStateCore(desc)); state->_setThisPtr(state); notifySamplerStateCreated(desc, state); } return state; } SPtr RenderStateCoreManager::createDepthStencilStateInternal(const DEPTH_STENCIL_STATE_DESC& desc) const { SPtr state = findCachedState(desc); if (state == nullptr) { SPtr state = bs_shared_ptr(new (bs_alloc()) DepthStencilStateCore(desc)); state->_setThisPtr(state); notifyDepthStencilStateCreated(desc, state); } return state; } SPtr RenderStateCoreManager::createRasterizerStateInternal(const RASTERIZER_STATE_DESC& desc) const { SPtr state = findCachedState(desc); if (state == nullptr) { SPtr state = bs_shared_ptr(new (bs_alloc()) RasterizerStateCore(desc)); state->_setThisPtr(state); notifyRasterizerStateCreated(desc, state); } return state; } SPtr RenderStateCoreManager::createBlendStateInternal(const BLEND_STATE_DESC& desc) const { SPtr state = findCachedState(desc); if (state == nullptr) { state = bs_shared_ptr(new (bs_alloc()) BlendStateCore(desc)); state->_setThisPtr(state); notifyBlendStateCreated(desc, state); } return state; } }