MainRenderer.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright (C) 2009-2015, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include "anki/renderer/MainRenderer.h"
  6. #include "anki/renderer/Renderer.h"
  7. #include "anki/renderer/Is.h"
  8. #include "anki/renderer/Pps.h"
  9. #include "anki/renderer/Dbg.h"
  10. #include "anki/renderer/Ms.h"
  11. #include "anki/scene/SceneGraph.h"
  12. #include "anki/scene/Camera.h"
  13. #include "anki/util/Logger.h"
  14. #include "anki/renderer/Deformer.h"
  15. #include "anki/util/File.h"
  16. #include "anki/util/Filesystem.h"
  17. #include "anki/core/Counters.h"
  18. #include "anki/core/App.h"
  19. #include "anki/misc/ConfigSet.h"
  20. namespace anki {
  21. //==============================================================================
  22. MainRenderer::MainRenderer()
  23. {}
  24. //==============================================================================
  25. MainRenderer::~MainRenderer()
  26. {
  27. ANKI_LOGI("Destroying main renderer");
  28. m_materialShaderSource.destroy(m_alloc);
  29. }
  30. //==============================================================================
  31. Error MainRenderer::create(
  32. Threadpool* threadpool,
  33. ResourceManager* resources,
  34. GrManager* gr,
  35. AllocAlignedCallback allocCb,
  36. void* allocCbUserData,
  37. const ConfigSet& config,
  38. const Timestamp* globalTimestamp)
  39. {
  40. ANKI_LOGI("Initializing main renderer");
  41. m_alloc = HeapAllocator<U8>(allocCb, allocCbUserData);
  42. m_frameAlloc = StackAllocator<U8>(allocCb, allocCbUserData, 1024 * 1024);
  43. // Init default FB
  44. m_width = config.getNumber("width");
  45. m_height = config.getNumber("height");
  46. FramebufferInitializer fbInit;
  47. m_defaultFb = gr->newInstance<Framebuffer>(fbInit);
  48. // Init renderer
  49. ConfigSet config2 = config;
  50. m_renderingQuality = config.getNumber("renderingQuality");
  51. config2.set("width", m_renderingQuality * F32(m_width));
  52. config2.set("height", m_renderingQuality * F32(m_height));
  53. m_r.reset(m_alloc.newInstance<Renderer>());
  54. ANKI_CHECK(m_r->init(threadpool, resources, gr, m_alloc,
  55. m_frameAlloc, config2, globalTimestamp));
  56. // Set the default preprocessor string
  57. m_materialShaderSource.sprintf(
  58. m_alloc,
  59. "#define ANKI_RENDERER_WIDTH %u\n"
  60. "#define ANKI_RENDERER_HEIGHT %u\n",
  61. m_r->getWidth(), m_r->getHeight());
  62. // Init other
  63. ANKI_CHECK(m_blitFrag.load(
  64. "shaders/Final.frag.glsl", &m_r->getResourceManager()));
  65. ColorStateInfo colorState;
  66. colorState.m_attachmentCount = 1;
  67. colorState.m_attachments[0].m_format =
  68. PixelFormat(ComponentFormat::R8G8B8, TransformFormat::UNORM);
  69. m_r->createDrawQuadPipeline(
  70. m_blitFrag->getGrShader(), colorState, m_blitPpline);
  71. ANKI_LOGI("Main renderer initialized. Rendering size %dx%d",
  72. m_width, m_height);
  73. // Init RC group
  74. ResourceGroupInitializer rcinit;
  75. if(m_r->getPps().getEnabled())
  76. {
  77. rcinit.m_textures[0].m_texture = m_r->getPps().getRt();
  78. }
  79. else
  80. {
  81. rcinit.m_textures[0].m_texture = m_r->getIs().getRt();
  82. }
  83. m_rcGroup = m_r->getGrManager().newInstance<ResourceGroup>(rcinit);
  84. return ErrorCode::NONE;
  85. }
  86. //==============================================================================
  87. Error MainRenderer::render(SceneGraph& scene)
  88. {
  89. ANKI_COUNTER_START_TIMER(MAIN_RENDERER_TIME);
  90. GrManager& gl = m_r->getGrManager();
  91. Array<CommandBufferPtr, RENDERER_COMMAND_BUFFERS_COUNT> cmdbs;
  92. CommandBufferPtr& cmdb = cmdbs[RENDERER_COMMAND_BUFFERS_COUNT - 1];
  93. for(U i = 0; i < RENDERER_COMMAND_BUFFERS_COUNT; i++)
  94. {
  95. cmdbs[i] = gl.newInstance<CommandBuffer>(m_cbInitHints[i]);
  96. }
  97. // Find where the m_r should draw
  98. Bool rDrawToDefault;
  99. if(m_renderingQuality == 1.0 && !m_r->getDbg().getEnabled()
  100. && m_r->getPps().getEnabled())
  101. {
  102. rDrawToDefault = true;
  103. }
  104. else
  105. {
  106. rDrawToDefault = false;
  107. }
  108. if(rDrawToDefault)
  109. {
  110. m_r->setOutputFramebuffer(m_defaultFb, m_width, m_height);
  111. }
  112. else
  113. {
  114. m_r->setOutputFramebuffer(FramebufferPtr(), 0, 0);
  115. }
  116. // Run renderer
  117. m_r->getIs().setAmbientColor(scene.getAmbientColor());
  118. ANKI_CHECK(m_r->render(scene.getActiveCamera(), cmdbs));
  119. if(!rDrawToDefault)
  120. {
  121. cmdb->bindFramebuffer(m_defaultFb);
  122. cmdb->setViewport(0, 0, m_width, m_height);
  123. cmdb->bindPipeline(m_blitPpline);
  124. cmdb->bindResourceGroup(m_rcGroup);
  125. m_r->drawQuad(cmdb);
  126. }
  127. // Flush the last command buffer
  128. cmdb->flush();
  129. // Set the hints
  130. for(U i = 0; i < RENDERER_COMMAND_BUFFERS_COUNT; i++)
  131. {
  132. m_cbInitHints[i] = cmdbs[i]->computeInitHints();
  133. }
  134. ANKI_COUNTER_STOP_TIMER_INC(MAIN_RENDERER_TIME);
  135. return ErrorCode::NONE;
  136. }
  137. //==============================================================================
  138. Dbg& MainRenderer::getDbg()
  139. {
  140. return m_r->getDbg();
  141. }
  142. //==============================================================================
  143. F32 MainRenderer::getAspectRatio() const
  144. {
  145. return m_r->getAspectRatio();
  146. }
  147. //==============================================================================
  148. void MainRenderer::prepareForVisibilityTests(Camera& cam)
  149. {
  150. m_r->prepareForVisibilityTests(cam);
  151. }
  152. } // end namespace anki