Fix incorrect FLT_MIN use
[blender.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         /* Descriptor of CPU feature-set to be used. */
32         struct CPU {
33                 CPU();
34
35                 /* Reset flags to their defaults. */
36                 void reset();
37
38                 /* Flags describing which instructions sets are allowed for use. */
39                 bool avx2;
40                 bool avx;
41                 bool sse41;
42                 bool sse3;
43                 bool sse2;
44
45                 /* Whether QBVH usage is allowed or not. */
46                 bool qbvh;
47         };
48
49         /* Descriptor of CUDA feature-set to be used. */
50         struct CUDA {
51                 CUDA();
52
53                 /* Reset flags to their defaults. */
54                 void reset();
55
56                 /* Whether adaptive feature based runtime compile is enabled or not.
57                  * Requires the CUDA Toolkit and only works on Linux atm. */
58                 bool adaptive_compile;
59         };
60
61         /* Descriptor of OpenCL feature-set to be used. */
62         struct OpenCL {
63                 OpenCL();
64
65                 /* Reset flags to their defaults. */
66                 void reset();
67
68                 /* Available device types.
69                  * Only gives a hint which devices to let user to choose from, does not
70                  * try to use any sort of optimal device or so.
71                  */
72                 enum DeviceType {
73                         /* None of OpenCL devices will be used. */
74                         DEVICE_NONE,
75                         /* All OpenCL devices will be used. */
76                         DEVICE_ALL,
77                         /* Default system OpenCL device will be used.  */
78                         DEVICE_DEFAULT,
79                         /* Host processor will be used. */
80                         DEVICE_CPU,
81                         /* GPU devices will be used. */
82                         DEVICE_GPU,
83                         /* Dedicated OpenCL accelerator device will be used. */
84                         DEVICE_ACCELERATOR,
85                 };
86
87                 /* Available kernel types. */
88                 enum KernelType {
89                         /* Do automated guess which kernel to use, based on the officially
90                          * supported GPUs and such.
91                          */
92                         KERNEL_DEFAULT,
93                         /* Force mega kernel to be used. */
94                         KERNEL_MEGA,
95                         /* Force split kernel to be used. */
96                         KERNEL_SPLIT,
97                 };
98
99                 /* Requested device type. */
100                 DeviceType device_type;
101
102                 /* Requested kernel type. */
103                 KernelType kernel_type;
104
105                 /* Use debug version of the kernel. */
106                 bool debug;
107         };
108
109         /* Get instance of debug flags registry. */
110         static DebugFlags& get()
111         {
112                 static DebugFlags instance;
113                 return instance;
114         }
115
116         /* Reset flags to their defaults. */
117         void reset();
118
119         /* Requested CPU flags. */
120         CPU cpu;
121
122         /* Requested CUDA flags. */
123         CUDA cuda;
124
125         /* Requested OpenCL flags. */
126         OpenCL opencl;
127
128 private:
129         DebugFlags();
130
131 #if (__cplusplus > 199711L)
132 public:
133         DebugFlags(DebugFlags const& /*other*/)     = delete;
134         void operator=(DebugFlags const& /*other*/) = delete;
135 #else
136 private:
137         DebugFlags(DebugFlags const& /*other*/);
138         void operator=(DebugFlags const& /*other*/);
139 #endif
140 };
141
142 typedef DebugFlags& DebugFlagsRef;
143 typedef const DebugFlags& DebugFlagsConstRef;
144
145 inline DebugFlags& DebugFlags() {
146   return DebugFlags::get();
147 }
148
149 std::ostream& operator <<(std::ostream &os,
150                           DebugFlagsConstRef debug_flags);
151
152 CCL_NAMESPACE_END
153
154 #endif /* __UTIL_DEBUG_H__ */