BsRenderStateManager.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  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<GraphicsPipelineState> RenderStateManager::createGraphicsPipelineState(const PIPELINE_STATE_DESC& desc) const
  35. {
  36. SPtr<GraphicsPipelineState> state = _createGraphicsPipelineState(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<GraphicsPipelineState> RenderStateManager::_createGraphicsPipelineState(const PIPELINE_STATE_DESC& desc) const
  65. {
  66. SPtr<GraphicsPipelineState> pipelineState =
  67. bs_core_ptr<GraphicsPipelineState>(new (bs_alloc<GraphicsPipelineState>()) GraphicsPipelineState(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,
  100. GpuDeviceFlags deviceMask) const
  101. {
  102. SPtr<SamplerStateCore> state = findCachedState(desc);
  103. if (state == nullptr)
  104. {
  105. state = createSamplerStateInternal(desc, deviceMask);
  106. state->initialize();
  107. notifySamplerStateCreated(desc, state);
  108. }
  109. return state;
  110. }
  111. SPtr<DepthStencilStateCore> RenderStateCoreManager::createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const
  112. {
  113. UINT32 id = 0;
  114. SPtr<DepthStencilStateCore> state = findCachedState(desc, id);
  115. if (state == nullptr)
  116. {
  117. state = createDepthStencilStateInternal(desc, id);
  118. state->initialize();
  119. CachedDepthStencilState cachedData(id);
  120. cachedData.state = state;
  121. notifyDepthStencilStateCreated(desc, cachedData);
  122. }
  123. return state;
  124. }
  125. SPtr<RasterizerStateCore> RenderStateCoreManager::createRasterizerState(const RASTERIZER_STATE_DESC& desc) const
  126. {
  127. UINT32 id = 0;
  128. SPtr<RasterizerStateCore> state = findCachedState(desc, id);
  129. if (state == nullptr)
  130. {
  131. state = createRasterizerStateInternal(desc, id);
  132. state->initialize();
  133. CachedRasterizerState cachedData(id);
  134. cachedData.state = state;
  135. notifyRasterizerStateCreated(desc, cachedData);
  136. }
  137. return state;
  138. }
  139. SPtr<BlendStateCore> RenderStateCoreManager::createBlendState(const BLEND_STATE_DESC& desc) const
  140. {
  141. UINT32 id = 0;
  142. SPtr<BlendStateCore> state = findCachedState(desc, id);
  143. if (state == nullptr)
  144. {
  145. state = createBlendStateInternal(desc, id);
  146. state->initialize();
  147. CachedBlendState cachedData(id);
  148. cachedData.state = state;
  149. notifyBlendStateCreated(desc, cachedData);
  150. }
  151. return state;
  152. }
  153. SPtr<GraphicsPipelineStateCore> RenderStateCoreManager::createPipelineState(const PIPELINE_STATE_CORE_DESC& desc,
  154. GpuDeviceFlags deviceMask) const
  155. {
  156. SPtr<GraphicsPipelineStateCore> state = _createPipelineState(desc, deviceMask);
  157. state->initialize();
  158. return state;
  159. }
  160. SPtr<SamplerStateCore> RenderStateCoreManager::_createSamplerState(const SAMPLER_STATE_DESC& desc,
  161. GpuDeviceFlags deviceMask) const
  162. {
  163. SPtr<SamplerStateCore> state = findCachedState(desc);
  164. if (state == nullptr)
  165. {
  166. state = createSamplerStateInternal(desc, deviceMask);
  167. notifySamplerStateCreated(desc, state);
  168. }
  169. return state;
  170. }
  171. SPtr<DepthStencilStateCore> RenderStateCoreManager::_createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const
  172. {
  173. UINT32 id = 0;
  174. SPtr<DepthStencilStateCore> state = findCachedState(desc, id);
  175. if (state == nullptr)
  176. {
  177. state = createDepthStencilStateInternal(desc, id);
  178. CachedDepthStencilState cachedData(id);
  179. cachedData.state = state;
  180. notifyDepthStencilStateCreated(desc, cachedData);
  181. }
  182. return state;
  183. }
  184. SPtr<RasterizerStateCore> RenderStateCoreManager::_createRasterizerState(const RASTERIZER_STATE_DESC& desc) const
  185. {
  186. UINT32 id = 0;
  187. SPtr<RasterizerStateCore> state = findCachedState(desc, id);
  188. if (state == nullptr)
  189. {
  190. state = createRasterizerStateInternal(desc, id);
  191. CachedRasterizerState cachedData(id);
  192. cachedData.state = state;
  193. notifyRasterizerStateCreated(desc, cachedData);
  194. }
  195. return state;
  196. }
  197. SPtr<BlendStateCore> RenderStateCoreManager::_createBlendState(const BLEND_STATE_DESC& desc) const
  198. {
  199. UINT32 id = 0;
  200. SPtr<BlendStateCore> state = findCachedState(desc, id);
  201. if (state == nullptr)
  202. {
  203. state = createBlendStateInternal(desc, id);
  204. CachedBlendState cachedData(id);
  205. cachedData.state = state;
  206. notifyBlendStateCreated(desc, cachedData);
  207. }
  208. return state;
  209. }
  210. SPtr<GraphicsPipelineStateCore> RenderStateCoreManager::_createPipelineState(const PIPELINE_STATE_CORE_DESC& desc,
  211. GpuDeviceFlags deviceMask) const
  212. {
  213. SPtr<GraphicsPipelineStateCore> pipelineState =
  214. bs_shared_ptr<GraphicsPipelineStateCore>(new (bs_alloc<GraphicsPipelineStateCore>()) GraphicsPipelineStateCore(desc, deviceMask));
  215. pipelineState->_setThisPtr(pipelineState);
  216. return pipelineState;
  217. }
  218. void RenderStateCoreManager::onShutDown()
  219. {
  220. mDefaultBlendState = nullptr;
  221. mDefaultDepthStencilState = nullptr;
  222. mDefaultRasterizerState = nullptr;
  223. mDefaultSamplerState = nullptr;
  224. }
  225. const SPtr<SamplerStateCore>& RenderStateCoreManager::getDefaultSamplerState() const
  226. {
  227. if (mDefaultSamplerState == nullptr)
  228. mDefaultSamplerState = createSamplerState(SAMPLER_STATE_DESC());
  229. return mDefaultSamplerState;
  230. }
  231. const SPtr<BlendStateCore>& RenderStateCoreManager::getDefaultBlendState() const
  232. {
  233. if (mDefaultBlendState == nullptr)
  234. mDefaultBlendState = createBlendState(BLEND_STATE_DESC());
  235. return mDefaultBlendState;
  236. }
  237. const SPtr<RasterizerStateCore>& RenderStateCoreManager::getDefaultRasterizerState() const
  238. {
  239. if (mDefaultRasterizerState == nullptr)
  240. mDefaultRasterizerState = createRasterizerState(RASTERIZER_STATE_DESC());
  241. return mDefaultRasterizerState;
  242. }
  243. const SPtr<DepthStencilStateCore>& RenderStateCoreManager::getDefaultDepthStencilState() const
  244. {
  245. if (mDefaultDepthStencilState == nullptr)
  246. mDefaultDepthStencilState = createDepthStencilState(DEPTH_STENCIL_STATE_DESC());
  247. return mDefaultDepthStencilState;
  248. }
  249. void RenderStateCoreManager::notifySamplerStateCreated(const SAMPLER_STATE_DESC& desc, const SPtr<SamplerStateCore>& state) const
  250. {
  251. Lock lock(mMutex);
  252. mCachedSamplerStates[desc] = state;
  253. }
  254. void RenderStateCoreManager::notifyBlendStateCreated(const BLEND_STATE_DESC& desc, const CachedBlendState& state) const
  255. {
  256. Lock lock(mMutex);
  257. mCachedBlendStates[desc] = state;
  258. }
  259. void RenderStateCoreManager::notifyRasterizerStateCreated(const RASTERIZER_STATE_DESC& desc, const CachedRasterizerState& state) const
  260. {
  261. Lock lock(mMutex);
  262. mCachedRasterizerStates[desc] = state;
  263. }
  264. void RenderStateCoreManager::notifyDepthStencilStateCreated(const DEPTH_STENCIL_STATE_DESC& desc, const CachedDepthStencilState& state) const
  265. {
  266. Lock lock(mMutex);
  267. mCachedDepthStencilStates[desc] = state;
  268. }
  269. void RenderStateCoreManager::notifySamplerStateDestroyed(const SAMPLER_STATE_DESC& desc) const
  270. {
  271. Lock lock(mMutex);
  272. mCachedSamplerStates.erase(desc);
  273. }
  274. SPtr<SamplerStateCore> RenderStateCoreManager::findCachedState(const SAMPLER_STATE_DESC& desc) const
  275. {
  276. Lock lock(mMutex);
  277. auto iterFind = mCachedSamplerStates.find(desc);
  278. if (iterFind != mCachedSamplerStates.end())
  279. return iterFind->second.lock();
  280. return nullptr;
  281. }
  282. SPtr<BlendStateCore> RenderStateCoreManager::findCachedState(const BLEND_STATE_DESC& desc, UINT32& id) const
  283. {
  284. Lock lock(mMutex);
  285. auto iterFind = mCachedBlendStates.find(desc);
  286. if (iterFind != mCachedBlendStates.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 = mNextBlendStateId++;
  294. assert(id <= 0x3FF); // 10 bits maximum
  295. return nullptr;
  296. }
  297. SPtr<RasterizerStateCore> RenderStateCoreManager::findCachedState(const RASTERIZER_STATE_DESC& desc, UINT32& id) const
  298. {
  299. Lock lock(mMutex);
  300. auto iterFind = mCachedRasterizerStates.find(desc);
  301. if (iterFind != mCachedRasterizerStates.end())
  302. {
  303. id = iterFind->second.id;
  304. if (!iterFind->second.state.expired())
  305. return iterFind->second.state.lock();
  306. return nullptr;
  307. }
  308. id = mNextRasterizerStateId++;
  309. assert(id <= 0x3FF); // 10 bits maximum
  310. return nullptr;
  311. }
  312. SPtr<DepthStencilStateCore> RenderStateCoreManager::findCachedState(const DEPTH_STENCIL_STATE_DESC& desc, UINT32& id) const
  313. {
  314. Lock lock(mMutex);
  315. auto iterFind = mCachedDepthStencilStates.find(desc);
  316. if (iterFind != mCachedDepthStencilStates.end())
  317. {
  318. id = iterFind->second.id;
  319. if (!iterFind->second.state.expired())
  320. return iterFind->second.state.lock();
  321. return nullptr;
  322. }
  323. id = mNextDepthStencilStateId++;
  324. assert(id <= 0x3FF); // 10 bits maximum
  325. return nullptr;
  326. }
  327. SPtr<SamplerStateCore> RenderStateCoreManager::createSamplerStateInternal(const SAMPLER_STATE_DESC& desc, GpuDeviceFlags deviceMask) const
  328. {
  329. SPtr<SamplerStateCore> state =
  330. bs_shared_ptr<SamplerStateCore>(new (bs_alloc<SamplerStateCore>()) SamplerStateCore(desc, deviceMask));
  331. state->_setThisPtr(state);
  332. return state;
  333. }
  334. SPtr<DepthStencilStateCore> RenderStateCoreManager::createDepthStencilStateInternal(const DEPTH_STENCIL_STATE_DESC& desc, UINT32 id) const
  335. {
  336. SPtr<DepthStencilStateCore> state = bs_shared_ptr<DepthStencilStateCore>(new (bs_alloc<DepthStencilStateCore>()) DepthStencilStateCore(desc, id));
  337. state->_setThisPtr(state);
  338. return state;
  339. }
  340. SPtr<RasterizerStateCore> RenderStateCoreManager::createRasterizerStateInternal(const RASTERIZER_STATE_DESC& desc, UINT32 id) const
  341. {
  342. SPtr<RasterizerStateCore> state = bs_shared_ptr<RasterizerStateCore>(new (bs_alloc<RasterizerStateCore>()) RasterizerStateCore(desc, id));
  343. state->_setThisPtr(state);
  344. return state;
  345. }
  346. SPtr<BlendStateCore> RenderStateCoreManager::createBlendStateInternal(const BLEND_STATE_DESC& desc, UINT32 id) const
  347. {
  348. SPtr<BlendStateCore> state = bs_shared_ptr<BlendStateCore>(new (bs_alloc<BlendStateCore>()) BlendStateCore(desc, id));
  349. state->_setThisPtr(state);
  350. return state;
  351. }
  352. }