-
Notifications
You must be signed in to change notification settings - Fork 0
Cortex 9, Arnold 5, exploratory PR #1
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
base: 9_exploratory
Are you sure you want to change the base?
Conversation
This is needed for some of the Arnold tests to pass.
…passed due to substantial watermarks baked into the bright values of the comparison image. We now assume tests will run with a license, and I've regenerated the comparison image
…lues of rendered pixels, to account for floating point error in filter normalization. ( I couldn't figure out any easy way to swtich to a box filter )
…amples to reliably converge ( in Arnold 4, the tests were passing due to good luck )
…till exist in Arnold 5
…requires undocumented functions
…red in the header, and instead use accessor functions
…tructor for the writable UniverseBlock will always call it anyway
…to no output In Gaffer::IECoreArnoldPreview or Cortex10, there are options to set verbosity Currently, without this, we would dump a huge pile of output every time you made a UniverseBlock just to query metadata or something.
… can check it ( There is no way to do this through Cortex 9 at the moment, so we use Arnold's python API )
johnhaddon
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
All looks good to me - just minor comments that aren't particularly important. Thanks for getting everything up to date, even for the stuff that'll get deleted pretty soon. My plan is to port over those existing tests to work with the IECoreArnoldPreview::Renderer when that moves to Cortex, so having them updated is great.
| arnoldTest = arnoldTestEnv.Command( "contrib/IECoreArnold/test/IECoreArnold/results.txt", arnoldPythonModule, pythonExecutable + " $TEST_ARNOLD_SCRIPT" ) | ||
| NoCache( arnoldTest ) | ||
| arnoldTestEnv.Depends( arnoldTest, [ arnoldPythonModule + arnoldProceduralForTest + arnoldDriverForTest ] ) | ||
| arnoldTestEnv.Depends( arnoldTest, [ arnoldPythonModule + arnoldProceduralForTest + arnoldDriverForTest + arnoldLibrary ] ) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm surprised this is necessary, since arnoldPythonModule already depends on arnoldLibrary.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The issue is the cache. If you make a change to arnoldLibrary that does not produce any changes in the python/IECoreArnold/_IECoreArnold.so binary, then the cache considers the test to have already been run with this exact set of inputs.
| { | ||
| const Imath::M44f v( data->readable() ); | ||
| AiNodeSetMatrix( node, name, const_cast<float (*)[4]>( v.x ) ); | ||
| AiNodeSetMatrix( node, name, *reinterpret_cast<AtMatrix*>( const_cast<float(*)[4][4]>( &v.x ) ) ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we really need all the nested casting? I don't suppose reinterpret_cast<const AtMatrix &>( v ) work?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think at the time, I felt better about being more explicit about the reason this cast works is that the classes can be cast to float[4][4] - but you're right that this is pretty ugly. I'll go ahead and change this
| /// Arnold does not support non-uniform sampling. It just takes a start and end time, and assume | ||
| /// the samples are distributed evenly between them. We need to throw an exception if given data | ||
| /// we can't render. | ||
| void ensureUniformTimeSamples( const std::vector<float> × ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can we just make this internal to the Renderer class? I'm trying to minimise the API surface area...
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I currently use this from both IECoreArnold::RendererImplementation and GafferArnold::IECoreArnoldPreview::Renderer, so I need it to be public. I can add a /todo to make it private in Cortex 10 when we don't have this split.
| } | ||
|
|
||
| m_motionTimes.insert( m_motionTimes.end(), times.begin(), times.end() ); | ||
| // TODO - is it worth the time to do this, in order to avoid silently giving incorrect results? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems unlikely to have significant overhead compared to the rest of the work we're doing.
| NodeAlgo::ensureUniformTimeSamples( timesVector ); | ||
|
|
||
| m_motionStart = *times.begin(); | ||
| m_motionEnd = *(--times.end()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
timesVector.back() might be a bit more idiomatic?
|
|
||
| const FloatData *pixelAspectRatio = cortexCamera->parametersData()->member<FloatData>( "pixelAspectRatio" ); | ||
| AiNodeSetFlt( options, "aspect_ratio", 1.0f / pixelAspectRatio->readable() ); // arnold is y/x, we're x/y | ||
| AiNodeSetFlt( options, "pixel_aspect_ratio", 1.0f / pixelAspectRatio->readable() ); // arnold is y/x, we're x/y |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I could have sworn I saw something saying that they'd also changed the interpretation to be x/y - am I wrong about that?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah - good catch, thanks, will fix.
| // just like built in nodes - we don't reference the filename of the dso that defines the node type. | ||
| // So here we just interpret "filename" as the node type to create. | ||
| // Where should this be documented. Should we change the name of the parameter to ExternalProcedural | ||
| // to be something other than "filename" in Cortex 10? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Seems reasonable, maybe just calling it "name" is generic enough? Let's not mix that up with the Arnold update though - what you have here seems fine for now.
| AiParameterArray( "parameterValues", AiArray(0, 1, AI_TYPE_STRING) ); | ||
| } | ||
|
|
||
| procedural_init |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For what it's worth, I hate the way Arnold uses macros to obfuscate the function parameters, and I explicitly wrote out the signatures instead so they were obvious.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
OK, though I liked having less typing ...
| void begin() | ||
| { | ||
| AiBegin(); | ||
| // Default to logging errors / warnings only - we may not even be using this universe block to perform a render, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So Arnold 5 defaults to all logging being on?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not sure if it is all logging, maybe it was reporting the paths it was loading shaders from into "info"? It was a lot of annoying output every time you instantiated a universe block anyway
`DisplayTileCallbackFactory::create()` returned the same DisplayTileCallback instance every time, and up until now took responsibility for deleting it. This has always been sketchy because Appleseed holds the returned DisplayTileCallback's with `auto_release_ptr`, so `DisplayTileCallback::release()` must avoid double deletes by just doing nothing. This worked if `DisplayTileCallback::release()` was called before `DisplayTileCallbackFactory::release()`, but Appleseed 2.1 has reversed the call order so that the factory is destroyed before the callback is. This means `DisplayTileCallback::release()` is called on an already-deleted instance, and crashes, with a stack trace like so : ``` #0 0x0000000000000000 in ?? () #1 0x00007fffe18153a6 in foundation::auto_release_ptr<renderer::ITileCallback>::reset (this=0x7fff8c012148, ptr=0x0) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/foundation/utility/autoreleaseptr.h:187 ImageEngine#2 0x00007fffe181137f in renderer::(anonymous namespace)::ProgressiveFrameRenderer::~ProgressiveFrameRenderer (this=0x7fff8c0120a0, __in_chrg=<optimized out>) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/renderer/kernel/rendering/progressive/progressiveframerenderer.cpp:178 ImageEngine#3 0x00007fffe1811592 in renderer::(anonymous namespace)::ProgressiveFrameRenderer::~ProgressiveFrameRenderer (this=0x7fff8c0120a0, __in_chrg=<optimized out>) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/renderer/kernel/rendering/progressive/progressiveframerenderer.cpp:187 ImageEngine#4 0x00007fffe18115ca in renderer::(anonymous namespace)::ProgressiveFrameRenderer::release (this=0x7fff8c0120a0) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/renderer/kernel/rendering/progressive/progressiveframerenderer.cpp:191 ImageEngine#5 0x00007fffe1712fb7 in foundation::auto_release_ptr<renderer::IFrameRenderer>::~auto_release_ptr (this=0x7fff8c01f928, __in_chrg=<optimized out>) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/foundation/utility/autoreleaseptr.h:124 ImageEngine#6 0x00007fffe17121be in renderer::RendererComponents::~RendererComponents (this=0x7fff8c01f890, __in_chrg=<optimized out>) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/renderer/kernel/rendering/renderercomponents.h:73 ImageEngine#7 0x00007fffe1712288 in std::default_delete<renderer::RendererComponents>::operator() (this=0x7fff8c000ae0, __ptr=0x7fff8c01f890) at /opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/unique_ptr.h:76 ImageEngine#8 0x00007fffe1711e0d in std::unique_ptr<renderer::RendererComponents, std::default_delete<renderer::RendererComponents> >::reset (this=0x7fff8c000ae0, __p=0x7fff8c01f890) at /opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/unique_ptr.h:347 ImageEngine#9 0x00007fffe1710632 in renderer::CPURenderDevice::~CPURenderDevice (this=0x7fff8c0009b0, __in_chrg=<optimized out>) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/renderer/device/cpu/cpurenderdevice.cpp:112 ImageEngine#10 0x00007fffe1710988 in renderer::CPURenderDevice::~CPURenderDevice (this=0x7fff8c0009b0, __in_chrg=<optimized out>) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/renderer/device/cpu/cpurenderdevice.cpp:129 ImageEngine#11 0x00007fffe181f21c in std::default_delete<renderer::IRenderDevice>::operator() (this=0x3093868, __ptr=0x7fff8c0009b0) at /opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/unique_ptr.h:76 ImageEngine#12 0x00007fffe181eafd in std::unique_ptr<renderer::IRenderDevice, std::default_delete<renderer::IRenderDevice> >::~unique_ptr (this=0x3093868, __in_chrg=<optimized out>) at /opt/rh/devtoolset-6/root/usr/include/c++/6.3.1/bits/unique_ptr.h:239 ImageEngine#13 0x00007fffe181d545 in renderer::MasterRenderer::Impl::~Impl (this=0x3093820, __in_chrg=<optimized out>) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/renderer/kernel/rendering/masterrenderer.cpp:168 ImageEngine#14 0x00007fffe181cfdb in renderer::MasterRenderer::~MasterRenderer (this=0x3088d70, __in_chrg=<optimized out>) at /disk1/john/dev/gafferDependencies/Appleseed/working/appleseed-2.1.0-beta/src/appleseed/renderer/kernel/rendering/masterrenderer.cpp:584 ImageEngine#15 0x00007fffc67d0ae0 in (anonymous namespace)::AppleseedRenderer::~AppleseedRenderer() () from /disk1/john/dev/build/gaffer/lib/libGafferAppleseed.so ImageEngine#16 0x00007fffd8a734b6 in GafferScene::InteractiveRender::stop() () from /disk1/john/dev/build/gaffer/lib/libGafferScene.so ImageEngine#17 0x00007fffd8a735bf in GafferScene::InteractiveRender::update() () from /disk1/john/dev/build/gaffer/lib/libGafferScene.so ``` The solution here is to return a new DisplayTileCallback every time `DisplayTileCallbackFactory::create()` is called, and to destroy those the regular way in `DisplayTileCallback::release()`. This works fine for interactive renders, because Appleseed will only ever make a single DisplayTileCallback at a time. For batch renders it is completely broken though, because Appleseed will call `DisplayTileCallbackFactory::create()` once per thread, and every thread will end up writing to a different display driver. So far we've only used the display driver for interactive renders though, so maybe this is OK.
…r is computing.
I noticed crashes when the SceneCacheReader property panel was displayed and you would change frame or
filter the scene tag.
The following traceback indicates that it was related with refresh the SceneView widget.
This is likely something fundamentally flawed with the node ( as Nuke often complains
we are updating knob inside the _validate).
Futhermore, we should be able to use native Nuke node once we start using Nuke 14+ and
its USD support ( using our SceneCacheDataFormat AbstractFormat USD plugin ).
The trick is to avoid updating the widget when it's already up to date.
While testing,I couldnt reproduce the crash I saw when changing the filtering
and the "loading" of location in the Nuke 3d system.
```
0 0x0000000080000017 in ?? ()
1 0x00007fa26c59fee2 in QObject::disconnect(QObject const*, char const*, QObject const*, char const*) () from /software/apps/nuke/13.2v8/cent7.x86_64/libQt5Core.so.5
2 0x00007fa26d341e90 in QTreeView::setModel(QAbstractItemModel*) () from /software/apps/nuke/13.2v8/cent7.x86_64/libQt5Widgets.so.5
3 0x00007fa25b1a089c in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libnuke-13.2.8.so
4 0x00007fa25aae2656 in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libnuke-13.2.8.so
5 0x00007fa25aaec3f9 in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libnuke-13.2.8.so
6 0x00007fa175dc56e9 in IECoreNuke::SceneCacheReader::filterScene(std::string const&, std::string const&, bool) ()
from /software/apps/cortex/10.4.10.0/cent7.x86_64/nuke/13.2/lib/libIECoreNuke-10.4.so
7 0x00007fa175dc6065 in IECoreNuke::SceneCacheReader::_validate(bool) () from /software/apps/cortex/10.4.10.0/cent7.x86_64/nuke/13.2/lib/libIECoreNuke-10.4.so
8 0x00007fa2597faf3b in DD::Image::Op::force_validate(bool) () from /software/apps/nuke/13.2v8/cent7.x86_64/libDDImage.so
9 0x00007fa175da9794 in IECoreNuke::LiveScene::geometryList(DD::Image::Op*, double const&) const ()
from /software/apps/cortex/10.4.10.0/cent7.x86_64/nuke/13.2/lib/libIECoreNuke-10.4.so
10 0x00007fa175da9dc9 in IECoreNuke::LiveScene::geometryList(double const&) const () from /software/apps/cortex/10.4.10.0/cent7.x86_64/nuke/13.2/lib/libIECoreNuke-10.4.so
11 0x00007fa175daa860 in IECoreNuke::LiveScene::cacheGeometryList(double const&) const () from /software/apps/cortex/10.4.10.0/cent7.x86_64/nuke/13.2/lib/libIECoreNuke-10.4.so
12 0x00007fa175dab8f2 in IECoreNuke::LiveScene::objectNum(double const*) const () from /software/apps/cortex/10.4.10.0/cent7.x86_64/nuke/13.2/lib/libIECoreNuke-10.4.so
13 0x00007fa175dacedb in IECoreNuke::LiveScene::childNames(std::vector<IECore::InternedString, std::allocator<IECore::InternedString> >&) const ()
from /software/apps/cortex/10.4.10.0/cent7.x86_64/nuke/13.2/lib/libIECoreNuke-10.4.so
14 0x00007fa1298fbca9 in CaribouNuke::CaribouSceneReader::computeChildNames(std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > const&, Gaffer::Context const*, GafferScene::ScenePlug const*) const () from /home/lucienf/apps/caribou/4.2.2dev/gaffer/1.2/tools/nuke/13.2/python/cent7.x86_64/cortex/10.4/CaribouNuke/_CaribouNuke.so
15 0x00007fa13530d444 in GafferScene::SceneNode::compute(Gaffer::ValuePlug*, Gaffer::Context const*) const ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGafferScene.so
16 0x00007fa148ec5340 in Gaffer::ValuePlug::ComputeProcess::ComputeProcess((anonymous namespace)::ComputeProcessKey const&) ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
17 0x00007fa148ece618 in Gaffer::ValuePlug::ComputeProcess::value(Gaffer::ValuePlug const*, IECore::MurmurHash const*) ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
18 0x00007fa148ec7f6a in Gaffer::ValuePlug::getValueInternal(IECore::MurmurHash const*) const () from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
19 0x00007fa148eba781 in boost::intrusive_ptr<IECore::TypedData<std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > > const> Gaffer::ValuePlug::getObjectValue<IECore::TypedData<std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > > >(IECore::MurmurHash const*) const ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
20 0x00007fa148ebab7a in Gaffer::TypedObjectPlug<IECore::TypedData<std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > > >::getValue(IECore::MurmurHash const*) const () from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
21 0x00007fa148ebabbe in Gaffer::TypedObjectPlug<IECore::TypedData<std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > > >::setFrom(Gaffer::ValuePlug const*)
() from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
22 0x00007fa148e36256 in Gaffer::NameSwitch::compute(Gaffer::ValuePlug*, Gaffer::Context const*) const ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
23 0x00007fa148ec5340 in Gaffer::ValuePlug::ComputeProcess::ComputeProcess((anonymous namespace)::ComputeProcessKey const&) ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
24 0x00007fa148ece618 in Gaffer::ValuePlug::ComputeProcess::value(Gaffer::ValuePlug const*, IECore::MurmurHash const*) ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
25 0x00007fa148ec7f6a in Gaffer::ValuePlug::getValueInternal(IECore::MurmurHash const*) const () from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
26 0x00007fa148eba781 in boost::intrusive_ptr<IECore::TypedData<std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > > const> Gaffer::ValuePlug::getObjectValue<IECore::TypedData<std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > > >(IECore::MurmurHash const*) const ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
27 0x00007fa148ebab7a in Gaffer::TypedObjectPlug<IECore::TypedData<std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > > >::getValue(IECore::MurmurHash const*) const () from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
28 0x00007fa1352c50ca in GafferScene::RenderController::SceneGraph::updateChildren(Gaffer::TypedObjectPlug<IECore::TypedData<std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > > > const*) () from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGafferScene.so
29 0x00007fa1352d9754 in GafferScene::RenderController::SceneGraph::update(std::vector<IECore::InternedString, std::allocator<IECore::InternedString> > const&, unsigned int, GafferScene::RenderController::SceneGraph::Type, GafferScene::RenderController*) () from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGafferScene.so
30 0x00007fa1352d9e1b in GafferScene::RenderController::SceneGraphUpdateTask::execute() () from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGafferScene.so
31 0x00007fa2568544ef in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libtbb.so.2
---Type <return> to continue, or q <return> to quit---
32 0x00007fa256851b00 in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libtbb.so.2
33 0x00007fa1352bb36e in GafferScene::RenderController::updateInternal(std::function<void (Gaffer::BackgroundTask::Status)> const&, IECore::PathMatcher const*, bool) ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGafferScene.so
34 0x00007fa148e3b47b in std::_Function_handler<void (IECore::Canceller const&), Gaffer::ParallelAlgo::callOnBackgroundThread(Gaffer::Plug const*, std::function<void ()>)::{lambda(IECore::Canceller const&)#1}>::_M_invoke(std::_Any_data const&, IECore::Canceller const&) () from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
35 0x00007fa148d83dd5 in _ZN3tbb8internal13function_taskIZN6Gaffer14BackgroundTaskC4EPKNS2_4PlugERKSt8functionIFvRKN6IECore9CancellerEEEEUlvE_E7executeEv ()
from /software/apps/gaffer/1.2.9.0/cent7.x86_64/cortex/10.4/nuke/13.2/lib/libGaffer.so
36 0x00007fa2568544ef in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libtbb.so.2
37 0x00007fa25684dae4 in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libtbb.so.2
38 0x00007fa25684c603 in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libtbb.so.2
39 0x00007fa256848846 in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libtbb.so.2
40 0x00007fa256848a79 in ?? () from /software/apps/nuke/13.2v8/cent7.x86_64/libtbb.so.2
41 0x00007fa26bed3ea5 in start_thread () from /lib64/libpthread.so.0
42 0x00007fa26b308b0d in clone () from /lib64/libc.so.6
```
No description provided.