From cfad1d8c3e789c62b6c1f3519196587242283f5a Mon Sep 17 00:00:00 2001 From: David Rose Date: Thu, 4 Dec 2003 18:13:50 +0000 Subject: [PATCH] work on pstats reporting --- panda/src/collide/collisionTraverser.cxx | 15 ++++-- panda/src/collide/collisionTraverser.h | 6 ++- panda/src/display/graphicsEngine.cxx | 17 ++++++- panda/src/display/graphicsEngine.h | 4 ++ panda/src/display/graphicsStateGuardian.cxx | 49 +------------------ panda/src/display/graphicsStateGuardian.h | 14 +----- panda/src/dxgsg7/dxGraphicsStateGuardian7.cxx | 3 ++ panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx | 3 ++ panda/src/glgsg/glGraphicsStateGuardian.cxx | 2 + panda/src/pgraph/Sources.pp | 2 +- panda/src/pgraph/cullTraverser.cxx | 6 +++ panda/src/pgraph/cullTraverser.h | 6 +++ panda/src/pstatclient/pStatProperties.cxx | 20 +------- 13 files changed, 62 insertions(+), 85 deletions(-) diff --git a/panda/src/collide/collisionTraverser.cxx b/panda/src/collide/collisionTraverser.cxx index 53419a2a2d..4d4c3f763b 100644 --- a/panda/src/collide/collisionTraverser.cxx +++ b/panda/src/collide/collisionTraverser.cxx @@ -33,6 +33,7 @@ #ifndef CPPPARSER PStatCollector CollisionTraverser::_collisions_pcollector("App:Collisions"); +PStatCollector CollisionTraverser::_reset_prev_pcollector("App:Collisions:Reset"); #endif //////////////////////////////////////////////////////////////////// @@ -41,7 +42,10 @@ PStatCollector CollisionTraverser::_collisions_pcollector("App:Collisions"); // Description: //////////////////////////////////////////////////////////////////// CollisionTraverser:: -CollisionTraverser() { +CollisionTraverser(const string &name) : + Namable(name), + _this_pcollector(_collisions_pcollector, name) +{ _respect_prev_transform = respect_prev_transform; #ifdef DO_COLLISION_RECORDING _recorder = (CollisionRecorder *)NULL; @@ -265,7 +269,7 @@ remove_collider(CollisionNode *node) { //////////////////////////////////////////////////////////////////// void CollisionTraverser:: traverse(const NodePath &root) { - PStatTimer timer(_collisions_pcollector); + PStatTimer timer(_this_pcollector); #ifdef DO_COLLISION_RECORDING if (has_recorder()) { @@ -311,6 +315,7 @@ traverse(const NodePath &root) { //////////////////////////////////////////////////////////////////// void CollisionTraverser:: reset_prev_transform(const NodePath &root) { + PStatTimer timer(_reset_prev_pcollector); r_reset_prev_transform(root.node()); } @@ -808,8 +813,10 @@ remove_handler(CollisionTraverser::Handlers::iterator hi) { void CollisionTraverser:: r_reset_prev_transform(PandaNode *node) { node->reset_prev_transform(); - int num_children = node->get_num_children(); + + PandaNode::Children children = node->get_children(); + int num_children = children.get_num_children(); for (int i = 0; i < num_children; i++) { - r_reset_prev_transform(node->get_child(i)); + r_reset_prev_transform(children.get_child(i)); } } diff --git a/panda/src/collide/collisionTraverser.h b/panda/src/collide/collisionTraverser.h index 8df8d04e64..6ebe85e495 100644 --- a/panda/src/collide/collisionTraverser.h +++ b/panda/src/collide/collisionTraverser.h @@ -49,9 +49,9 @@ class CollisionEntry; // indicated root, calling the appropriate // CollisionHandler for each detected collision. //////////////////////////////////////////////////////////////////// -class EXPCL_PANDA CollisionTraverser { +class EXPCL_PANDA CollisionTraverser : public Namable { PUBLISHED: - CollisionTraverser(); + CollisionTraverser(const string &name = "ctrav"); ~CollisionTraverser(); INLINE void set_respect_prev_transform(bool flag); @@ -136,6 +136,8 @@ private: // Statistics static PStatCollector _collisions_pcollector; + static PStatCollector _reset_prev_pcollector; + PStatCollector _this_pcollector; }; INLINE ostream &operator << (ostream &out, const CollisionTraverser &trav) { diff --git a/panda/src/display/graphicsEngine.cxx b/panda/src/display/graphicsEngine.cxx index 451b569fb2..7140d0eb9b 100644 --- a/panda/src/display/graphicsEngine.cxx +++ b/panda/src/display/graphicsEngine.cxx @@ -41,6 +41,10 @@ #ifndef CPPPARSER PStatCollector GraphicsEngine::_cull_pcollector("Cull"); PStatCollector GraphicsEngine::_draw_pcollector("Draw"); +PStatCollector GraphicsEngine::_transform_states_pcollector("TransformStates"); +PStatCollector GraphicsEngine::_transform_states_unused_pcollector("TransformStates:Unused"); +PStatCollector GraphicsEngine::_render_states_pcollector("RenderStates"); +PStatCollector GraphicsEngine::_render_states_unused_pcollector("RenderStates:Unused"); #endif // CPPPARSER //////////////////////////////////////////////////////////////////// @@ -349,11 +353,22 @@ render_frame() { RenderThread *thread = (*ti).second; thread->_cv_mutex.lock(); } - + // Now cycle the pipeline and officially begin the next frame. _pipeline->cycle(); ClockObject::get_global_clock()->tick(); PStatClient::main_tick(); + + // Reset our pcollectors that track data across the frame. + CullTraverser::_nodes_pcollector.clear_level(); + CullTraverser::_geom_nodes_pcollector.clear_level(); + + _transform_states_pcollector.set_level(TransformState::get_num_states()); + _render_states_pcollector.set_level(RenderState::get_num_states()); + if (pstats_unused_states) { + _transform_states_unused_pcollector.set_level(TransformState::get_num_unused_states()); + _render_states_unused_pcollector.set_level(RenderState::get_num_unused_states()); + } // Now signal all of our threads to begin their next frame. _app.do_frame(this); diff --git a/panda/src/display/graphicsEngine.h b/panda/src/display/graphicsEngine.h index 1b1149ae55..e88716cded 100644 --- a/panda/src/display/graphicsEngine.h +++ b/panda/src/display/graphicsEngine.h @@ -182,6 +182,10 @@ private: static PStatCollector _cull_pcollector; static PStatCollector _draw_pcollector; + static PStatCollector _transform_states_pcollector; + static PStatCollector _transform_states_unused_pcollector; + static PStatCollector _render_states_pcollector; + static PStatCollector _render_states_unused_pcollector; friend class WindowRenderer; }; diff --git a/panda/src/display/graphicsStateGuardian.cxx b/panda/src/display/graphicsStateGuardian.cxx index 22383c87fb..a4001436cb 100644 --- a/panda/src/display/graphicsStateGuardian.cxx +++ b/panda/src/display/graphicsStateGuardian.cxx @@ -51,25 +51,14 @@ PStatCollector GraphicsStateGuardian::_total_texmem_pcollector("Texture memory") PStatCollector GraphicsStateGuardian::_used_texmem_pcollector("Texture memory:In use"); PStatCollector GraphicsStateGuardian::_texmgrmem_total_pcollector("Texture manager"); PStatCollector GraphicsStateGuardian::_texmgrmem_resident_pcollector("Texture manager:Resident"); -PStatCollector GraphicsStateGuardian::_vertices_pcollector("Vertices"); PStatCollector GraphicsStateGuardian::_vertices_tristrip_pcollector("Vertices:Triangle strips"); PStatCollector GraphicsStateGuardian::_vertices_trifan_pcollector("Vertices:Triangle fans"); PStatCollector GraphicsStateGuardian::_vertices_tri_pcollector("Vertices:Triangles"); PStatCollector GraphicsStateGuardian::_vertices_other_pcollector("Vertices:Other"); -PStatCollector GraphicsStateGuardian::_state_changes_pcollector("State changes"); PStatCollector GraphicsStateGuardian::_transform_state_pcollector("State changes:Transforms"); PStatCollector GraphicsStateGuardian::_texture_state_pcollector("State changes:Textures"); -PStatCollector GraphicsStateGuardian::_nodes_pcollector("Nodes"); -PStatCollector GraphicsStateGuardian::_geom_nodes_pcollector("Nodes:GeomNodes"); -PStatCollector GraphicsStateGuardian::_frustum_cull_volumes_pcollector("Cull volumes"); -PStatCollector GraphicsStateGuardian::_frustum_cull_transforms_pcollector("Cull volumes:Transforms"); - -PStatCollector GraphicsStateGuardian::_set_state_pcollector("Draw:Set state"); +PStatCollector GraphicsStateGuardian::_other_state_pcollector("State changes:Other"); PStatCollector GraphicsStateGuardian::_draw_primitive_pcollector("Draw:Primitive"); -PStatCollector GraphicsStateGuardian::_transform_states_pcollector("TransformStates"); -PStatCollector GraphicsStateGuardian::_transform_states_unused_pcollector("TransformStates:Unused"); -PStatCollector GraphicsStateGuardian::_render_states_pcollector("RenderStates"); -PStatCollector GraphicsStateGuardian::_render_states_unused_pcollector("RenderStates:Unused"); #endif @@ -1407,23 +1396,9 @@ init_frame_pstats() { _vertices_tri_pcollector.clear_level(); _vertices_other_pcollector.clear_level(); - _state_changes_pcollector.clear_level(); _transform_state_pcollector.clear_level(); _texture_state_pcollector.clear_level(); - - _nodes_pcollector.clear_level(); - _geom_nodes_pcollector.clear_level(); - - // Not to mention the view-frustum-cull counters. - _frustum_cull_volumes_pcollector.clear_level(); - _frustum_cull_transforms_pcollector.clear_level(); - - _transform_states_pcollector.set_level(TransformState::get_num_states()); - _render_states_pcollector.set_level(RenderState::get_num_states()); - if (pstats_unused_states) { - _transform_states_unused_pcollector.set_level(TransformState::get_num_unused_states()); - _render_states_unused_pcollector.set_level(RenderState::get_num_unused_states()); - } + _other_state_pcollector.clear_level(); } } @@ -1479,26 +1454,6 @@ add_to_geom_node_record(GeomNodeContext *gnc) { } } } - -//////////////////////////////////////////////////////////////////// -// Function: GraphicsStateGuardian::record_state_change -// Access: Protected -// Description: Indicates a state change request for a property of -// the given type. -//////////////////////////////////////////////////////////////////// -void GraphicsStateGuardian:: -record_state_change(TypeHandle type) { - _state_changes_pcollector.add_level(1); - - // We can't use the get_class_type() methods since we don't have - // those header files available yet. - string name = type.get_name(); - if (name == "TransformTransition") { - _transform_state_pcollector.add_level(1); - } else if (name == "TextureTransition") { - _texture_state_pcollector.add_level(1); - } -} #endif // DO_PSTATS //////////////////////////////////////////////////////////////////// diff --git a/panda/src/display/graphicsStateGuardian.h b/panda/src/display/graphicsStateGuardian.h index 49fcbc043b..bf52c7caa9 100644 --- a/panda/src/display/graphicsStateGuardian.h +++ b/panda/src/display/graphicsStateGuardian.h @@ -207,7 +207,7 @@ protected: void add_to_texture_record(TextureContext *tc); void add_to_geom_record(GeomContext *gc); void add_to_geom_node_record(GeomNodeContext *gnc); - void record_state_change(TypeHandle type); + pset _current_textures; pset _current_geoms; pset _current_geom_nodes; @@ -282,24 +282,14 @@ public: static PStatCollector _used_texmem_pcollector; static PStatCollector _texmgrmem_total_pcollector; static PStatCollector _texmgrmem_resident_pcollector; - static PStatCollector _vertices_pcollector; static PStatCollector _vertices_tristrip_pcollector; static PStatCollector _vertices_trifan_pcollector; static PStatCollector _vertices_tri_pcollector; static PStatCollector _vertices_other_pcollector; - static PStatCollector _state_changes_pcollector; static PStatCollector _transform_state_pcollector; static PStatCollector _texture_state_pcollector; - static PStatCollector _nodes_pcollector; - static PStatCollector _geom_nodes_pcollector; - static PStatCollector _frustum_cull_volumes_pcollector; - static PStatCollector _frustum_cull_transforms_pcollector; - static PStatCollector _set_state_pcollector; + static PStatCollector _other_state_pcollector; static PStatCollector _draw_primitive_pcollector; - static PStatCollector _transform_states_pcollector; - static PStatCollector _transform_states_unused_pcollector; - static PStatCollector _render_states_pcollector; - static PStatCollector _render_states_unused_pcollector; private: class LightInfo { diff --git a/panda/src/dxgsg7/dxGraphicsStateGuardian7.cxx b/panda/src/dxgsg7/dxGraphicsStateGuardian7.cxx index dc10bde5c4..1a3cd86d7c 100644 --- a/panda/src/dxgsg7/dxGraphicsStateGuardian7.cxx +++ b/panda/src/dxgsg7/dxGraphicsStateGuardian7.cxx @@ -3845,6 +3845,8 @@ enable_texturing(bool val) { //////////////////////////////////////////////////////////////////// void DXGraphicsStateGuardian7:: issue_transform(const TransformState *transform) { + DO_PSTATS_STUFF(_transform_state_pcollector.add_level(1)); + _pScrn->pD3DDevice->SetTransform(D3DTRANSFORMSTATE_WORLD, (LPD3DMATRIX)transform->get_mat().get_data()); } @@ -3883,6 +3885,7 @@ issue_tex_matrix(const TexMatrixAttrib *attrib) { //////////////////////////////////////////////////////////////////// void DXGraphicsStateGuardian7:: issue_texture(const TextureAttrib *attrib) { + DO_PSTATS_STUFF(_texture_state_pcollector.add_level(1)); if (attrib->is_off()) { enable_texturing(false); } else { diff --git a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx index 22bc97e0e4..9d95e6ebc3 100644 --- a/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx +++ b/panda/src/dxgsg8/dxGraphicsStateGuardian8.cxx @@ -3573,6 +3573,8 @@ enable_texturing(bool val) { //////////////////////////////////////////////////////////////////// void DXGraphicsStateGuardian8:: issue_transform(const TransformState *transform) { + DO_PSTATS_STUFF(_transform_state_pcollector.add_level(1)); + // if we're using ONLY vertex shaders, could get avoid calling SetTrans D3DMATRIX *pMat = (D3DMATRIX*)transform->get_mat().get_data(); _pD3DDevice->SetTransform(D3DTS_WORLD,pMat); @@ -3625,6 +3627,7 @@ issue_tex_matrix(const TexMatrixAttrib *attrib) { //////////////////////////////////////////////////////////////////// void DXGraphicsStateGuardian8:: issue_texture(const TextureAttrib *attrib) { + DO_PSTATS_STUFF(_texture_state_pcollector.add_level(1)); if (attrib->is_off()) { enable_texturing(false); } else { diff --git a/panda/src/glgsg/glGraphicsStateGuardian.cxx b/panda/src/glgsg/glGraphicsStateGuardian.cxx index 9ef03fbdcb..e3d8c18ac0 100644 --- a/panda/src/glgsg/glGraphicsStateGuardian.cxx +++ b/panda/src/glgsg/glGraphicsStateGuardian.cxx @@ -2131,6 +2131,7 @@ issue_transform(const TransformState *transform) { glgsg_cat.spam() << "glLoadMatrix(GL_MODELVIEW): " << transform->get_mat() << endl; #endif + DO_PSTATS_STUFF(_transform_state_pcollector.add_level(1)); glMatrixMode(GL_MODELVIEW); glLoadMatrixf(transform->get_mat().get_data()); @@ -2156,6 +2157,7 @@ issue_tex_matrix(const TexMatrixAttrib *attrib) { //////////////////////////////////////////////////////////////////// void GLGraphicsStateGuardian:: issue_texture(const TextureAttrib *attrib) { + DO_PSTATS_STUFF(_texture_state_pcollector.add_level(1)); if (attrib->is_off()) { enable_texturing(false); } else { diff --git a/panda/src/pgraph/Sources.pp b/panda/src/pgraph/Sources.pp index 9234b777fd..a1fde712d1 100644 --- a/panda/src/pgraph/Sources.pp +++ b/panda/src/pgraph/Sources.pp @@ -2,7 +2,7 @@ dtoolutil:c dtoolbase:c dtool:m #define LOCAL_LIBS \ lerp event gsgbase gobj putil linmath \ - downloader express pandabase + downloader express pandabase pstatclient #begin lib_target #define TARGET pgraph diff --git a/panda/src/pgraph/cullTraverser.cxx b/panda/src/pgraph/cullTraverser.cxx index 66645d692b..e743d93211 100644 --- a/panda/src/pgraph/cullTraverser.cxx +++ b/panda/src/pgraph/cullTraverser.cxx @@ -32,6 +32,10 @@ #include "cullFaceAttrib.h" #include "depthOffsetAttrib.h" +#ifndef CPPPARSER +PStatCollector CullTraverser::_nodes_pcollector("Nodes"); +PStatCollector CullTraverser::_geom_nodes_pcollector("Nodes:GeomNodes"); +#endif // CPPPARSER TypeHandle CullTraverser::_type_handle; @@ -135,6 +139,7 @@ traverse(CullTraverserData &data) { //////////////////////////////////////////////////////////////////// void CullTraverser:: traverse_below(CullTraverserData &data) { + _nodes_pcollector.add_level(1); PandaNode *node = data.node(); const RenderEffects *node_effects = node->get_effects(); bool has_decal = node_effects->has_decal(); @@ -145,6 +150,7 @@ traverse_below(CullTraverserData &data) { } else { if (node->is_geom_node()) { + _geom_nodes_pcollector.add_level(1); GeomNode *geom_node = DCAST(GeomNode, node); // Get all the Geoms, with no decalling. diff --git a/panda/src/pgraph/cullTraverser.h b/panda/src/pgraph/cullTraverser.h index 8f0f8bac31..8030d6f3a2 100644 --- a/panda/src/pgraph/cullTraverser.h +++ b/panda/src/pgraph/cullTraverser.h @@ -29,6 +29,7 @@ #include "pointerTo.h" #include "drawMask.h" #include "typedObject.h" +#include "pStatCollector.h" class PandaNode; class CullHandler; @@ -77,6 +78,11 @@ public: void traverse(CullTraverserData &data); void traverse_below(CullTraverserData &data); +public: + // Statistics + static PStatCollector _nodes_pcollector; + static PStatCollector _geom_nodes_pcollector; + private: void show_bounds(CullTraverserData &data); PT(Geom) make_bounds_viz(const BoundingVolume &vol); diff --git a/panda/src/pstatclient/pStatProperties.cxx b/panda/src/pstatclient/pStatProperties.cxx index 1e96107f99..4f5c43d1f2 100644 --- a/panda/src/pstatclient/pStatProperties.cxx +++ b/panda/src/pstatclient/pStatProperties.cxx @@ -108,6 +108,7 @@ static TimeCollectorProperties time_properties[] = { { 1, "App", { 0.0, 0.8, 0.4 }, 1.0 / 30.0 }, { 1, "App:Animation", { 1.0, 0.0, 1.0 } }, { 1, "App:Collisions", { 1.0, 0.5, 0.0 } }, + { 1, "App:Collisions:Reset", { 0.0, 0.0, 0.5 } }, { 0, "App:Data graph", { 0.5, 0.8, 0.4 } }, { 1, "App:Show code", { 0.8, 0.2, 1.0 } }, { 0, "App:Show code:Nametags", { 0.8, 0.8, 1.0 } }, @@ -118,27 +119,9 @@ static TimeCollectorProperties time_properties[] = { { 0, "App:Show code:Nametags:3d:Contents", { 0.0, 0.5, 0.0 } }, { 0, "App:Show code:Nametags:3d:Adjust", { 0.5, 0.0, 0.5 } }, { 1, "Cull", { 0.0, 1.0, 0.0 }, 1.0 / 30.0 }, - { 0, "Cull:Traverse", { 0.0, 1.0, 1.0 } }, - { 0, "Cull:Geom node", { 1.0, 0.0, 1.0 } }, - { 0, "Cull:Direct node", { 1.0, 0.5, 0.0 } }, - { 0, "Cull:Apply initial", { 0.2, 1.0, 0.8 } }, - { 0, "Cull:Draw", { 1.0, 1.0, 0.0 } }, - { 0, "Cull:Clean", { 0.0, 0.0, 1.0 } }, - { 0, "Cull:Bins", { 0.8, 1.0, 0.8 } }, - { 0, "Cull:Bins:BTF", { 1.0, 0.5, 0.5 } }, - { 0, "Cull:Bins:Unsorted", { 0.5, 0.5, 1.0 } }, - { 0, "Cull:Bins:Fixed", { 0.5, 1.0, 0.5 } }, { 1, "Draw", { 1.0, 0.0, 0.0 }, 1.0 / 30.0 }, { 0, "Draw:Primitive", { 0.0, 0.0, 0.5 } }, - { 0, "Draw:Set state", { 0.5, 0.0, 0.0 } }, - { 1, "Draw:Quick", { 1.0, 0.0, 0.8 } }, - { 1, "Draw:Direct", { 0.0, 0.4, 1.0 } }, - { 1, "Draw:Cull", { 0.4, 1.0, 0.0 } }, - { 0, "Draw:Clear", { 0.5, 0.7, 0.7 } }, { 0, "Draw:Show fps", { 0.5, 0.8, 1.0 } }, - { 0, "Draw:Make current", { 1.0, 0.6, 0.3 } }, - { 0, "WRT", { 0.0, 0.0, 1.0 } }, - { 0, "WRT:Subtree", { 0.3, 1.0, 0.3 } }, { 0, NULL } }; @@ -164,6 +147,7 @@ static LevelCollectorProperties level_properties[] = { { 1, "Cull volumes", { 0.7, 0.6, 0.9 }, "", 500.0 }, { 1, "Cull volumes:Transforms", { 0.9, 0.6, 0.0 } }, { 1, "State changes", { 1.0, 0.5, 0.2 }, "", 500.0 }, + { 1, "State changes:Other", { 0.2, 0.2, 0.2 } }, { 1, "State changes:Transforms", { 0.2, 0.2, 0.8 } }, { 1, "State changes:Textures", { 0.8, 0.2, 0.2 } }, { 1, "Memory usage", { 0.5, 1.0, 0.5 }, "MB", 64, 1048576 },