From a17d432720c42d6c6605e02f4eb4d86134545c1f Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Tue, 29 Nov 2022 12:19:30 -0500 Subject: [PATCH 1/2] Reimplement shared VP2 render item counter to avoid using MRenderItem::setCustomData method, which causes a huge performance regression in Maya --- .../render/vp2RenderDelegate/draw_item.cpp | 71 +++++-------------- .../render/vp2RenderDelegate/draw_item.h | 10 ++- lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp | 2 +- 3 files changed, 22 insertions(+), 61 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp b/lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp index 431fea806d..1ba527038e 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp @@ -19,38 +19,8 @@ #include -#include - PXR_NAMESPACE_OPEN_SCOPE -namespace { -class HdVP2DrawItemUserData : public MUserData -{ -public: -#if MAYA_API_VERSION >= 20220000 - HdVP2DrawItemUserData() { } -#else - HdVP2DrawItemUserData() - : MUserData(true) - { - } -#endif - ~HdVP2DrawItemUserData() override { } - - int increaseUseCount() { return ++_useCount; } - int decreaseUseCount() { return --_useCount; } - -private: - // A render item can be shared between Reprs. We need to track usage so it only gets removed - // from the subscene once all references are gone. - int _useCount = 0; -}; - -#if MAYA_API_VERSION >= 20220000 -using HdVP2DrawItemUserDataPtr = MSharedPtr; -#endif -} // namespace - /*! \brief Constructor. Data holder for its corresponding render item to facilitate parallelized evaluation. @@ -78,14 +48,8 @@ HdVP2DrawItem::~HdVP2DrawItem() MSubSceneContainer* subSceneContainer = param ? param->GetContainer() : nullptr; if (subSceneContainer) { for (const auto& renderItemData : _renderItems) { -#if MAYA_API_VERSION >= 20220000 - auto sharingData = HdVP2DrawItemUserDataPtr::dynamic_pointer_cast<>( - renderItemData._renderItem->getCustomData()); -#else - HdVP2DrawItemUserData* sharingData = dynamic_cast( - renderItemData._renderItem->customData()); -#endif - if (!sharingData || sharingData->decreaseUseCount() == 0) { + const auto& sharedRenderItemCounter = renderItemData._sharedRenderItemCounter; + if (!sharedRenderItemCounter || (--(*sharedRenderItemCounter)) == 0) { TF_VERIFY(renderItemData._renderItemName == renderItemData._renderItem->name()); subSceneContainer->remove(renderItemData._renderItem->name()); } @@ -105,22 +69,6 @@ HdVP2DrawItem::AddRenderItem(MHWRender::MRenderItem* item, const HdGeomSubset* g renderItemData._renderItem = item; renderItemData._renderItemName = item->name(); renderItemData._enabled = item->isEnabled(); -#if MAYA_API_VERSION >= 20220000 - auto sharingData = HdVP2DrawItemUserDataPtr::dynamic_pointer_cast<>(item->getCustomData()); -#else - HdVP2DrawItemUserData* sharingData - = dynamic_cast(renderItemData._renderItem->customData()); -#endif - if (!sharingData) { - // create the custom data -#if MAYA_API_VERSION >= 20220000 - sharingData = HdVP2DrawItemUserDataPtr(new HdVP2DrawItemUserData()); -#else - sharingData = new HdVP2DrawItemUserData(); -#endif - item->setCustomData(sharingData); - } - sharingData->increaseUseCount(); if (geomSubset) { renderItemData._geomSubset = *geomSubset; } @@ -131,6 +79,21 @@ HdVP2DrawItem::AddRenderItem(MHWRender::MRenderItem* item, const HdGeomSubset* g return renderItemData; } +void HdVP2DrawItem::ShareRenderItem(HdVP2DrawItem& sourceDrawItem) +{ + TF_VERIFY(_renderItems.size() == 0); + RenderItemData& srcData = sourceDrawItem.GetRenderItemData(); + AddRenderItem(srcData._renderItem); + + if (!srcData._sharedRenderItemCounter) { + srcData._sharedRenderItemCounter = std::make_shared(1); + } + + RenderItemData& dstData = GetRenderItemData(); + dstData._sharedRenderItemCounter = srcData._sharedRenderItemCounter; + ++(*dstData._sharedRenderItemCounter); +} + /* static */ SdfPath HdVP2DrawItem::RenderItemToPrimPath(const MHWRender::MRenderItem& item) { diff --git a/lib/mayaUsd/render/vp2RenderDelegate/draw_item.h b/lib/mayaUsd/render/vp2RenderDelegate/draw_item.h index adcd3239e9..1bfbf363b5 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/draw_item.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/draw_item.h @@ -47,6 +47,8 @@ class HdVP2DrawItem final : public HdDrawItem MString _renderItemName; //! Pointer of the render item for fast access. No ownership is held. MHWRender::MRenderItem* _renderItem { nullptr }; + //! If the render item is shared, this will store the shared counter + std::shared_ptr _sharedRenderItemCounter; //! The geom subset this render item represents. _geomSubset.id is StdPath::EmptyPath() if //! there is no geom subset. @@ -163,13 +165,9 @@ class HdVP2DrawItem final : public HdDrawItem */ MHWRender::MRenderItem* GetRenderItem() const { return GetRenderItemData()._renderItem; } - /*! \brief Set pointer of the associated render item + /*! \brief Shares a single render item between the source and the destination draw items */ - void SetRenderItem(MHWRender::MRenderItem* item) - { - TF_VERIFY(_renderItems.size() == 0); - AddRenderItem(item); - } + void ShareRenderItem(HdVP2DrawItem& sourceDrawItem); /*! \brief Set a usage to the render item */ diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp index af10ab48b6..fbe5f88922 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp @@ -1226,7 +1226,7 @@ void HdVP2Mesh::_InitRepr(const TfToken& reprToken, HdDirtyBits* dirtyBits) #endif if (shDrawItem && shDrawItem->MatchesUsage(HdVP2DrawItem::kSelectionHighlight)) { - drawItem->SetRenderItem(shDrawItem->GetRenderItem()); + drawItem->ShareRenderItem(*shDrawItem); foundShared = true; break; } From f2a446a1981b24714c92d74cb55c5f628835f1b3 Mon Sep 17 00:00:00 2001 From: Ivan Vlasov Date: Tue, 29 Nov 2022 12:24:35 -0500 Subject: [PATCH 2/2] clang formatting --- lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp b/lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp index 1ba527038e..0c688eb1a8 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/draw_item.cpp @@ -48,7 +48,7 @@ HdVP2DrawItem::~HdVP2DrawItem() MSubSceneContainer* subSceneContainer = param ? param->GetContainer() : nullptr; if (subSceneContainer) { for (const auto& renderItemData : _renderItems) { - const auto& sharedRenderItemCounter = renderItemData._sharedRenderItemCounter; + const auto& sharedRenderItemCounter = renderItemData._sharedRenderItemCounter; if (!sharedRenderItemCounter || (--(*sharedRenderItemCounter)) == 0) { TF_VERIFY(renderItemData._renderItemName == renderItemData._renderItem->name()); subSceneContainer->remove(renderItemData._renderItem->name());