From 546a1d14a241a2e9e62395834734065fa1cf67b0 Mon Sep 17 00:00:00 2001 From: Sujin Philip Date: Fri, 15 Mar 2019 16:47:32 -0400 Subject: [PATCH] VariantArrayHandle should report run time NumberOfComponents Query and report number of components at runtime so that it can work with arrays of types with runtime varying number of components Eg. ArrayHandleGroupVecVariable. --- vtkm/cont/VariantArrayHandle.cxx | 9 ++--- .../internal/VariantArrayHandleContainer.h | 36 ++++++++++++++++--- .../testing/UnitTestDynamicTransform.cxx | 1 + .../testing/UnitTestVariantArrayHandle.cxx | 3 ++ 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/vtkm/cont/VariantArrayHandle.cxx b/vtkm/cont/VariantArrayHandle.cxx index 880e4dd8e..a17fd4dc7 100644 --- a/vtkm/cont/VariantArrayHandle.cxx +++ b/vtkm/cont/VariantArrayHandle.cxx @@ -32,15 +32,12 @@ namespace internal { VariantArrayHandleContainerBase::VariantArrayHandleContainerBase() - : NumberOfComponents(0) - , TypeIndex(typeid(nullptr)) + : TypeIndex(typeid(nullptr)) { } -VariantArrayHandleContainerBase::VariantArrayHandleContainerBase(vtkm::IdComponent numComps, - const std::type_info& typeinfo) - : NumberOfComponents(numComps) - , TypeIndex(typeinfo) +VariantArrayHandleContainerBase::VariantArrayHandleContainerBase(const std::type_info& typeinfo) + : TypeIndex(typeinfo) { } diff --git a/vtkm/cont/internal/VariantArrayHandleContainer.h b/vtkm/cont/internal/VariantArrayHandleContainer.h index 53d098a13..d3758d271 100644 --- a/vtkm/cont/internal/VariantArrayHandleContainer.h +++ b/vtkm/cont/internal/VariantArrayHandleContainer.h @@ -47,17 +47,16 @@ namespace internal /// struct VTKM_CONT_EXPORT VariantArrayHandleContainerBase { - vtkm::IdComponent NumberOfComponents; std::type_index TypeIndex; VariantArrayHandleContainerBase(); - VariantArrayHandleContainerBase(vtkm::IdComponent numComps, const std::type_info& hash); + explicit VariantArrayHandleContainerBase(const std::type_info& hash); // This must exist so that subclasses are destroyed correctly. virtual ~VariantArrayHandleContainerBase(); virtual vtkm::Id GetNumberOfValues() const = 0; - inline vtkm::IdComponent GetNumberOfComponents() const { return NumberOfComponents; } + virtual vtkm::IdComponent GetNumberOfComponents() const = 0; virtual void ReleaseResourcesExecution() = 0; virtual void ReleaseResources() = 0; @@ -79,15 +78,16 @@ template struct VTKM_ALWAYS_EXPORT VariantArrayHandleContainer final : public VariantArrayHandleContainerBase { vtkm::cont::ArrayHandleVirtual Array; + mutable vtkm::IdComponent NumberOfComponents = 0; VariantArrayHandleContainer() - : VariantArrayHandleContainerBase(vtkm::VecTraits::NUM_COMPONENTS, typeid(T)) + : VariantArrayHandleContainerBase(typeid(T)) , Array() { } VariantArrayHandleContainer(const vtkm::cont::ArrayHandleVirtual& array) - : VariantArrayHandleContainerBase(vtkm::VecTraits::NUM_COMPONENTS, typeid(T)) + : VariantArrayHandleContainerBase(typeid(T)) , Array(array) { } @@ -96,6 +96,19 @@ struct VTKM_ALWAYS_EXPORT VariantArrayHandleContainer final : public VariantArra vtkm::Id GetNumberOfValues() const { return this->Array.GetNumberOfValues(); } + vtkm::IdComponent GetNumberOfComponents() const override + { + // Cache number of components to avoid unnecessary device to host transfers of the array. + // Also assumes that the number of components is constant accross all elements and + // throughout the life of the array. + if (this->NumberOfComponents == 0) + { + this->NumberOfComponents = + this->GetNumberOfComponents(typename vtkm::VecTraits::IsSizeStatic{}); + } + return this->NumberOfComponents; + } + void ReleaseResourcesExecution() { this->Array.ReleaseResourcesExecution(); } void ReleaseResources() { this->Array.ReleaseResources(); } @@ -108,6 +121,19 @@ struct VTKM_ALWAYS_EXPORT VariantArrayHandleContainer final : public VariantArra { return std::make_shared>(this->Array.NewInstance()); } + +private: + vtkm::IdComponent GetNumberOfComponents(VecTraitsTagSizeStatic) const + { + return vtkm::VecTraits::NUM_COMPONENTS; + } + + vtkm::IdComponent GetNumberOfComponents(VecTraitsTagSizeVariable) const + { + return (this->Array.GetNumberOfValues() == 0) + ? 0 + : vtkm::VecTraits::GetNumberOfComponents(this->Array.GetPortalConstControl().Get(0)); + } }; namespace variant diff --git a/vtkm/cont/internal/testing/UnitTestDynamicTransform.cxx b/vtkm/cont/internal/testing/UnitTestDynamicTransform.cxx index f9e790ccc..ef64bc30b 100644 --- a/vtkm/cont/internal/testing/UnitTestDynamicTransform.cxx +++ b/vtkm/cont/internal/testing/UnitTestDynamicTransform.cxx @@ -39,6 +39,7 @@ namespace vtkm template <> struct VecTraits { + using IsSizeStatic = vtkm::VecTraitsTagSizeStatic; static constexpr vtkm::IdComponent NUM_COMPONENTS = 1; using HasMultipleComponents = vtkm::VecTraitsTagSingleComponent; }; diff --git a/vtkm/cont/testing/UnitTestVariantArrayHandle.cxx b/vtkm/cont/testing/UnitTestVariantArrayHandle.cxx index 92638db32..2a9dd9d1a 100644 --- a/vtkm/cont/testing/UnitTestVariantArrayHandle.cxx +++ b/vtkm/cont/testing/UnitTestVariantArrayHandle.cxx @@ -54,6 +54,7 @@ namespace vtkm template <> struct VecTraits { + using IsSizeStatic = vtkm::VecTraitsTagSizeStatic; static constexpr vtkm::IdComponent NUM_COMPONENTS = 1; using HasMultipleComponents = vtkm::VecTraitsTagSingleComponent; }; @@ -156,6 +157,8 @@ void BasicArrayVariantChecks(const vtkm::cont::VariantArrayHandleBase& { VTKM_TEST_ASSERT(array.GetNumberOfValues() == ARRAY_SIZE, "Dynamic array reports unexpected size."); + std::cout << "array.GetNumberOfComponents() = " << array.GetNumberOfComponents() << ", " + << "numComponents = " << numComponents << "\n"; VTKM_TEST_ASSERT(array.GetNumberOfComponents() == numComponents, "Dynamic array reports unexpected number of components."); }