BsRenderStateManager.cpp 15 KB

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