|
@@ -18,6 +18,8 @@
|
|
|
#include "BsDrawHelper3D.h"
|
|
#include "BsDrawHelper3D.h"
|
|
|
#include "BsGUIManager.h"
|
|
#include "BsGUIManager.h"
|
|
|
|
|
|
|
|
|
|
+#include "CmProfiler.h"
|
|
|
|
|
+
|
|
|
using namespace CamelotFramework;
|
|
using namespace CamelotFramework;
|
|
|
|
|
|
|
|
namespace BansheeEngine
|
|
namespace BansheeEngine
|
|
@@ -40,6 +42,8 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
void ForwardRenderer::renderAll()
|
|
void ForwardRenderer::renderAll()
|
|
|
{
|
|
{
|
|
|
|
|
+ gProfiler().beginSample("renderA");
|
|
|
|
|
+
|
|
|
gSceneManager().updateRenderableBounds();
|
|
gSceneManager().updateRenderableBounds();
|
|
|
|
|
|
|
|
CoreAccessor& coreAccessor = gMainCA();
|
|
CoreAccessor& coreAccessor = gMainCA();
|
|
@@ -80,6 +84,9 @@ namespace BansheeEngine
|
|
|
std::sort(begin(cameras), end(cameras), cameraComparer);
|
|
std::sort(begin(cameras), end(cameras), cameraComparer);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ gProfiler().endSample("renderA");
|
|
|
|
|
+ gProfiler().beginSample("renderB");
|
|
|
|
|
+
|
|
|
// Render everything, target by target
|
|
// Render everything, target by target
|
|
|
for(auto& camerasPerTarget : camerasPerRenderTarget)
|
|
for(auto& camerasPerTarget : camerasPerRenderTarget)
|
|
|
{
|
|
{
|
|
@@ -112,10 +119,14 @@ namespace BansheeEngine
|
|
|
coreAccessor.endFrame();
|
|
coreAccessor.endFrame();
|
|
|
coreAccessor.swapBuffers(target);
|
|
coreAccessor.swapBuffers(target);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ gProfiler().endSample("renderB");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void ForwardRenderer::render(const HCamera& camera)
|
|
void ForwardRenderer::render(const HCamera& camera)
|
|
|
{
|
|
{
|
|
|
|
|
+ gProfiler().beginSample("renderC");
|
|
|
|
|
+
|
|
|
Vector<HRenderable>::type allRenderables;
|
|
Vector<HRenderable>::type allRenderables;
|
|
|
|
|
|
|
|
if(!camera->getIgnoreSceneRenderables())
|
|
if(!camera->getIgnoreSceneRenderables())
|
|
@@ -131,6 +142,9 @@ namespace BansheeEngine
|
|
|
|
|
|
|
|
mRenderQueue->clear();
|
|
mRenderQueue->clear();
|
|
|
|
|
|
|
|
|
|
+ gProfiler().endSample("renderC");
|
|
|
|
|
+ gProfiler().beginSample("renderD");
|
|
|
|
|
+
|
|
|
// Get scene render operations
|
|
// Get scene render operations
|
|
|
for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
|
|
for(auto iter = allRenderables.begin(); iter != allRenderables.end(); ++iter)
|
|
|
{
|
|
{
|
|
@@ -150,6 +164,9 @@ namespace BansheeEngine
|
|
|
(*iter)->render(*mRenderQueue);
|
|
(*iter)->render(*mRenderQueue);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ gProfiler().endSample("renderD");
|
|
|
|
|
+ gProfiler().beginSample("renderE");
|
|
|
|
|
+
|
|
|
// Get GUI render operations
|
|
// Get GUI render operations
|
|
|
GUIManager::instance().render(camera->getViewport(), *mRenderQueue);
|
|
GUIManager::instance().render(camera->getViewport(), *mRenderQueue);
|
|
|
|
|
|
|
@@ -160,6 +177,9 @@ namespace BansheeEngine
|
|
|
DrawHelper3D::instance().render(camera, *mRenderQueue);
|
|
DrawHelper3D::instance().render(camera, *mRenderQueue);
|
|
|
DrawHelper2D::instance().render(camera, *mRenderQueue);
|
|
DrawHelper2D::instance().render(camera, *mRenderQueue);
|
|
|
|
|
|
|
|
|
|
+ gProfiler().endSample("renderE");
|
|
|
|
|
+ gProfiler().beginSample("renderF");
|
|
|
|
|
+
|
|
|
// Get any operations from hooked up callbacks
|
|
// Get any operations from hooked up callbacks
|
|
|
const Viewport* viewportRawPtr = camera->getViewport().get();
|
|
const Viewport* viewportRawPtr = camera->getViewport().get();
|
|
|
auto callbacksForViewport = mRenderCallbacks[viewportRawPtr];
|
|
auto callbacksForViewport = mRenderCallbacks[viewportRawPtr];
|
|
@@ -171,18 +191,30 @@ namespace BansheeEngine
|
|
|
mRenderQueue->sort();
|
|
mRenderQueue->sort();
|
|
|
const Vector<SortedRenderOp>::type& sortedROps = mRenderQueue->getSortedRenderOps();
|
|
const Vector<SortedRenderOp>::type& sortedROps = mRenderQueue->getSortedRenderOps();
|
|
|
|
|
|
|
|
|
|
+ gProfiler().endSample("renderF");
|
|
|
|
|
+
|
|
|
for(auto iter = sortedROps.begin(); iter != sortedROps.end(); ++iter)
|
|
for(auto iter = sortedROps.begin(); iter != sortedROps.end(); ++iter)
|
|
|
{
|
|
{
|
|
|
|
|
+ gProfiler().beginSample("renderG");
|
|
|
|
|
+
|
|
|
const RenderOperation& renderOp = *iter->baseOperation;
|
|
const RenderOperation& renderOp = *iter->baseOperation;
|
|
|
HMaterial material = renderOp.material;
|
|
HMaterial material = renderOp.material;
|
|
|
|
|
|
|
|
PassPtr pass = material->getPass(iter->passIdx);
|
|
PassPtr pass = material->getPass(iter->passIdx);
|
|
|
pass->activate(coreAccessor);
|
|
pass->activate(coreAccessor);
|
|
|
|
|
|
|
|
|
|
+ gProfiler().endSample("renderG");
|
|
|
|
|
+ gProfiler().beginSample("renderH");
|
|
|
|
|
+
|
|
|
PassParametersPtr paramsPtr = material->getPassParameters(iter->passIdx);
|
|
PassParametersPtr paramsPtr = material->getPassParameters(iter->passIdx);
|
|
|
pass->bindParameters(coreAccessor, paramsPtr);
|
|
pass->bindParameters(coreAccessor, paramsPtr);
|
|
|
|
|
|
|
|
|
|
+ gProfiler().endSample("renderH");
|
|
|
|
|
+ gProfiler().beginSample("renderI");
|
|
|
|
|
+
|
|
|
coreAccessor.render(renderOp.mesh.getInternalPtr(), renderOp.submeshIdx);
|
|
coreAccessor.render(renderOp.mesh.getInternalPtr(), renderOp.submeshIdx);
|
|
|
|
|
+
|
|
|
|
|
+ gProfiler().endSample("renderI");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|