Cycles: Initial implementation of detailed statistics
[blender.git] / intern / cycles / render / stats.cpp
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 #include "render/stats.h"
18 #include "util/util_algorithm.h"
19 #include "util/util_foreach.h"
20 #include "util/util_string.h"
21
22 CCL_NAMESPACE_BEGIN
23
24 static int kIndentNumSpaces = 2;
25
26 /* Named size entry. */
27
28 namespace {
29
30 bool namedSizeEntryComparator(const NamedSizeEntry& a, const NamedSizeEntry& b)
31 {
32         /* We sort in descending order. */
33         return a.size > b.size;
34 }
35
36 }  // namespace
37
38 NamedSizeEntry::NamedSizeEntry()
39     : name(""),
40       size(0) {
41 }
42
43 NamedSizeEntry::NamedSizeEntry(const string& name, size_t size)
44     : name(name),
45       size(size) {
46 }
47
48 /* Named size statistics. */
49
50 NamedSizeStats::NamedSizeStats()
51     : total_size(0) {
52 }
53
54 void NamedSizeStats::add_entry(const NamedSizeEntry& entry) {
55         total_size += entry.size;
56         entries.push_back(entry);
57 }
58
59 string NamedSizeStats::full_report(int indent_level)
60 {
61         const string indent(indent_level * kIndentNumSpaces, ' ');
62         const string double_indent = indent + indent;
63         string result = "";
64         result += string_printf("%sTotal memory: %s (%s)\n",
65                                 indent.c_str(),
66                                 string_human_readable_size(total_size).c_str(),
67                                 string_human_readable_number(total_size).c_str());
68         sort(entries.begin(), entries.end(), namedSizeEntryComparator);
69         foreach(const NamedSizeEntry& entry, entries) {
70                 result += string_printf(
71                         "%s%-32s %s (%s)\n",
72                         double_indent.c_str(),
73                         entry.name.c_str(),
74                         string_human_readable_size(entry.size).c_str(),
75                         string_human_readable_number(entry.size).c_str());
76         }
77         return result;
78 }
79
80 /* Mesh statistics. */
81
82 MeshStats::MeshStats() {
83 }
84
85 string MeshStats::full_report(int indent_level)
86 {
87         const string indent(indent_level * kIndentNumSpaces, ' ');
88         string result = "";
89         result += indent + "Geometry:\n" + geometry.full_report(indent_level + 1);
90         return result;
91 }
92
93 /* Image statistics. */
94
95 ImageStats::ImageStats() {
96 }
97
98 string ImageStats::full_report(int indent_level)
99 {
100         const string indent(indent_level * kIndentNumSpaces, ' ');
101         string result = "";
102         result += indent + "Textures:\n" + textures.full_report(indent_level + 1);
103         return result;
104 }
105
106 /* Overall statistics. */
107
108 RenderStats::RenderStats() {
109 }
110
111 string RenderStats::full_report()
112 {
113         string result = "";
114         result += "Mesh statistics:\n" + mesh.full_report(1);
115         result += "Image statistics:\n" + image.full_report(1);
116         return result;
117 }
118
119 CCL_NAMESPACE_END