renderer.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441
  1. /*
  2. * Copyright 2011-2017 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
  4. */
  5. #ifndef BGFX_RENDERER_H_HEADER_GUARD
  6. #define BGFX_RENDERER_H_HEADER_GUARD
  7. #include "bgfx_p.h"
  8. namespace bgfx
  9. {
  10. struct ViewState
  11. {
  12. ViewState()
  13. {
  14. }
  15. ViewState(Frame* _frame, bool _hmdEnabled)
  16. {
  17. reset(_frame, _hmdEnabled);
  18. }
  19. void reset(Frame* _frame, bool _hmdEnabled)
  20. {
  21. m_alphaRef = 0.0f;
  22. m_invViewCached = UINT16_MAX;
  23. m_invProjCached = UINT16_MAX;
  24. m_invViewProjCached = UINT16_MAX;
  25. m_view[0] = _frame->m_view;
  26. m_view[1] = m_viewTmp[1];
  27. if (_hmdEnabled)
  28. {
  29. HMD& hmd = _frame->m_hmd;
  30. m_view[0] = m_viewTmp[0];
  31. Matrix4 viewAdjust;
  32. bx::mtxIdentity(viewAdjust.un.val);
  33. for (uint32_t eye = 0; eye < 2; ++eye)
  34. {
  35. const HMD::Eye& hmdEye = hmd.eye[eye];
  36. viewAdjust.un.val[12] = hmdEye.viewOffset[0];
  37. viewAdjust.un.val[13] = hmdEye.viewOffset[1];
  38. viewAdjust.un.val[14] = hmdEye.viewOffset[2];
  39. for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
  40. {
  41. if (BGFX_VIEW_STEREO == (_frame->m_viewFlags[ii] & BGFX_VIEW_STEREO) )
  42. {
  43. bx::float4x4_mul(&m_view[eye][ii].un.f4x4
  44. , &_frame->m_view[ii].un.f4x4
  45. , &viewAdjust.un.f4x4
  46. );
  47. }
  48. else
  49. {
  50. bx::memCopy(&m_view[0][ii].un.f4x4, &_frame->m_view[ii].un.f4x4, sizeof(Matrix4) );
  51. }
  52. }
  53. }
  54. }
  55. for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
  56. {
  57. for (uint32_t eye = 0; eye < uint32_t(_hmdEnabled)+1; ++eye)
  58. {
  59. bx::float4x4_mul(&m_viewProj[eye][ii].un.f4x4
  60. , &m_view[eye][ii].un.f4x4
  61. , &_frame->m_proj[eye][ii].un.f4x4
  62. );
  63. }
  64. }
  65. }
  66. template<uint16_t mtxRegs, typename RendererContext, typename Program, typename Draw>
  67. void setPredefined(RendererContext* _renderer, uint16_t _view, uint8_t _eye, Program& _program, Frame* _frame, const Draw& _draw)
  68. {
  69. for (uint32_t ii = 0, num = _program.m_numPredefined; ii < num; ++ii)
  70. {
  71. PredefinedUniform& predefined = _program.m_predefined[ii];
  72. uint8_t flags = predefined.m_type&BGFX_UNIFORM_FRAGMENTBIT;
  73. switch (predefined.m_type&(~BGFX_UNIFORM_FRAGMENTBIT) )
  74. {
  75. case PredefinedUniform::ViewRect:
  76. {
  77. float frect[4];
  78. frect[0] = m_rect.m_x;
  79. frect[1] = m_rect.m_y;
  80. frect[2] = m_rect.m_width;
  81. frect[3] = m_rect.m_height;
  82. _renderer->setShaderUniform4f(flags
  83. , predefined.m_loc
  84. , &frect[0]
  85. , 1
  86. );
  87. }
  88. break;
  89. case PredefinedUniform::ViewTexel:
  90. {
  91. float frect[4];
  92. frect[0] = 1.0f/float(m_rect.m_width);
  93. frect[1] = 1.0f/float(m_rect.m_height);
  94. _renderer->setShaderUniform4f(flags
  95. , predefined.m_loc
  96. , &frect[0]
  97. , 1
  98. );
  99. }
  100. break;
  101. case PredefinedUniform::View:
  102. {
  103. _renderer->setShaderUniform4x4f(flags
  104. , predefined.m_loc
  105. , m_view[_eye][_view].un.val
  106. , bx::uint32_min(mtxRegs, predefined.m_count)
  107. );
  108. }
  109. break;
  110. case PredefinedUniform::InvView:
  111. {
  112. uint16_t viewEye = (_view << 1) | _eye;
  113. if (viewEye != m_invViewCached)
  114. {
  115. m_invViewCached = viewEye;
  116. bx::float4x4_inverse(&m_invView.un.f4x4
  117. , &m_view[_eye][_view].un.f4x4
  118. );
  119. }
  120. _renderer->setShaderUniform4x4f(flags
  121. , predefined.m_loc
  122. , m_invView.un.val
  123. , bx::uint32_min(mtxRegs, predefined.m_count)
  124. );
  125. }
  126. break;
  127. case PredefinedUniform::Proj:
  128. {
  129. _renderer->setShaderUniform4x4f(flags
  130. , predefined.m_loc
  131. , _frame->m_proj[_eye][_view].un.val
  132. , bx::uint32_min(mtxRegs, predefined.m_count)
  133. );
  134. }
  135. break;
  136. case PredefinedUniform::InvProj:
  137. {
  138. uint16_t viewEye = (_view << 1) | _eye;
  139. if (viewEye != m_invProjCached)
  140. {
  141. m_invProjCached = viewEye;
  142. bx::float4x4_inverse(&m_invProj.un.f4x4
  143. , &_frame->m_proj[_eye][_view].un.f4x4
  144. );
  145. }
  146. _renderer->setShaderUniform4x4f(flags
  147. , predefined.m_loc
  148. , m_invProj.un.val
  149. , bx::uint32_min(mtxRegs, predefined.m_count)
  150. );
  151. }
  152. break;
  153. case PredefinedUniform::ViewProj:
  154. {
  155. _renderer->setShaderUniform4x4f(flags
  156. , predefined.m_loc
  157. , m_viewProj[_eye][_view].un.val
  158. , bx::uint32_min(mtxRegs, predefined.m_count)
  159. );
  160. }
  161. break;
  162. case PredefinedUniform::InvViewProj:
  163. {
  164. uint16_t viewEye = (_view << 1) | _eye;
  165. if (viewEye != m_invViewProjCached)
  166. {
  167. m_invViewProjCached = viewEye;
  168. bx::float4x4_inverse(&m_invViewProj.un.f4x4
  169. , &m_viewProj[_eye][_view].un.f4x4
  170. );
  171. }
  172. _renderer->setShaderUniform4x4f(flags
  173. , predefined.m_loc
  174. , m_invViewProj.un.val
  175. , bx::uint32_min(mtxRegs, predefined.m_count)
  176. );
  177. }
  178. break;
  179. case PredefinedUniform::Model:
  180. {
  181. const Matrix4& model = _frame->m_matrixCache.m_cache[_draw.m_matrix];
  182. _renderer->setShaderUniform4x4f(flags
  183. , predefined.m_loc
  184. , model.un.val
  185. , bx::uint32_min(_draw.m_num*mtxRegs, predefined.m_count)
  186. );
  187. }
  188. break;
  189. case PredefinedUniform::ModelView:
  190. {
  191. Matrix4 modelView;
  192. const Matrix4& model = _frame->m_matrixCache.m_cache[_draw.m_matrix];
  193. bx::float4x4_mul(&modelView.un.f4x4
  194. , &model.un.f4x4
  195. , &m_view[_eye][_view].un.f4x4
  196. );
  197. _renderer->setShaderUniform4x4f(flags
  198. , predefined.m_loc
  199. , modelView.un.val
  200. , bx::uint32_min(mtxRegs, predefined.m_count)
  201. );
  202. }
  203. break;
  204. case PredefinedUniform::ModelViewProj:
  205. {
  206. Matrix4 modelViewProj;
  207. const Matrix4& model = _frame->m_matrixCache.m_cache[_draw.m_matrix];
  208. bx::float4x4_mul(&modelViewProj.un.f4x4
  209. , &model.un.f4x4
  210. , &m_viewProj[_eye][_view].un.f4x4
  211. );
  212. _renderer->setShaderUniform4x4f(flags
  213. , predefined.m_loc
  214. , modelViewProj.un.val
  215. , bx::uint32_min(mtxRegs, predefined.m_count)
  216. );
  217. }
  218. break;
  219. case PredefinedUniform::AlphaRef:
  220. {
  221. _renderer->setShaderUniform4f(flags
  222. , predefined.m_loc
  223. , &m_alphaRef
  224. , 1
  225. );
  226. }
  227. break;
  228. default:
  229. BX_CHECK(false, "predefined %d not handled", predefined.m_type);
  230. break;
  231. }
  232. }
  233. }
  234. Matrix4 m_viewTmp[2][BGFX_CONFIG_MAX_VIEWS];
  235. Matrix4 m_viewProj[2][BGFX_CONFIG_MAX_VIEWS];
  236. Matrix4* m_view[2];
  237. Rect m_rect;
  238. Matrix4 m_invView;
  239. Matrix4 m_invProj;
  240. Matrix4 m_invViewProj;
  241. float m_alphaRef;
  242. uint16_t m_invViewCached;
  243. uint16_t m_invProjCached;
  244. uint16_t m_invViewProjCached;
  245. };
  246. template<typename Ty>
  247. inline void release(Ty)
  248. {
  249. }
  250. template <typename Ty, uint16_t MaxHandleT>
  251. class StateCacheLru
  252. {
  253. public:
  254. Ty* add(uint64_t _key, const Ty& _value, uint16_t _parent)
  255. {
  256. uint16_t handle = m_alloc.alloc();
  257. if (UINT16_MAX == handle)
  258. {
  259. uint16_t back = m_alloc.getBack();
  260. invalidate(back);
  261. handle = m_alloc.alloc();
  262. }
  263. BX_CHECK(UINT16_MAX != handle, "Failed to find handle.");
  264. Data& data = m_data[handle];
  265. data.m_hash = _key;
  266. data.m_value = _value;
  267. data.m_parent = _parent;
  268. m_hashMap.insert(stl::make_pair(_key, handle) );
  269. return &m_data[handle].m_value;
  270. }
  271. Ty* find(uint64_t _key)
  272. {
  273. HashMap::iterator it = m_hashMap.find(_key);
  274. if (it != m_hashMap.end() )
  275. {
  276. uint16_t handle = it->second;
  277. m_alloc.touch(handle);
  278. return &m_data[handle].m_value;
  279. }
  280. return NULL;
  281. }
  282. void invalidate(uint64_t _key)
  283. {
  284. HashMap::iterator it = m_hashMap.find(_key);
  285. if (it != m_hashMap.end() )
  286. {
  287. uint16_t handle = it->second;
  288. m_alloc.free(handle);
  289. m_hashMap.erase(it);
  290. release(m_data[handle].m_value);
  291. }
  292. }
  293. void invalidate(uint16_t _handle)
  294. {
  295. if (m_alloc.isValid(_handle) )
  296. {
  297. m_alloc.free(_handle);
  298. Data& data = m_data[_handle];
  299. m_hashMap.erase(m_hashMap.find(data.m_hash) );
  300. release(data.m_value);
  301. }
  302. }
  303. void invalidateWithParent(uint16_t _parent)
  304. {
  305. for (uint16_t ii = 0; ii < m_alloc.getNumHandles();)
  306. {
  307. uint16_t handle = m_alloc.getHandleAt(ii);
  308. Data& data = m_data[handle];
  309. if (data.m_parent == _parent)
  310. {
  311. m_alloc.free(handle);
  312. m_hashMap.erase(m_hashMap.find(data.m_hash) );
  313. release(data.m_value);
  314. }
  315. else
  316. {
  317. ++ii;
  318. }
  319. }
  320. }
  321. void invalidate()
  322. {
  323. for (uint16_t ii = 0, num = m_alloc.getNumHandles(); ii < num; ++ii)
  324. {
  325. uint16_t handle = m_alloc.getHandleAt(ii);
  326. Data& data = m_data[handle];
  327. release(data.m_value);
  328. }
  329. m_hashMap.clear();
  330. m_alloc.reset();
  331. }
  332. uint32_t getCount() const
  333. {
  334. return uint32_t(m_hashMap.size() );
  335. }
  336. private:
  337. typedef stl::unordered_map<uint64_t, uint16_t> HashMap;
  338. HashMap m_hashMap;
  339. bx::HandleAllocLruT<MaxHandleT> m_alloc;
  340. struct Data
  341. {
  342. uint64_t m_hash;
  343. Ty m_value;
  344. uint16_t m_parent;
  345. };
  346. Data m_data[MaxHandleT];
  347. };
  348. class StateCache
  349. {
  350. public:
  351. void add(uint64_t _key, uint16_t _value)
  352. {
  353. invalidate(_key);
  354. m_hashMap.insert(stl::make_pair(_key, _value) );
  355. }
  356. uint16_t find(uint64_t _key)
  357. {
  358. HashMap::iterator it = m_hashMap.find(_key);
  359. if (it != m_hashMap.end() )
  360. {
  361. return it->second;
  362. }
  363. return UINT16_MAX;
  364. }
  365. void invalidate(uint64_t _key)
  366. {
  367. HashMap::iterator it = m_hashMap.find(_key);
  368. if (it != m_hashMap.end() )
  369. {
  370. m_hashMap.erase(it);
  371. }
  372. }
  373. void invalidate()
  374. {
  375. m_hashMap.clear();
  376. }
  377. uint32_t getCount() const
  378. {
  379. return uint32_t(m_hashMap.size() );
  380. }
  381. private:
  382. typedef stl::unordered_map<uint64_t, uint16_t> HashMap;
  383. HashMap m_hashMap;
  384. };
  385. } // namespace bgfx
  386. #endif // BGFX_RENDERER_H_HEADER_GUARD