Cycles: Remove unneeded include statements
[blender-staging.git] / intern / cycles / util / util_debug.h
1 /*
2  * Copyright 2011-2013 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 __UTIL_DEBUG_H__
18 #define __UTIL_DEBUG_H__
19
20 #include <cassert>
21 #include <iostream>
22
23 CCL_NAMESPACE_BEGIN
24
25 /* Global storage for all sort of flags used to fine-tune behavior of particular
26  * areas for the development purposes, without officially exposing settings to
27  * the interface.
28  */
29 class DebugFlags {
30 public:
31         /* Use static BVH in viewport, to match final render exactly. */
32         bool viewport_static_bvh;
33
34         /* Descriptor of CPU feature-set to be used. */
35         struct CPU {
36                 CPU();
37
38                 /* Reset flags to their defaults. */
39                 void reset();
40
41                 /* Flags describing which instructions sets are allowed for use. */
42                 bool avx2;
43                 bool avx;
44                 bool sse41;
45                 bool sse3;
46                 bool sse2;
47
48                 /* Whether QBVH usage is allowed or not. */
49                 bool qbvh;
50
51                 /* Whether split kernel is used */
52                 bool split_kernel;
53         };
54
55         /* Descriptor of CUDA feature-set to be used. */
56         struct CUDA {
57                 CUDA();
58
59                 /* Reset flags to their defaults. */
60                 void reset();
61
62                 /* Whether adaptive feature based runtime compile is enabled or not.
63                  * Requires the CUDA Toolkit and only works on Linux atm. */
64                 bool adaptive_compile;
65
66                 /* Whether split kernel is used */
67                 bool split_kernel;
68         };
69
70         /* Descriptor of OpenCL feature-set to be used. */
71         struct OpenCL {
72                 OpenCL();
73
74                 /* Reset flags to their defaults. */
75                 void reset();
76
77                 /* Available device types.
78                  * Only gives a hint which devices to let user to choose from, does not
79                  * try to use any sort of optimal device or so.
80                  */
81                 enum DeviceType {
82                         /* None of OpenCL devices will be used. */
83                         DEVICE_NONE,
84                         /* All OpenCL devices will be used. */
85                         DEVICE_ALL,
86                         /* Default system OpenCL device will be used.  */
87                         DEVICE_DEFAULT,
88                         /* Host processor will be used. */
89                         DEVICE_CPU,
90                         /* GPU devices will be used. */
91                         DEVICE_GPU,
92                         /* Dedicated OpenCL accelerator device will be used. */
93                         DEVICE_ACCELERATOR,
94                 };
95
96                 /* Available kernel types. */
97                 enum KernelType {
98                         /* Do automated guess which kernel to use, based on the officially
99                          * supported GPUs and such.
100                          */
101                         KERNEL_DEFAULT,
102                         /* Force mega kernel to be used. */
103                         KERNEL_MEGA,
104                         /* Force split kernel to be used. */
105                         KERNEL_SPLIT,
106                 };
107
108                 /* Requested device type. */
109                 DeviceType device_type;
110
111                 /* Requested kernel type. */
112                 KernelType kernel_type;
113
114                 /* Use debug version of the kernel. */
115                 bool debug;
116
117                 /* Use single program */
118                 bool single_program;
119
120                 /* TODO(mai): Currently this is only for OpenCL, but we should have it implemented for all devices. */
121                 /* Artificial memory limit in bytes (0 if disabled). */
122                 size_t mem_limit;
123         };
124
125         /* Get instance of debug flags registry. */
126         static DebugFlags& get()
127         {
128                 static DebugFlags instance;
129                 return instance;
130         }
131
132         /* Reset flags to their defaults. */
133         void reset();
134
135         /* Requested CPU flags. */
136         CPU cpu;
137
138         /* Requested CUDA flags. */
139         CUDA cuda;
140
141         /* Requested OpenCL flags. */
142         OpenCL opencl;
143
144 private:
145         DebugFlags();
146
147 #if (__cplusplus > 199711L)
148 public:
149         explicit DebugFlags(DebugFlags const& /*other*/)     = delete;
150         void operator=(DebugFlags const& /*other*/) = delete;
151 #else
152 private:
153         explicit DebugFlags(DebugFlags const& /*other*/);
154         void operator=(DebugFlags const& /*other*/);
155 #endif
156 };
157
158 typedef DebugFlags& DebugFlagsRef;
159 typedef const DebugFlags& DebugFlagsConstRef;
160
161 inline DebugFlags& DebugFlags() {
162   return DebugFlags::get();
163 }
164
165 std::ostream& operator <<(std::ostream &os,
166                           DebugFlagsConstRef debug_flags);
167
168 CCL_NAMESPACE_END
169
170 #endif /* __UTIL_DEBUG_H__ */