diff options
author | Patrick Mours <pmours@nvidia.com> | 2022-06-01 16:26:55 +0300 |
---|---|---|
committer | Brecht Van Lommel <brecht@blender.org> | 2022-06-03 19:56:30 +0300 |
commit | 34f94a02f37005210f629f04635c457d98ff5f91 (patch) | |
tree | 4339231acf82070c1e8c6f1c71f52640eb069dd8 /intern/cycles/hydra/render_buffer.cpp | |
parent | 7f7ed8e0989d3c6a3078404567e7da419d6f92f5 (diff) |
Fix use of OpenGL interop breaking in Hydra viewports that do not support it
Rendering directly to a resource using OpenGL interop and Hgi
doesn't work in Houdini, since it never uses the resulting resource
(it does not call `HdRenderBuffer::GetResource`). But since doing
that simultaneously disables mapping (`HdRenderBuffer::Map` is
not implemented then), nothing was displayed. To fix this, keep
track of whether a Hydra viewport does support displaying a Hgi
resource directly, by checking whether
`HdRenderBuffer::GetResource` is ever called and only enable use
of OpenGL interop if that is the case.
Differential Revision: https://developer.blender.org/D15090
Diffstat (limited to 'intern/cycles/hydra/render_buffer.cpp')
-rw-r--r-- | intern/cycles/hydra/render_buffer.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/intern/cycles/hydra/render_buffer.cpp b/intern/cycles/hydra/render_buffer.cpp index 4867def0624..4d8b21d1e61 100644 --- a/intern/cycles/hydra/render_buffer.cpp +++ b/intern/cycles/hydra/render_buffer.cpp @@ -35,7 +35,7 @@ bool HdCyclesRenderBuffer::Allocate(const GfVec3i &dimensions, HdFormat format, return false; } - const size_t oldSize = _data.size(); + const size_t oldSize = _dataSize; const size_t newSize = dimensions[0] * dimensions[1] * HdDataSizeOfFormat(format); if (oldSize == newSize) { return true; @@ -49,8 +49,8 @@ bool HdCyclesRenderBuffer::Allocate(const GfVec3i &dimensions, HdFormat format, _width = dimensions[0]; _height = dimensions[1]; _format = format; - - _data.resize(newSize); + _dataSize = newSize; + _resourceUsed = false; return true; } @@ -63,6 +63,7 @@ void HdCyclesRenderBuffer::_Deallocate() _data.clear(); _data.shrink_to_fit(); + _dataSize = 0; _resource = VtValue(); } @@ -74,6 +75,10 @@ void *HdCyclesRenderBuffer::Map() return nullptr; } + if (_data.size() != _dataSize) { + _data.resize(_dataSize); + } + ++_mapped; return _data.data(); @@ -103,10 +108,17 @@ void HdCyclesRenderBuffer::SetConverged(bool converged) _converged = converged; } +bool HdCyclesRenderBuffer::IsResourceUsed() const +{ + return _resourceUsed; +} + VtValue HdCyclesRenderBuffer::GetResource(bool multiSampled) const { TF_UNUSED(multiSampled); + _resourceUsed = true; + return _resource; } |