Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 2 additions & 0 deletions lib/mayaHydra/hydraExtensions/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ target_sources(${TARGET_NAME}
mayaHydraLibInterfaceImp.cpp
mayaUtils.cpp
mhBuildInfo.cpp
mhDgAccessLock.cpp
mixedUtils.cpp
mhWireframeColorInterfaceImp.cpp
mhLeadObjectPathTracker.cpp
Expand All @@ -27,6 +28,7 @@ set(HEADERS
mayaHydraLibInterface.h
mayaHydraLibInterfaceImp.h
mayaUtils.h
mhDgAccessLock.h
mixedUtils.h
mhWireframeColorInterfaceImp.h
mhLeadObjectPathTracker.h
Expand Down
6 changes: 1 addition & 5 deletions lib/mayaHydra/hydraExtensions/adapters/adapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,6 @@ TF_REGISTRY_FUNCTION(TfType) { TfType::Define<MayaHydraAdapter>(); }

namespace {

using LockType = std::recursive_mutex;
LockType dg_access_mutex;

// When an extension/dynamic attribute set changes on an rprim, also dirty extComputationPrimvars
// because the attribute may back a computation input. This is NOT emitted on topology changes
// (see doc/render_delegate_topology_vs_deformation.md).
Expand Down Expand Up @@ -207,8 +204,7 @@ HdPrimvarDescriptorVector MayaHydraAdapter::GetPrimvarDescriptors(HdInterpolatio
// All extension/dynamic attributes as custom primvars.
if (interpolation == HdInterpolationConstant) {
if (_extAttrMapNeedUpdate) {
// Apply a global lock to avoid race condition while doing parallel DG node evaluation.
std::lock_guard<LockType> lock(dg_access_mutex);
MayaHydra::DgAccessLock dgLock;
MAYAHYDRA_NS::GetExtensionAndDynamicAttributesFromNode(
GetNode(),
_extAttrNameToValueMap);
Expand Down
1 change: 1 addition & 0 deletions lib/mayaHydra/hydraExtensions/adapters/adapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <mayaHydraLib/api.h>

#include <mayaHydraLib/adapters/mhDirtyNotifier.h>
#include <mayaHydraLib/mhDgAccessLock.h>

#include <pxr/imaging/hd/sceneDelegate.h>
#include <pxr/pxr.h>
Expand Down
4 changes: 4 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/aiAreaLightAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@ class MayaHydraAiAreaLightAdapter : public MayaHydraLightAdapter
{
const TfToken& defaultLightType = HdPrimTypeTokens->rectLight;

MayaHydra::DgAccessLock dgLock;

// Get the light type
MStatus status;
MFnDependencyNode depNode(GetNode(), &status);
Expand Down Expand Up @@ -80,6 +82,8 @@ class MayaHydraAiAreaLightAdapter : public MayaHydraLightAdapter
paramName.GetText(),
GetDagPath().partialPathName().asChar());

MayaHydra::DgAccessLock dgLock;

MStatus status;
MFnDependencyNode depNode(GetNode(), &status);
if (!status) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ class MayaHydraAiSkyDomeLightAdapter : public MayaHydraLightAdapter

VtValue GetLightParamValue(const TfToken& paramName) override
{
MayaHydra::DgAccessLock dgLock;

MStatus status;
MFnDependencyNode light(GetNode(), &status);
if (ARCH_UNLIKELY(!status)) {
Expand Down
2 changes: 2 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/areaLightAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@ class MayaHydraAreaLightAdapter : public MayaHydraLightAdapter
paramName.GetText(),
GetDagPath().partialPathName().asChar());

MayaHydra::DgAccessLock dgLock;

auto sizeScaled = [=](int index) {
constexpr float defaultSizeForAreaLights[2] { 2.0f, 2.0f };
double scale[3] = { 1.0, 1.0, 1.0 };
Expand Down
2 changes: 2 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/cameraAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,8 @@ VtValue MayaHydraCameraAdapter::Get(const TfToken& key) { return MayaHydraShapeA

VtValue MayaHydraCameraAdapter::GetCameraParamValue(const TfToken& paramName)
{
MayaHydra::DgAccessLock dgLock;

constexpr double inchToMM = 25.4;

MStatus status;
Expand Down
2 changes: 2 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/customDagAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,8 @@ bool MayaHydraCustomDagAdapter::GetVisible()

VtDictionary MayaHydraCustomDagAdapter::GetNonDefaultMayaAttributes() const
{
MayaHydra::DgAccessLock dgLock;

VtDictionary attrs;
GetNonDefaultMayaAttributesFromNode(GetNode(), attrs);
return attrs;
Expand Down
13 changes: 13 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/dagAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,7 @@ GfMatrix4d MayaHydraDagAdapter::GetTransform()
_dagPath.partialPathName().asChar());

if (_invalidTransform) {
MayaHydra::DgAccessLock dgLock;
if (IsInstanced()) {
_transform.SetIdentity();
} else {
Expand All @@ -210,12 +211,15 @@ size_t
MayaHydraDagAdapter::SampleTransform(size_t maxSampleCount, float* times, GfMatrix4d* samples)
{
return GetMayaHydraSceneIndex()->SampleValues(maxSampleCount, times, samples, [&]() -> GfMatrix4d {
MayaHydra::DgAccessLock dgLock;
return GetGfMatrixFromMaya(_dagPath.inclusiveMatrix());
});
}

void MayaHydraDagAdapter::RefreshInstancingState()
{
MayaHydra::DgAccessLock dgLock;

MDagPathArray dags;
if (MDagPath::getAllPathsTo(GetDagPath().node(), dags)) {
_isInstanced = dags.length() > 1;
Expand Down Expand Up @@ -278,6 +282,8 @@ void MayaHydraDagAdapter::RemovePrim()

bool MayaHydraDagAdapter::UpdateVisibility()
{
MayaHydra::DgAccessLock dgLock;

if (ARCH_UNLIKELY(!GetDagPath().isValid())) {
return false;
}
Expand All @@ -303,6 +309,9 @@ VtIntArray MayaHydraDagAdapter::GetInstanceIndices(const SdfPath& prototypeId)
if (!IsInstanced()) {
return {};
}

MayaHydra::DgAccessLock dgLock;

MDagPathArray dags;
if (!MDagPath::getAllPathsTo(GetDagPath().node(), dags)) {
return {};
Expand Down Expand Up @@ -344,6 +353,8 @@ void MayaHydraDagAdapter::_AddHierarchyChangedCallbacks(MDagPath& dag)

SdfPath MayaHydraDagAdapter::GetInstancerID() const
{
MayaHydra::DgAccessLock dgLock;

MDagPathArray dags;
if (!MDagPath::getAllPathsTo(GetDagPath().node(), dags) || dags.length() <= 1) {
return {};
Expand All @@ -367,6 +378,8 @@ bool MayaHydraDagAdapter::_GetVisibility() const { return GetDagPath().isVisible
VtValue MayaHydraDagAdapter::GetInstancePrimvar(const TfToken& key)
{
if (key == _tokens->instanceTransform) {
MayaHydra::DgAccessLock dgLock;

MDagPathArray dags;
if (!MDagPath::getAllPathsTo(GetDagPath().node(), dags)) {
return {};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,8 @@ class MayaHydraDirectionalLightAdapter : public MayaHydraLightAdapter
GetDagPath().partialPathName().asChar());

if (key == HdLightTokens->shadowParams) {
MayaHydra::DgAccessLock dgLock;

HdxShadowParams shadowParams;
MFnDirectionalLight mayaLight(GetDagPath());
if (!GetShadowsEnabled(mayaLight)) {
Expand All @@ -96,6 +98,8 @@ class MayaHydraDirectionalLightAdapter : public MayaHydraLightAdapter
VtValue GetLightParamValue(const TfToken& paramName) override
{
if ((paramName == HdLightTokens->angle) || (paramName == UsdLuxTokens->inputsAngle)) {
MayaHydra::DgAccessLock dgLock;

MStatus status;
MFnDependencyNode lightNode(GetNode(), &status);
if (ARCH_UNLIKELY(!status)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,11 @@ void MayaHydraImagePlaneMaterialAdapter::CreateCallbacks()

VtValue MayaHydraImagePlaneMaterialAdapter::GetMaterialResource()
{
std::string imagePath = GetImagePlaneTexturePath(GetNode());
std::string imagePath;
{
MayaHydra::DgAccessLock dgLock;
imagePath = GetImagePlaneTexturePath(GetNode());
Comment thread
ppt-adsk marked this conversation as resolved.
}
if (imagePath.empty()) {
return GetPreviewMaterialResource(GetID());
}
Expand Down
10 changes: 10 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/lightAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -340,6 +340,8 @@ VtValue MayaHydraLightAdapter::Get(const TfToken& key)
GetDagPath().partialPathName().asChar());

if (key == HdLightTokens->params) {
MayaHydra::DgAccessLock dgLock;

MFnLight mayaLight(GetDagPath());
GlfSimpleLight light;
const auto color = mayaLight.color();
Expand Down Expand Up @@ -397,6 +399,8 @@ VtValue MayaHydraLightAdapter::Get(const TfToken& key)
coll.SetRootPaths(lightedPaths);
return VtValue(coll);
} else if (key == HdLightTokens->shadowParams) {
MayaHydra::DgAccessLock dgLock;

HdxShadowParams shadowParams;
MFnLight mayaLight(GetDagPath());
if (!GetShadowsEnabled(mayaLight)) {
Expand All @@ -412,6 +416,8 @@ VtValue MayaHydraLightAdapter::Get(const TfToken& key)

MayaHydraLightAdapter::MayaLightParams MayaHydraLightAdapter::GetMayaLightParams() const
{
MayaHydra::DgAccessLock dgLock;

MayaLightParams params;
MStatus status;
MFnDependencyNode lightDepNode(GetNode(), &status);
Expand Down Expand Up @@ -493,6 +499,8 @@ VtValue MayaHydraLightAdapter::GetLightParamValue(const TfToken& paramName)
paramName.GetText(),
GetDagPath().partialPathName().asChar());

MayaHydra::DgAccessLock dgLock;

MFnLight light(GetDagPath());

// Get Maya parameters (including Arnold attributes with "ai" prefix)
Expand Down Expand Up @@ -551,6 +559,8 @@ VtValue MayaHydraLightAdapter::GetLightMaterialNetwork() const
"Called MayaHydraLightAdapter::GetLightMaterialNetwork() - %s\n",
GetDagPath().partialPathName().asChar());

MayaHydra::DgAccessLock dgLock;

// Additional debugging for dome lights
const bool isSkyDomeLight = IsDagPathAnArnoldSkyDomeLight(GetDagPath());
if (isSkyDomeLight) {
Expand Down
4 changes: 4 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/materialAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,8 @@ class MayaHydraShadingEngineAdapter : public MayaHydraMaterialAdapter

void _CacheNodeAndTypes()
{
MayaHydra::DgAccessLock dgLock;

_surfaceShader = MObject::kNullObj;
_surfaceShaderType = _emptyToken;
MStatus status;
Expand Down Expand Up @@ -507,6 +509,8 @@ class MayaHydraShadingEngineAdapter : public MayaHydraMaterialAdapter
TF_DEBUG(MAYAHYDRALIB_ADAPTER_MATERIALS)
.Msg("MayaHydraShadingEngineAdapter::GetMaterialResource(): %s\n", GetID().GetText());

MayaHydra::DgAccessLock dgLock;

HdMaterialNetworkMap materialXNetworkMap;
if (PopulateMaterialXNetworkMap(materialXNetworkMap)) {
return VtValue(materialXNetworkMap);
Expand Down
18 changes: 18 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/meshAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Return face-varying UVs as a primvar value.
VtValue GetUVs()
{
MayaHydra::DgAccessLock dgLock;

MStatus status;
MFnMesh mesh(GetDagPath(), &status);
if (ARCH_UNLIKELY(!status)) {
Expand Down Expand Up @@ -234,6 +236,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Return face-varying tangents as a primvar value.
VtValue GetTangents()
{
MayaHydra::DgAccessLock dgLock;

MStatus status;
MFnMesh mesh(GetDagPath(), &status);
if (ARCH_UNLIKELY(!status)) {
Expand Down Expand Up @@ -268,6 +272,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Return vertex positions as a primvar value.
VtValue GetPoints()
{
MayaHydra::DgAccessLock dgLock;

MStatus status;
MFnMesh mesh(GetDagPath(), &status);
if (ARCH_UNLIKELY(!status)) {
Expand All @@ -286,6 +292,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Return face-varying normals as a primvar value.
VtValue GetNormals()
{
MayaHydra::DgAccessLock dgLock;

MStatus status;
MFnMesh mesh(GetDagPath(), &status);
if (ARCH_UNLIKELY(!status)) {
Expand Down Expand Up @@ -379,6 +387,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Build the mesh topology from the Maya mesh.
HdMeshTopology GetMeshTopology() override
{
MayaHydra::DgAccessLock dgLock;

MFnMesh mesh(GetDagPath());
const auto numPolygons = mesh.numPolygons();
VtIntArray faceVertexCounts;
Expand Down Expand Up @@ -406,6 +416,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Return display style based on smooth mesh settings.
HdDisplayStyle GetDisplayStyle() override
{
MayaHydra::DgAccessLock dgLock;

MStatus status;
MFnDependencyNode node(GetNode(), &status);
if (ARCH_UNLIKELY(!status)) {
Expand All @@ -424,6 +436,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Return subdivision tags (creases/corners) for smooth meshes.
PxOsdSubdivTags GetSubdivTags() override
{
MayaHydra::DgAccessLock dgLock;

PxOsdSubdivTags tags;
if (GetDisplayStyle().refineLevel < 1) {
return tags;
Expand Down Expand Up @@ -488,6 +502,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Return primvar descriptors for the requested interpolation.
HdPrimvarDescriptorVector GetPrimvarDescriptors(HdInterpolation interpolation) override
{
MayaHydra::DgAccessLock dgLock;

// Base descriptors
HdPrimvarDescriptorVector descs
= MayaHydraShapeAdapter::GetPrimvarDescriptors(interpolation);
Expand Down Expand Up @@ -525,6 +541,8 @@ class MayaHydraMeshAdapter : public MayaHydraShapeAdapter
/// Return whether the mesh is double-sided.
bool GetDoubleSided() const override
{
MayaHydra::DgAccessLock dgLock;

MFnMesh mesh(GetDagPath());
auto p = mesh.findPlug(MayaAttrs::mesh::doubleSided, true);
if (ARCH_UNLIKELY(p.isNull())) {
Expand Down
4 changes: 4 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/nurbsCurveAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ class MayaHydraNurbsCurveAdapter : public MayaHydraShapeAdapter
GetDagPath().partialPathName().asChar());

if (key == HdTokens->points) {
MayaHydra::DgAccessLock dgLock;

MFnNurbsCurve curve(GetDagPath());
MStatus status;
MPointArray pointArray;
Expand All @@ -147,6 +149,8 @@ class MayaHydraNurbsCurveAdapter : public MayaHydraShapeAdapter

HdBasisCurvesTopology GetBasisCurvesTopology() override
{
MayaHydra::DgAccessLock dgLock;

MFnNurbsCurve curve(GetDagPath());
const auto pointCount = curve.numCVs();

Expand Down
3 changes: 0 additions & 3 deletions lib/mayaHydra/hydraExtensions/adapters/pointLightAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@
#include <pxr/pxr.h>
#include <pxr/usd/usdLux/tokens.h>

#include <maya/MFnPointLight.h>

#include <memory>

PXR_NAMESPACE_OPEN_SCOPE
Expand Down Expand Up @@ -58,7 +56,6 @@ class MayaHydraPointLightAdapter : public MayaHydraLightAdapter
paramName.GetText(),
GetDagPath().partialPathName().asChar());

MFnPointLight light(GetDagPath());
if ((paramName == HdLightTokens->radius) || (paramName == UsdLuxTokens->inputsRadius)) {
// For point lights, use a default radius if the render delegate asks for it
constexpr float radius = 0.01f; // Default radius for point lights
Expand Down
3 changes: 3 additions & 0 deletions lib/mayaHydra/hydraExtensions/adapters/shapeAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,14 @@ MObject MayaHydraShapeAdapter::GetMaterial(const MObject& shadingComp)
"Called MayaHydraShapeAdapter::GetMaterial() - %s\n",
GetDagPath().partialPathName().asChar());

MayaHydra::DgAccessLock dgLock;
Comment thread
ppt-adsk marked this conversation as resolved.
return MayaHydra::FindShadingEngine(GetDagPath(), shadingComp);
}

GfBBox3d MayaHydraShapeAdapter::GetBoundingBox()
{
MayaHydra::DgAccessLock dgLock;

MFnDagNode node(GetDagPath());
MBoundingBox objBB = node.boundingBox();
MPoint minPt = objBB.min();
Expand Down
Loading
Loading