Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MAYA-105284 Track changes to render tags more carefully to avoid setting the tags #587

Merged
merged 5 commits into from
Jun 13, 2020
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 54 additions & 1 deletion lib/mayaUsd/render/vp2RenderDelegate/basisCurves.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<HdVP2RenderParam*>(_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");

Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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<HdVP2DrawItem*>(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.
Expand Down
2 changes: 2 additions & 0 deletions lib/mayaUsd/render/vp2RenderDelegate/basisCurves.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
20 changes: 15 additions & 5 deletions lib/mayaUsd/render/vp2RenderDelegate/mesh.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
});
Expand Down
54 changes: 33 additions & 21 deletions lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -823,24 +823,16 @@ 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());
#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
Expand All @@ -849,16 +841,36 @@ 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();
#if USD_VERSION_NUM <= 2005
_visibilityVersion = changeTracker.GetVisibilityChangeCount();
#endif
}

//! \brief List the rprims in collection that match renderTags
Expand Down
5 changes: 4 additions & 1 deletion lib/mayaUsd/render/vp2RenderDelegate/proxyRenderDelegate.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,11 @@ class ProxyRenderDelegate : public MHWRender::MPxSubSceneOverride
std::unique_ptr<HdRprimCollection> _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
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.

//! A collection of Rprims being selected
Expand Down