renderer.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /*
  2. * Copyright 2011-2016 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* _render, bool _hmdEnabled)
  16. {
  17. reset(_render, _hmdEnabled);
  18. }
  19. void reset(Frame* _render, 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] = _render->m_view;
  26. m_view[1] = m_viewTmp[1];
  27. if (_hmdEnabled)
  28. {
  29. HMD& hmd = _render->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 == (_render->m_viewFlags[ii] & BGFX_VIEW_STEREO) )
  42. {
  43. bx::float4x4_mul(&m_view[eye][ii].un.f4x4
  44. , &_render->m_view[ii].un.f4x4
  45. , &viewAdjust.un.f4x4
  46. );
  47. }
  48. else
  49. {
  50. memcpy(&m_view[0][ii].un.f4x4, &_render->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. , &_render->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* _render, 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. , _render->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. , &_render->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 = _render->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 = _render->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 = _render->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. } // namespace bgfx
  247. #endif // BGFX_RENDERER_H_HEADER_GUARD