Blender V5.0
render_pass.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2022 NVIDIA Corporation
2 * SPDX-FileCopyrightText: 2022 Blender Foundation
3 *
4 * SPDX-License-Identifier: Apache-2.0 */
5
6#include "hydra/render_pass.h"
7#include "hydra/camera.h"
11#include "hydra/session.h"
12
13#ifdef WITH_HYDRA_DISPLAY_DRIVER
14# include "hydra/display_driver.h"
15#endif
16
17#include "scene/camera.h"
18#include "scene/integrator.h"
19#include "scene/scene.h"
20
21#include "session/session.h"
22
23#include <pxr/imaging/hd/renderPassState.h>
24
26
28 const HdRprimCollection &collection,
29 HdCyclesSession *renderParam)
30 : HdRenderPass(index, collection), _renderParam(renderParam)
31{
32 Session *const session = _renderParam->session;
33 // Reset cancel state so session thread can continue rendering
34 session->progress.reset();
35
36 session->set_output_driver(make_unique<HdCyclesOutputDriver>(renderParam));
37
38 const auto *const renderDelegate = static_cast<const HdCyclesDelegate *>(
39 GetRenderIndex()->GetRenderDelegate());
40 if (renderDelegate->IsDisplaySupported()) {
41#ifdef WITH_HYDRA_DISPLAY_DRIVER
42 session->set_display_driver(
43 make_unique<HdCyclesDisplayDriver>(renderParam, renderDelegate->GetHgi()));
44#endif
45 }
46}
47
49{
50 Session *const session = _renderParam->session;
51 session->cancel(true);
52}
53
55{
56 for (const HdRenderPassAovBinding &aovBinding : _renderParam->GetAovBindings()) {
57 if (aovBinding.renderBuffer && !aovBinding.renderBuffer->IsConverged()) {
58 return false;
59 }
60 }
61
62 return true;
63}
64
65void HdCyclesRenderPass::ResetConverged()
66{
67 for (const HdRenderPassAovBinding &aovBinding : _renderParam->GetAovBindings()) {
68 if (auto *const renderBuffer = static_cast<HdCyclesRenderBuffer *>(aovBinding.renderBuffer)) {
69 renderBuffer->SetConverged(false);
70 }
71 }
72}
73
74void HdCyclesRenderPass::_Execute(const HdRenderPassStateSharedPtr &renderPassState,
75 const TfTokenVector & /*renderTags*/)
76{
77 Scene *const scene = _renderParam->session->scene.get();
78 Session *const session = _renderParam->session;
79
80 if (session->progress.get_cancel()) {
81 return; // Something went wrong and cannot continue without recreating the session
82 }
83
84 if (scene->mutex.try_lock()) {
85 auto *const renderDelegate = static_cast<HdCyclesDelegate *>(
86 GetRenderIndex()->GetRenderDelegate());
87
88 const unsigned int settingsVersion = renderDelegate->GetRenderSettingsVersion();
89
90 // Update requested AOV bindings
91 const HdRenderPassAovBindingVector &aovBindings = renderPassState->GetAovBindings();
92 if (_renderParam->GetAovBindings() != aovBindings ||
93 // Need to resync passes when denoising is enabled or disabled to update the pass mode
94 (settingsVersion != _lastSettingsVersion && scene->integrator->use_denoise_is_modified()))
95 {
96 _renderParam->SyncAovBindings(aovBindings);
97
98 if (renderDelegate->IsDisplaySupported()) {
99 // Update display pass to the first requested color AOV
100 const HdRenderPassAovBinding displayAovBinding = !aovBindings.empty() ?
101 aovBindings.front() :
102 HdRenderPassAovBinding();
103 if (displayAovBinding.aovName == HdAovTokens->color && displayAovBinding.renderBuffer) {
104 _renderParam->SetDisplayAovBinding(displayAovBinding);
105 }
106 else {
107 _renderParam->SetDisplayAovBinding(HdRenderPassAovBinding());
108 }
109 }
110 }
111
112 // Update camera dimensions to the viewport size
113#if PXR_VERSION >= 2102
114 CameraUtilFraming framing = renderPassState->GetFraming();
115 if (!framing.IsValid()) {
116 const GfVec4f vp = renderPassState->GetViewport();
117 framing = CameraUtilFraming(GfRect2i(GfVec2i(0), int(vp[2]), int(vp[3])));
118 }
119
120 scene->camera->set_full_width(framing.dataWindow.GetWidth());
121 scene->camera->set_full_height(framing.dataWindow.GetHeight());
122#else
123 const GfVec4f vp = renderPassState->GetViewport();
124 scene->camera->set_full_width(int(vp[2]));
125 scene->camera->set_full_height(int(vp[3]));
126#endif
127
128 if (const auto *const camera = static_cast<const HdCyclesCamera *>(
129 renderPassState->GetCamera()))
130 {
131 camera->ApplyCameraSettings(_renderParam, scene->camera);
132 }
133 else {
135 renderPassState->GetWorldToViewMatrix(),
136 renderPassState->GetProjectionMatrix(),
137 renderPassState->GetClipPlanes(),
138 scene->camera);
139 }
140
141 // Reset session if the session, scene, camera or AOV bindings changed
142 if (scene->need_reset() || settingsVersion != _lastSettingsVersion) {
143 _lastSettingsVersion = settingsVersion;
144
145 // Reset convergence state of all render buffers
146 ResetConverged();
147
148 BufferParams buffer_params;
149#if PXR_VERSION >= 2102
150 buffer_params.full_x = static_cast<int>(framing.displayWindow.GetMin()[0]);
151 buffer_params.full_y = static_cast<int>(framing.displayWindow.GetMin()[1]);
152 buffer_params.full_width = static_cast<int>(framing.displayWindow.GetSize()[0]);
153 buffer_params.full_height = static_cast<int>(framing.displayWindow.GetSize()[1]);
154
155 buffer_params.window_x = framing.dataWindow.GetMinX() - buffer_params.full_x;
156 buffer_params.window_y = framing.dataWindow.GetMinY() - buffer_params.full_y;
157 buffer_params.window_width = framing.dataWindow.GetWidth();
158 buffer_params.window_height = framing.dataWindow.GetHeight();
159
160 buffer_params.width = buffer_params.window_width;
161 buffer_params.height = buffer_params.window_height;
162#else
163 buffer_params.width = static_cast<int>(vp[2]);
164 buffer_params.height = static_cast<int>(vp[3]);
165 buffer_params.full_width = buffer_params.width;
166 buffer_params.full_height = buffer_params.height;
167 buffer_params.window_width = buffer_params.width;
168 buffer_params.window_height = buffer_params.height;
169#endif
170
171 session->reset(session->params, buffer_params);
172 }
173
174 scene->mutex.unlock();
175
176 // Start Cycles render thread if not already running
177 session->start();
178 }
179
180 session->draw();
181}
182
183void HdCyclesRenderPass::_MarkCollectionDirty() {}
184
struct Scene Scene
int full_width
Definition buffers.h:85
int window_y
Definition buffers.h:78
int full_height
Definition buffers.h:86
int window_height
Definition buffers.h:80
int window_width
Definition buffers.h:79
NODE_DECLARE int width
Definition buffers.h:70
int window_x
Definition buffers.h:77
void ApplyCameraSettings(PXR_NS::HdRenderParam *renderParam, CCL_NS::Camera *cam) const
~HdCyclesRenderPass() override
HdCyclesRenderPass(PXR_NS::HdRenderIndex *index, const PXR_NS::HdRprimCollection &collection, HdCyclesSession *renderParam)
bool IsConverged() const override
const PXR_NS::HdRenderPassAovBindingVector & GetAovBindings() const
bool get_cancel() const
Definition progress.h:77
void reset()
Definition progress.h:48
void cancel(bool quick=false)
Progress progress
SessionParams params
void reset(const SessionParams &session_params, const BufferParams &buffer_params)
void set_output_driver(unique_ptr< OutputDriver > driver)
#define HDCYCLES_NAMESPACE_CLOSE_SCOPE
Integrator * integrator
Definition scene.h:130
thread_mutex mutex
Definition scene.h:171
bool need_reset(const bool check_camera=true)
Definition scene.cpp:473
struct Object * camera