BsRenderStateManager.cpp 13 KB

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