Add some more perfs counter to post process

This commit is contained in:
vlj 2014-05-09 15:07:07 +02:00
parent 59f586c5ee
commit 94c65434df
4 changed files with 81 additions and 73 deletions

View File

@ -84,6 +84,10 @@ enum QueryPerf
Q_TRANSPARENT, Q_TRANSPARENT,
Q_PARTICLES, Q_PARTICLES,
Q_DISPLACEMENT, Q_DISPLACEMENT,
Q_GODRAYS,
Q_BLOOM,
Q_TONEMAP,
Q_MOTIONBLUR,
Q_LAST Q_LAST
}; };

View File

@ -624,10 +624,8 @@ void PostProcessing::applyMLAA()
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/** Render the post-processed scene */ /** Render the post-processed scene */
void PostProcessing::render() void PostProcessing::render(scene::ICameraSceneNode * const camnode)
{ {
if (!irr_driver->isGLSL()) return;
IVideoDriver * const drv = irr_driver->getVideoDriver(); IVideoDriver * const drv = irr_driver->getVideoDriver();
MotionBlurProvider * const mocb = (MotionBlurProvider *) irr_driver-> MotionBlurProvider * const mocb = (MotionBlurProvider *) irr_driver->
@ -635,29 +633,25 @@ void PostProcessing::render()
GaussianBlurProvider * const gacb = (GaussianBlurProvider *) irr_driver-> GaussianBlurProvider * const gacb = (GaussianBlurProvider *) irr_driver->
getCallback(ES_GAUSSIAN3H); getCallback(ES_GAUSSIAN3H);
const u32 cams = Camera::getNumCameras(); GLuint in_rtt = irr_driver->getRenderTargetTexture(RTT_COLOR), in_fbo = irr_driver->getFBO(FBO_COLORS);
for(u32 cam = 0; cam < cams; cam++) GLuint out_rtt = irr_driver->getRenderTargetTexture(RTT_TMP1), out_fbo = irr_driver->getFBO(FBO_TMP1_WITH_DS);
// Each effect uses these as named, and sets them up for the next effect.
// This allows chaining effects where some may be disabled.
// As the original color shouldn't be touched, the first effect can't be disabled.
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
if (UserConfigParams::m_dof)
{ {
scene::ICameraSceneNode * const camnode = renderDoF(out_fbo, in_rtt);
Camera::getCamera(cam)->getCameraSceneNode(); std::swap(in_rtt, out_rtt);
mocb->setCurrentCamera(cam); std::swap(in_fbo, out_fbo);
GLuint in_rtt = irr_driver->getRenderTargetTexture(RTT_COLOR), in_fbo = irr_driver->getFBO(FBO_COLORS); }
GLuint out_rtt = irr_driver->getRenderTargetTexture(RTT_TMP1), out_fbo = irr_driver->getFBO(FBO_TMP1_WITH_DS);
// Each effect uses these as named, and sets them up for the next effect.
// This allows chaining effects where some may be disabled.
// As the original color shouldn't be touched, the first effect can't be disabled.
glDisable(GL_DEPTH_TEST);
glDisable(GL_BLEND);
if (UserConfigParams::m_dof)
{
renderDoF(out_fbo, in_rtt);
std::swap(in_rtt, out_rtt);
std::swap(in_fbo, out_fbo);
}
{
PROFILER_PUSH_CPU_MARKER("- Godrays", 0xFF, 0x00, 0x00); PROFILER_PUSH_CPU_MARKER("- Godrays", 0xFF, 0x00, 0x00);
ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_GODRAYS));
const bool hasgodrays = World::getWorld()->getTrack()->hasGodRays(); const bool hasgodrays = World::getWorld()->getTrack()->hasGodRays();
if (UserConfigParams::m_light_shaft && m_sunpixels > 30 && hasgodrays) if (UserConfigParams::m_light_shaft && m_sunpixels > 30 && hasgodrays)
{ {
@ -665,7 +659,7 @@ void PostProcessing::render()
// Grab the sky // Grab the sky
glBindFramebuffer(GL_FRAMEBUFFER, out_fbo); glBindFramebuffer(GL_FRAMEBUFFER, out_fbo);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
// irr_driver->renderSkybox(); irr_driver->renderSkybox(camnode);
// Set the sun's color // Set the sun's color
const SColor col = World::getWorld()->getTrack()->getSunColor(); const SColor col = World::getWorld()->getTrack()->getSunColor();
@ -700,8 +694,8 @@ void PostProcessing::render()
trans.transformVect(ndc, pos); trans.transformVect(ndc, pos);
const float texh = m_vertices[cam].v1.TCoords.Y - m_vertices[cam].v0.TCoords.Y; const float texh = m_vertices[0].v1.TCoords.Y - m_vertices[0].v0.TCoords.Y;
const float texw = m_vertices[cam].v3.TCoords.X - m_vertices[cam].v0.TCoords.X; const float texw = m_vertices[0].v3.TCoords.X - m_vertices[0].v0.TCoords.X;
const float sunx = ((ndc[0] / ndc[3]) * 0.5f + 0.5f) * texw; const float sunx = ((ndc[0] / ndc[3]) * 0.5f + 0.5f) * texw;
const float suny = ((ndc[1] / ndc[3]) * 0.5f + 0.5f) * texh; const float suny = ((ndc[1] / ndc[3]) * 0.5f + 0.5f) * texh;
@ -727,10 +721,13 @@ void PostProcessing::render()
glDisable(GL_BLEND); glDisable(GL_BLEND);
} }
PROFILER_POP_CPU_MARKER(); PROFILER_POP_CPU_MARKER();
}
// Simulate camera defects from there // Simulate camera defects from there
{
PROFILER_PUSH_CPU_MARKER("- Bloom", 0xFF, 0x00, 0x00); PROFILER_PUSH_CPU_MARKER("- Bloom", 0xFF, 0x00, 0x00);
ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_BLOOM));
if (UserConfigParams::m_bloom) if (UserConfigParams::m_bloom)
{ {
glClear(GL_STENCIL_BUFFER_BIT); glClear(GL_STENCIL_BUFFER_BIT);
@ -784,53 +781,61 @@ void PostProcessing::render()
renderPassThrough(irr_driver->getRenderTargetTexture(RTT_BLOOM_512)); renderPassThrough(irr_driver->getRenderTargetTexture(RTT_BLOOM_512));
glDisable(GL_BLEND); glDisable(GL_BLEND);
} // end if bloom } // end if bloom
PROFILER_POP_CPU_MARKER();
computeLogLuminance(in_rtt); }
//computeLogLuminance(in_rtt);
{
PROFILER_PUSH_CPU_MARKER("- Tonemap", 0xFF, 0x00, 0x00);
ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_TONEMAP));
toneMap(out_fbo, in_rtt); toneMap(out_fbo, in_rtt);
std::swap(in_rtt, out_rtt); std::swap(in_rtt, out_rtt);
std::swap(in_fbo, out_fbo); std::swap(in_fbo, out_fbo);
PROFILER_POP_CPU_MARKER();
}
{
PROFILER_PUSH_CPU_MARKER("- Motion blur", 0xFF, 0x00, 0x00);
ScopedGPUTimer Timer(irr_driver->getGPUTimer(Q_MOTIONBLUR));
if (UserConfigParams::m_motionblur && m_any_boost) // motion blur if (UserConfigParams::m_motionblur && m_any_boost) // motion blur
{ {
PROFILER_PUSH_CPU_MARKER("- Motion blur", 0xFF, 0x00, 0x00); renderMotionBlur(0, in_rtt, out_fbo);
renderMotionBlur(cam, in_rtt, out_fbo);
std::swap(in_fbo, out_fbo); std::swap(in_fbo, out_fbo);
std::swap(in_rtt, out_rtt); std::swap(in_rtt, out_rtt);
PROFILER_POP_CPU_MARKER();
} }
PROFILER_POP_CPU_MARKER();
}
if (irr_driver->getNormals()) if (irr_driver->getNormals())
{ {
glEnable(GL_FRAMEBUFFER_SRGB); glEnable(GL_FRAMEBUFFER_SRGB);
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
renderPassThrough(irr_driver->getRenderTargetTexture(RTT_NORMAL_AND_DEPTH)); renderPassThrough(irr_driver->getRenderTargetTexture(RTT_NORMAL_AND_DEPTH));
glDisable(GL_FRAMEBUFFER_SRGB); glDisable(GL_FRAMEBUFFER_SRGB);
} }
else if (irr_driver->getSSAOViz()) else if (irr_driver->getSSAOViz())
{ {
glEnable(GL_FRAMEBUFFER_SRGB); glEnable(GL_FRAMEBUFFER_SRGB);
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
renderPassThrough(irr_driver->getRenderTargetTexture(RTT_SSAO)); renderPassThrough(irr_driver->getRenderTargetTexture(RTT_SSAO));
glDisable(GL_FRAMEBUFFER_SRGB); glDisable(GL_FRAMEBUFFER_SRGB);
} }
else if (UserConfigParams::m_mlaa) // MLAA. Must be the last pp filter. else if (UserConfigParams::m_mlaa) // MLAA. Must be the last pp filter.
{ {
PROFILER_PUSH_CPU_MARKER("- MLAA", 0xFF, 0x00, 0x00); PROFILER_PUSH_CPU_MARKER("- MLAA", 0xFF, 0x00, 0x00);
glEnable(GL_FRAMEBUFFER_SRGB); glEnable(GL_FRAMEBUFFER_SRGB);
glBindFramebuffer(GL_FRAMEBUFFER, irr_driver->getFBO(FBO_MLAA_COLORS)); glBindFramebuffer(GL_FRAMEBUFFER, irr_driver->getFBO(FBO_MLAA_COLORS));
renderPassThrough(in_rtt); renderPassThrough(in_rtt);
glDisable(GL_FRAMEBUFFER_SRGB); glDisable(GL_FRAMEBUFFER_SRGB);
applyMLAA(); applyMLAA();
blitFBO(irr_driver->getFBO(FBO_MLAA_COLORS), 0, UserConfigParams::m_width, UserConfigParams::m_height); blitFBO(irr_driver->getFBO(FBO_MLAA_COLORS), 0, UserConfigParams::m_width, UserConfigParams::m_height);
PROFILER_POP_CPU_MARKER(); PROFILER_POP_CPU_MARKER();
} }
else else
{ {
glEnable(GL_FRAMEBUFFER_SRGB); glEnable(GL_FRAMEBUFFER_SRGB);
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
renderPassThrough(in_rtt); renderPassThrough(in_rtt);
glDisable(GL_FRAMEBUFFER_SRGB); glDisable(GL_FRAMEBUFFER_SRGB);
}
} }
} // render } // render

View File

@ -21,6 +21,7 @@
#include "IShaderConstantSetCallBack.h" #include "IShaderConstantSetCallBack.h"
#include "S3DVertex.h" #include "S3DVertex.h"
#include "SMaterial.h" #include "SMaterial.h"
#include "graphics/camera.hpp"
#include <vector> #include <vector>
@ -92,7 +93,7 @@ public:
void renderGlow(unsigned tex); void renderGlow(unsigned tex);
/** Render the post-processed scene */ /** Render the post-processed scene */
void render(); void render(scene::ICameraSceneNode * const camnode);
/** Use motion blur for a short time */ /** Use motion blur for a short time */
void giveBoost(unsigned int cam_index); void giveBoost(unsigned int cam_index);

View File

@ -142,6 +142,12 @@ void IrrDriver::renderGLSL(float dt)
renderScene(camnode, glows, dt, track->hasShadows()); renderScene(camnode, glows, dt, track->hasShadows());
// Render the post-processed scene
if (UserConfigParams::m_dynamic_lights)
m_post_processing->render(camnode);
else
glDisable(GL_FRAMEBUFFER_SRGB);
PROFILER_POP_CPU_MARKER(); PROFILER_POP_CPU_MARKER();
// Note that drawAll must be called before rendering // Note that drawAll must be called before rendering
@ -152,14 +158,6 @@ void IrrDriver::renderGLSL(float dt)
World::getWorld()->getPhysics()->draw(); World::getWorld()->getPhysics()->draw();
} // for i<world->getNumKarts() } // for i<world->getNumKarts()
PROFILER_PUSH_CPU_MARKER("Postprocessing", 0xFF, 0xFF, 0x00);
// Render the post-processed scene
if (UserConfigParams::m_dynamic_lights)
m_post_processing->render();
else
glDisable(GL_FRAMEBUFFER_SRGB);
PROFILER_POP_CPU_MARKER();
glBindVertexArray(0); glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);