BsRenderStateManager.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Managers/BsRenderStateManager.h"
  4. #include "RenderAPI/BsSamplerState.h"
  5. #include "RenderAPI/BsDepthStencilState.h"
  6. #include "RenderAPI/BsRasterizerState.h"
  7. #include "RenderAPI/BsBlendState.h"
  8. namespace bs
  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<ComputePipelineState> RenderStateManager::createComputePipelineState(const SPtr<GpuProgram>& program) const
  41. {
  42. SPtr<ComputePipelineState> state = _createComputePipelineState(program);
  43. state->initialize();
  44. return state;
  45. }
  46. SPtr<SamplerState> RenderStateManager::_createSamplerStatePtr(const SAMPLER_STATE_DESC& desc) const
  47. {
  48. SPtr<SamplerState> samplerState = bs_core_ptr<SamplerState>(new (bs_alloc<SamplerState>()) SamplerState(desc));
  49. samplerState->_setThisPtr(samplerState);
  50. return samplerState;
  51. }
  52. SPtr<DepthStencilState> RenderStateManager::_createDepthStencilStatePtr(const DEPTH_STENCIL_STATE_DESC& desc) const
  53. {
  54. SPtr<DepthStencilState> depthStencilState = bs_core_ptr<DepthStencilState>(new (bs_alloc<DepthStencilState>()) DepthStencilState(desc));
  55. depthStencilState->_setThisPtr(depthStencilState);
  56. return depthStencilState;
  57. }
  58. SPtr<RasterizerState> RenderStateManager::_createRasterizerStatePtr(const RASTERIZER_STATE_DESC& desc) const
  59. {
  60. SPtr<RasterizerState> rasterizerState = bs_core_ptr<RasterizerState>(new (bs_alloc<RasterizerState>()) RasterizerState(desc));
  61. rasterizerState->_setThisPtr(rasterizerState);
  62. return rasterizerState;
  63. }
  64. SPtr<BlendState> RenderStateManager::_createBlendStatePtr(const BLEND_STATE_DESC& desc) const
  65. {
  66. SPtr<BlendState> blendState = bs_core_ptr<BlendState>(new (bs_alloc<BlendState>()) BlendState(desc));
  67. blendState->_setThisPtr(blendState);
  68. return blendState;
  69. }
  70. SPtr<GraphicsPipelineState> RenderStateManager::_createGraphicsPipelineState(const PIPELINE_STATE_DESC& desc) const
  71. {
  72. SPtr<GraphicsPipelineState> pipelineState =
  73. bs_core_ptr<GraphicsPipelineState>(new (bs_alloc<GraphicsPipelineState>()) GraphicsPipelineState(desc));
  74. pipelineState->_setThisPtr(pipelineState);
  75. return pipelineState;
  76. }
  77. SPtr<ComputePipelineState> RenderStateManager::_createComputePipelineState(const SPtr<GpuProgram>& program) const
  78. {
  79. SPtr<ComputePipelineState> pipelineState =
  80. bs_core_ptr<ComputePipelineState>(new (bs_alloc<ComputePipelineState>()) ComputePipelineState(program));
  81. pipelineState->_setThisPtr(pipelineState);
  82. return pipelineState;
  83. }
  84. const SPtr<SamplerState>& RenderStateManager::getDefaultSamplerState() const
  85. {
  86. if(mDefaultSamplerState == nullptr)
  87. mDefaultSamplerState = createSamplerState(SAMPLER_STATE_DESC());
  88. return mDefaultSamplerState;
  89. }
  90. const SPtr<BlendState>& RenderStateManager::getDefaultBlendState() const
  91. {
  92. if(mDefaultBlendState == nullptr)
  93. mDefaultBlendState = createBlendState(BLEND_STATE_DESC());
  94. return mDefaultBlendState;
  95. }
  96. const SPtr<RasterizerState>& RenderStateManager::getDefaultRasterizerState() const
  97. {
  98. if(mDefaultRasterizerState == nullptr)
  99. mDefaultRasterizerState = createRasterizerState(RASTERIZER_STATE_DESC());
  100. return mDefaultRasterizerState;
  101. }
  102. const SPtr<DepthStencilState>& RenderStateManager::getDefaultDepthStencilState() const
  103. {
  104. if(mDefaultDepthStencilState == nullptr)
  105. mDefaultDepthStencilState = createDepthStencilState(DEPTH_STENCIL_STATE_DESC());
  106. return mDefaultDepthStencilState;
  107. }
  108. namespace ct
  109. {
  110. RenderStateManager::RenderStateManager()
  111. :mNextBlendStateId(0), mNextRasterizerStateId(0), mNextDepthStencilStateId(0)
  112. {
  113. }
  114. SPtr<SamplerState> RenderStateManager::createSamplerState(const SAMPLER_STATE_DESC& desc,
  115. GpuDeviceFlags deviceMask) const
  116. {
  117. SPtr<SamplerState> state = findCachedState(desc);
  118. if (state == nullptr)
  119. {
  120. state = createSamplerStateInternal(desc, deviceMask);
  121. state->initialize();
  122. notifySamplerStateCreated(desc, state);
  123. }
  124. return state;
  125. }
  126. SPtr<DepthStencilState> RenderStateManager::createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const
  127. {
  128. UINT32 id = 0;
  129. SPtr<DepthStencilState> state = findCachedState(desc, id);
  130. if (state == nullptr)
  131. {
  132. state = createDepthStencilStateInternal(desc, id);
  133. state->initialize();
  134. CachedDepthStencilState cachedData(id);
  135. cachedData.state = state;
  136. notifyDepthStencilStateCreated(desc, cachedData);
  137. }
  138. return state;
  139. }
  140. SPtr<RasterizerState> RenderStateManager::createRasterizerState(const RASTERIZER_STATE_DESC& desc) const
  141. {
  142. UINT32 id = 0;
  143. SPtr<RasterizerState> state = findCachedState(desc, id);
  144. if (state == nullptr)
  145. {
  146. state = createRasterizerStateInternal(desc, id);
  147. state->initialize();
  148. CachedRasterizerState cachedData(id);
  149. cachedData.state = state;
  150. notifyRasterizerStateCreated(desc, cachedData);
  151. }
  152. return state;
  153. }
  154. SPtr<BlendState> RenderStateManager::createBlendState(const BLEND_STATE_DESC& desc) const
  155. {
  156. UINT32 id = 0;
  157. SPtr<BlendState> state = findCachedState(desc, id);
  158. if (state == nullptr)
  159. {
  160. state = createBlendStateInternal(desc, id);
  161. state->initialize();
  162. CachedBlendState cachedData(id);
  163. cachedData.state = state;
  164. notifyBlendStateCreated(desc, cachedData);
  165. }
  166. return state;
  167. }
  168. SPtr<GraphicsPipelineState> RenderStateManager::createGraphicsPipelineState(const PIPELINE_STATE_DESC& desc,
  169. GpuDeviceFlags deviceMask) const
  170. {
  171. SPtr<GraphicsPipelineState> state = _createGraphicsPipelineState(desc, deviceMask);
  172. state->initialize();
  173. return state;
  174. }
  175. SPtr<ComputePipelineState> RenderStateManager::createComputePipelineState(const SPtr<GpuProgram>& program,
  176. GpuDeviceFlags deviceMask) const
  177. {
  178. SPtr<ComputePipelineState> state = _createComputePipelineState(program, deviceMask);
  179. state->initialize();
  180. return state;
  181. }
  182. SPtr<GpuPipelineParamInfo> RenderStateManager::createPipelineParamInfo(
  183. const GPU_PIPELINE_PARAMS_DESC& desc, GpuDeviceFlags deviceMask) const
  184. {
  185. SPtr<GpuPipelineParamInfo> paramInfo = _createPipelineParamInfo(desc, deviceMask);
  186. paramInfo->initialize();
  187. return paramInfo;
  188. }
  189. SPtr<SamplerState> RenderStateManager::_createSamplerState(const SAMPLER_STATE_DESC& desc,
  190. GpuDeviceFlags deviceMask) const
  191. {
  192. SPtr<SamplerState> state = findCachedState(desc);
  193. if (state == nullptr)
  194. {
  195. state = createSamplerStateInternal(desc, deviceMask);
  196. notifySamplerStateCreated(desc, state);
  197. }
  198. return state;
  199. }
  200. SPtr<DepthStencilState> RenderStateManager::_createDepthStencilState(const DEPTH_STENCIL_STATE_DESC& desc) const
  201. {
  202. UINT32 id = 0;
  203. SPtr<DepthStencilState> state = findCachedState(desc, id);
  204. if (state == nullptr)
  205. {
  206. state = createDepthStencilStateInternal(desc, id);
  207. CachedDepthStencilState cachedData(id);
  208. cachedData.state = state;
  209. notifyDepthStencilStateCreated(desc, cachedData);
  210. }
  211. return state;
  212. }
  213. SPtr<RasterizerState> RenderStateManager::_createRasterizerState(const RASTERIZER_STATE_DESC& desc) const
  214. {
  215. UINT32 id = 0;
  216. SPtr<RasterizerState> state = findCachedState(desc, id);
  217. if (state == nullptr)
  218. {
  219. state = createRasterizerStateInternal(desc, id);
  220. CachedRasterizerState cachedData(id);
  221. cachedData.state = state;
  222. notifyRasterizerStateCreated(desc, cachedData);
  223. }
  224. return state;
  225. }
  226. SPtr<BlendState> RenderStateManager::_createBlendState(const BLEND_STATE_DESC& desc) const
  227. {
  228. UINT32 id = 0;
  229. SPtr<BlendState> state = findCachedState(desc, id);
  230. if (state == nullptr)
  231. {
  232. state = createBlendStateInternal(desc, id);
  233. CachedBlendState cachedData(id);
  234. cachedData.state = state;
  235. notifyBlendStateCreated(desc, cachedData);
  236. }
  237. return state;
  238. }
  239. SPtr<GraphicsPipelineState> RenderStateManager::_createGraphicsPipelineState(const PIPELINE_STATE_DESC& desc,
  240. GpuDeviceFlags deviceMask) const
  241. {
  242. SPtr<GraphicsPipelineState> pipelineState =
  243. bs_shared_ptr<GraphicsPipelineState>(new (bs_alloc<GraphicsPipelineState>())
  244. GraphicsPipelineState(desc, deviceMask));
  245. pipelineState->_setThisPtr(pipelineState);
  246. return pipelineState;
  247. }
  248. SPtr<ComputePipelineState> RenderStateManager::_createComputePipelineState(const SPtr<GpuProgram>& program,
  249. GpuDeviceFlags deviceMask) const
  250. {
  251. SPtr<ComputePipelineState> pipelineState =
  252. bs_shared_ptr<ComputePipelineState>(new (bs_alloc<ComputePipelineState>())
  253. ComputePipelineState(program, deviceMask));
  254. pipelineState->_setThisPtr(pipelineState);
  255. return pipelineState;
  256. }
  257. SPtr<GpuPipelineParamInfo> RenderStateManager::_createPipelineParamInfo(
  258. const GPU_PIPELINE_PARAMS_DESC& desc, GpuDeviceFlags deviceMask) const
  259. {
  260. SPtr<GpuPipelineParamInfo> paramInfo =
  261. bs_shared_ptr<GpuPipelineParamInfo>(new (bs_alloc<GpuPipelineParamInfo>())
  262. GpuPipelineParamInfo(desc, deviceMask));
  263. paramInfo->_setThisPtr(paramInfo);
  264. return paramInfo;
  265. }
  266. void RenderStateManager::onShutDown()
  267. {
  268. mDefaultBlendState = nullptr;
  269. mDefaultDepthStencilState = nullptr;
  270. mDefaultRasterizerState = nullptr;
  271. mDefaultSamplerState = nullptr;
  272. }
  273. const SPtr<SamplerState>& RenderStateManager::getDefaultSamplerState() const
  274. {
  275. if (mDefaultSamplerState == nullptr)
  276. mDefaultSamplerState = createSamplerState(SAMPLER_STATE_DESC());
  277. return mDefaultSamplerState;
  278. }
  279. const SPtr<BlendState>& RenderStateManager::getDefaultBlendState() const
  280. {
  281. if (mDefaultBlendState == nullptr)
  282. mDefaultBlendState = createBlendState(BLEND_STATE_DESC());
  283. return mDefaultBlendState;
  284. }
  285. const SPtr<RasterizerState>& RenderStateManager::getDefaultRasterizerState() const
  286. {
  287. if (mDefaultRasterizerState == nullptr)
  288. mDefaultRasterizerState = createRasterizerState(RASTERIZER_STATE_DESC());
  289. return mDefaultRasterizerState;
  290. }
  291. const SPtr<DepthStencilState>& RenderStateManager::getDefaultDepthStencilState() const
  292. {
  293. if (mDefaultDepthStencilState == nullptr)
  294. mDefaultDepthStencilState = createDepthStencilState(DEPTH_STENCIL_STATE_DESC());
  295. return mDefaultDepthStencilState;
  296. }
  297. void RenderStateManager::notifySamplerStateCreated(const SAMPLER_STATE_DESC& desc, const SPtr<SamplerState>& state) const
  298. {
  299. Lock lock(mMutex);
  300. mCachedSamplerStates[desc] = state;
  301. }
  302. void RenderStateManager::notifyBlendStateCreated(const BLEND_STATE_DESC& desc, const CachedBlendState& state) const
  303. {
  304. Lock lock(mMutex);
  305. mCachedBlendStates[desc] = state;
  306. }
  307. void RenderStateManager::notifyRasterizerStateCreated(const RASTERIZER_STATE_DESC& desc, const CachedRasterizerState& state) const
  308. {
  309. Lock lock(mMutex);
  310. mCachedRasterizerStates[desc] = state;
  311. }
  312. void RenderStateManager::notifyDepthStencilStateCreated(const DEPTH_STENCIL_STATE_DESC& desc, const CachedDepthStencilState& state) const
  313. {
  314. Lock lock(mMutex);
  315. mCachedDepthStencilStates[desc] = state;
  316. }
  317. void RenderStateManager::notifySamplerStateDestroyed(const SAMPLER_STATE_DESC& desc) const
  318. {
  319. Lock lock(mMutex);
  320. mCachedSamplerStates.erase(desc);
  321. }
  322. SPtr<SamplerState> RenderStateManager::findCachedState(const SAMPLER_STATE_DESC& desc) const
  323. {
  324. Lock lock(mMutex);
  325. auto iterFind = mCachedSamplerStates.find(desc);
  326. if (iterFind != mCachedSamplerStates.end())
  327. return iterFind->second.lock();
  328. return nullptr;
  329. }
  330. SPtr<BlendState> RenderStateManager::findCachedState(const BLEND_STATE_DESC& desc, UINT32& id) const
  331. {
  332. Lock lock(mMutex);
  333. auto iterFind = mCachedBlendStates.find(desc);
  334. if (iterFind != mCachedBlendStates.end())
  335. {
  336. id = iterFind->second.id;
  337. if (!iterFind->second.state.expired())
  338. return iterFind->second.state.lock();
  339. return nullptr;
  340. }
  341. id = mNextBlendStateId++;
  342. assert(id <= 0x3FF); // 10 bits maximum
  343. return nullptr;
  344. }
  345. SPtr<RasterizerState> RenderStateManager::findCachedState(const RASTERIZER_STATE_DESC& desc, UINT32& id) const
  346. {
  347. Lock lock(mMutex);
  348. auto iterFind = mCachedRasterizerStates.find(desc);
  349. if (iterFind != mCachedRasterizerStates.end())
  350. {
  351. id = iterFind->second.id;
  352. if (!iterFind->second.state.expired())
  353. return iterFind->second.state.lock();
  354. return nullptr;
  355. }
  356. id = mNextRasterizerStateId++;
  357. assert(id <= 0x3FF); // 10 bits maximum
  358. return nullptr;
  359. }
  360. SPtr<DepthStencilState> RenderStateManager::findCachedState(const DEPTH_STENCIL_STATE_DESC& desc, UINT32& id) const
  361. {
  362. Lock lock(mMutex);
  363. auto iterFind = mCachedDepthStencilStates.find(desc);
  364. if (iterFind != mCachedDepthStencilStates.end())
  365. {
  366. id = iterFind->second.id;
  367. if (!iterFind->second.state.expired())
  368. return iterFind->second.state.lock();
  369. return nullptr;
  370. }
  371. id = mNextDepthStencilStateId++;
  372. assert(id <= 0x3FF); // 10 bits maximum
  373. return nullptr;
  374. }
  375. SPtr<SamplerState> RenderStateManager::createSamplerStateInternal(const SAMPLER_STATE_DESC& desc, GpuDeviceFlags deviceMask) const
  376. {
  377. SPtr<SamplerState> state =
  378. bs_shared_ptr<SamplerState>(new (bs_alloc<SamplerState>()) SamplerState(desc, deviceMask));
  379. state->_setThisPtr(state);
  380. return state;
  381. }
  382. SPtr<DepthStencilState> RenderStateManager::createDepthStencilStateInternal(const DEPTH_STENCIL_STATE_DESC& desc, UINT32 id) const
  383. {
  384. SPtr<DepthStencilState> state = bs_shared_ptr<DepthStencilState>(new (bs_alloc<DepthStencilState>()) DepthStencilState(desc, id));
  385. state->_setThisPtr(state);
  386. return state;
  387. }
  388. SPtr<RasterizerState> RenderStateManager::createRasterizerStateInternal(const RASTERIZER_STATE_DESC& desc, UINT32 id) const
  389. {
  390. SPtr<RasterizerState> state = bs_shared_ptr<RasterizerState>(new (bs_alloc<RasterizerState>()) RasterizerState(desc, id));
  391. state->_setThisPtr(state);
  392. return state;
  393. }
  394. SPtr<BlendState> RenderStateManager::createBlendStateInternal(const BLEND_STATE_DESC& desc, UINT32 id) const
  395. {
  396. SPtr<BlendState> state = bs_shared_ptr<BlendState>(new (bs_alloc<BlendState>()) BlendState(desc, id));
  397. state->_setThisPtr(state);
  398. return state;
  399. }
  400. }
  401. }