1//
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions
4// are met:
5// * Redistributions of source code must retain the above copyright
6// notice, this list of conditions and the following disclaimer.
7// * Redistributions in binary form must reproduce the above copyright
8// notice, this list of conditions and the following disclaimer in the
9// documentation and/or other materials provided with the distribution.
10// * Neither the name of NVIDIA CORPORATION nor the names of its
11// contributors may be used to endorse or promote products derived
12// from this software without specific prior written permission.
13//
14// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
15// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25//
26// Copyright (c) 2008-2021 NVIDIA Corporation. All rights reserved.
27// Copyright (c) 2004-2008 AGEIA Technologies, Inc. All rights reserved.
28// Copyright (c) 2001-2004 NovodeX AG. All rights reserved.
29
30#ifndef PSFOUNDATION_PSBITUTILS_H
31#define PSFOUNDATION_PSBITUTILS_H
32
33#include "foundation/PxIntrinsics.h"
34#include "foundation/PxAssert.h"
35#include "PsIntrinsics.h"
36#include "Ps.h"
37
38namespace physx
39{
40namespace shdfnd
41{
42PX_INLINE uint32_t bitCount(uint32_t v)
43{
44 // from http://graphics.stanford.edu/~seander/bithacks.html#CountBitsSetParallel
45 uint32_t const w = v - ((v >> 1) & 0x55555555);
46 uint32_t const x = (w & 0x33333333) + ((w >> 2) & 0x33333333);
47 return (((x + (x >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
48}
49
50PX_INLINE bool isPowerOfTwo(uint32_t x)
51{
52 return x != 0 && (x & (x - 1)) == 0;
53}
54
55// "Next Largest Power of 2
56// Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm
57// that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with
58// the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next
59// largest power of 2. For a 32-bit value:"
60PX_INLINE uint32_t nextPowerOfTwo(uint32_t x)
61{
62 x |= (x >> 1);
63 x |= (x >> 2);
64 x |= (x >> 4);
65 x |= (x >> 8);
66 x |= (x >> 16);
67 return x + 1;
68}
69
70/*!
71Return the index of the highest set bit. Not valid for zero arg.
72*/
73
74PX_INLINE uint32_t lowestSetBit(uint32_t x)
75{
76 PX_ASSERT(x);
77 return lowestSetBitUnsafe(v: x);
78}
79
80/*!
81Return the index of the highest set bit. Not valid for zero arg.
82*/
83
84PX_INLINE uint32_t highestSetBit(uint32_t x)
85{
86 PX_ASSERT(x);
87 return highestSetBitUnsafe(v: x);
88}
89
90// Helper function to approximate log2 of an integer value
91// assumes that the input is actually power of two.
92// todo: replace 2 usages with 'highestSetBit'
93PX_INLINE uint32_t ilog2(uint32_t num)
94{
95 for(uint32_t i = 0; i < 32; i++)
96 {
97 num >>= 1;
98 if(num == 0)
99 return i;
100 }
101
102 PX_ASSERT(0);
103 return uint32_t(-1);
104}
105
106} // namespace shdfnd
107} // namespace physx
108
109#endif // #ifndef PSFOUNDATION_PSBITUTILS_H
110

source code of qtquick3dphysics/src/3rdparty/PhysX/source/foundation/include/PsBitUtils.h