|
@@ -4,6 +4,12 @@
|
|
|
// http://www.anki3d.org/LICENSE
|
|
// http://www.anki3d.org/LICENSE
|
|
|
|
|
|
|
|
#include "anki/renderer/MainRenderer.h"
|
|
#include "anki/renderer/MainRenderer.h"
|
|
|
|
|
+#include "anki/renderer/Renderer.h"
|
|
|
|
|
+#include "anki/renderer/Is.h"
|
|
|
|
|
+#include "anki/renderer/Pps.h"
|
|
|
|
|
+#include "anki/renderer/Dbg.h"
|
|
|
|
|
+#include "anki/scene/SceneGraph.h"
|
|
|
|
|
+#include "anki/scene/Camera.h"
|
|
|
#include "anki/util/Logger.h"
|
|
#include "anki/util/Logger.h"
|
|
|
#include "anki/renderer/Deformer.h"
|
|
#include "anki/renderer/Deformer.h"
|
|
|
#include "anki/util/File.h"
|
|
#include "anki/util/File.h"
|
|
@@ -20,13 +26,15 @@ MainRenderer::MainRenderer()
|
|
|
|
|
|
|
|
//==============================================================================
|
|
//==============================================================================
|
|
|
MainRenderer::~MainRenderer()
|
|
MainRenderer::~MainRenderer()
|
|
|
-{}
|
|
|
|
|
|
|
+{
|
|
|
|
|
+ m_materialShaderSource.destroy(m_alloc);
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
//==============================================================================
|
|
|
Error MainRenderer::create(
|
|
Error MainRenderer::create(
|
|
|
Threadpool* threadpool,
|
|
Threadpool* threadpool,
|
|
|
ResourceManager* resources,
|
|
ResourceManager* resources,
|
|
|
- GrManager* gl,
|
|
|
|
|
|
|
+ GrManager* gr,
|
|
|
AllocAlignedCallback allocCb,
|
|
AllocAlignedCallback allocCb,
|
|
|
void* allocCbUserData,
|
|
void* allocCbUserData,
|
|
|
const ConfigSet& config,
|
|
const ConfigSet& config,
|
|
@@ -34,19 +42,43 @@ Error MainRenderer::create(
|
|
|
{
|
|
{
|
|
|
ANKI_LOGI("Initializing main renderer...");
|
|
ANKI_LOGI("Initializing main renderer...");
|
|
|
|
|
|
|
|
- ANKI_CHECK(Renderer::init(threadpool, resources, gl, allocCb,
|
|
|
|
|
- allocCbUserData, config, globalTimestamp));
|
|
|
|
|
|
|
+ m_alloc = HeapAllocator<U8>(allocCb, allocCbUserData);
|
|
|
|
|
+ m_frameAlloc = StackAllocator<U8>(allocCb, allocCbUserData, 1024 * 1024);
|
|
|
|
|
+
|
|
|
|
|
+ // Init default FB
|
|
|
|
|
+ m_width = config.get("width");
|
|
|
|
|
+ m_height = config.get("height");
|
|
|
|
|
+ FramebufferPtr::Initializer fbInit;
|
|
|
|
|
+ m_defaultFb.create(gr, fbInit);
|
|
|
|
|
+
|
|
|
|
|
+ // Init renderer
|
|
|
|
|
+ ConfigSet config2 = config;
|
|
|
|
|
+ m_renderingQuality = config.get("renderingQuality");
|
|
|
|
|
+ config2.set("width", m_renderingQuality * F32(m_width));
|
|
|
|
|
+ config2.set("height", m_renderingQuality * F32(m_height));
|
|
|
|
|
+
|
|
|
|
|
+ m_r.reset(m_alloc.newInstance<Renderer>());
|
|
|
|
|
+ ANKI_CHECK(m_r->init(threadpool, resources, gr, m_alloc,
|
|
|
|
|
+ m_frameAlloc, config2, globalTimestamp));
|
|
|
|
|
|
|
|
initGl();
|
|
initGl();
|
|
|
|
|
|
|
|
- ANKI_CHECK(
|
|
|
|
|
- m_blitFrag.load("shaders/Final.frag.glsl", &_getResourceManager()));
|
|
|
|
|
|
|
+ // Set the default preprocessor string
|
|
|
|
|
+ m_materialShaderSource.sprintf(
|
|
|
|
|
+ m_alloc,
|
|
|
|
|
+ "#define ANKI_RENDERER_WIDTH %u\n"
|
|
|
|
|
+ "#define ANKI_RENDERER_HEIGHT %u\n",
|
|
|
|
|
+ m_r->getWidth(), m_r->getHeight());
|
|
|
|
|
|
|
|
- ANKI_CHECK(createDrawQuadPipeline(
|
|
|
|
|
|
|
+ // Init other
|
|
|
|
|
+ ANKI_CHECK(m_blitFrag.load(
|
|
|
|
|
+ "shaders/Final.frag.glsl", &m_r->getResourceManager()));
|
|
|
|
|
+
|
|
|
|
|
+ ANKI_CHECK(m_r->createDrawQuadPipeline(
|
|
|
m_blitFrag->getGrShader(), m_blitPpline));
|
|
m_blitFrag->getGrShader(), m_blitPpline));
|
|
|
|
|
|
|
|
ANKI_LOGI("Main renderer initialized. Rendering size %dx%d",
|
|
ANKI_LOGI("Main renderer initialized. Rendering size %dx%d",
|
|
|
- getWidth(), getHeight());
|
|
|
|
|
|
|
+ m_width, m_height);
|
|
|
|
|
|
|
|
return ErrorCode::NONE;
|
|
return ErrorCode::NONE;
|
|
|
}
|
|
}
|
|
@@ -56,63 +88,74 @@ Error MainRenderer::render(SceneGraph& scene)
|
|
|
{
|
|
{
|
|
|
ANKI_COUNTER_START_TIMER(MAIN_RENDERER_TIME);
|
|
ANKI_COUNTER_START_TIMER(MAIN_RENDERER_TIME);
|
|
|
|
|
|
|
|
- GrManager& gl = _getGrManager();
|
|
|
|
|
- Array<CommandBufferPtr, JOB_CHAINS_COUNT> jobs;
|
|
|
|
|
- CommandBufferPtr& lastJobs = jobs[JOB_CHAINS_COUNT - 1];
|
|
|
|
|
|
|
+ GrManager& gl = m_r->getGrManager();
|
|
|
|
|
+ Array<CommandBufferPtr, RENDERER_COMMAND_BUFFERS_COUNT> cmdbs;
|
|
|
|
|
+ CommandBufferPtr& cmdb = cmdbs[RENDERER_COMMAND_BUFFERS_COUNT - 1];
|
|
|
|
|
|
|
|
- for(U i = 0; i < JOB_CHAINS_COUNT; i++)
|
|
|
|
|
|
|
+ for(U i = 0; i < RENDERER_COMMAND_BUFFERS_COUNT; i++)
|
|
|
|
|
+ {
|
|
|
|
|
+ cmdbs[i].create(&gl, m_cbInitHints[i]);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Find where the m_r should draw
|
|
|
|
|
+ Bool rDrawToDefault;
|
|
|
|
|
+ if(m_renderingQuality == 1.0 && !m_r->getDbg().getEnabled())
|
|
|
|
|
+ {
|
|
|
|
|
+ rDrawToDefault = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
{
|
|
{
|
|
|
- jobs[i].create(&gl, m_jobsInitHints[i]);
|
|
|
|
|
|
|
+ rDrawToDefault = false;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- ANKI_CHECK(Renderer::render(scene, jobs));
|
|
|
|
|
|
|
+ if(rDrawToDefault)
|
|
|
|
|
+ {
|
|
|
|
|
+ m_r->setOutputFramebuffer(m_defaultFb, m_width, m_height);
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ m_r->setOutputFramebuffer(FramebufferPtr(), 0, 0);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-#if 1
|
|
|
|
|
- Bool alreadyDrawnToDefault =
|
|
|
|
|
- !getDbg().getEnabled()
|
|
|
|
|
- && getRenderingQuality() == 1.0;
|
|
|
|
|
-#else
|
|
|
|
|
- const Bool alreadyDrawnToDefault = false;
|
|
|
|
|
- ANKI_LOGW("Have a debug code enabled");
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+ // Run renderer
|
|
|
|
|
+ m_r->getIs().setAmbientColor(scene.getAmbientColor());
|
|
|
|
|
+ ANKI_CHECK(m_r->render(scene.getActiveCamera(), cmdbs));
|
|
|
|
|
|
|
|
- if(!alreadyDrawnToDefault)
|
|
|
|
|
|
|
+ if(!rDrawToDefault)
|
|
|
{
|
|
{
|
|
|
- getDefaultFramebuffer().bind(lastJobs);
|
|
|
|
|
- lastJobs.setViewport(0, 0,
|
|
|
|
|
- getDefaultFramebufferWidth(), getDefaultFramebufferHeight());
|
|
|
|
|
|
|
+ m_defaultFb.bind(cmdb);
|
|
|
|
|
+ cmdb.setViewport(0, 0, m_width, m_height);
|
|
|
|
|
|
|
|
- m_blitPpline.bind(lastJobs);
|
|
|
|
|
|
|
+ m_blitPpline.bind(cmdb);
|
|
|
|
|
|
|
|
TexturePtr* rt;
|
|
TexturePtr* rt;
|
|
|
|
|
|
|
|
- if(getPps().getEnabled())
|
|
|
|
|
|
|
+ if(m_r->getPps().getEnabled())
|
|
|
{
|
|
{
|
|
|
- rt = &getPps().getRt();
|
|
|
|
|
|
|
+ rt = &m_r->getPps().getRt();
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
|
- rt = &getIs()._getRt();
|
|
|
|
|
|
|
+ rt = &m_r->getIs()._getRt();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//rt = &getMs().getRt2();
|
|
//rt = &getMs().getRt2();
|
|
|
//rt = &getPps().getHdr()._getRt();
|
|
//rt = &getPps().getHdr()._getRt();
|
|
|
|
|
|
|
|
- rt->bind(lastJobs, 0);
|
|
|
|
|
|
|
+ rt->bind(cmdb, 0);
|
|
|
|
|
|
|
|
- drawQuad(lastJobs);
|
|
|
|
|
|
|
+ m_r->drawQuad(cmdb);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Flush the last command buffer
|
|
|
|
|
+ cmdb.flush();
|
|
|
|
|
+
|
|
|
// Set the hints
|
|
// Set the hints
|
|
|
- for(U i = 0; i < JOB_CHAINS_COUNT; i++)
|
|
|
|
|
|
|
+ for(U i = 0; i < RENDERER_COMMAND_BUFFERS_COUNT; i++)
|
|
|
{
|
|
{
|
|
|
- m_jobsInitHints[i] = jobs[i].computeInitHints();
|
|
|
|
|
|
|
+ m_cbInitHints[i] = cmdbs[i].computeInitHints();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Flush the last job chain
|
|
|
|
|
- //ANKI_ASSERT(lastJobs.get().getReferenceCount() == 1);
|
|
|
|
|
- lastJobs.flush();
|
|
|
|
|
-
|
|
|
|
|
ANKI_COUNTER_STOP_TIMER_INC(MAIN_RENDERER_TIME);
|
|
ANKI_COUNTER_STOP_TIMER_INC(MAIN_RENDERER_TIME);
|
|
|
|
|
|
|
|
return ErrorCode::NONE;
|
|
return ErrorCode::NONE;
|
|
@@ -121,9 +164,8 @@ Error MainRenderer::render(SceneGraph& scene)
|
|
|
//==============================================================================
|
|
//==============================================================================
|
|
|
void MainRenderer::initGl()
|
|
void MainRenderer::initGl()
|
|
|
{
|
|
{
|
|
|
- // get max texture units
|
|
|
|
|
CommandBufferPtr cmdb;
|
|
CommandBufferPtr cmdb;
|
|
|
- cmdb.create(&_getGrManager());
|
|
|
|
|
|
|
+ cmdb.create(&m_r->getGrManager());
|
|
|
|
|
|
|
|
cmdb.enableCulling(true);
|
|
cmdb.enableCulling(true);
|
|
|
cmdb.setCullFace(GL_BACK);
|
|
cmdb.setCullFace(GL_BACK);
|
|
@@ -132,82 +174,15 @@ void MainRenderer::initGl()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
//==============================================================================
|
|
|
-void MainRenderer::takeScreenshotTga(const char* filename)
|
|
|
|
|
|
|
+Dbg& MainRenderer::getDbg()
|
|
|
{
|
|
{
|
|
|
-#if 0
|
|
|
|
|
- // open file and check
|
|
|
|
|
- File fs;
|
|
|
|
|
- try
|
|
|
|
|
- {
|
|
|
|
|
- fs.open(filename, File::OF_WRITE | File::OF_BINARY);
|
|
|
|
|
- }
|
|
|
|
|
- catch(const std::exception& e)
|
|
|
|
|
- {
|
|
|
|
|
- throw ANKI_EXCEPTION("Cannot write screenshot file") << e;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // write headers
|
|
|
|
|
- static const U8 tgaHeaderUncompressed[12] = {
|
|
|
|
|
- 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
|
|
|
|
- Array<U8, 6> header;
|
|
|
|
|
-
|
|
|
|
|
- header[1] = getWidth() / 256;
|
|
|
|
|
- header[0] = getWidth() % 256;
|
|
|
|
|
- header[3] = getHeight() / 256;
|
|
|
|
|
- header[2] = getHeight() % 256;
|
|
|
|
|
- header[4] = 24;
|
|
|
|
|
- header[5] = 0;
|
|
|
|
|
-
|
|
|
|
|
- fs.write((char*)tgaHeaderUncompressed, sizeof(tgaHeaderUncompressed));
|
|
|
|
|
- fs.write((char*)&header[0], sizeof(header));
|
|
|
|
|
-
|
|
|
|
|
- // Create the buffers
|
|
|
|
|
- U outBufferSize = getWidth() * getHeight() * 3;
|
|
|
|
|
- Vector<U8> outBuffer;
|
|
|
|
|
- outBuffer.resize(outBufferSize);
|
|
|
|
|
-
|
|
|
|
|
- U rgbaBufferSize = getWidth() * getHeight() * 4;
|
|
|
|
|
- Vector<U8> rgbaBuffer;
|
|
|
|
|
- rgbaBuffer.resize(rgbaBufferSize);
|
|
|
|
|
-
|
|
|
|
|
- // Read pixels
|
|
|
|
|
- glReadPixels(0, 0, getWidth(), getHeight(), GL_RGBA, GL_UNSIGNED_BYTE,
|
|
|
|
|
- &rgbaBuffer[0]);
|
|
|
|
|
-
|
|
|
|
|
- U j = 0;
|
|
|
|
|
- for(U i = 0; i < outBufferSize; i += 3)
|
|
|
|
|
- {
|
|
|
|
|
- outBuffer[i] = rgbaBuffer[j + 2];
|
|
|
|
|
- outBuffer[i + 1] = rgbaBuffer[j + 1];
|
|
|
|
|
- outBuffer[i + 2] = rgbaBuffer[j];
|
|
|
|
|
-
|
|
|
|
|
- j += 4;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- fs.write((char*)&outBuffer[0], outBufferSize);
|
|
|
|
|
-
|
|
|
|
|
- // end
|
|
|
|
|
- ANKI_CHECK_GL_ERROR();
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+ return m_r->getDbg();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//==============================================================================
|
|
//==============================================================================
|
|
|
-void MainRenderer::takeScreenshot(const char* filename)
|
|
|
|
|
|
|
+F32 MainRenderer::getAspectRatio() const
|
|
|
{
|
|
{
|
|
|
-#if 0
|
|
|
|
|
- String ext = getFileExtension(filename, getAllocator());
|
|
|
|
|
-
|
|
|
|
|
- // exec from this extension
|
|
|
|
|
- if(ext == "tga")
|
|
|
|
|
- {
|
|
|
|
|
- takeScreenshotTga(filename);
|
|
|
|
|
- }
|
|
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- throw ANKI_EXCEPTION("Unsupported file extension");
|
|
|
|
|
- }
|
|
|
|
|
- ANKI_LOGI("Screenshot %s saved", filename);
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+ return m_r->getAspectRatio();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
} // end namespace anki
|
|
} // end namespace anki
|