renderer.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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. ViewState(Frame* _render, bool _hmdEnabled)
  14. {
  15. reset(_render, _hmdEnabled);
  16. }
  17. void reset(Frame* _render, bool _hmdEnabled)
  18. {
  19. m_alphaRef = 0.0f;
  20. m_invViewCached = UINT16_MAX;
  21. m_invProjCached = UINT16_MAX;
  22. m_invViewProjCached = UINT16_MAX;
  23. m_view[0] = _render->m_view;
  24. m_view[1] = m_viewTmp[1];
  25. if (_hmdEnabled)
  26. {
  27. HMD& hmd = _render->m_hmd;
  28. m_view[0] = m_viewTmp[0];
  29. Matrix4 viewAdjust;
  30. bx::mtxIdentity(viewAdjust.un.val);
  31. for (uint32_t eye = 0; eye < 2; ++eye)
  32. {
  33. const HMD::Eye& hmdEye = hmd.eye[eye];
  34. viewAdjust.un.val[12] = hmdEye.viewOffset[0];
  35. viewAdjust.un.val[13] = hmdEye.viewOffset[1];
  36. viewAdjust.un.val[14] = hmdEye.viewOffset[2];
  37. for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
  38. {
  39. if (BGFX_VIEW_STEREO == (_render->m_viewFlags[ii] & BGFX_VIEW_STEREO) )
  40. {
  41. bx::float4x4_mul(&m_view[eye][ii].un.f4x4
  42. , &_render->m_view[ii].un.f4x4
  43. , &viewAdjust.un.f4x4
  44. );
  45. }
  46. else
  47. {
  48. memcpy(&m_view[0][ii].un.f4x4, &_render->m_view[ii].un.f4x4, sizeof(Matrix4) );
  49. }
  50. }
  51. }
  52. }
  53. for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
  54. {
  55. for (uint32_t eye = 0; eye < uint32_t(_hmdEnabled)+1; ++eye)
  56. {
  57. bx::float4x4_mul(&m_viewProj[eye][ii].un.f4x4
  58. , &m_view[eye][ii].un.f4x4
  59. , &_render->m_proj[eye][ii].un.f4x4
  60. );
  61. }
  62. }
  63. }
  64. template<uint16_t mtxRegs, typename RendererContext, typename Program, typename Draw>
  65. void setPredefined(RendererContext* _renderer, uint16_t view, uint8_t eye, Program& _program, Frame* _render, const Draw& _draw)
  66. {
  67. for (uint32_t ii = 0, num = _program.m_numPredefined; ii < num; ++ii)
  68. {
  69. PredefinedUniform& predefined = _program.m_predefined[ii];
  70. uint8_t flags = predefined.m_type&BGFX_UNIFORM_FRAGMENTBIT;
  71. switch (predefined.m_type&(~BGFX_UNIFORM_FRAGMENTBIT) )
  72. {
  73. case PredefinedUniform::ViewRect:
  74. {
  75. float frect[4];
  76. frect[0] = m_rect.m_x;
  77. frect[1] = m_rect.m_y;
  78. frect[2] = m_rect.m_width;
  79. frect[3] = m_rect.m_height;
  80. _renderer->setShaderUniform4f(flags
  81. , predefined.m_loc
  82. , &frect[0]
  83. , 1
  84. );
  85. }
  86. break;
  87. case PredefinedUniform::ViewTexel:
  88. {
  89. float frect[4];
  90. frect[0] = 1.0f/float(m_rect.m_width);
  91. frect[1] = 1.0f/float(m_rect.m_height);
  92. _renderer->setShaderUniform4f(flags
  93. , predefined.m_loc
  94. , &frect[0]
  95. , 1
  96. );
  97. }
  98. break;
  99. case PredefinedUniform::View:
  100. {
  101. _renderer->setShaderUniform4x4f(flags
  102. , predefined.m_loc
  103. , m_view[eye][view].un.val
  104. , bx::uint32_min(mtxRegs, predefined.m_count)
  105. );
  106. }
  107. break;
  108. case PredefinedUniform::InvView:
  109. {
  110. uint16_t viewEye = (view << 1) | eye;
  111. if (viewEye != m_invViewCached)
  112. {
  113. m_invViewCached = viewEye;
  114. bx::float4x4_inverse(&m_invView.un.f4x4
  115. , &m_view[eye][view].un.f4x4
  116. );
  117. }
  118. _renderer->setShaderUniform4x4f(flags
  119. , predefined.m_loc
  120. , m_invView.un.val
  121. , bx::uint32_min(mtxRegs, predefined.m_count)
  122. );
  123. }
  124. break;
  125. case PredefinedUniform::Proj:
  126. {
  127. _renderer->setShaderUniform4x4f(flags
  128. , predefined.m_loc
  129. , _render->m_proj[eye][view].un.val
  130. , bx::uint32_min(mtxRegs, predefined.m_count)
  131. );
  132. }
  133. break;
  134. case PredefinedUniform::InvProj:
  135. {
  136. uint16_t viewEye = (view << 1) | eye;
  137. if (viewEye != m_invProjCached)
  138. {
  139. m_invProjCached = viewEye;
  140. bx::float4x4_inverse(&m_invProj.un.f4x4
  141. , &_render->m_proj[eye][view].un.f4x4
  142. );
  143. }
  144. _renderer->setShaderUniform4x4f(flags
  145. , predefined.m_loc
  146. , m_invProj.un.val
  147. , bx::uint32_min(mtxRegs, predefined.m_count)
  148. );
  149. }
  150. break;
  151. case PredefinedUniform::ViewProj:
  152. {
  153. _renderer->setShaderUniform4x4f(flags
  154. , predefined.m_loc
  155. , m_viewProj[eye][view].un.val
  156. , bx::uint32_min(mtxRegs, predefined.m_count)
  157. );
  158. }
  159. break;
  160. case PredefinedUniform::InvViewProj:
  161. {
  162. uint16_t viewEye = (view << 1) | eye;
  163. if (viewEye != m_invViewProjCached)
  164. {
  165. m_invViewProjCached = viewEye;
  166. bx::float4x4_inverse(&m_invViewProj.un.f4x4
  167. , &m_viewProj[eye][view].un.f4x4
  168. );
  169. }
  170. _renderer->setShaderUniform4x4f(flags
  171. , predefined.m_loc
  172. , m_invViewProj.un.val
  173. , bx::uint32_min(mtxRegs, predefined.m_count)
  174. );
  175. }
  176. break;
  177. case PredefinedUniform::Model:
  178. {
  179. const Matrix4& model = _render->m_matrixCache.m_cache[_draw.m_matrix];
  180. _renderer->setShaderUniform4x4f(flags
  181. , predefined.m_loc
  182. , model.un.val
  183. , bx::uint32_min(_draw.m_num*mtxRegs, predefined.m_count)
  184. );
  185. }
  186. break;
  187. case PredefinedUniform::ModelView:
  188. {
  189. Matrix4 modelView;
  190. const Matrix4& model = _render->m_matrixCache.m_cache[_draw.m_matrix];
  191. bx::float4x4_mul(&modelView.un.f4x4
  192. , &model.un.f4x4
  193. , &m_view[eye][view].un.f4x4
  194. );
  195. _renderer->setShaderUniform4x4f(flags
  196. , predefined.m_loc
  197. , modelView.un.val
  198. , bx::uint32_min(mtxRegs, predefined.m_count)
  199. );
  200. }
  201. break;
  202. case PredefinedUniform::ModelViewProj:
  203. {
  204. Matrix4 modelViewProj;
  205. const Matrix4& model = _render->m_matrixCache.m_cache[_draw.m_matrix];
  206. bx::float4x4_mul(&modelViewProj.un.f4x4
  207. , &model.un.f4x4
  208. , &m_viewProj[eye][view].un.f4x4
  209. );
  210. _renderer->setShaderUniform4x4f(flags
  211. , predefined.m_loc
  212. , modelViewProj.un.val
  213. , bx::uint32_min(mtxRegs, predefined.m_count)
  214. );
  215. }
  216. break;
  217. case PredefinedUniform::AlphaRef:
  218. {
  219. _renderer->setShaderUniform4f(flags
  220. , predefined.m_loc
  221. , &m_alphaRef
  222. , 1
  223. );
  224. }
  225. break;
  226. default:
  227. BX_CHECK(false, "predefined %d not handled", predefined.m_type);
  228. break;
  229. }
  230. }
  231. }
  232. Matrix4 m_viewTmp[2][BGFX_CONFIG_MAX_VIEWS];
  233. Matrix4 m_viewProj[2][BGFX_CONFIG_MAX_VIEWS];
  234. Matrix4* m_view[2];
  235. Rect m_rect;
  236. Matrix4 m_invView;
  237. Matrix4 m_invProj;
  238. Matrix4 m_invViewProj;
  239. float m_alphaRef;
  240. uint16_t m_invViewCached;
  241. uint16_t m_invProjCached;
  242. uint16_t m_invViewProjCached;
  243. };
  244. } // namespace bgfx
  245. #endif // BGFX_RENDERER_H_HEADER_GUARD