Kohi Game Engine
defines.h
Go to the documentation of this file.
1 
14 #pragma once
15 
16 #define KNULL 0
17 
18 // Unsigned int types.
19 
21 typedef unsigned char u8;
22 
24 typedef unsigned short u16;
25 
27 typedef unsigned int u32;
28 
30 typedef unsigned long long u64;
31 
32 // Signed int types.
33 
35 typedef signed char i8;
36 
38 typedef signed short i16;
39 
41 typedef signed int i32;
42 
44 typedef signed long long i64;
45 
46 // Floating point types
47 
49 typedef float f32;
50 
52 typedef double f64;
53 
54 // Boolean types
55 
57 typedef int b32;
58 
60 typedef _Bool b8;
61 
63 typedef struct krange {
69 
71 typedef struct range32 {
77 // Properly define static assertions.
78 #if defined(__clang__) || defined(__GNUC__)
80 # define STATIC_ASSERT _Static_assert
81 #else
82 
84 # define STATIC_ASSERT static_assert
85 #endif
86 
87 // Ensure all types are of the correct size.
88 
90 STATIC_ASSERT(sizeof(u8) == 1, "Expected u8 to be 1 byte.");
91 
93 STATIC_ASSERT(sizeof(u16) == 2, "Expected u16 to be 2 bytes.");
94 
96 STATIC_ASSERT(sizeof(u32) == 4, "Expected u32 to be 4 bytes.");
97 
99 STATIC_ASSERT(sizeof(u64) == 8, "Expected u64 to be 8 bytes.");
100 
102 STATIC_ASSERT(sizeof(i8) == 1, "Expected i8 to be 1 byte.");
103 
105 STATIC_ASSERT(sizeof(i16) == 2, "Expected i16 to be 2 bytes.");
106 
108 STATIC_ASSERT(sizeof(i32) == 4, "Expected i32 to be 4 bytes.");
109 
111 STATIC_ASSERT(sizeof(i64) == 8, "Expected i64 to be 8 bytes.");
112 
114 STATIC_ASSERT(sizeof(f32) == 4, "Expected f32 to be 4 bytes.");
115 
117 STATIC_ASSERT(sizeof(f64) == 8, "Expected f64 to be 8 bytes.");
118 
120 #define true 1
121 
123 #define false 0
124 
125 #define U64_MAX 18446744073709551615UL
126 #define U32_MAX 4294967295U
127 #define U16_MAX 65535U
128 #define U8_MAX 255U
129 #define U64_MIN 0UL
130 #define U32_MIN 0U
131 #define U16_MIN 0U
132 #define U8_MIN 0U
133 
134 #define I8_MAX 127
135 #define I16_MAX 32767
136 #define I32_MAX 2147483647
137 #define I64_MAX 9223372036854775807L
138 #define I8_MIN (-I8_MAX - 1)
139 #define I16_MIN (-I16_MAX - 1)
140 #define I32_MIN (-I32_MAX - 1)
141 #define I64_MIN (-I64_MAX - 1)
142 
143 #define KWHOLE_SIZE U64_MAX
144 
149 #define INVALID_ID_U64 U64_MAX
150 #define INVALID_ID_U32 U32_MAX
151 #define INVALID_ID_U16 U16_MAX
152 #define INVALID_ID_U8 U8_MAX
153 #define INVALID_ID INVALID_ID_U32
154 
155 // Platform detection
156 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
157 # define KPLATFORM_WINDOWS 1
158 # ifndef _WIN64
159 # error "64-bit is required on Windows!"
160 # endif
161 #elif defined(__linux__) || defined(__gnu_linux__)
162 // Linux OS
163 # define KPLATFORM_LINUX 1
164 # if defined(__ANDROID__)
165 # define KPLATFORM_ANDROID 1
166 # endif
167 #elif defined(__unix__)
168 // Catch anything not caught by the above.
169 # define KPLATFORM_UNIX 1
170 #elif defined(_POSIX_VERSION)
171 // Posix
172 # define KPLATFORM_POSIX 1
173 #elif __APPLE__
174 // Apple platforms
175 # define KPLATFORM_APPLE 1
176 # include <TargetConditionals.h>
177 # if TARGET_IPHONE_SIMULATOR
178 // iOS Simulator
179 # define KPLATFORM_IOS 1
180 # define KPLATFORM_IOS_SIMULATOR 1
181 # elif TARGET_OS_IPHONE
182 # define KPLATFORM_IOS 1
183 // iOS device
184 # elif TARGET_OS_MAC
185 // HACK: Should probably be in the Vulkan Renderer lib, not here.
186 # define VK_USE_PLATFORM_MACOS_MVK
187 // Other kinds of Mac OS
188 # else
189 # error "Unknown Apple platform"
190 # endif
191 #else
192 # error "Unknown platform!"
193 #endif
194 
195 #ifdef KEXPORT
196 // Exports
197 # ifdef _MSC_VER
198 # define KAPI __declspec(dllexport)
199 # else
200 # define KAPI __attribute__((visibility("default")))
201 # endif
202 #else
203 // Imports
204 # ifdef _MSC_VER
206 # define KAPI __declspec(dllimport)
207 # else
209 # define KAPI
210 # endif
211 #endif
212 
213 #if _DEBUG
214 # define KOHI_DEBUG 1
215 # define KOHI_RELEASE 0
216 #else
217 # define KOHI_RELEASE 1
218 # define KOHI_DEBUG 0
219 #endif
220 
221 // Feature build flags.
222 
223 #if KOHI_DEBUG
224 # define KOHI_HOT_RELOAD 1
225 #else
226 # define KOHI_HOT_RELOAD 0
227 #endif
228 
236 #define KCLAMP(value, min, max) ((value <= min) ? min : (value >= max) ? max \
237  : value)
238 
239 // Inlining
240 #if defined(__clang__) || defined(__gcc__)
242 # define KINLINE __attribute__((always_inline)) inline
243 
245 # define KNOINLINE __attribute__((noinline))
246 #elif defined(_MSC_VER)
247 
249 # define KINLINE __forceinline
250 
252 # define KNOINLINE __declspec(noinline)
253 #else
254 
256 # define KINLINE static inline
257 
259 # define KNOINLINE
260 #endif
261 
262 // Deprecation
263 #if defined(__clang__) || defined(__gcc__)
265 # define KDEPRECATED(message) __attribute__((deprecated(message)))
266 #elif defined(_MSC_VER)
268 # define KDEPRECATED(message) __declspec(deprecated(message))
269 #else
270 # error "Unsupported compiler - don't know how to define deprecations!"
271 #endif
272 
274 #define GIBIBYTES(amount) ((amount) * 1024ULL * 1024ULL * 1024ULL)
276 #define MEBIBYTES(amount) ((amount) * 1024ULL * 1024ULL)
278 #define KIBIBYTES(amount) ((amount) * 1024ULL)
279 
281 #define GIGABYTES(amount) ((amount) * 1000ULL * 1000ULL * 1000ULL)
283 #define MEGABYTES(amount) ((amount) * 1000ULL * 1000ULL)
285 #define KILOBYTES(amount) ((amount) * 1000ULL)
286 
287 KINLINE u64 get_aligned(u64 operand, u64 granularity) {
288  return ((operand + (granularity - 1)) & ~(granularity - 1));
289 }
290 
291 KINLINE krange get_aligned_range(u64 offset, u64 size, u64 granularity) {
292  return (krange){get_aligned(offset, granularity), get_aligned(size, granularity)};
293 }
294 
295 #define KSWAP(type, a, b) \
296  { \
297  type temp = a; \
298  a = b; \
299  b = temp; \
300  }
301 
302 #define KMIN(x, y) (x < y ? x : y)
303 #define KMAX(x, y) (x > y ? x : y)
304 
308 #define FLAG_GET(flags, flag) ((flags & flag) == flag)
309 
317 #define FLAG_SET(flags, flag, enabled) (flags = (enabled ? (flags | flag) : (flags & ~flag)))
318 
327 #define UNPACK_U64_U16S(packed, a, b, c, d) \
328  { \
329  a = (u16)(packed >> 48); \
330  b = (u16)(packed >> 32); \
331  c = (u16)(packed >> 16); \
332  d = (u16)(packed >> 0); \
333  }
334 
338 #define UNPACK_U64_U16_AT(packed, index) ((u16)(packed >> ((3 - index) * 16)))
339 
343 #define PACK_U64_U16S(a, b, c, d) (((u64)a << 48) | ((u64)b << 32) | ((u64)c << 16) | ((u64)d))
344 
351 #define PACK_U64_U16_AT(target, n, index) (target = (target | ((u64)n << ((3 - index) * 16))))
352 
359 #define UNPACK_U64_U32S(packed, a, b) \
360  { \
361  a = (u32)(packed >> 32); \
362  b = (u32)(packed >> 0); \
363  }
364 
368 #define UNPACK_U64_U32_AT(packed, index) ((u32)(packed >> ((1 - index) * 32)))
369 
373 #define PACK_U64_U32S(a, b) (((u64)a << 32) | ((u64)b))
374 
381 #define PACK_U64_U32_AT(target, n, index) (target = (target | ((u64)n << ((1 - index) * 32))))
382 
389 #define UNPACK_U32_U16S(packed, a, b) \
390  { \
391  a = (u16)(packed >> 16); \
392  b = (u16)(packed >> 0); \
393  }
394 
398 #define UNPACK_U32_U16_AT(packed, index) ((u16)(packed >> ((1 - index) * 16)))
399 
403 #define PACK_U32_U16S(a, b) (((u32)a << 16) | ((u32)b))
404 
411 #define PACK_U32_U16_AT(target, n, index) (target = (target | ((u32)n << ((1 - index) * 16))))
412 
413 #define IS_IN_RANGE(val, from, to) ((from < to) ? (val >= from && val <= to) : (val <= from && val >= to))
struct krange krange
A range, typically of memory.
unsigned int u32
Unsigned 32-bit integer.
Definition: defines.h:27
#define STATIC_ASSERT
Static assertion.
Definition: defines.h:84
signed char i8
Signed 8-bit integer.
Definition: defines.h:35
KINLINE krange get_aligned_range(u64 offset, u64 size, u64 granularity)
Definition: defines.h:291
_Bool b8
8-bit boolean type
Definition: defines.h:60
struct range32 range32
A range, typically of memory.
float f32
32-bit floating point number
Definition: defines.h:49
double f64
64-bit floating point number
Definition: defines.h:52
signed int i32
Signed 32-bit integer.
Definition: defines.h:41
unsigned short u16
Unsigned 16-bit integer.
Definition: defines.h:24
#define KINLINE
Inline qualifier.
Definition: defines.h:256
KINLINE u64 get_aligned(u64 operand, u64 granularity)
Definition: defines.h:287
signed short i16
Signed 16-bit integer.
Definition: defines.h:38
int b32
32-bit boolean type, used for APIs which require it
Definition: defines.h:57
unsigned long long u64
Unsigned 64-bit integer.
Definition: defines.h:30
signed long long i64
Signed 64-bit integer.
Definition: defines.h:44
unsigned char u8
Unsigned 8-bit integer.
Definition: defines.h:21
A range, typically of memory.
Definition: defines.h:63
u64 offset
The offset in bytes.
Definition: defines.h:65
u64 size
The size in bytes.
Definition: defines.h:67
A range, typically of memory.
Definition: defines.h:71
i32 offset
The offset in bytes.
Definition: defines.h:73
i32 size
The size in bytes.
Definition: defines.h:75