2020-08-24 21:26:57 +00:00
|
|
|
//============================================================================
|
|
|
|
// 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 <vtkm/cont/BitField.h>
|
|
|
|
#include <vtkm/cont/Logging.h>
|
|
|
|
|
|
|
|
namespace vtkm
|
|
|
|
{
|
|
|
|
namespace cont
|
|
|
|
{
|
|
|
|
|
|
|
|
namespace detail
|
|
|
|
{
|
|
|
|
|
|
|
|
} // namespace detail
|
|
|
|
|
|
|
|
BitField::BitField()
|
|
|
|
{
|
2020-11-10 23:22:05 +00:00
|
|
|
this->Buffer.SetMetaData(internal::BitFieldMetaData{});
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
vtkm::Id BitField::GetNumberOfBits() const
|
|
|
|
{
|
2020-11-10 23:22:05 +00:00
|
|
|
return this->Buffer.GetMetaData<internal::BitFieldMetaData>().NumberOfBits;
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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<unsigned long long>(numberOfBits),
|
|
|
|
vtkm::cont::GetSizeString(static_cast<vtkm::UInt64>(numBytes)).c_str());
|
|
|
|
|
|
|
|
this->Buffer.SetNumberOfBytes(numBytes, preserve, token);
|
2020-11-10 23:22:05 +00:00
|
|
|
this->Buffer.GetMetaData<internal::BitFieldMetaData>().NumberOfBits = numberOfBits;
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
2022-01-03 18:51:25 +00:00
|
|
|
void BitField::FillImpl(const void* word,
|
|
|
|
vtkm::BufferSizeType wordSize,
|
|
|
|
vtkm::cont::Token& token) const
|
|
|
|
{
|
2022-01-11 14:15:41 +00:00
|
|
|
this->Buffer.Fill(word, wordSize, 0, this->Buffer.GetNumberOfBytes(), token);
|
2022-01-03 18:51:25 +00:00
|
|
|
}
|
|
|
|
|
2020-08-24 21:26:57 +00:00
|
|
|
void BitField::ReleaseResourcesExecution()
|
|
|
|
{
|
|
|
|
this->Buffer.ReleaseDeviceResources();
|
|
|
|
}
|
|
|
|
|
|
|
|
void BitField::ReleaseResources()
|
|
|
|
{
|
|
|
|
vtkm::cont::Token token;
|
|
|
|
this->Buffer.SetNumberOfBytes(0, vtkm::CopyFlag::Off, token);
|
2020-11-10 23:22:05 +00:00
|
|
|
this->Buffer.GetMetaData<internal::BitFieldMetaData>().NumberOfBits = 0;
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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),
|
2020-11-10 23:22:05 +00:00
|
|
|
this->Buffer.GetMetaData<internal::BitFieldMetaData>().NumberOfBits);
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BitField::ReadPortalType BitField::ReadPortal() const
|
|
|
|
{
|
|
|
|
vtkm::cont::Token token;
|
|
|
|
return ReadPortalType(this->Buffer.ReadPointerHost(token),
|
2020-11-10 23:22:05 +00:00
|
|
|
this->Buffer.GetMetaData<internal::BitFieldMetaData>().NumberOfBits);
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BitField::ReadPortalType BitField::PrepareForInput(vtkm::cont::DeviceAdapterId device,
|
|
|
|
vtkm::cont::Token& token) const
|
|
|
|
{
|
|
|
|
return ReadPortalType(this->Buffer.ReadPointerDevice(device, token),
|
2020-11-10 23:22:05 +00:00
|
|
|
this->Buffer.GetMetaData<internal::BitFieldMetaData>().NumberOfBits);
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
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),
|
2020-11-10 23:22:05 +00:00
|
|
|
this->Buffer.GetMetaData<internal::BitFieldMetaData>().NumberOfBits);
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
BitField::WritePortalType BitField::PrepareForInPlace(vtkm::cont::DeviceAdapterId device,
|
|
|
|
vtkm::cont::Token& token) const
|
|
|
|
{
|
|
|
|
return WritePortalType(this->Buffer.WritePointerDevice(device, token),
|
2020-11-10 23:22:05 +00:00
|
|
|
this->Buffer.GetMetaData<internal::BitFieldMetaData>().NumberOfBits);
|
2020-08-24 21:26:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
} // namespace vtkm::cont
|