mitsuba/include/mitsuba/core/platform.h

244 lines
6.1 KiB
C++

/*
This file is part of Mitsuba, a physically based rendering system.
Copyright (c) 2007-2012 by Wenzel Jakob and others.
Mitsuba is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License Version 3
as published by the Free Software Foundation.
Mitsuba is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#if !defined(__MITSUBA_CORE_PLATFORM_H_)
#define __MITSUBA_CORE_PLATFORM_H_
/// Disable BOOST's autolinking feature
#define BOOST_ALL_NO_LIB 1
#if !defined(_OPENMP) && !defined(MTS_NO_OPENMP)
#define MTS_NO_OPENMP
#endif
#if defined(_MSC_VER)
#define __MSVC__
#define __WINDOWS__
// Don't complain about perfectly fine ISO C++
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_NONSTDC_NO_DEPRECATE
#define _CRT_SECURE_NO_DEPRECATE
#define _WIN32_WINNT 0x0501 // Windows XP
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN
#pragma warning(disable : 4251) // 'field' : class 'A' needs to have dll-interface to be used by clients of class 'B'
#pragma warning(disable : 4800) // 'type' : forcing value to bool 'true' or 'false' (performance warning)
#pragma warning(disable : 4996) // Secure SCL warnings
#include <stdint.h>
#if _MSC_VER >= 1400
#include <memory.h>
#include <string.h>
#include <math.h>
#pragma intrinsic(memset, memcmp, memcpy, strlen, strcmp, strcpy, _strset, strcat, fabs, abs)
#endif
#elif defined(__APPLE__)
#define __OSX__
#elif defined(__linux)
#define __LINUX__
#if !defined(_GNU_SOURCE)
#define _GNU_SOURCE
#endif
#else
#error Unknown OS
#endif
#ifdef __MSVC__
#define MTS_DONT_EXPORT // not supported on MSVC
#define SIZE_T_FMT "%Iu"
#define BOOST_FILESYSTEM_NO_LIB
#define BOOST_SYSTEM_NO_LIB
#define MTS_EXPORT __declspec(dllexport)
#define MTS_IMPORT __declspec(dllimport)
#define MTS_MAY_ALIAS // not supported on Windows
#else
#define MTS_EXPORT __attribute__ ((visibility("default")))
#define MTS_IMPORT
#define MTS_MAY_ALIAS __attribute__ ((__may_alias__))
#include <stdint.h>
#define SIZE_T_FMT "%zd"
#endif
#define MTS_MODULE_CORE 1
#define MTS_MODULE_RENDER 2
#define MTS_MODULE_HW 3
#define MTS_MODULE_BIDIR 4
#define MTS_MODULE_PYTHON 5
#if MTS_BUILD_MODULE == MTS_MODULE_CORE
#define MTS_EXPORT_CORE MTS_EXPORT
#else
#define MTS_EXPORT_CORE MTS_IMPORT
#endif
#if MTS_BUILD_MODULE == MTS_MODULE_RENDER
#define MTS_EXPORT_RENDER MTS_EXPORT
#else
#define MTS_EXPORT_RENDER MTS_IMPORT
#endif
#if MTS_BUILD_MODULE == MTS_MODULE_HW
#define MTS_EXPORT_HW MTS_EXPORT
#else
#define MTS_EXPORT_HW MTS_IMPORT
#endif
#if MTS_BUILD_MODULE == MTS_MODULE_BIDIR
#define MTS_EXPORT_BIDIR MTS_EXPORT
#else
#define MTS_EXPORT_BIDIR MTS_IMPORT
#endif
#if MTS_BUILD_MODULE == MTS_MODULE_PYTHON
#define MTS_EXPORT_PYTHON MTS_EXPORT
#else
#define MTS_EXPORT_PYTHON MTS_IMPORT
#endif
#if defined(__x86_64__) || defined(_M_X64) || defined(__LP64__) || defined(_LP64) || defined(WIN64)
#define __64BIT__
#else
#define __32BIT__
#endif
#if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
#define __LITTLE_ENDIAN__ 1 // Little endian by default
#endif
#define MTS_NAMESPACE_BEGIN namespace mitsuba {
#define MTS_NAMESPACE_END }
#if defined(__GNUC__)
#define FINLINE inline __attribute__((always_inline))
#define NOINLINE __attribute__((noinline))
#define EXPECT_TAKEN(a) __builtin_expect(!!(a), true)
#define EXPECT_NOT_TAKEN(a) __builtin_expect(!!(a), false)
#elif defined(__MSVC__)
#define FINLINE __forceinline
#define NOINLINE __declspec(noinline)
#define MM_ALIGN16 __declspec(align(16))
#define EXPECT_TAKEN(a) (a)
#define EXPECT_NOT_TAKEN(a) (a)
#else
#error Unsupported compiler!
#endif
#ifdef MTS_SSE
#define SSE_STR "SSE2 enabled"
#else
#define SSE_STR "SSE2 disabled"
#endif
/* The default OpenMP implementation on OSX is seriously broken,
for instance it segfaults when launching OpenMP threads
from context other than the main application thread */
#if defined(__OSX__) && !defined(__INTEL_COMPILER) && !defined(MTS_NO_OPENMP)
#define MTS_NO_OPENMP
#endif
#if !defined(MTS_NO_OPENMP)
#define MTS_OPENMP
#endif
/* Compile with Boost::Filesystem v3 */
#define BOOST_FILESYSTEM_VERSION 3
#include <string>
MTS_NAMESPACE_BEGIN
#if defined(DOUBLE_PRECISION)
typedef double Float;
#elif defined(SINGLE_PRECISION)
typedef float Float;
#else
#error No precision flag was defined!
#endif
#if defined(__OSX__)
extern MTS_EXPORT_CORE void __mts_autorelease_init();
extern MTS_EXPORT_CORE void __mts_autorelease_shutdown();
extern MTS_EXPORT_CORE void __mts_autorelease_begin();
extern MTS_EXPORT_CORE void __mts_autorelease_end();
extern MTS_EXPORT_CORE std::string __mts_bundlepath();
extern MTS_EXPORT_CORE void __mts_chdir_to_bundlepath();
extern MTS_EXPORT_CORE void __mts_init_cocoa();
extern MTS_EXPORT_CORE void __mts_set_appdefaults();
#define MTS_AUTORELEASE_BEGIN() __mts_autorelease_begin();
#define MTS_AUTORELEASE_END() __mts_autorelease_end();
#define MTS_AMBIGUOUS_SIZE_T 1
#else
#define MTS_AUTORELEASE_BEGIN()
#define MTS_AUTORELEASE_END()
#endif
MTS_NAMESPACE_END
/// \cond
// Try to make MSVC++ behave a bit more like C++
// with an underlying C99 implementation
// (and dn't include this in the documentation)
#if defined(_MSC_VER)
#include <float.h>
#define snprintf _snprintf
#define vsnprintf _vsnprintf
namespace std {
inline char tolower(char c) {
return ::tolower(c);
}
inline char toupper(char c) {
return ::toupper(c);
}
inline bool isnan(float f) {
return _isnan(f);
}
inline bool isnan(double f) {
return _isnan(f);
}
inline bool isfinite(float f) {
return _finite(f);
}
inline bool isfinite(double f) {
return _finite(f);
}
inline bool isinf(float f) {
return !_finite(f);
}
inline bool isinf(double f) {
return !_finite(f);
}
};
#endif
#endif /* __MITSUBA_CORE_PLATFORM_H_ */