diff --git a/pxr/imaging/hd/renderPassState.cpp b/pxr/imaging/hd/renderPassState.cpp index f060fd2bed..63dde1abf7 100644 --- a/pxr/imaging/hd/renderPassState.cpp +++ b/pxr/imaging/hd/renderPassState.cpp @@ -511,6 +511,18 @@ HdRenderPassState::SetMultiSampleEnabled(bool enabled) _multiSampleEnabled = enabled; } +void +HdRenderPassState::SetCancelCallback(std::function const& callback) +{ + _cancelCallback = callback; +} + +bool +HdRenderPassState::IsCancelled() const +{ + return _cancelCallback && _cancelCallback(); +} + GfVec2f HdRenderPassState::GetDrawingRangeNDC() const { diff --git a/pxr/imaging/hd/renderPassState.h b/pxr/imaging/hd/renderPassState.h index c72b00b16c..073f8dcafe 100644 --- a/pxr/imaging/hd/renderPassState.h +++ b/pxr/imaging/hd/renderPassState.h @@ -42,6 +42,7 @@ #include "pxr/base/gf/vec4f.h" #include +#include PXR_NAMESPACE_OPEN_SCOPE @@ -344,6 +345,11 @@ class HdRenderPassState HD_API void SetMultiSampleEnabled(bool enabled); bool GetMultiSampleEnabled() const { return _multiSampleEnabled; } + + HD_API + void SetCancelCallback(std::function const& callback); + HD_API + bool IsCancelled() const; protected: // ---------------------------------------------------------------------- // @@ -425,6 +431,8 @@ class HdRenderPassState float _stepSizeLighting; bool _multiSampleEnabled; + + std::function _cancelCallback; }; PXR_NAMESPACE_CLOSE_SCOPE diff --git a/pxr/imaging/hdSt/commandBuffer.cpp b/pxr/imaging/hdSt/commandBuffer.cpp index 436782f0f0..144dc7aaba 100644 --- a/pxr/imaging/hdSt/commandBuffer.cpp +++ b/pxr/imaging/hdSt/commandBuffer.cpp @@ -172,6 +172,8 @@ HdStCommandBuffer::ExecuteDraw( // draw batches // for (auto const& batch : _drawBatches) { + if (renderPassState->IsCancelled()) + break; batch->ExecuteDraw(gfxCmds, renderPassState, resourceRegistry); } diff --git a/pxr/imaging/hdx/renderSetupTask.cpp b/pxr/imaging/hdx/renderSetupTask.cpp index 841129388f..c6180d0ff4 100644 --- a/pxr/imaging/hdx/renderSetupTask.cpp +++ b/pxr/imaging/hdx/renderSetupTask.cpp @@ -173,6 +173,8 @@ HdxRenderSetupTask::SyncParams(HdSceneDelegate* delegate, renderPassState->SetAlphaToCoverageEnabled( params.enableAlphaToCoverage && !TfDebug::IsEnabled(HDX_DISABLE_ALPHA_TO_COVERAGE)); + + renderPassState->SetCancelCallback(params.cancelCallback); if (HdStRenderPassState * const hdStRenderPassState = dynamic_cast(renderPassState.get())) { diff --git a/pxr/imaging/hdx/renderSetupTask.h b/pxr/imaging/hdx/renderSetupTask.h index f6ae5ac4ae..e67bc6c8e8 100644 --- a/pxr/imaging/hdx/renderSetupTask.h +++ b/pxr/imaging/hdx/renderSetupTask.h @@ -260,6 +260,9 @@ struct HdxRenderTaskParams GfVec4d viewport; HdCullStyle cullStyle; std::pair overrideWindowPolicy; + + // Frame cancellation + std::function cancelCallback; }; // VtValue requirements diff --git a/pxr/imaging/hgiMetal/graphicsCmds.mm b/pxr/imaging/hgiMetal/graphicsCmds.mm index d2f01bddfa..6d046865e5 100644 --- a/pxr/imaging/hgiMetal/graphicsCmds.mm +++ b/pxr/imaging/hgiMetal/graphicsCmds.mm @@ -130,14 +130,9 @@ hasClear = true; } - if (@available(macos 100.100, ios 8.0, *)) { - metalColorAttachment.loadAction = MTLLoadActionLoad; - } - else { - metalColorAttachment.loadAction = - HgiMetalConversions::GetAttachmentLoadOp( - hgiColorAttachment.loadOp); - } + metalColorAttachment.loadAction = + HgiMetalConversions::GetAttachmentLoadOp( + hgiColorAttachment.loadOp); metalColorAttachment.storeAction = HgiMetalConversions::GetAttachmentStoreOp(