157 lines
3.6 KiB
C++
157 lines
3.6 KiB
C++
/*
|
|
* Copyright 2011-2013 Blender Foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef __UTIL_DEBUG_H__
|
|
#define __UTIL_DEBUG_H__
|
|
|
|
#include <cassert>
|
|
#include <iostream>
|
|
|
|
#include "util_static_assert.h"
|
|
|
|
CCL_NAMESPACE_BEGIN
|
|
|
|
/* Global storage for all sort of flags used to fine-tune behavior of particular
|
|
* areas for the development purposes, without officially exposing settings to
|
|
* the interface.
|
|
*/
|
|
class DebugFlags {
|
|
public:
|
|
/* Descriptor of CPU feature-set to be used. */
|
|
struct CPU {
|
|
CPU();
|
|
|
|
/* Reset flags to their defaults. */
|
|
void reset();
|
|
|
|
/* Flags describing which instructions sets are allowed for use. */
|
|
bool avx2;
|
|
bool avx;
|
|
bool sse41;
|
|
bool sse3;
|
|
bool sse2;
|
|
|
|
/* Whether QBVH usage is allowed or not. */
|
|
bool qbvh;
|
|
};
|
|
|
|
/* Descriptor of CUDA feature-set to be used. */
|
|
struct CUDA {
|
|
CUDA();
|
|
|
|
/* Reset flags to their defaults. */
|
|
void reset();
|
|
|
|
/* Whether adaptive feature based runtime compile is enabled or not.
|
|
* Requires the CUDA Toolkit and only works on Linux atm. */
|
|
bool adaptive_compile;
|
|
};
|
|
|
|
/* Descriptor of OpenCL feature-set to be used. */
|
|
struct OpenCL {
|
|
OpenCL();
|
|
|
|
/* Reset flags to their defaults. */
|
|
void reset();
|
|
|
|
/* Available device types.
|
|
* Only gives a hint which devices to let user to choose from, does not
|
|
* try to use any sort of optimal device or so.
|
|
*/
|
|
enum DeviceType {
|
|
/* None of OpenCL devices will be used. */
|
|
DEVICE_NONE,
|
|
/* All OpenCL devices will be used. */
|
|
DEVICE_ALL,
|
|
/* Default system OpenCL device will be used. */
|
|
DEVICE_DEFAULT,
|
|
/* Host processor will be used. */
|
|
DEVICE_CPU,
|
|
/* GPU devices will be used. */
|
|
DEVICE_GPU,
|
|
/* Dedicated OpenCL accelerator device will be used. */
|
|
DEVICE_ACCELERATOR,
|
|
};
|
|
|
|
/* Available kernel types. */
|
|
enum KernelType {
|
|
/* Do automated guess which kernel to use, based on the officially
|
|
* supported GPUs and such.
|
|
*/
|
|
KERNEL_DEFAULT,
|
|
/* Force mega kernel to be used. */
|
|
KERNEL_MEGA,
|
|
/* Force split kernel to be used. */
|
|
KERNEL_SPLIT,
|
|
};
|
|
|
|
/* Requested device type. */
|
|
DeviceType device_type;
|
|
|
|
/* Requested kernel type. */
|
|
KernelType kernel_type;
|
|
|
|
/* Use debug version of the kernel. */
|
|
bool debug;
|
|
};
|
|
|
|
/* Get instance of debug flags registry. */
|
|
static DebugFlags& get()
|
|
{
|
|
static DebugFlags instance;
|
|
return instance;
|
|
}
|
|
|
|
/* Reset flags to their defaults. */
|
|
void reset();
|
|
|
|
/* Requested CPU flags. */
|
|
CPU cpu;
|
|
|
|
/* Requested CUDA flags. */
|
|
CUDA cuda;
|
|
|
|
/* Requested OpenCL flags. */
|
|
OpenCL opencl;
|
|
|
|
private:
|
|
DebugFlags();
|
|
|
|
#if (__cplusplus > 199711L)
|
|
public:
|
|
explicit DebugFlags(DebugFlags const& /*other*/) = delete;
|
|
void operator=(DebugFlags const& /*other*/) = delete;
|
|
#else
|
|
private:
|
|
explicit DebugFlags(DebugFlags const& /*other*/);
|
|
void operator=(DebugFlags const& /*other*/);
|
|
#endif
|
|
};
|
|
|
|
typedef DebugFlags& DebugFlagsRef;
|
|
typedef const DebugFlags& DebugFlagsConstRef;
|
|
|
|
inline DebugFlags& DebugFlags() {
|
|
return DebugFlags::get();
|
|
}
|
|
|
|
std::ostream& operator <<(std::ostream &os,
|
|
DebugFlagsConstRef debug_flags);
|
|
|
|
CCL_NAMESPACE_END
|
|
|
|
#endif /* __UTIL_DEBUG_H__ */
|