BsRenderStateManager.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsRenderStateManager.h"
  4. #include "BsSamplerState.h"
  5. #include "BsDepthStencilState.h"
  6. #include "BsRasterizerState.h"
  7. #include "BsBlendState.h"
  8. namespace BansheeEngine
  9. {
  10. SamplerStatePtr RenderStateManager::createSamplerState(const SAMPLER_STATE_DESC& desc) const
  11. {
  12. SPtr<SamplerState> state = _createSamplerStatePtr(desc);
  13. state->initialize();
  14. return state;
  15. }
  16. DepthStencilStatePtr RenderStateManager::createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const
  17. {
  18. SPtr<DepthStencilState> state = _createDepthStencilStatePtr(desc);
  19. state->initialize();
  20. return state;
  21. }
  22. RasterizerStatePtr RenderStateManager::createRasterizerState(const RASTERIZER_STATE_DESC& desc) const
  23. {
  24. SPtr<RasterizerState> state = _createRasterizerStatePtr(desc);
  25. state->initialize();
  26. return state;
  27. }
  28. BlendStatePtr RenderStateManager::createBlendState(const BLEND_STATE_DESC& desc) const
  29. {
  30. SPtr<BlendState> state = _createBlendStatePtr(desc);
  31. state->initialize();
  32. return state;
  33. }
  34. SamplerStatePtr RenderStateManager::_createSamplerStatePtr(const SAMPLER_STATE_DESC& desc) const
  35. {
  36. SamplerStatePtr samplerState = bs_core_ptr<SamplerState>(new (bs_alloc<SamplerState>()) SamplerState(desc));
  37. samplerState->_setThisPtr(samplerState);
  38. return samplerState;
  39. }
  40. DepthStencilStatePtr RenderStateManager::_createDepthStencilStatePtr(const DEPTH_STENCIL_STATE_DESC& desc) const
  41. {
  42. DepthStencilStatePtr depthStencilState = bs_core_ptr<DepthStencilState>(new (bs_alloc<DepthStencilState>()) DepthStencilState(desc));
  43. depthStencilState->_setThisPtr(depthStencilState);
  44. return depthStencilState;
  45. }
  46. RasterizerStatePtr RenderStateManager::_createRasterizerStatePtr(const RASTERIZER_STATE_DESC& desc) const
  47. {
  48. RasterizerStatePtr rasterizerState = bs_core_ptr<RasterizerState>(new (bs_alloc<RasterizerState>()) RasterizerState(desc));
  49. rasterizerState->_setThisPtr(rasterizerState);
  50. return rasterizerState;
  51. }
  52. BlendStatePtr RenderStateManager::_createBlendStatePtr(const BLEND_STATE_DESC& desc) const
  53. {
  54. BlendStatePtr blendState = bs_core_ptr<BlendState>(new (bs_alloc<BlendState>()) BlendState(desc));
  55. blendState->_setThisPtr(blendState);
  56. return blendState;
  57. }
  58. const SamplerStatePtr& RenderStateManager::getDefaultSamplerState() const
  59. {
  60. if(mDefaultSamplerState == nullptr)
  61. mDefaultSamplerState = createSamplerState(SAMPLER_STATE_DESC());
  62. return mDefaultSamplerState;
  63. }
  64. const BlendStatePtr& RenderStateManager::getDefaultBlendState() const
  65. {
  66. if(mDefaultBlendState == nullptr)
  67. mDefaultBlendState = createBlendState(BLEND_STATE_DESC());
  68. return mDefaultBlendState;
  69. }
  70. const RasterizerStatePtr& RenderStateManager::getDefaultRasterizerState() const
  71. {
  72. if(mDefaultRasterizerState == nullptr)
  73. mDefaultRasterizerState = createRasterizerState(RASTERIZER_STATE_DESC());
  74. return mDefaultRasterizerState;
  75. }
  76. const DepthStencilStatePtr& RenderStateManager::getDefaultDepthStencilState() const
  77. {
  78. if(mDefaultDepthStencilState == nullptr)
  79. mDefaultDepthStencilState = createDepthStencilState(DEPTH_STENCIL_STATE_DESC());
  80. return mDefaultDepthStencilState;
  81. }
  82. RenderStateCoreManager::RenderStateCoreManager()
  83. :mNextBlendStateId(0), mNextDepthStencilStateId(0), mNextRasterizerStateId(0)
  84. {
  85. }
  86. SPtr<SamplerStateCore> RenderStateCoreManager::createSamplerState(const SAMPLER_STATE_DESC& desc) const
  87. {
  88. SPtr<SamplerStateCore> state = findCachedState(desc);
  89. if (state == nullptr)
  90. {
  91. state = createSamplerStateInternal(desc);
  92. state->initialize();
  93. notifySamplerStateCreated(desc, state);
  94. }
  95. return state;
  96. }
  97. SPtr<DepthStencilStateCore> RenderStateCoreManager::createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const
  98. {
  99. UINT32 id = 0;
  100. SPtr<DepthStencilStateCore> state = findCachedState(desc, id);
  101. if (state == nullptr)
  102. {
  103. state = createDepthStencilStateInternal(desc, id);
  104. state->initialize();
  105. CachedDepthStencilState cachedData(id);
  106. cachedData.state = state;
  107. notifyDepthStencilStateCreated(desc, cachedData);
  108. }
  109. return state;
  110. }
  111. SPtr<RasterizerStateCore> RenderStateCoreManager::createRasterizerState(const RASTERIZER_STATE_DESC& desc) const
  112. {
  113. UINT32 id = 0;
  114. SPtr<RasterizerStateCore> state = findCachedState(desc, id);
  115. if (state == nullptr)
  116. {
  117. state = createRasterizerStateInternal(desc, id);
  118. state->initialize();
  119. CachedRasterizerState cachedData(id);
  120. cachedData.state = state;
  121. notifyRasterizerStateCreated(desc, cachedData);
  122. }
  123. return state;
  124. }
  125. SPtr<BlendStateCore> RenderStateCoreManager::createBlendState(const BLEND_STATE_DESC& desc) const
  126. {
  127. UINT32 id = 0;
  128. SPtr<BlendStateCore> state = findCachedState(desc, id);
  129. if (state == nullptr)
  130. {
  131. state = createBlendStateInternal(desc, id);
  132. state->initialize();
  133. CachedBlendState cachedData(id);
  134. cachedData.state = state;
  135. notifyBlendStateCreated(desc, cachedData);
  136. }
  137. return state;
  138. }
  139. SPtr<SamplerStateCore> RenderStateCoreManager::_createSamplerState(const SAMPLER_STATE_DESC& desc) const
  140. {
  141. SPtr<SamplerStateCore> state = findCachedState(desc);
  142. if (state == nullptr)
  143. {
  144. state = createSamplerStateInternal(desc);
  145. notifySamplerStateCreated(desc, state);
  146. }
  147. return state;
  148. }
  149. SPtr<DepthStencilStateCore> RenderStateCoreManager::_createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const
  150. {
  151. UINT32 id = 0;
  152. SPtr<DepthStencilStateCore> state = findCachedState(desc, id);
  153. if (state == nullptr)
  154. {
  155. state = createDepthStencilStateInternal(desc, id);
  156. CachedDepthStencilState cachedData(id);
  157. cachedData.state = state;
  158. notifyDepthStencilStateCreated(desc, cachedData);
  159. }
  160. return state;
  161. }
  162. SPtr<RasterizerStateCore> RenderStateCoreManager::_createRasterizerState(const RASTERIZER_STATE_DESC& desc) const
  163. {
  164. UINT32 id = 0;
  165. SPtr<RasterizerStateCore> state = findCachedState(desc, id);
  166. if (state == nullptr)
  167. {
  168. state = createRasterizerStateInternal(desc, id);
  169. CachedRasterizerState cachedData(id);
  170. cachedData.state = state;
  171. notifyRasterizerStateCreated(desc, cachedData);
  172. }
  173. return state;
  174. }
  175. SPtr<BlendStateCore> RenderStateCoreManager::_createBlendState(const BLEND_STATE_DESC& desc) const
  176. {
  177. UINT32 id = 0;
  178. SPtr<BlendStateCore> state = findCachedState(desc, id);
  179. if (state == nullptr)
  180. {
  181. state = createBlendStateInternal(desc, id);
  182. CachedBlendState cachedData(id);
  183. cachedData.state = state;
  184. notifyBlendStateCreated(desc, cachedData);
  185. }
  186. return state;
  187. }
  188. void RenderStateCoreManager::onShutDown()
  189. {
  190. mDefaultBlendState = nullptr;
  191. mDefaultDepthStencilState = nullptr;
  192. mDefaultRasterizerState = nullptr;
  193. mDefaultSamplerState = nullptr;
  194. }
  195. const SPtr<SamplerStateCore>& RenderStateCoreManager::getDefaultSamplerState() const
  196. {
  197. if (mDefaultSamplerState == nullptr)
  198. mDefaultSamplerState = createSamplerState(SAMPLER_STATE_DESC());
  199. return mDefaultSamplerState;
  200. }
  201. const SPtr<BlendStateCore>& RenderStateCoreManager::getDefaultBlendState() const
  202. {
  203. if (mDefaultBlendState == nullptr)
  204. mDefaultBlendState = createBlendState(BLEND_STATE_DESC());
  205. return mDefaultBlendState;
  206. }
  207. const SPtr<RasterizerStateCore>& RenderStateCoreManager::getDefaultRasterizerState() const
  208. {
  209. if (mDefaultRasterizerState == nullptr)
  210. mDefaultRasterizerState = createRasterizerState(RASTERIZER_STATE_DESC());
  211. return mDefaultRasterizerState;
  212. }
  213. const SPtr<DepthStencilStateCore>& RenderStateCoreManager::getDefaultDepthStencilState() const
  214. {
  215. if (mDefaultDepthStencilState == nullptr)
  216. mDefaultDepthStencilState = createDepthStencilState(DEPTH_STENCIL_STATE_DESC());
  217. return mDefaultDepthStencilState;
  218. }
  219. void RenderStateCoreManager::notifySamplerStateCreated(const SAMPLER_STATE_DESC& desc, const SPtr<SamplerStateCore>& state) const
  220. {
  221. BS_LOCK_MUTEX(mMutex);
  222. mCachedSamplerStates[desc] = state;
  223. }
  224. void RenderStateCoreManager::notifyBlendStateCreated(const BLEND_STATE_DESC& desc, const CachedBlendState& state) const
  225. {
  226. BS_LOCK_MUTEX(mMutex);
  227. mCachedBlendStates[desc] = state;
  228. }
  229. void RenderStateCoreManager::notifyRasterizerStateCreated(const RASTERIZER_STATE_DESC& desc, const CachedRasterizerState& state) const
  230. {
  231. BS_LOCK_MUTEX(mMutex);
  232. mCachedRasterizerStates[desc] = state;
  233. }
  234. void RenderStateCoreManager::notifyDepthStencilStateCreated(const DEPTH_STENCIL_STATE_DESC& desc, const CachedDepthStencilState& state) const
  235. {
  236. BS_LOCK_MUTEX(mMutex);
  237. mCachedDepthStencilStates[desc] = state;
  238. }
  239. void RenderStateCoreManager::notifySamplerStateDestroyed(const SAMPLER_STATE_DESC& desc) const
  240. {
  241. BS_LOCK_MUTEX(mMutex);
  242. mCachedSamplerStates.erase(desc);
  243. }
  244. SPtr<SamplerStateCore> RenderStateCoreManager::findCachedState(const SAMPLER_STATE_DESC& desc) const
  245. {
  246. BS_LOCK_MUTEX(mMutex);
  247. auto iterFind = mCachedSamplerStates.find(desc);
  248. if (iterFind != mCachedSamplerStates.end())
  249. return iterFind->second.lock();
  250. return nullptr;
  251. }
  252. SPtr<BlendStateCore> RenderStateCoreManager::findCachedState(const BLEND_STATE_DESC& desc, UINT32& id) const
  253. {
  254. BS_LOCK_MUTEX(mMutex);
  255. auto iterFind = mCachedBlendStates.find(desc);
  256. if (iterFind != mCachedBlendStates.end())
  257. {
  258. id = iterFind->second.id;
  259. if (!iterFind->second.state.expired())
  260. return iterFind->second.state.lock();
  261. return nullptr;
  262. }
  263. id = mNextBlendStateId++;
  264. assert(id <= 0x3FF); // 10 bits maximum
  265. return nullptr;
  266. }
  267. SPtr<RasterizerStateCore> RenderStateCoreManager::findCachedState(const RASTERIZER_STATE_DESC& desc, UINT32& id) const
  268. {
  269. BS_LOCK_MUTEX(mMutex);
  270. auto iterFind = mCachedRasterizerStates.find(desc);
  271. if (iterFind != mCachedRasterizerStates.end())
  272. {
  273. id = iterFind->second.id;
  274. if (!iterFind->second.state.expired())
  275. return iterFind->second.state.lock();
  276. return nullptr;
  277. }
  278. id = mNextRasterizerStateId++;
  279. assert(id <= 0x3FF); // 10 bits maximum
  280. return nullptr;
  281. }
  282. SPtr<DepthStencilStateCore> RenderStateCoreManager::findCachedState(const DEPTH_STENCIL_STATE_DESC& desc, UINT32& id) const
  283. {
  284. BS_LOCK_MUTEX(mMutex);
  285. auto iterFind = mCachedDepthStencilStates.find(desc);
  286. if (iterFind != mCachedDepthStencilStates.end())
  287. {
  288. id = iterFind->second.id;
  289. if (!iterFind->second.state.expired())
  290. return iterFind->second.state.lock();
  291. return nullptr;
  292. }
  293. id = mNextDepthStencilStateId++;
  294. assert(id <= 0x3FF); // 10 bits maximum
  295. return nullptr;
  296. }
  297. SPtr<SamplerStateCore> RenderStateCoreManager::createSamplerStateInternal(const SAMPLER_STATE_DESC& desc) const
  298. {
  299. SPtr<SamplerStateCore> state = bs_shared_ptr<SamplerStateCore>(new (bs_alloc<SamplerStateCore>()) SamplerStateCore(desc));
  300. state->_setThisPtr(state);
  301. return state;
  302. }
  303. SPtr<DepthStencilStateCore> RenderStateCoreManager::createDepthStencilStateInternal(const DEPTH_STENCIL_STATE_DESC& desc, UINT32 id) const
  304. {
  305. SPtr<DepthStencilStateCore> state = bs_shared_ptr<DepthStencilStateCore>(new (bs_alloc<DepthStencilStateCore>()) DepthStencilStateCore(desc, id));
  306. state->_setThisPtr(state);
  307. return state;
  308. }
  309. SPtr<RasterizerStateCore> RenderStateCoreManager::createRasterizerStateInternal(const RASTERIZER_STATE_DESC& desc, UINT32 id) const
  310. {
  311. SPtr<RasterizerStateCore> state = bs_shared_ptr<RasterizerStateCore>(new (bs_alloc<RasterizerStateCore>()) RasterizerStateCore(desc, id));
  312. state->_setThisPtr(state);
  313. return state;
  314. }
  315. SPtr<BlendStateCore> RenderStateCoreManager::createBlendStateInternal(const BLEND_STATE_DESC& desc, UINT32 id) const
  316. {
  317. SPtr<BlendStateCore> state = bs_shared_ptr<BlendStateCore>(new (bs_alloc<BlendStateCore>()) BlendStateCore(desc, id));
  318. state->_setThisPtr(state);
  319. return state;
  320. }
  321. }