Ms.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // Copyright (C) 2014, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include "anki/renderer/Ms.h"
  6. #include "anki/renderer/Ez.h"
  7. #include "anki/renderer/Renderer.h"
  8. #include "anki/util/Logger.h"
  9. #include "anki/scene/Camera.h"
  10. #include "anki/scene/SceneGraph.h"
  11. #include "anki/misc/ConfigSet.h"
  12. namespace anki {
  13. //==============================================================================
  14. Ms::~Ms()
  15. {}
  16. //==============================================================================
  17. Error Ms::createRt(U32 index, U32 samples)
  18. {
  19. Error err = ErrorCode::NONE;
  20. Plane& plane = m_planes[index];
  21. err = m_r->createRenderTarget(m_r->getWidth(), m_r->getHeight(),
  22. GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT,
  23. GL_UNSIGNED_INT, samples, plane.m_depthRt);
  24. if(err) return err;
  25. err = m_r->createRenderTarget(m_r->getWidth(), m_r->getHeight(), GL_RGBA8,
  26. GL_RGBA, GL_UNSIGNED_BYTE, samples, plane.m_rt0);
  27. if(err) return err;
  28. err = m_r->createRenderTarget(m_r->getWidth(), m_r->getHeight(), GL_RGBA8,
  29. GL_RGBA, GL_UNSIGNED_BYTE, samples, plane.m_rt1);
  30. if(err) return err;
  31. GlDevice& gl = getGlDevice();
  32. GlCommandBufferHandle cmdb;
  33. err = cmdb.create(&gl);
  34. if(err) return err;
  35. err = plane.m_fb.create(
  36. cmdb,
  37. {{plane.m_rt0, GL_COLOR_ATTACHMENT0},
  38. {plane.m_rt1, GL_COLOR_ATTACHMENT1},
  39. {plane.m_depthRt, GL_DEPTH_ATTACHMENT}});
  40. if(err) return err;
  41. cmdb.finish();
  42. return err;
  43. }
  44. //==============================================================================
  45. Error Ms::init(const ConfigSet& initializer)
  46. {
  47. Error err = initInternal(initializer);
  48. if(err)
  49. {
  50. ANKI_LOGE("Failed to initialize material stage");
  51. }
  52. return err;
  53. }
  54. //==============================================================================
  55. Error Ms::initInternal(const ConfigSet& initializer)
  56. {
  57. Error err = ErrorCode::NONE;
  58. if(initializer.get("samples") > 1)
  59. {
  60. err = createRt(0, initializer.get("samples"));
  61. if(err) return err;
  62. }
  63. err = createRt(1, 1);
  64. if(err) return err;
  65. // Init small depth
  66. {
  67. m_smallDepthSize = UVec2(
  68. getAlignedRoundDown(16, m_r->getWidth() / 3),
  69. getAlignedRoundDown(16, m_r->getHeight() / 3));
  70. err = m_r->createRenderTarget(
  71. m_smallDepthSize.x(),
  72. m_smallDepthSize.y(),
  73. GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT,
  74. GL_UNSIGNED_INT, 1, m_smallDepthRt);
  75. if(err) return err;
  76. GlDevice& gl = getGlDevice();
  77. GlCommandBufferHandle cmdb;
  78. err = cmdb.create(&gl);
  79. if(err) return err;
  80. m_smallDepthRt.setFilter(cmdb, GlTextureHandle::Filter::LINEAR);
  81. err = m_smallDepthFb.create(
  82. cmdb,
  83. {{m_smallDepthRt, GL_DEPTH_ATTACHMENT}});
  84. if(err) return err;
  85. cmdb.finish();
  86. }
  87. err = m_ez.init(initializer);
  88. return err;
  89. }
  90. //==============================================================================
  91. Error Ms::run(GlCommandBufferHandle& cmdb)
  92. {
  93. Error err = ErrorCode::NONE;
  94. // Chose the multisampled or the singlesampled framebuffer
  95. if(m_r->getSamples() > 1)
  96. {
  97. m_planes[0].m_fb.bind(cmdb, true);
  98. }
  99. else
  100. {
  101. m_planes[1].m_fb.bind(cmdb, true);
  102. }
  103. cmdb.setViewport(0, 0, m_r->getWidth(), m_r->getHeight());
  104. cmdb.clearBuffers(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT
  105. #if ANKI_DEBUG
  106. | GL_COLOR_BUFFER_BIT
  107. #endif
  108. );
  109. cmdb.enableDepthTest(true);
  110. cmdb.setDepthWriteMask(true);
  111. if(m_ez.getEnabled())
  112. {
  113. cmdb.setDepthFunction(GL_LESS);
  114. cmdb.setColorWriteMask(false, false, false, false);
  115. err = m_ez.run(cmdb);
  116. if(err) return err;
  117. cmdb.setDepthFunction(GL_LEQUAL);
  118. cmdb.setColorWriteMask(true, true, true, true);
  119. }
  120. // render all
  121. m_r->getSceneDrawer().prepareDraw(RenderingStage::MATERIAL, Pass::COLOR,
  122. cmdb);
  123. Camera& cam = m_r->getSceneGraph().getActiveCamera();
  124. VisibilityTestResults& vi =
  125. m_r->getSceneGraph().getActiveCamera().getVisibilityTestResults();
  126. auto it = vi.getRenderablesBegin();
  127. auto end = vi.getRenderablesEnd();
  128. for(; it != end; ++it)
  129. {
  130. err = m_r->getSceneDrawer().render(cam, *it);
  131. if(err) return err;
  132. }
  133. m_r->getSceneDrawer().finishDraw();
  134. // If there is multisampling then resolve to singlesampled
  135. if(m_r->getSamples() > 1)
  136. {
  137. #if 0
  138. fbo[1].blitFrom(fbo[0], UVec2(0U), UVec2(r->getWidth(), r->getHeight()),
  139. UVec2(0U), UVec2(r->getWidth(), r->getHeight()),
  140. GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT,
  141. GL_NEAREST);
  142. #endif
  143. ANKI_ASSERT(0 && "TODO");
  144. }
  145. // Blit big depth buffer to small one
  146. m_smallDepthFb.blit(cmdb, m_planes[1].m_fb,
  147. {{0, 0, m_r->getWidth(), m_r->getHeight()}},
  148. {{0, 0, m_smallDepthSize.x(), m_smallDepthSize.y()}},
  149. GL_DEPTH_BUFFER_BIT, false);
  150. cmdb.enableDepthTest(false);
  151. return err;
  152. }
  153. } // end namespace anki