From d7b780901d7cba1eb9828c43071fcaaa2cb4e5ea Mon Sep 17 00:00:00 2001 From: krickw Date: Thu, 11 Jun 2020 11:19:28 -0400 Subject: [PATCH 1/5] Track changes to render tags more carefully to avoid setting the tags every refresh. --- .../vp2RenderDelegate/proxyRenderDelegate.cpp | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index e4e914de02..cc6b6ffc5c 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -823,24 +823,11 @@ void ProxyRenderDelegate::_UpdateRenderTags() } } - // When the render tag on an rprim changes we do a pass over all rprims to update - // their visibility. The frame after we do the pass over all the tags, set the tags back to - // the minimum set of tags. - if (!_taskRenderTagsValid) { - TfTokenVector renderTags - = { HdRenderTagTokens->geometry }; // always draw geometry render tag purpose. - if (_proxyShapeData->DrawRenderPurpose()) { - renderTags.push_back(HdRenderTagTokens->render); - } - if (_proxyShapeData->DrawProxyPurpose()) { - renderTags.push_back(HdRenderTagTokens->proxy); - } - if (_proxyShapeData->DrawGuidePurpose()) { - renderTags.push_back(HdRenderTagTokens->guide); - } - _taskController->SetRenderTags(renderTags); - _taskRenderTagsValid = true; - } + // The renderTagsVersion increments when the render tags on an rprim changes, or when the + // global render tags are set. Check to see if the render tags version has changed since + // the last time we set the render tags so we know if there is a change to an individual + // rprim or not. + bool rprimRenderTagChanged = (_renderTagVersion == changeTracker.GetRenderTagVersion()); // Vp2RenderDelegate implements render tags as a per-render item setting. // To handle cases when an rprim changes from a displayed tag to a hidden tag @@ -849,16 +836,33 @@ void ProxyRenderDelegate::_UpdateRenderTags() // render tags to be all the tags. // When an rprim has it's renderTag changed the global render tag version // id will change. - const int renderTagVersion = changeTracker.GetRenderTagVersion(); - if (renderTagVersion != _renderTagVersion) { + if (rprimRenderTagChanged) + { TfTokenVector renderTags = { HdRenderTagTokens->geometry, HdRenderTagTokens->render, HdRenderTagTokens->proxy, HdRenderTagTokens->guide }; _taskController->SetRenderTags(renderTags); _taskRenderTagsValid = false; - _renderTagVersion = renderTagVersion; } + // When the render tag on an rprim changes we do a pass over all rprims to update + // their visibility. The frame after we do the pass over all the tags, set the tags back to + // the minimum set of tags. + else if (!_taskRenderTagsValid) { + TfTokenVector renderTags = { HdRenderTagTokens->geometry }; // always draw geometry render tag purpose. + if (_proxyShapeData->DrawRenderPurpose()) { + renderTags.push_back(HdRenderTagTokens->render); + } + if (_proxyShapeData->DrawProxyPurpose()) { + renderTags.push_back(HdRenderTagTokens->proxy); + } + if (_proxyShapeData->DrawGuidePurpose()) { + renderTags.push_back(HdRenderTagTokens->guide); + } + _taskController->SetRenderTags(renderTags); + _taskRenderTagsValid = true; + } + _renderTagVersion = changeTracker.GetRenderTagVersion(); } //! \brief List the rprims in collection that match renderTags From 1c50f8b99ff0a0d54b226d2f48105fbed5b838dc Mon Sep 17 00:00:00 2001 From: krickw Date: Thu, 11 Jun 2020 14:18:58 -0400 Subject: [PATCH 2/5] More correctness fixes for purpose. --- .../render/vp2RenderDelegate/basisCurves.cpp | 55 ++++++++++++++++++- .../render/vp2RenderDelegate/basisCurves.h | 2 + lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp | 20 +++++-- .../vp2RenderDelegate/proxyRenderDelegate.cpp | 10 +++- .../vp2RenderDelegate/proxyRenderDelegate.h | 3 + 5 files changed, 83 insertions(+), 7 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp index 126c610bf9..d264729408 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp @@ -548,6 +548,22 @@ void HdVP2BasisCurves::Sync( return; } + // We don't update the repr if it is hidden by the render tags (purpose) + // of the ProxyRenderDelegate. In additional, we need to hide any already + // existing render items because they should not be drawn. + auto* const param = static_cast(_delegate->GetRenderParam()); + ProxyRenderDelegate& drawScene = param->GetDrawScene(); + if (!drawScene.DrawRenderTag(delegate->GetRenderIndex().GetRenderTag(GetId()))) { + _HideAllDrawItems(reprToken); + *dirtyBits &= ~( HdChangeTracker::DirtyRenderTag +#if USD_VERSION_NUM <= 2005 + // Purpose changing marks visibility dirty instead of render tag. + | HdChangeTracker::DirtyVisibility +#endif + ); + return; + } + MProfilingScope profilingScope(HdVP2RenderDelegate::sProfilerCategory, MProfiler::kColorC_L2, _rprimId.asChar(), "HdVP2BasisCurves::Sync"); @@ -632,7 +648,12 @@ void HdVP2BasisCurves::Sync( _sharedData.visible = delegate->GetVisible(id); } - if (*dirtyBits & HdChangeTracker::DirtyRenderTag) { + if (*dirtyBits & (HdChangeTracker::DirtyRenderTag +#if USD_VERSION_NUM <= 2005 + //purpose changing sets DirtyVisibility instead of DirtyRenderTag + |HdChangeTracker::DirtyVisibility +#endif + )) { _curvesSharedData._renderTag = delegate->GetRenderTag(id); } @@ -1651,6 +1672,38 @@ HdDirtyBits HdVP2BasisCurves::GetInitialDirtyBitsMask() const return bits; } +void HdVP2BasisCurves::_HideAllDrawItems(const TfToken& reprToken) { + HdReprSharedPtr const& curRepr = _GetRepr(reprToken); + if (!curRepr) { + return; + } + + _BasisCurvesReprConfig::DescArray reprDescs = _GetReprDesc(reprToken); + + // For each relevant draw item, update dirty buffer sources. + int drawItemIndex = 0; + for (size_t descIdx = 0; descIdx < reprDescs.size(); ++descIdx) { + const HdBasisCurvesReprDesc& desc = reprDescs[descIdx]; + if (desc.geomStyle == HdBasisCurvesGeomStyleInvalid) { + continue; + } + + auto* drawItem = static_cast(curRepr->GetDrawItem(drawItemIndex++)); + if (!drawItem) + continue; + MHWRender::MRenderItem* renderItem = drawItem->GetRenderItem(); + if (!renderItem) + continue; + + HdVP2DrawItem::RenderItemData& drawItemData(drawItem->GetRenderItemData()); + drawItemData._enabled = false; + + _delegate->GetVP2ResourceRegistry().EnqueueCommit([renderItem]() { + renderItem->enable(false); + }); + } +} + /*! \brief Update _primvarSourceMap, our local cache of raw primvar data. This function pulls data from the scene delegate, but defers processing. diff --git a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.h b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.h index d18eaec024..95c3122339 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.h @@ -116,6 +116,8 @@ class HdVP2BasisCurves final: public HdBasisCurves HdVP2DrawItem *drawItem, HdBasisCurvesReprDesc const &desc); + void _HideAllDrawItems(const TfToken& reprToken); + void _UpdatePrimvarSources( HdSceneDelegate *sceneDelegate, HdDirtyBits dirtyBits, diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp index 7dd7ecc846..7c0bc158ad 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp @@ -372,10 +372,12 @@ void HdVP2Mesh::Sync( ProxyRenderDelegate& drawScene = param->GetDrawScene(); if (!drawScene.DrawRenderTag(delegate->GetRenderIndex().GetRenderTag(GetId()))) { _HideAllDrawItems(reprToken); - // clearing visibility here is wrong. It is a work around to handle purpose changing - // marking visibility dirty instead of render tag. See UsdImagingGprimAdapter::ProcessPropertyChange - // for where this happens. - *dirtyBits &= ~( HdChangeTracker::DirtyRenderTag | HdChangeTracker::DirtyVisibility ); + *dirtyBits &= ~( HdChangeTracker::DirtyRenderTag +#if USD_VERSION_NUM <= 2005 + // Purpose changing marks visibility dirty instead of render tag. + | HdChangeTracker::DirtyVisibility +#endif + ); return; } @@ -495,7 +497,12 @@ void HdVP2Mesh::Sync( _sharedData.visible = delegate->GetVisible(id); } - if (*dirtyBits & HdChangeTracker::DirtyRenderTag) { + if (*dirtyBits & (HdChangeTracker::DirtyRenderTag +#if USD_VERSION_NUM <= 2005 + //purpose changing sets DirtyVisibility instead of DirtyRenderTag + |HdChangeTracker::DirtyVisibility +#endif + )) { _meshSharedData._renderTag = delegate->GetRenderTag(id); } @@ -1587,6 +1594,9 @@ void HdVP2Mesh::_HideAllDrawItems(const TfToken& reprToken) { if (!renderItem) continue; + HdVP2DrawItem::RenderItemData& drawItemData(drawItem->GetRenderItemData()); + drawItemData._enabled = false; + _delegate->GetVP2ResourceRegistry().EnqueueCommit([renderItem]() { renderItem->enable(false); }); diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index cc6b6ffc5c..5715bd423c 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -827,7 +827,12 @@ void ProxyRenderDelegate::_UpdateRenderTags() // global render tags are set. Check to see if the render tags version has changed since // the last time we set the render tags so we know if there is a change to an individual // rprim or not. - bool rprimRenderTagChanged = (_renderTagVersion == changeTracker.GetRenderTagVersion()); + bool rprimRenderTagChanged = (_renderTagVersion != changeTracker.GetRenderTagVersion()); +#if USD_VERSION_NUM <= 2005 + // in v20.05 and earlier when the purpose of an rprim changes the visibility gets dirtied, + // and that doesn't update the render tag version. + rprimRenderTagChanged = rprimRenderTagChanged || ( _visibilityVersion != changeTracker.GetVisibilityChangeCount()); +#endif // Vp2RenderDelegate implements render tags as a per-render item setting. // To handle cases when an rprim changes from a displayed tag to a hidden tag @@ -863,6 +868,9 @@ void ProxyRenderDelegate::_UpdateRenderTags() _taskRenderTagsValid = true; } _renderTagVersion = changeTracker.GetRenderTagVersion(); +#if USD_VERSION_NUM <= 2005 + _visibilityVersion = changeTracker.GetVisibilityChangeCount(); +#endif } //! \brief List the rprims in collection that match renderTags diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h index b6018375cb..c3149b3142 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h @@ -196,6 +196,9 @@ class ProxyRenderDelegate : public MHWRender::MPxSubSceneOverride //! The render tag version used the last time render tags were updated int _renderTagVersion { 0 }; // initialized to 1 in HdChangeTracker, so we'll always have an // invalid version the first update. +#if USD_VERSION_NUM <= 2005 + int _visibilityVersion { 0 }; // initialized to 1 in HdChangeTracker. +#endif bool _taskRenderTagsValid { false }; //!< If false the render tags on the dummy render task are not the minimum set of tags. //! A collection of Rprims being selected From 25afd80f43a422b7b25c9e1551990d612fe12b61 Mon Sep 17 00:00:00 2001 From: krickw Date: Thu, 11 Jun 2020 15:33:32 -0400 Subject: [PATCH 3/5] Fix linux compile error. --- lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h index c3149b3142..09cddb948e 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h @@ -194,10 +194,10 @@ class ProxyRenderDelegate : public MHWRender::MPxSubSceneOverride std::unique_ptr _defaultCollection; //! The render tag version used the last time render tags were updated - int _renderTagVersion { 0 }; // initialized to 1 in HdChangeTracker, so we'll always have an + unsigned int _renderTagVersion { 0 }; // initialized to 1 in HdChangeTracker, so we'll always have an // invalid version the first update. #if USD_VERSION_NUM <= 2005 - int _visibilityVersion { 0 }; // initialized to 1 in HdChangeTracker. + unsigned int _visibilityVersion { 0 }; // initialized to 1 in HdChangeTracker. #endif bool _taskRenderTagsValid { false }; //!< If false the render tags on the dummy render task are not the minimum set of tags. From 92c051c68d062a9105a63cfd237cefdd3b766ce9 Mon Sep 17 00:00:00 2001 From: krickw Date: Fri, 12 Jun 2020 10:25:34 -0400 Subject: [PATCH 4/5] Create a preprocessor macro to protect the workaround code. --- .../render/vp2RenderDelegate/basisCurves.cpp | 9 +++------ lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp | 9 +++------ .../vp2RenderDelegate/proxyRenderDelegate.cpp | 4 +--- .../render/vp2RenderDelegate/proxyRenderDelegate.h | 13 ++++++++++++- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp index d264729408..9e56b49c53 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp @@ -556,8 +556,7 @@ void HdVP2BasisCurves::Sync( if (!drawScene.DrawRenderTag(delegate->GetRenderIndex().GetRenderTag(GetId()))) { _HideAllDrawItems(reprToken); *dirtyBits &= ~( HdChangeTracker::DirtyRenderTag -#if USD_VERSION_NUM <= 2005 - // Purpose changing marks visibility dirty instead of render tag. +#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND | HdChangeTracker::DirtyVisibility #endif ); @@ -649,8 +648,7 @@ void HdVP2BasisCurves::Sync( } if (*dirtyBits & (HdChangeTracker::DirtyRenderTag -#if USD_VERSION_NUM <= 2005 - //purpose changing sets DirtyVisibility instead of DirtyRenderTag +#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND |HdChangeTracker::DirtyVisibility #endif )) { @@ -1695,8 +1693,7 @@ void HdVP2BasisCurves::_HideAllDrawItems(const TfToken& reprToken) { if (!renderItem) continue; - HdVP2DrawItem::RenderItemData& drawItemData(drawItem->GetRenderItemData()); - drawItemData._enabled = false; + drawItem->GetRenderItemData()._enabled = false; _delegate->GetVP2ResourceRegistry().EnqueueCommit([renderItem]() { renderItem->enable(false); diff --git a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp index 7c0bc158ad..d2f91a4ab2 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp @@ -373,8 +373,7 @@ void HdVP2Mesh::Sync( if (!drawScene.DrawRenderTag(delegate->GetRenderIndex().GetRenderTag(GetId()))) { _HideAllDrawItems(reprToken); *dirtyBits &= ~( HdChangeTracker::DirtyRenderTag -#if USD_VERSION_NUM <= 2005 - // Purpose changing marks visibility dirty instead of render tag. +#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND | HdChangeTracker::DirtyVisibility #endif ); @@ -498,8 +497,7 @@ void HdVP2Mesh::Sync( } if (*dirtyBits & (HdChangeTracker::DirtyRenderTag -#if USD_VERSION_NUM <= 2005 - //purpose changing sets DirtyVisibility instead of DirtyRenderTag +#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND |HdChangeTracker::DirtyVisibility #endif )) { @@ -1594,8 +1592,7 @@ void HdVP2Mesh::_HideAllDrawItems(const TfToken& reprToken) { if (!renderItem) continue; - HdVP2DrawItem::RenderItemData& drawItemData(drawItem->GetRenderItemData()); - drawItemData._enabled = false; + drawItem->GetRenderItemData()._enabled = false; _delegate->GetVP2ResourceRegistry().EnqueueCommit([renderItem]() { renderItem->enable(false); diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index 5715bd423c..00ebed469f 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -828,9 +828,7 @@ void ProxyRenderDelegate::_UpdateRenderTags() // the last time we set the render tags so we know if there is a change to an individual // rprim or not. bool rprimRenderTagChanged = (_renderTagVersion != changeTracker.GetRenderTagVersion()); -#if USD_VERSION_NUM <= 2005 - // in v20.05 and earlier when the purpose of an rprim changes the visibility gets dirtied, - // and that doesn't update the render tag version. +#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND rprimRenderTagChanged = rprimRenderTagChanged || ( _visibilityVersion != changeTracker.GetVisibilityChangeCount()); #endif diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h index 09cddb948e..3047a8f709 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h @@ -44,6 +44,17 @@ #define MAYA_ENABLE_UPDATE_FOR_SELECTION #endif +#define ENABLE_RENDERTAG_VISIBILITY_WORKAROUND +/* In USD v20.05 and earlier when the purpose of an rprim changes the visibility gets dirtied, + and that doesn't update the render tag version. + + Pixar is in the process of fixing this one as noted in: + https://groups.google.com/forum/#!topic/usd-interest/9pzFbtCEY-Y + + Logged as: + https://github.com/PixarAnimationStudios/USD/issues/1243 +*/ + PXR_NAMESPACE_OPEN_SCOPE class HdRenderDelegate; @@ -196,7 +207,7 @@ class ProxyRenderDelegate : public MHWRender::MPxSubSceneOverride //! The render tag version used the last time render tags were updated unsigned int _renderTagVersion { 0 }; // initialized to 1 in HdChangeTracker, so we'll always have an // invalid version the first update. -#if USD_VERSION_NUM <= 2005 +#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND unsigned int _visibilityVersion { 0 }; // initialized to 1 in HdChangeTracker. #endif bool _taskRenderTagsValid { false }; //!< If false the render tags on the dummy render task are not the minimum set of tags. From f41ad9263da4c743e965e2b520a513cc1cc0a385 Mon Sep 17 00:00:00 2001 From: krickw Date: Fri, 12 Jun 2020 11:29:05 -0400 Subject: [PATCH 5/5] Missed one preprocess macro. --- lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp index 00ebed469f..69e18692da 100644 --- a/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp +++ b/lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp @@ -866,7 +866,7 @@ void ProxyRenderDelegate::_UpdateRenderTags() _taskRenderTagsValid = true; } _renderTagVersion = changeTracker.GetRenderTagVersion(); -#if USD_VERSION_NUM <= 2005 +#ifdef ENABLE_RENDERTAG_VISIBILITY_WORKAROUND _visibilityVersion = changeTracker.GetVisibilityChangeCount(); #endif }