1 // 2 // Copyright 2016 Pixar 3 // 4 // Licensed under the Apache License, Version 2.0 (the "Apache License") 5 // with the following modification; you may not use this file except in 6 // compliance with the Apache License and the following modification to it: 7 // Section 6. Trademarks. is deleted and replaced with: 8 // 9 // 6. Trademarks. This License does not grant permission to use the trade 10 // names, trademarks, service marks, or product names of the Licensor 11 // and its affiliates, except as required to comply with Section 4(c) of 12 // the License and to reproduce the content of the NOTICE file. 13 // 14 // You may obtain a copy of the Apache License at 15 // 16 // http://www.apache.org/licenses/LICENSE-2.0 17 // 18 // Unless required by applicable law or agreed to in writing, software 19 // distributed under the Apache License with the above modification is 20 // distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 21 // KIND, either express or implied. See the Apache License for the specific 22 // language governing permissions and limitations under the Apache License. 23 // 24 #ifndef PXR_IMAGING_HDX_RENDER_TASK_H 25 #define PXR_IMAGING_HDX_RENDER_TASK_H 26 27 #include "pxr/pxr.h" 28 #include "pxr/imaging/hdx/api.h" 29 #include "pxr/imaging/hdx/version.h" 30 #include "pxr/imaging/hdx/task.h" 31 #include "pxr/imaging/hdx/renderSetupTask.h" // for short-term compatibility. 32 #include "pxr/imaging/hdSt/renderPassState.h" 33 34 #include <memory> 35 36 PXR_NAMESPACE_OPEN_SCOPE 37 38 39 class HdSceneDelegate; 40 41 using HdRenderPassStateSharedPtr = std::shared_ptr<class HdRenderPassState>; 42 using HdRenderPassSharedPtr = std::shared_ptr<class HdRenderPass>; 43 using HdxRenderSetupTaskSharedPtr = std::shared_ptr<class HdxRenderSetupTask>; 44 45 /// \class HdxRenderTask 46 /// 47 /// A task for rendering geometry to pixels. 48 /// 49 /// Rendering state management can be handled two ways: 50 /// 1.) An application can create an HdxRenderTask and pass it the 51 /// HdxRenderTaskParams struct as "params". 52 /// 2.) An application can create an HdxRenderSetupTask and an 53 /// HdxRenderTask, and pass params to the setup task. In this case 54 /// the setup task must run first. 55 /// 56 /// Parameter unpacking is handled by HdxRenderSetupTask; in case #1, 57 /// HdxRenderTask creates a dummy setup task internally to manage the sync 58 /// process. 59 /// 60 /// Case #2 introduces complexity; the benefit is that by changing which 61 /// setup task you run before the render task, you can change the render 62 /// parameters without incurring a hydra sync or rebuilding any resources. 63 /// 64 class HdxRenderTask : public HdxTask 65 { 66 public: 67 HDX_API 68 HdxRenderTask(HdSceneDelegate* delegate, SdfPath const& id); 69 70 HDX_API 71 ~HdxRenderTask() override; 72 73 /// Hooks for progressive rendering (delegated to renderpasses). 74 HDX_API 75 bool IsConverged() const override; 76 77 /// Prepare the tasks resources 78 HDX_API 79 void Prepare(HdTaskContext* ctx, 80 HdRenderIndex* renderIndex) override; 81 82 /// Execute render pass task 83 HDX_API 84 void Execute(HdTaskContext* ctx) override; 85 86 /// Collect Render Tags used by the task. 87 HDX_API 88 const TfTokenVector &GetRenderTags() const override; 89 90 protected: 91 /// Sync the render pass resources 92 HDX_API 93 void _Sync(HdSceneDelegate* delegate, 94 HdTaskContext* ctx, 95 HdDirtyBits* dirtyBits) override; 96 97 HDX_API 98 HdRenderPassStateSharedPtr _GetRenderPassState(HdTaskContext *ctx) const; 99 100 // XXX: Storm specific API 101 // While HdDrawItem is currently a core-Hydra concept, it'll be moved 102 // to Storm. Until then, allow querying the render pass to know if there's 103 // draw submission work. 104 105 // Returns whether the render pass has any draw items to submit. 106 // For non-Storm backends, this returns true. 107 // When using with Storm tasks, make sure to call it after 108 // HdxRenderTask::Prepare(). 109 HDX_API 110 bool _HasDrawItems() const; 111 112 private: 113 HdRenderPassSharedPtr _pass; 114 TfTokenVector _renderTags; 115 116 // Optional internal render setup task, for params unpacking. 117 HdxRenderSetupTaskSharedPtr _setupTask; 118 119 // XXX: Storm specific API 120 // Setup additional state that HdStRenderPassState requires. 121 void _SetHdStRenderPassState(HdTaskContext *ctx, 122 HdStRenderPassState *renderPassState); 123 124 // Inspect the AOV bindings to determine if any of them need to be cleared. 125 bool _NeedToClearAovs(HdRenderPassStateSharedPtr const &renderPassState) 126 const; 127 128 HdxRenderTask() = delete; 129 HdxRenderTask(const HdxRenderTask &) = delete; 130 HdxRenderTask &operator =(const HdxRenderTask &) = delete; 131 }; 132 133 134 PXR_NAMESPACE_CLOSE_SCOPE 135 136 #endif //PXR_IMAGING_HDX_RENDER_TASK_H 137