Fixed poly count

This commit is contained in:
Elderme
2016-01-24 22:49:56 +01:00
parent 8d17911ef6
commit 126f883fac
10 changed files with 77 additions and 68 deletions

View File

@@ -195,3 +195,10 @@ void AbstractRenderer::drawJoint(bool drawline, bool drawname,
#endif //DEBUG
AbstractRenderer::AbstractRenderer()
{
resetObjectCount();
resetPolyCount();
}

View File

@@ -28,6 +28,15 @@
class RenderTarget;
enum STKRenderingPass
{
SOLID_NORMAL_AND_DEPTH_PASS,
SOLID_LIT_PASS,
TRANSPARENT_PASS,
GLOW_PASS,
SHADOW_PASS,
PASS_COUNT,
};
struct GlowData {
irr::scene::ISceneNode * node;
@@ -45,6 +54,10 @@ class AbstractRenderer
protected:
irr::core::vector2df m_current_screen_size;
/** Performance stats */
unsigned m_object_count[PASS_COUNT];
unsigned m_poly_count [PASS_COUNT];
#ifdef DEBUG
void drawDebugMeshes() const;
@@ -56,6 +69,7 @@ protected:
void renderSkybox(const irr::scene::ICameraSceneNode *camera) const;
public:
AbstractRenderer();
virtual ~AbstractRenderer(){}
virtual void onLoadWorld() = 0;
@@ -98,6 +112,14 @@ public:
*/
virtual std::unique_ptr<RenderTarget> createRenderTarget(const irr::core::dimension2du &dimension,
const std::string &name) = 0;
void resetObjectCount() { memset(m_object_count, 0, sizeof(m_object_count));}
void resetPolyCount() { memset(m_poly_count, 0, sizeof(m_poly_count)); }
void incObjectCount(STKRenderingPass phase) { m_object_count[phase]++; }
unsigned getObjectCount(STKRenderingPass pass) const { return m_object_count[pass]; }
unsigned getPolyCount(STKRenderingPass pass) const { return m_poly_count [pass]; }
};
#endif //HEADER_ABSTRACT_RENDERER_HPP

View File

@@ -403,7 +403,10 @@ void DrawCalls::parseSceneManager(core::list<scene::ISceneNode*> &List,
}
void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICameraSceneNode *camnode)
void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices,
scene::ICameraSceneNode *camnode,
unsigned &solid_poly_count,
unsigned &shadow_poly_count)
{
windDir = getWindDir();
clearLists();
@@ -509,10 +512,8 @@ void DrawCalls::prepareDrawCalls( ShadowMatrices& shadow_matrices, scene::ICamer
}
}
PROFILER_POP_CPU_MARKER();
//poly_count[SOLID_NORMAL_AND_DEPTH_PASS] += SolidPoly;
//poly_count[SHADOW_PASS] += ShadowPoly;
//TODO: return polycount and update it in renderer class
solid_poly_count = m_solid_cmd_buffer.getPolyCount();
shadow_poly_count = m_shadow_cmd_buffer.getPolyCount();
if (CVS->supportsAsyncInstanceUpload())
glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT);

View File

@@ -30,14 +30,9 @@
class DrawCalls
{
public:
GLsync m_sync = 0; //TODO: make it private. Should it be in shader_based_renderer?
{
private:
GLsync m_sync = 0;
std::vector<irr::scene::ISceneNode *> m_immediate_draw_list;
std::vector<STKBillboard *> m_billboard_list;
@@ -60,31 +55,36 @@ private:
void clearLists();
void handleSTKCommon(scene::ISceneNode *Node,
std::vector<scene::ISceneNode *> *ImmediateDraw,
const scene::ICameraSceneNode *cam,
scene::ICameraSceneNode *shadowcam[4],
const scene::ICameraSceneNode *rsmcam,
bool &culledforcam,
bool culledforshadowcam[4],
bool &culledforrsm,
bool drawRSM);
std::vector<scene::ISceneNode *> *ImmediateDraw,
const scene::ICameraSceneNode *cam,
scene::ICameraSceneNode *shadowcam[4],
const scene::ICameraSceneNode *rsmcam,
bool &culledforcam,
bool culledforshadowcam[4],
bool &culledforrsm,
bool drawRSM);
void parseSceneManager(core::list<scene::ISceneNode*> &List,
std::vector<scene::ISceneNode *> *ImmediateDraw,
const scene::ICameraSceneNode* cam,
scene::ICameraSceneNode *shadow_cam[4],const scene::ICameraSceneNode *rsmcam,
scene::ICameraSceneNode *shadow_cam[4],
const scene::ICameraSceneNode *rsmcam,
bool culledforcam,
bool culledforshadowcam[4],
bool culledforrsm,
bool drawRSM);
public:
void prepareDrawCalls(ShadowMatrices& shadow_matrices, irr::scene::ICameraSceneNode *camnode);
void prepareDrawCalls(ShadowMatrices& shadow_matrices,
irr::scene::ICameraSceneNode *camnode,
unsigned &solid_poly_count,
unsigned &shadow_poly_count);
void setFenceSync() { m_sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); }
void renderImmediateDrawList() const;
void renderBillboardList() const;
void renderParticlesList() const;
void renderBillboardList() const;
void renderParticlesList() const;
void drawIndirectSolidFirstPass() const;
void multidrawSolidFirstPass() const;

View File

@@ -37,7 +37,7 @@ void FixedPipelineRenderer::onUnloadWorld()
}
void FixedPipelineRenderer::render(float dt)
{
{
World *world = World::getWorld(); // Never NULL.
irr_driver->getVideoDriver()->beginScene(/*backBuffer clear*/ true,
@@ -112,4 +112,3 @@ std::unique_ptr<RenderTarget> FixedPipelineRenderer::createRenderTarget(const ir
{
return std::unique_ptr<RenderTarget>(new GL1RenderTarget(dimension, name));
}

View File

@@ -39,7 +39,6 @@ public:
std::unique_ptr<RenderTarget> createRenderTarget(const irr::core::dimension2du &dimension,
const std::string &name);
};
#endif //HEADER_FIXED_PIPELINE_RENDERER_HPP

View File

@@ -129,7 +129,6 @@ IrrDriver::IrrDriver()
m_lightviz = m_shadowviz = m_distortviz = m_rsm = m_rh = m_gi = false;
m_boundingboxesviz = false;
m_last_light_bucket_distance = 0;
memset(object_count, 0, sizeof(object_count));
} // IrrDriver
// ----------------------------------------------------------------------------
@@ -171,12 +170,7 @@ STKRenderingPass IrrDriver::getPhase() const
void IrrDriver::IncreaseObjectCount()
{
object_count[m_phase]++;
}
void IrrDriver::IncreasePolyCount(unsigned Polys)
{
poly_count[m_phase] += Polys;
m_renderer->incObjectCount(m_phase);
}
core::array<video::IRenderTarget> &IrrDriver::getMainSetup()
@@ -1842,26 +1836,21 @@ void IrrDriver::displayFPS()
if (low > kilotris) low = kilotris;
if (high < kilotris) high = kilotris;
core::stringw fpsString;
core::stringw fps_string;
if (UserConfigParams::m_artist_debug_mode)
if ((UserConfigParams::m_artist_debug_mode)&&(CVS->isGLSL()))
{
fpsString = _("FPS: %d/%d/%d - PolyCount: %d Solid, "
fps_string = _("FPS: %d/%d/%d - PolyCount: %d Solid, "
"%d Shadows - LightDist : %d",
min, fps, max, poly_count[SOLID_NORMAL_AND_DEPTH_PASS],
poly_count[SHADOW_PASS], m_last_light_bucket_distance);
poly_count[SOLID_NORMAL_AND_DEPTH_PASS] = 0;
poly_count[SHADOW_PASS] = 0;
object_count[SOLID_NORMAL_AND_DEPTH_PASS] = 0;
object_count[SOLID_NORMAL_AND_DEPTH_PASS] = 0;
object_count[TRANSPARENT_PASS] = 0;
min, fps, max, m_renderer->getPolyCount(SOLID_NORMAL_AND_DEPTH_PASS),
m_renderer->getPolyCount(SHADOW_PASS), m_last_light_bucket_distance);
}
else
fpsString = _("FPS: %d/%d/%d - %d KTris", min, fps, max, (int)roundf(kilotris));
fps_string = _("FPS: %d/%d/%d - %d KTris", min, fps, max, (int)roundf(kilotris));
static video::SColor fpsColor = video::SColor(255, 0, 0, 0);
font->draw( fpsString.c_str(), position, fpsColor, false );
font->draw( fps_string.c_str(), position, fpsColor, false );
} // updateFPS
// ----------------------------------------------------------------------------

View File

@@ -71,17 +71,6 @@ class ShadowImportance;
class ShadowMatrices;
class RenderTarget;
enum STKRenderingPass
{
SOLID_NORMAL_AND_DEPTH_PASS,
SOLID_LIT_PASS,
TRANSPARENT_PASS,
GLOW_PASS,
SHADOW_PASS,
PASS_COUNT,
};
/**
* \brief class that creates the irrLicht device and offers higher-level
@@ -181,10 +170,8 @@ private:
bool m_lightviz;
bool m_distortviz;
bool m_boundingboxesviz;
/** Performance stats */
unsigned m_last_light_bucket_distance;
unsigned object_count[PASS_COUNT];
unsigned poly_count[PASS_COUNT];
u32 m_renderpass;
class STKMeshSceneNode *m_sun_interposer;
core::vector3df m_sun_direction;
@@ -222,7 +209,6 @@ public:
void setPhase(STKRenderingPass);
STKRenderingPass getPhase() const;
void IncreaseObjectCount();
void IncreasePolyCount(unsigned);
core::array<video::IRenderTarget> &getMainSetup();
void updateConfigIfRelevant();
void setAllMaterialFlags(scene::IMesh *mesh) const;

View File

@@ -263,8 +263,13 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
irr_driver->getSceneManager()->setActiveCamera(camnode);
PROFILER_PUSH_CPU_MARKER("- Draw Call Generation", 0xFF, 0xFF, 0xFF);
m_draw_calls.prepareDrawCalls(m_shadow_matrices, camnode);
unsigned solid_poly_count;
unsigned shadow_poly_count;
m_draw_calls.prepareDrawCalls(m_shadow_matrices, camnode, solid_poly_count, shadow_poly_count);
m_poly_count[SOLID_NORMAL_AND_DEPTH_PASS] += solid_poly_count;
m_poly_count[SHADOW_PASS] += shadow_poly_count;
PROFILER_POP_CPU_MARKER();
// Shadows
{
// To avoid wrong culling, use the largest view possible
@@ -296,7 +301,6 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
}
PROFILER_PUSH_CPU_MARKER("- Solid Pass 1", 0xFF, 0x00, 0x00);
glDepthMask(GL_TRUE);
glDepthFunc(GL_LEQUAL);
@@ -481,7 +485,7 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
PROFILER_POP_CPU_MARKER();
}
m_draw_calls.m_sync = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
m_draw_calls.setFenceSync();
// Render particles
{
@@ -623,7 +627,7 @@ ShaderBasedRenderer::ShaderBasedRenderer()
else
m_geometry_passes = new GeometryPasses<GL3DrawPolicy>();
m_post_processing = new PostProcessing(irr_driver->getVideoDriver());
m_post_processing = new PostProcessing(irr_driver->getVideoDriver());
}
ShaderBasedRenderer::~ShaderBasedRenderer()
@@ -740,6 +744,9 @@ void ShaderBasedRenderer::clearGlowingNodes()
void ShaderBasedRenderer::render(float dt)
{
resetObjectCount();
resetPolyCount();
BoundingBoxes.clear(); //TODO: what is it doing here?
compressPowerUpTextures(); //TODO: is it useful every frame?
@@ -904,4 +911,3 @@ void ShaderBasedRenderer::renderToTexture(GL3RenderTarget *render_target,
irr_driver->getSceneManager()->setActiveCamera(NULL);
}

View File

@@ -40,7 +40,6 @@ private:
Skybox *m_skybox;
SphericalHarmonics *m_spherical_harmonics;
//GLsync m_sync; //TODO
DrawCalls m_draw_calls;
AbstractGeometryPasses *m_geometry_passes;
LightingPasses m_lighting_passes;
@@ -127,6 +126,7 @@ public:
void renderToTexture(GL3RenderTarget *render_target,
irr::scene::ICameraSceneNode* camera,
float dt);
};
#endif //HEADER_SHADER_BASED_RENDERER_HPP