22 return a.size >
b.size;
28 return a.time >
b.time;
34 return a.sum_samples >
b.sum_samples;
39 return a.samples >
b.samples;
65 const string double_indent = indent + indent;
74 double_indent.c_str(),
85 const string double_indent = indent + indent;
91 "%s%-40s %fs\n", double_indent.c_str(), entry.
name.c_str(), entry.
time);
101 : name(name), self_samples(samples), sum_samples(samples)
124 if (total_samples == 0) {
134 string info =
string_printf(
"%-32s: Total %3.2f%% (%.2fs), Self %3.2f%% (%.2fs)\n",
140 string result = indent + info;
144 result += entry.
full_report(indent_level + 1, total_samples);
152 : name(name), samples(samples), hits(hits)
160 entry_map::iterator entry =
entries.find(name);
162 entry->second.samples += samples;
163 entry->second.hits += hits;
174 sorted_entries.reserve(
entries.size());
176 uint64_t total_hits = 0, total_samples = 0;
177 foreach (entry_map::const_reference entry,
entries) {
180 total_hits += pair.
hits;
181 total_samples += pair.samples;
183 sorted_entries.push_back(pair);
185 const double avg_samples_per_hit = ((
double)total_samples) / total_hits;
187 sort(sorted_entries.begin(), sorted_entries.end(), namedSampleCountPairComparator);
191 const double seconds = entry.samples * 0.001;
192 const double relative = ((
double)entry.samples) / (entry.hits * avg_samples_per_hit);
196 "%-32s: %.2fs (Relative cost: %.2f)\n", entry.name.c_str(), seconds, relative);
209 result += indent +
"Geometry:\n" + geometry.full_report(indent_level + 1);
269 foreach (
Shader *shader, scene->shaders) {
271 if (prof.
get_shader(shader->id, samples, hits)) {
272 shaders.add(shader->name, samples, hits);
276 objects.entries.clear();
277 foreach (
Object *
object, scene->objects) {
279 if (prof.
get_object(object->get_device_index(), samples, hits)) {
280 objects.add(object->name, samples, hits);
288 result +=
"Mesh statistics:\n" + mesh.full_report(1);
289 result +=
"Image statistics:\n" + image.full_report(1);
292 result +=
"Shader statistics:\n" + shaders.full_report(1);
293 result +=
"Object statistics:\n" + objects.full_report(1);
296 result +=
"Profiling information not available (only works with CPU rendering)";
313 result +=
"Scene:\n" + scene.full_report(1);
314 result +=
"Geometry:\n" + geometry.full_report(1);
315 result +=
"Light:\n" + light.full_report(1);
316 result +=
"Object:\n" +
object.full_report(1);
317 result +=
"Image:\n" + image.full_report(1);
318 result +=
"Background:\n" + background.full_report(1);
319 result +=
"Bake:\n" +
bake.full_report(1);
320 result +=
"Camera:\n" + camera.full_report(1);
321 result +=
"Film:\n" + film.full_report(1);
333 geometry.times.clear();
336 object.times.clear();
337 background.times.clear();
339 camera.times.clear();
typedef double(DMatrix)[4][4]
static DBVT_INLINE btDbvtNode * sort(btDbvtNode *n, btDbvtNode *&r)
string full_report(int indent_level=0)
string full_report(int indent_level=0)
string full_report(int indent_level=0, uint64_t total_samples=0)
vector< NamedNestedSampleStats > entries
NamedNestedSampleStats & add_entry(const string &name, uint64_t samples)
NamedSampleCountPair(const ustring &name, uint64_t samples, uint64_t hits)
string full_report(int indent_level=0)
void add(const ustring &name, uint64_t samples, uint64_t hits)
void add_entry(const NamedSizeEntry &entry)
string full_report(int indent_level=0)
vector< NamedSizeEntry > entries
string full_report(int indent_level=0)
vector< NamedTimeEntry > entries
uint64_t get_event(ProfilingEvent event)
bool get_shader(int shader, uint64_t &samples, uint64_t &hits)
bool get_object(int object, uint64_t &samples, uint64_t &hits)
UpdateTimeStats particles
UpdateTimeStats procedurals
UpdateTimeStats integrator
string full_report(int indent_level=0)
local_group_size(16, 16) .push_constant(Type b
#define CCL_NAMESPACE_END
static CCL_NAMESPACE_BEGIN int kIndentNumSpaces
unsigned __int64 uint64_t
string string_human_readable_size(size_t size)
string string_human_readable_number(size_t num)
CCL_NAMESPACE_BEGIN string string_printf(const char *format,...)
void collect_profiling(Scene *scene, Profiler &prof)
NamedNestedSampleStats kernel
@ PROFILING_SHADE_SURFACE_SETUP
@ PROFILING_SHADE_SHADOW_SURFACE
@ PROFILING_SHADE_VOLUME_INTEGRATE
@ PROFILING_SHADE_SHADOW_VOLUME
@ PROFILING_INTERSECT_SUBSURFACE
@ PROFILING_INTERSECT_SHADOW
@ PROFILING_INTERSECT_CLOSEST
@ PROFILING_INTERSECT_DEDICATED_LIGHT
@ PROFILING_SHADE_VOLUME_SETUP
@ PROFILING_SHADE_SURFACE_EVAL
@ PROFILING_SHADE_SURFACE_INDIRECT_LIGHT
@ PROFILING_SHADE_SURFACE_AO
@ PROFILING_SHADE_SURFACE_DIRECT_LIGHT
@ PROFILING_SHADE_LIGHT_SETUP
@ PROFILING_SHADE_SHADOW_SETUP
@ PROFILING_SHADE_DEDICATED_LIGHT
@ PROFILING_INTERSECT_VOLUME_STACK
@ PROFILING_SHADE_VOLUME_DIRECT_LIGHT
@ PROFILING_SHADE_SURFACE_PASSES
@ PROFILING_SHADE_LIGHT_EVAL
@ PROFILING_SHADE_VOLUME_INDIRECT_LIGHT