Merge branch 'master' into blender2.8
[blender.git] / intern / cycles / render / stats.h
1 /*
2  * Copyright 2011-2018 Blender Foundation
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #ifndef __RENDER_STATS_H__
18 #define __RENDER_STATS_H__
19
20 #include "render/scene.h"
21
22 #include "util/util_stats.h"
23 #include "util/util_string.h"
24 #include "util/util_vector.h"
25
26 CCL_NAMESPACE_BEGIN
27
28 /* Named statistics entry, which corresponds to a size. There is no real
29  * semantic around the units of size, it just should be the same for all
30  * entries.
31  *
32  * This is a generic entry foi all size-related statistics, which helps
33  * avoiding duplicating code for things like sorting.
34  */
35 class NamedSizeEntry {
36 public:
37         NamedSizeEntry();
38         NamedSizeEntry(const string& name, size_t size);
39
40         string name;
41         size_t size;
42 };
43
44 /* Container of named size entries. Used, for example, to store per-mesh memory
45  * usage statistics. But also keeps track of overall memory usage of the
46  * container.
47  */
48 class NamedSizeStats {
49 public:
50         NamedSizeStats();
51
52         /* Add entry to the statistics. */
53         void add_entry(const NamedSizeEntry& entry);
54
55         /* Generate full human-readable report. */
56         string full_report(int indent_level = 0);
57
58         /* Total size of all entries. */
59         size_t total_size;
60
61         /* NOTE: Is fine to read directly, but for adding use add_entry(), which
62          * makes sure all accumulating  values are properly updated.
63          */
64         vector<NamedSizeEntry> entries;
65 };
66
67 class NamedNestedSampleStats {
68 public:
69         NamedNestedSampleStats();
70         NamedNestedSampleStats(const string& name, uint64_t samples);
71
72         NamedNestedSampleStats& add_entry(const string& name, uint64_t samples);
73
74         /* Updates sum_samples recursively. */
75         void update_sum();
76
77         string full_report(int indent_level = 0, uint64_t total_samples = 0);
78
79         string name;
80
81         /* self_samples contains only the samples that this specific event got,
82          * while sum_samples also includes the samples of all sub-entries. */
83         uint64_t self_samples, sum_samples;
84
85         vector<NamedNestedSampleStats> entries;
86 };
87
88 /* Named entry containing both a time-sample count for objects of a type and a
89  * total count of processed items.
90  * This allows to estimate the time spent per item. */
91 class NamedSampleCountPair {
92 public:
93         NamedSampleCountPair(const ustring& name, uint64_t samples, uint64_t hits);
94
95         ustring name;
96         uint64_t samples;
97         uint64_t hits;
98 };
99
100 /* Contains statistics about pairs of samples and counts as described above. */
101 class NamedSampleCountStats {
102 public:
103         NamedSampleCountStats();
104
105         string full_report(int indent_level = 0);
106         void add(const ustring& name, uint64_t samples, uint64_t hits);
107
108         typedef unordered_map<ustring, NamedSampleCountPair, ustringHash> entry_map;
109         entry_map entries;
110 };
111
112 /* Statistics about mesh in the render database. */
113 class MeshStats {
114 public:
115         MeshStats();
116
117         /* Generate full human-readable report. */
118         string full_report(int indent_level = 0);
119
120         /* Input geometry statistics, this is what is coming as an input to render
121          * from. say, Blender. This does not include runtime or engine specific
122          * memory like BVH.
123          */
124         NamedSizeStats geometry;
125 };
126
127 /* Statistics about images held in memory. */
128 class ImageStats {
129 public:
130         ImageStats();
131
132         /* Generate full human-readable report. */
133         string full_report(int indent_level = 0);
134
135         NamedSizeStats textures;
136 };
137
138 /* Render process statistics. */
139 class RenderStats {
140 public:
141         RenderStats();
142
143         /* Return full report as string. */
144         string full_report();
145
146         /* Collect kernel sampling information from Stats. */
147         void collect_profiling(Scene *scene, Profiler& prof);
148
149         bool has_profiling;
150
151         MeshStats mesh;
152         ImageStats image;
153         NamedNestedSampleStats kernel;
154         NamedSampleCountStats shaders;
155         NamedSampleCountStats objects;
156 };
157
158 CCL_NAMESPACE_END
159
160 #endif  /* __RENDER_STATS_H__ */