NW4F G3d
Loading...
Searching...
No Matches
g3d_Inlines.h
Go to the documentation of this file.
1#ifndef NW_G3D_UT_INLINES_H_
2#define NW_G3D_UT_INLINES_H_
3
4#include <nw/g3d/g3d_config.h>
5
6#include <string.h>
7
8namespace nw { namespace g3d { namespace ut {
9
10enum
11{
13};
14
16bool IsPowerOfTwo(size_t size)
17{
18 return ((size - 1) & size) == 0;
19}
21void* AddOffset(void* ptr, size_t offset)
22{
23 return static_cast<char*>(ptr) + offset;
24}
25
27const void* AddOffset(const void* ptr, size_t offset)
28{
29 return static_cast<const char*>(ptr) + offset;
30}
31
32template <typename ResultT>
34ResultT* AddOffset(void* ptr, size_t offset)
35{
36 return static_cast<ResultT*>(AddOffset(ptr, offset));
37}
38
39template <typename ResultT>
41const ResultT* AddOffset(const void* ptr, size_t offset)
42{
43 return static_cast<const ResultT*>(AddOffset(ptr, offset));
44}
46size_t Align(size_t size, size_t alignment = DEFAULT_ALIGNMENT)
47{
48 NW_G3D_ASSERT(IsPowerOfTwo(alignment));
49 size_t mask = alignment - 1;
50 return (size + mask) & ~mask;
51}
52
54void* Align(void* ptr, size_t alignment = DEFAULT_ALIGNMENT)
55{
56 return reinterpret_cast<void*>(Align(reinterpret_cast<size_t>(ptr), alignment));
57}
58
60const void* Align(const void* ptr, size_t alignment = DEFAULT_ALIGNMENT)
61{
62 return reinterpret_cast<void*>(Align(reinterpret_cast<size_t>(ptr), alignment));
63}
64
66bool IsAligned(size_t size, size_t alignment = DEFAULT_ALIGNMENT)
67{
68 NW_G3D_ASSERT(IsPowerOfTwo(alignment));
69 return (size & (alignment - 1)) == 0;
70}
71
73bool IsAligned(const void* ptr, size_t alignment = DEFAULT_ALIGNMENT)
74{
75 return IsAligned(reinterpret_cast<size_t>(ptr), alignment);
76}
78u32 LoadRevU32(const u32* addr)
79{
80#if defined( __ghs__ )
81 register u32 data;
82 __lwbrx(addr, data);
83 return data;
84#else
85 return ((*addr << 24) & 0xFF000000) | ((*addr << 8) & 0x00FF0000) |
86 ((*addr >> 8) & 0x0000FF00) | ((*addr >> 24) & 0x000000FF);
87#endif
88}
89
91void StoreRevU32(u32* addr, u32 data)
92{
93#if defined( __ghs__ )
94 __stwbrx(addr, data);
95#else
96 *addr = ((data << 24) & 0xFF000000) | ((data << 8) & 0x00FF0000) |
97 ((data >> 8) & 0x0000FF00) | ((data >> 24) & 0x000000FF);
98#endif
99}
100
102u16 LoadRevU16(const u16* addr)
103{
104#if defined( __ghs__ )
105 register u32 data;
106 __lhbrx(addr, data);
107 return data;
108#else
109 return ((*addr << 8) & 0xFF00) | ((*addr >> 8) & 0x00FF);
110#endif
111}
112
114void StoreRevU16(u16* addr, u16 data)
115{
116#if defined( __ghs__ )
117 __sthbrx(addr, data);
118#else
119 *addr = ((data << 8) & 0xFF00) | ((data >> 8) & 0x00FF);
120#endif
121}
122
123template <bool swap>
125void Copy32(void* pDst, const void* pSrc, int count)
126{
128 if (swap)
129 {
130 bit32* dst = static_cast<bit32*>(pDst);
131 const bit32* src = static_cast<const bit32*>(pSrc);
132 for (const bit32* end = src + count; src != end; ++dst, ++src)
133 {
134 StoreRevU32(dst, *src);
135 }
136 }
137 else
138#endif
139 {
140 memcpy(pDst, pSrc, sizeof(bit32) * static_cast<size_t>(count));
141 }
142}
143
144template <typename DstT, typename SrcT>
145DstT FastCast(SrcT x);
146
147template <>
149s16 FastCast<s16, float>(float x)
150{
151#if defined( __ghs__ )
152 return __OSf32tos16Value(x);
153#else
154 return static_cast<s16>(x);
155#endif
156}
157
158template <>
160u16 FastCast<u16, float>(float x)
161{
162#if defined( __ghs__ )
163 return __OSf32tou16Value(x);
164#else
165 return static_cast<u16>(x);
166#endif
167}
168
169template <>
171s8 FastCast<s8, float>(float x)
172{
173#if defined( __ghs__ )
174 return __OSf32tos8Value(x);
175#else
176 return static_cast<s8>(x);
177#endif
178}
179
180template <>
182u8 FastCast<u8, float>(float x)
183{
184#if defined( __ghs__ )
185 return __OSf32tou8Value(x);
186#else
187 return static_cast<u8>(x);
188#endif
189}
190
191template <>
193float FastCast<float, s16>(s16 x)
194{
195#if defined( __ghs__ )
196 return OSs16tof32Value(&x);
197#else
198 return static_cast<float>(x);
199#endif
200}
201
202template <>
204float FastCast<float, u16>(u16 x)
205{
206#if defined( __ghs__ )
207 return OSu16tof32Value(&x);
208#else
209 return static_cast<float>(x);
210#endif
211}
212
213template <>
215float FastCast<float, s8>(s8 x)
216{
217#if defined( __ghs__ )
218 return OSs8tof32Value(&x);
219#else
220 return static_cast<float>(x);
221#endif
222}
223
224template <>
226float FastCast<float, u8>(u8 x)
227{
228#if defined( __ghs__ )
229 return OSu8tof32Value(&x);
230#else
231 return static_cast<float>(x);
232#endif
233}
234
235template <typename DstT, typename SrcT>
237DstT StaticCast(SrcT x) { return static_cast<DstT>(x); }
238
239template <>
241s16 StaticCast<s16, float>(float x) { return FastCast<s16, float>(x); }
242
243template <>
245u16 StaticCast<u16, float>(float x) { return FastCast<u16, float>(x); }
246
247template <>
249s8 StaticCast<s8, float>(float x) { return FastCast<s8, float>(x); }
250
251template <>
253u8 StaticCast<u8, float>(float x) { return FastCast<u8, float>(x); }
254
255template <>
257float StaticCast<float, s16>(s16 x) { return FastCast<float, s16>(x); }
258
259template <>
261float StaticCast<float, u16>(u16 x) { return FastCast<float, u16>(x); }
262
263template <>
265float StaticCast<float, s8>(s8 x) { return FastCast<float, s8>(x); }
266
267template <>
269float StaticCast<float, u8>(u8 x) { return FastCast<float, u8>(x); }
270
273{
274 x = (x & 0x55555555) + (x >> 1 & 0x55555555);
275 x = (x & 0x33333333) + (x >> 2 & 0x33333333);
276 x = (x & 0x0F0F0F0F) + (x >> 4 & 0x0F0F0F0F);
277 x = (x & 0x00FF00FF) + (x >> 8 & 0x00FF00FF);
278 x = (x & 0x0000FFFF) + (x >> 16 & 0x0000FFFF);
279 return static_cast<int>(x);
280}
281
284{
285#if defined( __ghs__ )
286 return __CLZ32(x);
287#else
288 x |= (x >> 1);
289 x |= (x >> 2);
290 x |= (x >> 4);
291 x |= (x >> 8);
292 x |= (x >> 16);
293 return CountOnes(~x);
294#endif
295}
296
299{
300#if defined( __ghs__ )
301 return 32 - CountLeadingZeros(~x & (x - 1));
302#else
303 return CountOnes((x & (~x + 1)) - 1);
304#endif
305}
306
307} } } // namespace nw::g3d::ut
308
309#endif // NW_G3D_UT_INLINES_H_
#define NW_G3D_ASSERT(exp)
Definition g3d_assert.h:17
#define NW_G3D_IS_HOST_CAFE
Definition g3d_defs.h:20
#define NW_G3D_FORCE_INLINE
Definition g3d_defs.h:66
u32 bit32
Definition g3d_defs.h:131
Definition g3d_Inlines.h:8
NW_G3D_FORCE_INLINE int CountOnes(bit32 x)
Definition g3d_Inlines.h:272
NW_G3D_FORCE_INLINE bool IsPowerOfTwo(size_t size)
Definition g3d_Inlines.h:16
NW_G3D_FORCE_INLINE bool IsAligned(const void *ptr, size_t alignment=DEFAULT_ALIGNMENT)
Definition g3d_Inlines.h:73
NW_G3D_FORCE_INLINE DstT StaticCast(SrcT x)
Definition g3d_Inlines.h:237
DstT FastCast(SrcT x)
NW_G3D_FORCE_INLINE const void * AddOffset(const void *ptr, size_t offset)
Definition g3d_Inlines.h:27
NW_G3D_FORCE_INLINE int CountTrailingZeros(bit32 x)
Definition g3d_Inlines.h:298
NW_G3D_FORCE_INLINE void StoreRevU32(u32 *addr, u32 data)
Definition g3d_Inlines.h:91
NW_G3D_FORCE_INLINE const ResultT * AddOffset(const void *ptr, size_t offset)
Definition g3d_Inlines.h:41
NW_G3D_FORCE_INLINE void StoreRevU16(u16 *addr, u16 data)
Definition g3d_Inlines.h:114
NW_G3D_FORCE_INLINE const void * Align(const void *ptr, size_t alignment=DEFAULT_ALIGNMENT)
Definition g3d_Inlines.h:60
NW_G3D_FORCE_INLINE void Copy32(void *pDst, const void *pSrc, int count)
Definition g3d_Inlines.h:125
NW_G3D_FORCE_INLINE u32 LoadRevU32(const u32 *addr)
Definition g3d_Inlines.h:78
NW_G3D_FORCE_INLINE void * Align(void *ptr, size_t alignment=DEFAULT_ALIGNMENT)
Definition g3d_Inlines.h:54
NW_G3D_FORCE_INLINE int CountLeadingZeros(bit32 x)
Definition g3d_Inlines.h:283
NW_G3D_FORCE_INLINE ResultT * AddOffset(void *ptr, size_t offset)
Definition g3d_Inlines.h:34
NW_G3D_FORCE_INLINE bool IsAligned(size_t size, size_t alignment=DEFAULT_ALIGNMENT)
Definition g3d_Inlines.h:66
NW_G3D_FORCE_INLINE void * AddOffset(void *ptr, size_t offset)
Definition g3d_Inlines.h:21
NW_G3D_FORCE_INLINE size_t Align(size_t size, size_t alignment=DEFAULT_ALIGNMENT)
Definition g3d_Inlines.h:46
@ DEFAULT_ALIGNMENT
Definition g3d_Inlines.h:12
NW_G3D_FORCE_INLINE u16 LoadRevU16(const u16 *addr)
Definition g3d_Inlines.h:102
Definition g3d_GfxManage.cpp:10