NTrace
GPU ray tracing framework
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
Defs.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2009-2011, NVIDIA Corporation
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of NVIDIA Corporation nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #pragma once
29 
30 #pragma warning(disable:4530) // C++ exception handler used, but unwind semantics are not enabled.
31 #include <new>
32 #include <string.h>
33 
34 namespace FW
35 {
36 //------------------------------------------------------------------------
37 
38 #ifndef NULL
39 # define NULL 0
40 #endif
41 
42 #ifdef _DEBUG
43 # define FW_DEBUG 1
44 #else
45 # define FW_DEBUG 0
46 #endif
47 
48 #ifdef _M_X64
49 # define FW_64 1
50 #else
51 # define FW_64 0
52 #endif
53 
54 #ifdef __CUDACC__
55 # define FW_CUDA 1
56 #else
57 # define FW_CUDA 0
58 #endif
59 
60 #if FW_CUDA && !defined(__CUDA_ARCH__)
61 # define __CUDA_ARCH__ 100 // e.g. 120 = compute capability 1.2
62 #endif
63 
64 #if (FW_DEBUG || defined(FW_ENABLE_ASSERT)) && !FW_CUDA
65 # define FW_ASSERT(X) ((X) ? ((void)0) : FW::fail("Assertion failed!\n%s:%d\n%s", __FILE__, __LINE__, #X))
66 #else
67 # define FW_ASSERT(X) ((void)0)
68 #endif
69 
70 #if FW_CUDA
71 # define FW_CUDA_FUNC __device__ __inline__
72 # define FW_CUDA_CONST __constant__
73 #else
74 # define FW_CUDA_FUNC inline
75 # define FW_CUDA_CONST static const
76 #endif
77 
78 #define FW_UNREF(X) ((void)(X))
79 #define FW_ARRAY_SIZE(X) ((int)(sizeof(X) / sizeof((X)[0])))
80 
81 //------------------------------------------------------------------------
82 
83 typedef unsigned char U8;
84 typedef unsigned short U16;
85 typedef unsigned int U32;
86 typedef signed char S8;
87 typedef signed short S16;
88 typedef signed int S32;
89 typedef float F32;
90 typedef double F64;
91 typedef void (*FuncPtr)(void);
92 
93 #if FW_CUDA
94 typedef unsigned long long U64;
95 typedef signed long long S64;
96 #else
97 typedef unsigned __int64 U64;
98 typedef signed __int64 S64;
99 #endif
100 
101 #if FW_64
102 typedef S64 SPTR;
103 typedef U64 UPTR;
104 #else
105 typedef __w64 S32 SPTR;
106 typedef __w64 U32 UPTR;
107 #endif
108 
109 //------------------------------------------------------------------------
110 
111 #define FW_U32_MAX (0xFFFFFFFFu)
112 #define FW_S32_MIN (~0x7FFFFFFF)
113 #define FW_S32_MAX (0x7FFFFFFF)
114 #define FW_U64_MAX ((U64)(S64)-1)
115 #define FW_S64_MIN ((S64)-1 << 63)
116 #define FW_S64_MAX (~((S64)-1 << 63))
117 #define FW_F32_MIN (1.175494351e-38f)
118 #define FW_F32_MAX (3.402823466e+38f)
119 #define FW_F64_MIN (2.2250738585072014e-308)
120 #define FW_F64_MAX (1.7976931348623158e+308)
121 #define FW_PI (3.14159265358979323846f)
122 #define FW_INV_PI (0.31830988618379067154f)
123 #define FW_INV_2PI (0.15915494309189533577f)
124 
125 //------------------------------------------------------------------------
126 
127 #if !FW_CUDA
128 
129 class String;
130 
131 // Common functionality.
132 
133 void* malloc (size_t size);
134 void free (void* ptr);
135 void* realloc (void* ptr, size_t size);
136 
137 void printf (const char* fmt, ...);
138 String sprintf (const char* fmt, ...);
139 
140 // Error handling.
141 
142 void setError (const char* fmt, ...);
143 String clearError (void);
144 bool restoreError (const String& old);
145 bool hasError (void);
146 const String& getError (void);
147 
148 void fail (const char* fmt, ...);
149 void failWin32Error (const char* funcName);
150 void failIfError (void);
151 
152 // Re-entrancy. Called internally by Main and Window.
153 
154 int incNestingLevel (int delta);
155 bool setDiscardEvents(bool discard);
156 bool getDiscardEvents(void);
157 
158 // Logging.
159 
160 void pushLogFile (const String& name, bool append = true);
161 void popLogFile (void);
162 bool hasLogFile (void);
163 
164 // Memory profiling.
165 
166 size_t getMemoryUsed (void);
167 void pushMemOwner (const char* id);
168 void popMemOwner (void);
169 void printMemStats (void);
170 
171 // Performance profiling.
172 
173 void profileStart (void);
174 void profilePush (const char* id);
175 void profilePop (void);
176 void profileEnd (bool printResults = true);
177 
178 #endif
179 
180 //------------------------------------------------------------------------
181 // min(), max(), clamp().
182 
183 template <class T> FW_CUDA_FUNC void swap(T& a, T& b) { T t = a; a = b; b = t; }
184 
185 #define FW_SPECIALIZE_MINMAX(TEMPLATE, T, MIN, MAX) \
186  TEMPLATE FW_CUDA_FUNC T min(T a, T b) { return MIN; } \
187  TEMPLATE FW_CUDA_FUNC T max(T a, T b) { return MAX; } \
188  TEMPLATE FW_CUDA_FUNC T min(T a, T b, T c) { return min(min(a, b), c); } \
189  TEMPLATE FW_CUDA_FUNC T max(T a, T b, T c) { return max(max(a, b), c); } \
190  TEMPLATE FW_CUDA_FUNC T min(T a, T b, T c, T d) { return min(min(min(a, b), c), d); } \
191  TEMPLATE FW_CUDA_FUNC T max(T a, T b, T c, T d) { return max(max(max(a, b), c), d); } \
192  TEMPLATE FW_CUDA_FUNC T min(T a, T b, T c, T d, T e) { return min(min(min(min(a, b), c), d), e); } \
193  TEMPLATE FW_CUDA_FUNC T max(T a, T b, T c, T d, T e) { return max(max(max(max(a, b), c), d), e); } \
194  TEMPLATE FW_CUDA_FUNC T min(T a, T b, T c, T d, T e, T f) { return min(min(min(min(min(a, b), c), d), e), f); } \
195  TEMPLATE FW_CUDA_FUNC T max(T a, T b, T c, T d, T e, T f) { return max(max(max(max(max(a, b), c), d), e), f); } \
196  TEMPLATE FW_CUDA_FUNC T min(T a, T b, T c, T d, T e, T f, T g) { return min(min(min(min(min(min(a, b), c), d), e), f), g); } \
197  TEMPLATE FW_CUDA_FUNC T max(T a, T b, T c, T d, T e, T f, T g) { return max(max(max(max(max(max(a, b), c), d), e), f), g); } \
198  TEMPLATE FW_CUDA_FUNC T min(T a, T b, T c, T d, T e, T f, T g, T h) { return min(min(min(min(min(min(min(a, b), c), d), e), f), g), h); } \
199  TEMPLATE FW_CUDA_FUNC T max(T a, T b, T c, T d, T e, T f, T g, T h) { return max(max(max(max(max(max(max(a, b), c), d), e), f), g), h); } \
200  TEMPLATE FW_CUDA_FUNC T clamp(T v, T lo, T hi) { return min(max(v, lo), hi); }
201 
202 FW_SPECIALIZE_MINMAX(template <class T>, T&, (a < b) ? a : b, (a > b) ? a : b)
203 FW_SPECIALIZE_MINMAX(template <class T>, const T&, (a < b) ? a : b, (a > b) ? a : b)
204 
205 #if FW_CUDA
206 FW_SPECIALIZE_MINMAX(, U32, ::min(a, b), ::max(a, b))
207 FW_SPECIALIZE_MINMAX(, S32, ::min(a, b), ::max(a, b))
208 FW_SPECIALIZE_MINMAX(, U64, ::min(a, b), ::max(a, b))
209 FW_SPECIALIZE_MINMAX(, S64, ::min(a, b), ::max(a, b))
210 FW_SPECIALIZE_MINMAX(, F32, ::fminf(a, b), ::fmaxf(a, b))
211 FW_SPECIALIZE_MINMAX(, F64, ::fmin(a, b), ::fmax(a, b))
212 #endif
213 
214 //------------------------------------------------------------------------
215 // CUDA utilities.
216 
217 #if FW_CUDA
218 # define globalThreadIdx (threadIdx.x + blockDim.x * (threadIdx.y + blockDim.y * (blockIdx.x + gridDim.x * blockIdx.y)))
219 #endif
220 
221 //------------------------------------------------------------------------
222 // new, delete.
223 }
224 
225 #ifndef FW_DO_NOT_OVERRIDE_NEW_DELETE
226 #if !FW_CUDA
227 
228 inline void* operator new (size_t size) { return FW::malloc(size); }
229 inline void* operator new[] (size_t size) { return FW::malloc(size); }
230 inline void operator delete (void* ptr) { return FW::free(ptr); }
231 inline void operator delete[] (void* ptr) { return FW::free(ptr); }
232 
233 #endif
234 #endif // FW_DO_NOT_OVERRIDE_NEW_DELETE
235 
236 //------------------------------------------------------------------------
__w64 U32 UPTR
Definition: Defs.hpp:106
bool hasLogFile(void)
Definition: Defs.cpp:425
void * malloc(size_t size)
Definition: Defs.cpp:120
const char * name
Definition: DLLImports.cpp:42
void setError(const char *fmt,...)
Definition: Defs.cpp:253
void ** ptr
Definition: DLLImports.cpp:74
String clearError(void)
Definition: Defs.cpp:269
void popMemOwner(void)
Definition: Defs.cpp:463
unsigned __int64 U64
Definition: Defs.hpp:97
signed char S8
Definition: Defs.hpp:86
double F64
Definition: Defs.hpp:90
void failWin32Error(const char *funcName)
Definition: Defs.cpp:345
bool getDiscardEvents(void)
Definition: Defs.cpp:387
#define FW_CUDA_FUNC
Definition: Defs.hpp:74
void popLogFile(void)
Definition: Defs.cpp:406
bool restoreError(const String &old)
Definition: Defs.cpp:278
float F32
Definition: Defs.hpp:89
signed short S16
Definition: Defs.hpp:87
void free(void *ptr)
Definition: Defs.cpp:164
size_t getMemoryUsed(void)
Definition: Defs.cpp:432
const String & getError(void)
Definition: Defs.cpp:296
bool setDiscardEvents(bool discard)
Definition: Defs.cpp:378
FW_CUDA_FUNC T min(const VectorBase< T, L, S > &v)
Definition: Math.hpp:461
FW_CUDA_FUNC T max(const VectorBase< T, L, S > &v)
Definition: Math.hpp:462
void pushMemOwner(const char *id)
Definition: Defs.cpp:439
void * realloc(void *ptr, size_t size)
Definition: Defs.cpp:191
signed int S32
Definition: Defs.hpp:88
void pushLogFile(const String &name, bool append=true)
Definition: Defs.cpp:394
int incNestingLevel(int delta)
Definition: Defs.cpp:369
String sprintf(const char *fmt,...)
Definition: Defs.cpp:241
signed __int64 S64
Definition: Defs.hpp:98
unsigned int U32
Definition: Defs.hpp:85
bool hasError(void)
Definition: Defs.cpp:289
__w64 S32 SPTR
Definition: Defs.hpp:105
void printf(const char *fmt,...)
Definition: Defs.cpp:225
void profileStart(void)
Definition: Defs.cpp:531
FW_SPECIALIZE_MINMAX(template< class T >, T &,(a< b)?a:b,(a > b)?a:b) FW_SPECIALIZE_MINMAX(template< class T >
unsigned char U8
Definition: Defs.hpp:83
unsigned short U16
Definition: Defs.hpp:84
void failIfError(void)
Definition: Defs.cpp:361
FW_CUDA_FUNC void swap(T &a, T &b)
Definition: Defs.hpp:183
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx void
Definition: DLLImports.inl:58
void(* FuncPtr)(void)
Definition: Defs.hpp:91
void fail(const char *fmt,...)
Definition: Defs.cpp:304
void profileEnd(bool printResults=true)
Definition: Defs.cpp:618
void profilePop(void)
Definition: Defs.cpp:602
CUdevice int ordinal char int CUdevice dev CUdevprop CUdevice dev CUcontext ctx CUcontext ctx CUcontext pctx CUmodule const void image CUmodule const void fatCubin CUfunction CUmodule const char name void p CUfunction unsigned int bytes CUtexref pTexRef CUtexref CUarray unsigned int Flags CUtexref int CUaddress_mode am CUtexref unsigned int Flags CUaddress_mode CUtexref int dim CUarray_format int CUtexref hTexRef CUfunction unsigned int numbytes CUfunction int float value CUfunction int CUtexref hTexRef CUfunction int int grid_height CUevent unsigned int Flags CUevent hEvent CUevent hEvent CUstream unsigned int Flags CUstream hStream GLuint bufferobj unsigned int CUdevice dev CUdeviceptr unsigned int CUmodule const char name CUdeviceptr unsigned int bytesize CUdeviceptr dptr void unsigned int bytesize void CUdeviceptr unsigned int ByteCount CUarray unsigned int CUdeviceptr unsigned int ByteCount CUarray unsigned int const void unsigned int ByteCount CUarray unsigned int CUarray unsigned int unsigned int ByteCount void CUarray unsigned int unsigned int CUstream hStream const CUDA_MEMCPY2D pCopy CUdeviceptr const void unsigned int CUstream hStream const CUDA_MEMCPY2D CUstream hStream CUdeviceptr unsigned char unsigned int N CUdeviceptr unsigned int unsigned int N CUdeviceptr unsigned int unsigned short unsigned int unsigned int Height CUarray const CUDA_ARRAY_DESCRIPTOR pAllocateArray CUarray const CUDA_ARRAY3D_DESCRIPTOR pAllocateArray unsigned int CUtexref CUdeviceptr unsigned int bytes CUcontext unsigned int CUdevice device GLenum texture GLenum GLuint buffer GLenum GLuint renderbuffer GLenum GLsizeiptr size
Definition: DLLImports.inl:319
void profilePush(const char *id)
Definition: Defs.cpp:544
void printMemStats(void)
Definition: Defs.cpp:483