Further PStats refinements
This commit is contained in:
parent
1e413cb018
commit
ab5db5fa68
|
|
@ -24,6 +24,7 @@ PStatCollector GraphicsStateGuardian::_vertices_tristrip_pcollector("Vertices:Tr
|
|||
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");
|
||||
#endif
|
||||
|
||||
TypeHandle GraphicsStateGuardian::_type_handle;
|
||||
|
|
@ -155,7 +156,7 @@ set_state(const NodeAttributes &new_state, bool complete) {
|
|||
gsg_cat.debug()
|
||||
<< "Issuing new attrib " << *(*new_i).second << "\n";
|
||||
}
|
||||
|
||||
_state_changes_pcollector.add_level(1);
|
||||
(*new_i).second->issue(this);
|
||||
|
||||
// And store the new value.
|
||||
|
|
@ -178,6 +179,7 @@ set_state(const NodeAttributes &new_state, bool complete) {
|
|||
<< "Unissuing attrib " << *(*current_i).second
|
||||
<< " (previously set, not now)\n";
|
||||
}
|
||||
_state_changes_pcollector.add_level(1);
|
||||
|
||||
PT(NodeAttribute) initial = (*current_i).second->make_initial();
|
||||
initial->issue(this);
|
||||
|
|
@ -206,6 +208,7 @@ set_state(const NodeAttributes &new_state, bool complete) {
|
|||
<< "Unissuing attrib " << *(*current_i).second
|
||||
<< " (previously set, now NULL)\n";
|
||||
}
|
||||
_state_changes_pcollector.add_level(1);
|
||||
|
||||
// Issue the initial attribute before clearing the state.
|
||||
PT(NodeAttribute) initial = (*current_i).second->make_initial();
|
||||
|
|
@ -230,6 +233,7 @@ set_state(const NodeAttributes &new_state, bool complete) {
|
|||
gsg_cat.debug()
|
||||
<< "Reissuing attrib " << *(*new_i).second << "\n";
|
||||
}
|
||||
_state_changes_pcollector.add_level(1);
|
||||
(*new_i).second->issue(this);
|
||||
|
||||
// And store the new value.
|
||||
|
|
@ -255,6 +259,7 @@ set_state(const NodeAttributes &new_state, bool complete) {
|
|||
gsg_cat.debug()
|
||||
<< "Issuing new attrib " << *(*new_i).second << "\n";
|
||||
}
|
||||
_state_changes_pcollector.add_level(1);
|
||||
|
||||
(*new_i).second->issue(this);
|
||||
|
||||
|
|
@ -274,6 +279,7 @@ set_state(const NodeAttributes &new_state, bool complete) {
|
|||
<< "Unissuing attrib " << *(*current_i).second
|
||||
<< " (previously set, end of list)\n";
|
||||
}
|
||||
_state_changes_pcollector.add_level(1);
|
||||
|
||||
// If we're in the "complete state" model, that means this
|
||||
// attribute should now get the default initial value.
|
||||
|
|
@ -437,7 +443,7 @@ mark_prepared_texture(TextureContext *tc) {
|
|||
bool prepared = _prepared_textures.insert(tc).second;
|
||||
#ifdef DO_PSTATS
|
||||
if (prepared) {
|
||||
_total_texusage_pcollector.add_level(tc->estimate_texture_memory() / 1048576.0);
|
||||
_total_texusage_pcollector.add_level(tc->estimate_texture_memory());
|
||||
}
|
||||
#endif
|
||||
return prepared;
|
||||
|
|
@ -457,13 +463,34 @@ unmark_prepared_texture(TextureContext *tc) {
|
|||
bool removed = (_prepared_textures.erase(tc) != 0);
|
||||
#ifdef DO_PSTATS
|
||||
if (removed) {
|
||||
_total_texusage_pcollector.add_level(-(tc->estimate_texture_memory() / 1048576.0));
|
||||
_total_texusage_pcollector.sub_level(tc->estimate_texture_memory());
|
||||
}
|
||||
#endif
|
||||
return removed;
|
||||
}
|
||||
|
||||
#ifdef DO_PSTATS
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::init_frame_pstats
|
||||
// Access: Protected
|
||||
// Description: Initializes the relevant PStats data at the beginning
|
||||
// of the frame.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void GraphicsStateGuardian::
|
||||
init_frame_pstats() {
|
||||
_current_textures.clear();
|
||||
_active_texusage_pcollector.clear_level();
|
||||
|
||||
// Also clear out our other counters while we're here.
|
||||
_vertices_tristrip_pcollector.clear_level();
|
||||
_vertices_trifan_pcollector.clear_level();
|
||||
_vertices_tri_pcollector.clear_level();
|
||||
_vertices_other_pcollector.clear_level();
|
||||
|
||||
_state_changes_pcollector.clear_level();
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::add_to_texture_record
|
||||
// Access: Protected
|
||||
|
|
@ -476,23 +503,9 @@ unmark_prepared_texture(TextureContext *tc) {
|
|||
void GraphicsStateGuardian::
|
||||
add_to_texture_record(TextureContext *tc) {
|
||||
if (_current_textures.insert(tc).second) {
|
||||
_active_texusage_pcollector.add_level(tc->estimate_texture_memory() / 1048576.0);
|
||||
_active_texusage_pcollector.add_level(tc->estimate_texture_memory());
|
||||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: GraphicsStateGuardian::clear_texture_record
|
||||
// Access: Protected
|
||||
// Description: Empties the texture record at the beginning of the
|
||||
// frame, in preparation for calling
|
||||
// add_to_texture_record() each time a texture is
|
||||
// applied.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void GraphicsStateGuardian::
|
||||
clear_texture_record() {
|
||||
_current_textures.clear();
|
||||
_active_texusage_pcollector.set_level(0);
|
||||
}
|
||||
#endif // DO_PSTATS
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -135,14 +135,14 @@ protected:
|
|||
bool unmark_prepared_texture(TextureContext *tc);
|
||||
|
||||
#ifdef DO_PSTATS
|
||||
// These functions are used to update the current texture memory
|
||||
// usage record in Pstats.
|
||||
// These functions are used to update the active texture memory
|
||||
// usage record (and other frame-based measurements) in Pstats.
|
||||
void init_frame_pstats();
|
||||
void add_to_texture_record(TextureContext *tc);
|
||||
void clear_texture_record();
|
||||
set<TextureContext *> _current_textures;
|
||||
#else
|
||||
INLINE void init_frame_pstats() { }
|
||||
INLINE void add_to_texture_record(TextureContext *) { }
|
||||
INLINE void clear_texture_record() { }
|
||||
#endif
|
||||
|
||||
protected:
|
||||
|
|
@ -180,6 +180,7 @@ protected:
|
|||
static PStatCollector _vertices_trifan_pcollector;
|
||||
static PStatCollector _vertices_tri_pcollector;
|
||||
static PStatCollector _vertices_other_pcollector;
|
||||
static PStatCollector _state_changes_pcollector;
|
||||
|
||||
private:
|
||||
typedef set<TextureContext *> Textures;
|
||||
|
|
|
|||
|
|
@ -476,7 +476,7 @@ render_frame(const AllAttributesWrapper &initial_state) {
|
|||
#ifdef DO_PSTATS
|
||||
// For Pstats to track our current texture memory usage, we have to
|
||||
// reset the set of current textures each frame.
|
||||
clear_texture_record();
|
||||
init_frame_pstats();
|
||||
|
||||
// But since we don't get sent a new issue_texture() unless our
|
||||
// texture state has changed, we have to be sure to clear the
|
||||
|
|
@ -485,12 +485,6 @@ render_frame(const AllAttributesWrapper &initial_state) {
|
|||
NodeAttributes state;
|
||||
state.set_attribute(TextureTransition::get_class_type(), new TextureAttribute);
|
||||
set_state(state, false);
|
||||
|
||||
// Also clear out our vertex counters while we're here.
|
||||
_vertices_tristrip_pcollector.set_level(0);
|
||||
_vertices_trifan_pcollector.set_level(0);
|
||||
_vertices_tri_pcollector.set_level(0);
|
||||
_vertices_other_pcollector.set_level(0);
|
||||
#endif
|
||||
|
||||
if (_clear_buffer_type != 0) {
|
||||
|
|
|
|||
|
|
@ -540,6 +540,7 @@ clear_level(int collector_index, int thread_index) {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
void PStatClient::
|
||||
set_level(int collector_index, int thread_index, float level) {
|
||||
level *= _collectors[collector_index]._def->_factor;
|
||||
_collectors[collector_index]._per_thread[thread_index]._has_level = true;
|
||||
_collectors[collector_index]._per_thread[thread_index]._level = level;
|
||||
}
|
||||
|
|
@ -557,6 +558,7 @@ set_level(int collector_index, int thread_index, float level) {
|
|||
////////////////////////////////////////////////////////////////////
|
||||
void PStatClient::
|
||||
add_level(int collector_index, int thread_index, float increment) {
|
||||
increment *= _collectors[collector_index]._def->_factor;
|
||||
_collectors[collector_index]._per_thread[thread_index]._has_level = true;
|
||||
_collectors[collector_index]._per_thread[thread_index]._level += increment;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -260,4 +260,32 @@ add_level(const PStatThread &thread, float increment) {
|
|||
_client->add_level(_index, thread._index, increment);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: PStatCollector::sub_level
|
||||
// Access: Public
|
||||
// Description: Subtracts the indicated decrement (which may be
|
||||
// negative) to the level setting associated with this
|
||||
// collector for the main thread. If the collector did
|
||||
// not already have a level setting for the main thread,
|
||||
// it is initialized to 0.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void PStatCollector::
|
||||
sub_level(float decrement) {
|
||||
_client->add_level(_index, 0, -decrement);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: PStatCollector::sub_level
|
||||
// Access: Public
|
||||
// Description: Subtracts the indicated decrement (which may be
|
||||
// negative) to the level setting associated with this
|
||||
// collector for the indicated thread. If the collector
|
||||
// did not already have a level setting for this thread,
|
||||
// it is initialized to 0.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
INLINE void PStatCollector::
|
||||
sub_level(const PStatThread &thread, float decrement) {
|
||||
_client->add_level(_index, thread._index, -decrement);
|
||||
}
|
||||
|
||||
#endif // DO_PSTATS
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ public:
|
|||
INLINE void set_level(const PStatThread &thread, float level);
|
||||
INLINE void add_level(float increment);
|
||||
INLINE void add_level(const PStatThread &thread, float increment);
|
||||
INLINE void sub_level(float decrement);
|
||||
INLINE void sub_level(const PStatThread &thread, float decrement);
|
||||
|
||||
private:
|
||||
PStatClient *_client;
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ PStatCollectorDef() {
|
|||
_suggested_color.set(0.0, 0.0, 0.0);
|
||||
_sort = -1;
|
||||
_suggested_scale = 0.0;
|
||||
_factor = 1.0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -37,6 +38,7 @@ PStatCollectorDef(int index, const string &name) :
|
|||
_suggested_color.set(0.0, 0.0, 0.0);
|
||||
_sort = -1;
|
||||
_suggested_scale = 0.0;
|
||||
_factor = 1.0;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -52,6 +54,7 @@ set_parent(const PStatCollectorDef &parent) {
|
|||
_parent_index = parent._index;
|
||||
_level_units = parent._level_units;
|
||||
_suggested_scale = parent._suggested_scale;
|
||||
_factor = parent._factor;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -69,6 +72,7 @@ write_datagram(Datagram &destination) const {
|
|||
destination.add_int16(_sort);
|
||||
destination.add_string(_level_units);
|
||||
destination.add_float32(_suggested_scale);
|
||||
destination.add_float32(_factor);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
|
|
@ -85,4 +89,5 @@ read_datagram(DatagramIterator &source) {
|
|||
_sort = source.get_int16();
|
||||
_level_units = source.get_string();
|
||||
_suggested_scale = source.get_float32();
|
||||
_factor = source.get_float32();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ public:
|
|||
int _sort;
|
||||
string _level_units;
|
||||
float _suggested_scale;
|
||||
float _factor;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ struct LevelCollectorProperties {
|
|||
ColorDef color;
|
||||
const char *units;
|
||||
float suggested_scale;
|
||||
float inv_factor;
|
||||
};
|
||||
|
||||
static TimeCollectorProperties time_properties[] = {
|
||||
|
|
@ -64,15 +65,17 @@ static TimeCollectorProperties time_properties[] = {
|
|||
};
|
||||
|
||||
static LevelCollectorProperties level_properties[] = {
|
||||
{ "Texture usage", { 1.0, 0.0, 0.0 }, "MB", 12.0 },
|
||||
{ "Texture usage", { 1.0, 0.0, 0.0 }, "MB", 12, 1048576 },
|
||||
{ "Texture usage:Active", { 1.0, 1.0, 0.0 } },
|
||||
{ "Texture memory", { 0.0, 0.0, 1.0 }, "MB", 12.0 },
|
||||
{ "Texture memory", { 0.0, 0.0, 1.0 }, "MB", 12, 1048576 },
|
||||
{ "Texture memory:In use", { 0.0, 1.0, 1.0 } },
|
||||
{ "Vertices", { 0.5, 0.2, 0.0 }, "", 10000.0 },
|
||||
{ "Vertices", { 0.5, 0.2, 0.0 }, "K", 10, 1000 },
|
||||
{ "Vertices:Other", { 0.2, 0.2, 0.2 } },
|
||||
{ "Vertices:Triangles", { 0.8, 0.8, 0.8 } },
|
||||
{ "Vertices:Triangle fans", { 0.8, 0.5, 0.2 } },
|
||||
{ "Vertices:Triangle strips", { 0.2, 0.5, 0.8 } },
|
||||
{ "Nodes", { 0.4, 0.2, 0.5 }, "", 1000.0 },
|
||||
{ "State changes", { 1.0, 0.5, 0.2 }, "", 500.0 },
|
||||
{ NULL }
|
||||
};
|
||||
|
||||
|
|
@ -123,6 +126,9 @@ initialize_collector_def(PStatClient *client, PStatCollectorDef *def) {
|
|||
if (lp.units != (const char *)NULL) {
|
||||
def->_level_units = lp.units;
|
||||
}
|
||||
if (lp.inv_factor != 0.0) {
|
||||
def->_factor = 1.0 / lp.inv_factor;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue