//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. //============================================================================ #include #include namespace vtkm { namespace cont { namespace detail { } // namespace detail BitField::BitField() { this->Buffer.SetMetaData(internal::BitFieldMetaData{}); } vtkm::Id BitField::GetNumberOfBits() const { return this->Buffer.GetMetaData().NumberOfBits; } void BitField::Allocate(vtkm::Id numberOfBits, vtkm::CopyFlag preserve, vtkm::cont::Token& token) const { const vtkm::BufferSizeType bytesNeeded = (numberOfBits + CHAR_BIT - 1) / CHAR_BIT; const vtkm::BufferSizeType blocksNeeded = (bytesNeeded + BlockSize - 1) / BlockSize; const vtkm::BufferSizeType numBytes = blocksNeeded * BlockSize; VTKM_LOG_F(vtkm::cont::LogLevel::MemCont, "BitField Allocation: %llu bits, blocked up to %s bytes.", static_cast(numberOfBits), vtkm::cont::GetSizeString(static_cast(numBytes)).c_str()); this->Buffer.SetNumberOfBytes(numBytes, preserve, token); this->Buffer.GetMetaData().NumberOfBits = numberOfBits; } void BitField::FillImpl(const void* word, vtkm::BufferSizeType wordSize, vtkm::cont::Token& token) const { this->Buffer.Fill(word, wordSize, 0, this->Buffer.GetNumberOfBytes(), token); } void BitField::ReleaseResourcesExecution() { this->Buffer.ReleaseDeviceResources(); } void BitField::ReleaseResources() { vtkm::cont::Token token; this->Buffer.SetNumberOfBytes(0, vtkm::CopyFlag::Off, token); this->Buffer.GetMetaData().NumberOfBits = 0; } void BitField::SyncControlArray() const { vtkm::cont::Token token; this->Buffer.ReadPointerHost(token); } bool BitField::IsOnDevice(vtkm::cont::DeviceAdapterId device) const { return this->Buffer.IsAllocatedOnDevice(device); } BitField::WritePortalType BitField::WritePortal() const { vtkm::cont::Token token; return WritePortalType(this->Buffer.WritePointerHost(token), this->Buffer.GetMetaData().NumberOfBits); } BitField::ReadPortalType BitField::ReadPortal() const { vtkm::cont::Token token; return ReadPortalType(this->Buffer.ReadPointerHost(token), this->Buffer.GetMetaData().NumberOfBits); } BitField::ReadPortalType BitField::PrepareForInput(vtkm::cont::DeviceAdapterId device, vtkm::cont::Token& token) const { return ReadPortalType(this->Buffer.ReadPointerDevice(device, token), this->Buffer.GetMetaData().NumberOfBits); } BitField::WritePortalType BitField::PrepareForOutput(vtkm::Id numBits, vtkm::cont::DeviceAdapterId device, vtkm::cont::Token& token) const { this->Allocate(numBits, vtkm::CopyFlag::Off, token); return WritePortalType(this->Buffer.WritePointerDevice(device, token), this->Buffer.GetMetaData().NumberOfBits); } BitField::WritePortalType BitField::PrepareForInPlace(vtkm::cont::DeviceAdapterId device, vtkm::cont::Token& token) const { return WritePortalType(this->Buffer.WritePointerDevice(device, token), this->Buffer.GetMetaData().NumberOfBits); } } } // namespace vtkm::cont