MainRenderer.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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/util/Logger.h"
  7. #include "anki/renderer/Deformer.h"
  8. #include "anki/util/File.h"
  9. #include "anki/util/Filesystem.h"
  10. #include "anki/core/Counters.h"
  11. #include "anki/core/App.h"
  12. #include "anki/misc/ConfigSet.h"
  13. namespace anki {
  14. //==============================================================================
  15. MainRenderer::MainRenderer()
  16. {}
  17. //==============================================================================
  18. MainRenderer::~MainRenderer()
  19. {}
  20. //==============================================================================
  21. Error MainRenderer::create(
  22. Threadpool* threadpool,
  23. ResourceManager* resources,
  24. GlDevice* gl,
  25. HeapAllocator<U8>& alloc,
  26. const ConfigSet& config,
  27. const Timestamp* globalTimestamp)
  28. {
  29. Error err = ErrorCode::NONE;
  30. ANKI_LOGI("Initializing main renderer...");
  31. err = Renderer::init(threadpool, resources, gl, alloc, config,
  32. globalTimestamp);
  33. if(err) return err;
  34. err = initGl();
  35. if(err) return err;
  36. err = m_blitFrag.load("shaders/Final.frag.glsl", &_getResourceManager());
  37. if(err) return err;
  38. err = createDrawQuadPipeline(
  39. m_blitFrag->getGlProgram(), m_blitPpline);
  40. if(err) return err;
  41. ANKI_LOGI("Main renderer initialized. Rendering size %dx%d",
  42. getWidth(), getHeight());
  43. return err;
  44. }
  45. //==============================================================================
  46. Error MainRenderer::render(SceneGraph& scene)
  47. {
  48. Error err = ErrorCode::NONE;
  49. ANKI_COUNTER_START_TIMER(MAIN_RENDERER_TIME);
  50. GlDevice& gl = _getGlDevice();
  51. Array<GlCommandBufferHandle, JOB_CHAINS_COUNT> jobs;
  52. GlCommandBufferHandle& lastJobs = jobs[JOB_CHAINS_COUNT - 1];
  53. for(U i = 0; i < JOB_CHAINS_COUNT; i++)
  54. {
  55. err = jobs[i].create(&gl, m_jobsInitHints[i]);
  56. if(err) return err;
  57. }
  58. err = Renderer::render(scene, jobs);
  59. if(err) return err;
  60. /*Bool alreadyDrawnToDefault =
  61. !getDbg().getEnabled()
  62. && getRenderingQuality() == 1.0;*/
  63. Bool alreadyDrawnToDefault = false;
  64. if(!alreadyDrawnToDefault)
  65. {
  66. getDefaultFramebuffer().bind(lastJobs, true);
  67. lastJobs.setViewport(0, 0,
  68. getDefaultFramebufferWidth(), getDefaultFramebufferHeight());
  69. m_blitPpline.bind(lastJobs);
  70. GlTextureHandle* rt;
  71. if(getPps().getEnabled())
  72. {
  73. rt = &getPps()._getRt();
  74. }
  75. else
  76. {
  77. rt = &getIs()._getRt();
  78. }
  79. //rt = &getTiler().getRt();
  80. //rt = &getIs()._getRt();
  81. rt->setFilter(lastJobs, GlTextureHandle::Filter::LINEAR);
  82. rt->bind(lastJobs, 0);
  83. drawQuad(lastJobs);
  84. }
  85. // Set the hints
  86. for(U i = 0; i < JOB_CHAINS_COUNT; i++)
  87. {
  88. m_jobsInitHints[i] = jobs[i].computeInitHints();
  89. }
  90. // Flush the last job chain
  91. ANKI_ASSERT(lastJobs.getReferenceCount() == 1);
  92. lastJobs.flush();
  93. ANKI_COUNTER_STOP_TIMER_INC(MAIN_RENDERER_TIME);
  94. return err;
  95. }
  96. //==============================================================================
  97. Error MainRenderer::initGl()
  98. {
  99. // get max texture units
  100. GlCommandBufferHandle cmdb;
  101. Error err = cmdb.create(&_getGlDevice());
  102. if(!err)
  103. {
  104. cmdb.enableCulling(true);
  105. cmdb.setCullFace(GL_BACK);
  106. cmdb.enablePointSize(true);
  107. cmdb.flush();
  108. }
  109. return err;
  110. }
  111. //==============================================================================
  112. void MainRenderer::takeScreenshotTga(const char* filename)
  113. {
  114. #if 0
  115. // open file and check
  116. File fs;
  117. try
  118. {
  119. fs.open(filename, File::OF_WRITE | File::OF_BINARY);
  120. }
  121. catch(const std::exception& e)
  122. {
  123. throw ANKI_EXCEPTION("Cannot write screenshot file") << e;
  124. }
  125. // write headers
  126. static const U8 tgaHeaderUncompressed[12] = {
  127. 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  128. Array<U8, 6> header;
  129. header[1] = getWidth() / 256;
  130. header[0] = getWidth() % 256;
  131. header[3] = getHeight() / 256;
  132. header[2] = getHeight() % 256;
  133. header[4] = 24;
  134. header[5] = 0;
  135. fs.write((char*)tgaHeaderUncompressed, sizeof(tgaHeaderUncompressed));
  136. fs.write((char*)&header[0], sizeof(header));
  137. // Create the buffers
  138. U outBufferSize = getWidth() * getHeight() * 3;
  139. Vector<U8> outBuffer;
  140. outBuffer.resize(outBufferSize);
  141. U rgbaBufferSize = getWidth() * getHeight() * 4;
  142. Vector<U8> rgbaBuffer;
  143. rgbaBuffer.resize(rgbaBufferSize);
  144. // Read pixels
  145. glReadPixels(0, 0, getWidth(), getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
  146. &rgbaBuffer[0]);
  147. U j = 0;
  148. for(U i = 0; i < outBufferSize; i += 3)
  149. {
  150. outBuffer[i] = rgbaBuffer[j + 2];
  151. outBuffer[i + 1] = rgbaBuffer[j + 1];
  152. outBuffer[i + 2] = rgbaBuffer[j];
  153. j += 4;
  154. }
  155. fs.write((char*)&outBuffer[0], outBufferSize);
  156. // end
  157. ANKI_CHECK_GL_ERROR();
  158. #endif
  159. }
  160. //==============================================================================
  161. void MainRenderer::takeScreenshot(const char* filename)
  162. {
  163. #if 0
  164. String ext = getFileExtension(filename, _getAllocator());
  165. // exec from this extension
  166. if(ext == "tga")
  167. {
  168. takeScreenshotTga(filename);
  169. }
  170. else
  171. {
  172. throw ANKI_EXCEPTION("Unsupported file extension");
  173. }
  174. ANKI_LOGI("Screenshot %s saved", filename);
  175. #endif
  176. }
  177. } // end namespace anki