Merge topic 'arrayhandlediscard-use-buffer'

cc729f422 Convert ArrayHandleDiscard to new buffer-style arrays

Acked-by: Kitware Robot <kwrobot@kitware.com>
Acked-by: Robert Maynard <robert.maynard@kitware.com>
Merge-request: !2309
This commit is contained in:
Kenneth Moreland 2020-11-10 14:45:13 +00:00 committed by Kitware Robot
commit 917ad80a85
5 changed files with 86 additions and 89 deletions

@ -0,0 +1,45 @@
//============================================================================
// 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/ArrayHandleDiscard.h>
namespace vtkm
{
namespace cont
{
namespace internal
{
BufferMetaDataDiscard::~BufferMetaDataDiscard() = default;
std::unique_ptr<vtkm::cont::internal::BufferMetaData> BufferMetaDataDiscard::DeepCopy() const
{
return std::unique_ptr<vtkm::cont::internal::BufferMetaData>(new BufferMetaDataDiscard(*this));
}
vtkm::cont::internal::BufferMetaDataDiscard* GetDiscardMetaData(
const vtkm::cont::internal::Buffer& buffer)
{
vtkm::cont::internal::BufferMetaData* generalMetadata = buffer.GetMetaData();
if (generalMetadata == nullptr)
{
buffer.SetMetaData(vtkm::cont::internal::BufferMetaDataDiscard{});
generalMetadata = buffer.GetMetaData();
}
vtkm::cont::internal::BufferMetaDataDiscard* metadata =
dynamic_cast<vtkm::cont::internal::BufferMetaDataDiscard*>(buffer.GetMetaData());
VTKM_ASSERT(metadata && "Buffer for discard array does not have correct metadata.");
return metadata;
}
}
}
} // namespace vtkm::cont::internal

@ -88,111 +88,57 @@ struct VTKM_ALWAYS_EXPORT StorageTagDiscard
{
};
template <typename ValueType_>
class Storage<ValueType_, StorageTagDiscard>
struct VTKM_CONT_EXPORT BufferMetaDataDiscard : vtkm::cont::internal::BufferMetaData
{
public:
using ValueType = ValueType_;
using PortalType = vtkm::exec::internal::ArrayPortalDiscard<ValueType>;
using PortalConstType = vtkm::exec::internal::ArrayPortalDiscard<ValueType>;
vtkm::Id NumberOfValues = 0;
VTKM_CONT
Storage() {}
VTKM_CONT ~BufferMetaDataDiscard() override;
VTKM_CONT
PortalType GetPortal() { return PortalType(this->NumberOfValues); }
VTKM_CONT
PortalConstType GetPortalConst() { return PortalConstType(this->NumberOfValues); }
VTKM_CONT
vtkm::Id GetNumberOfValues() const { return this->NumberOfValues; }
VTKM_CONT
void Allocate(vtkm::Id numValues) { this->NumberOfValues = numValues; }
VTKM_CONT
void Shrink(vtkm::Id numValues) { this->NumberOfValues = numValues; }
VTKM_CONT
void ReleaseResources() { this->NumberOfValues = 0; }
private:
vtkm::Id NumberOfValues;
VTKM_CONT std::unique_ptr<vtkm::cont::internal::BufferMetaData> DeepCopy() const override;
};
template <typename ValueType_, typename DeviceAdapter_>
class ArrayTransfer<ValueType_, StorageTagDiscard, DeviceAdapter_>
VTKM_CONT_EXPORT vtkm::cont::internal::BufferMetaDataDiscard* GetDiscardMetaData(
const vtkm::cont::internal::Buffer& buffer);
template <typename ValueType>
class Storage<ValueType, StorageTagDiscard>
{
using StorageTag = StorageTagDiscard;
using StorageType = Storage<ValueType_, StorageTag>;
public:
using ValueType = ValueType_;
using PortalControl = typename StorageType::PortalType;
using PortalConstControl = typename StorageType::PortalConstType;
using PortalExecution = vtkm::exec::internal::ArrayPortalDiscard<ValueType>;
using PortalConstExecution = vtkm::exec::internal::ArrayPortalDiscard<ValueType>;
using WritePortalType = vtkm::exec::internal::ArrayPortalDiscard<ValueType>;
VTKM_CONT
ArrayTransfer(StorageType* storage)
: Internal(storage)
// Note that this portal is write-only, so you will probably run into problems if
// you actually try to use this read portal.
using ReadPortalType = vtkm::exec::internal::ArrayPortalDiscard<ValueType>;
VTKM_CONT static vtkm::IdComponent GetNumberOfBuffers() { return 1; }
VTKM_CONT static void ResizeBuffers(vtkm::Id numValues,
vtkm::cont::internal::Buffer* buffers,
vtkm::CopyFlag,
vtkm::cont::Token&)
{
VTKM_ASSERT(numValues >= 0);
vtkm::cont::internal::GetDiscardMetaData(buffers[0])->NumberOfValues = numValues;
}
VTKM_CONT
vtkm::Id GetNumberOfValues() const
VTKM_CONT static vtkm::Id GetNumberOfValues(const vtkm::cont::internal::Buffer* buffers)
{
VTKM_ASSERT(this->Internal != nullptr);
return this->Internal->GetNumberOfValues();
return vtkm::cont::internal::GetDiscardMetaData(buffers[0])->NumberOfValues;
}
VTKM_CONT
PortalConstExecution PrepareForInput(bool vtkmNotUsed(updateData), vtkm::cont::Token&)
VTKM_CONT static ReadPortalType CreateReadPortal(const vtkm::cont::internal::Buffer*,
vtkm::cont::DeviceAdapterId,
vtkm::cont::Token&)
{
throw vtkm::cont::ErrorBadValue("Input access not supported: "
"Cannot read from an ArrayHandleDiscard.");
throw vtkm::cont::ErrorBadValue("Cannot read from ArrayHandleDiscard.");
}
VTKM_CONT
PortalExecution PrepareForInPlace(bool vtkmNotUsed(updateData), vtkm::cont::Token&)
VTKM_CONT static WritePortalType CreateWritePortal(vtkm::cont::internal::Buffer* buffers,
vtkm::cont::DeviceAdapterId,
vtkm::cont::Token&)
{
throw vtkm::cont::ErrorBadValue("InPlace access not supported: "
"Cannot read from an ArrayHandleDiscard.");
return WritePortalType(GetNumberOfValues(buffers));
}
VTKM_CONT
PortalExecution PrepareForOutput(vtkm::Id numValues, vtkm::cont::Token&)
{
VTKM_ASSERT(this->Internal != nullptr);
this->Internal->Allocate(numValues);
return PortalConstExecution(this->Internal->GetNumberOfValues());
}
VTKM_CONT
void RetrieveOutputData(StorageType* storage) const
{
VTKM_ASSERT(storage == this->Internal);
(void)storage;
// no-op
}
VTKM_CONT
void Shrink(vtkm::Id numValues)
{
VTKM_ASSERT(this->Internal != nullptr);
this->Internal->Shrink(numValues);
}
VTKM_CONT
void ReleaseResources()
{
VTKM_ASSERT(this->Internal != nullptr);
this->Internal->ReleaseResources();
}
private:
StorageType* Internal;
};
template <typename ValueType_>
@ -205,6 +151,10 @@ struct ArrayHandleDiscardTraits
} // end namespace internal
// This can go away once ArrayHandle is replaced with ArrayHandleNewStyle
template <typename T>
VTKM_ARRAY_HANDLE_NEW_STYLE(T, vtkm::cont::internal::StorageTagDiscard);
/// ArrayHandleDiscard is a write-only array that discards all data written to
/// it. This can be used to save memory when a filter provides optional outputs
/// that are not needed.

@ -136,6 +136,7 @@ set(template_sources
set(sources
ArrayHandle.cxx
ArrayHandleBasic.cxx
ArrayHandleDiscard.cxx
ArrayHandleImplicit.cxx
ArrayHandleSOA.cxx
BitField.cxx

@ -642,7 +642,7 @@ vtkm::cont::internal::BufferMetaData* Buffer::GetMetaData() const
return this->Internals->MetaData.get();
}
void Buffer::SetMetaData(std::unique_ptr<vtkm::cont::internal::BufferMetaData>&& metadata)
void Buffer::SetMetaData(std::unique_ptr<vtkm::cont::internal::BufferMetaData>&& metadata) const
{
this->Internals->MetaData = std::move(metadata);
}

@ -145,7 +145,8 @@ public:
/// This form of SetMetaData takes an rvalue to a unique_ptr holding the metadata to
/// ensure that the object is properly managed.
///
VTKM_CONT void SetMetaData(std::unique_ptr<vtkm::cont::internal::BufferMetaData>&& metadata);
VTKM_CONT void SetMetaData(
std::unique_ptr<vtkm::cont::internal::BufferMetaData>&& metadata) const;
/// \brief Sets the metadata for the buffer.
///
@ -153,7 +154,7 @@ public:
/// must be a subclass of BufferMetaData or you will get a compile error.
///
template <typename MetaDataType>
VTKM_CONT void SetMetaData(const MetaDataType& metadata)
VTKM_CONT void SetMetaData(const MetaDataType& metadata) const
{
this->SetMetaData(
std::unique_ptr<vtkm::cont::internal::BufferMetaData>(new MetaDataType(metadata)));