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