1 // 2 // Copyright 2021 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // CLBitField.h: A bit field class that encapsulates the cl_bitfield type. 7 8 #ifndef LIBANGLE_CLBITFIELD_H_ 9 #define LIBANGLE_CLBITFIELD_H_ 10 11 #include <angle_cl.h> 12 #include <ostream> 13 14 namespace cl 15 { 16 17 class BitField 18 { 19 public: BitField()20 BitField() noexcept : mBits(0u) {} BitField(cl_bitfield bits)21 explicit BitField(cl_bitfield bits) noexcept : mBits(bits) {} 22 23 BitField &operator=(cl_bitfield bits) 24 { 25 mBits = bits; 26 return *this; 27 } 28 29 bool operator==(cl_bitfield bits) const { return mBits == bits; } 30 bool operator!=(cl_bitfield bits) const { return mBits != bits; } 31 bool operator==(const BitField &other) const { return mBits == other.mBits; } 32 bool operator!=(const BitField &other) const { return mBits != other.mBits; } 33 get()34 cl_bitfield get() const { return mBits; } 35 intersects(cl_bitfield bits)36 bool intersects(cl_bitfield bits) const { return (mBits & bits) != 0u; } intersects(const BitField & other)37 bool intersects(const BitField &other) const { return (mBits & other.mBits) != 0u; } excludes(cl_bitfield bits)38 bool excludes(cl_bitfield bits) const { return !intersects(bits); } excludes(const BitField & other)39 bool excludes(const BitField &other) const { return !intersects(other); } 40 hasOtherBitsThan(cl_bitfield bits)41 bool hasOtherBitsThan(cl_bitfield bits) const { return (mBits & ~bits) != 0u; } hasOtherBitsThan(const BitField & other)42 bool hasOtherBitsThan(const BitField &other) const { return (mBits & ~other.mBits) != 0u; } 43 areMutuallyExclusive(cl_bitfield bits1,cl_bitfield bits2)44 bool areMutuallyExclusive(cl_bitfield bits1, cl_bitfield bits2) const 45 { 46 return (intersects(bits1) ? 1 : 0) + (intersects(bits2) ? 1 : 0) <= 1; 47 } 48 areMutuallyExclusive(cl_bitfield bits1,cl_bitfield bits2,cl_bitfield bits3)49 bool areMutuallyExclusive(cl_bitfield bits1, cl_bitfield bits2, cl_bitfield bits3) const 50 { 51 return (intersects(bits1) ? 1 : 0) + (intersects(bits2) ? 1 : 0) + 52 (intersects(bits3) ? 1 : 0) <= 53 1; 54 } 55 mask(cl_bitfield bits)56 BitField mask(cl_bitfield bits) const { return BitField(mBits & bits); } mask(const BitField & other)57 BitField mask(const BitField &other) const { return BitField(mBits & other.mBits); } 58 set(cl_bitfield bits)59 void set(cl_bitfield bits) { mBits |= bits; } set(const BitField & other)60 void set(const BitField &other) { mBits |= other.mBits; } clear(cl_bitfield bits)61 void clear(cl_bitfield bits) { mBits &= ~bits; } clear(const BitField & other)62 void clear(const BitField &other) { mBits &= ~other.mBits; } 63 64 private: 65 cl_bitfield mBits; 66 }; 67 68 static_assert(sizeof(BitField) == sizeof(cl_bitfield), "Type size mismatch"); 69 70 using DeviceType = BitField; 71 using DeviceFpConfig = BitField; 72 using DeviceExecCapabilities = BitField; 73 using DeviceSvmCapabilities = BitField; 74 using CommandQueueProperties = BitField; 75 using DeviceAffinityDomain = BitField; 76 using MemFlags = BitField; 77 using SVM_MemFlags = BitField; 78 using MemMigrationFlags = BitField; 79 using MapFlags = BitField; 80 using KernelArgTypeQualifier = BitField; 81 using DeviceAtomicCapabilities = BitField; 82 using DeviceEnqueueCapabilities = BitField; 83 84 } // namespace cl 85 86 #endif // LIBANGLE_CLBITFIELD_H_ 87