Blender V4.3
hydra/engine.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
5#include "engine.hh"
6
7#include <pxr/base/plug/plugin.h>
8#include <pxr/base/plug/registry.h>
9#include <pxr/imaging/hd/rendererPluginRegistry.h>
10#include <pxr/imaging/hdSt/renderDelegate.h>
11#include <pxr/imaging/hgi/tokens.h>
12#include <pxr/usd/usdGeom/tokens.h>
13
14#include "BLI_path_utils.hh"
15
16#include "BKE_context.hh"
17
18#include "GPU_context.hh"
19
21
22#include "RE_engine.h"
23
24#include "CLG_log.h"
25
26namespace blender::render::hydra {
27
29
30Engine::Engine(RenderEngine *bl_engine, const std::string &render_delegate_name)
31 : render_delegate_name_(render_delegate_name), bl_engine_(bl_engine)
32{
33 pxr::HdRendererPluginRegistry &registry = pxr::HdRendererPluginRegistry::GetInstance();
34
35 pxr::TF_PY_ALLOW_THREADS_IN_SCOPE();
36
38 BLI_setenv("HGI_ENABLE_VULKAN", "1");
39 }
40
41 pxr::HdDriverVector hd_drivers;
42 if (bl_engine->type->flag & RE_USE_GPU_CONTEXT) {
43 hgi_ = pxr::Hgi::CreatePlatformDefaultHgi();
44 hgi_driver_.name = pxr::HgiTokens->renderDriver;
45 hgi_driver_.driver = pxr::VtValue(hgi_.get());
46
47 hd_drivers.push_back(&hgi_driver_);
48 }
49 render_delegate_ = registry.CreateRenderDelegate(pxr::TfToken(render_delegate_name_));
50
51 if (!render_delegate_) {
52 throw std::runtime_error("Cannot create render delegate: " + render_delegate_name_);
53 }
54
55 render_index_.reset(pxr::HdRenderIndex::New(render_delegate_.Get(), hd_drivers));
56 free_camera_delegate_ = std::make_unique<pxr::HdxFreeCameraSceneDelegate>(
57 render_index_.get(), pxr::SdfPath::AbsoluteRootPath().AppendElementString("freeCamera"));
58
60 render_task_delegate_ = std::make_unique<GPURenderTaskDelegate>(
61 render_index_.get(), pxr::SdfPath::AbsoluteRootPath().AppendElementString("renderTask"));
62 }
63 else {
64 render_task_delegate_ = std::make_unique<RenderTaskDelegate>(
65 render_index_.get(), pxr::SdfPath::AbsoluteRootPath().AppendElementString("renderTask"));
66 }
67 render_task_delegate_->set_camera(free_camera_delegate_->GetCameraId());
68
69 if (render_delegate_name_ == "HdStormRendererPlugin") {
70 light_tasks_delegate_ = std::make_unique<LightTasksDelegate>(
71 render_index_.get(), pxr::SdfPath::AbsoluteRootPath().AppendElementString("lightTasks"));
72 light_tasks_delegate_->set_camera(free_camera_delegate_->GetCameraId());
73 }
74
75 engine_ = std::make_unique<pxr::HdEngine>();
76}
77
78void Engine::sync(Depsgraph *depsgraph, bContext *context)
79{
81 context_ = context;
83
84 const bool use_materialx = bl_engine_->type->flag & RE_USE_MATERIALX;
85
87 /* Fast path. */
88 usd_scene_delegate_.reset();
89
91 pxr::SdfPath scene_path = pxr::SdfPath::AbsoluteRootPath().AppendElementString("scene");
92 hydra_scene_delegate_ = std::make_unique<io::hydra::HydraSceneDelegate>(
93 render_index_.get(), scene_path, use_materialx);
94 }
95 hydra_scene_delegate_->populate(depsgraph, context ? CTX_wm_view3d(context) : nullptr);
96 }
97 else {
98 /* Slow USD export for reference. */
100 /* Freeing the Hydra scene delegate crashes as something internal to USD
101 * still holds a pointer to it, only clear it instead. */
102 hydra_scene_delegate_->clear();
103 }
104
105 if (!usd_scene_delegate_) {
106 pxr::SdfPath scene_path = pxr::SdfPath::AbsoluteRootPath().AppendElementString("usd_scene");
107 usd_scene_delegate_ = std::make_unique<io::hydra::USDSceneDelegate>(
108 render_index_.get(), scene_path, use_materialx);
109 }
111 }
112}
113
114void Engine::set_render_setting(const std::string &key, const pxr::VtValue &val)
115{
116 render_delegate_->SetRenderSetting(pxr::TfToken(key), val);
117}
118
120{
121 pxr::VtDictionary render_stats = render_delegate_->GetRenderStats();
122 auto it = render_stats.find("percentDone");
123 if (it == render_stats.end()) {
124 return 0.0f;
125 }
126 return float(it->second.UncheckedGet<double>());
127}
128
129pxr::HdTaskSharedPtrVector Engine::tasks()
130{
131 pxr::HdTaskSharedPtrVector res;
134#ifndef __APPLE__
135 /* TODO: Temporary disable skydome task for MacOS due to crash with error:
136 * Failed to created pipeline state, error depthAttachmentPixelFormat is not valid
137 * and shader writes to depth */
138 res.push_back(light_tasks_delegate_->skydome_task());
139#endif
140 }
141 res.push_back(light_tasks_delegate_->simple_task());
142 }
143 res.push_back(render_task_delegate_->task());
144 return res;
145}
146
147} // namespace blender::render::hydra
View3D * CTX_wm_view3d(const bContext *C)
void BLI_setenv(const char *env, const char *val) ATTR_NONNULL(1)
#define CLG_LOGREF_DECLARE_GLOBAL(var, id)
Definition CLG_log.h:145
Scene * DEG_get_evaluated_scene(const Depsgraph *graph)
@ SCE_HYDRA_EXPORT_HYDRA
@ R_ALPHAPREMUL
eGPUBackendType GPU_backend_get_type()
@ RE_USE_MATERIALX
Definition RE_engine.h:58
@ RE_USE_GPU_CONTEXT
Definition RE_engine.h:54
Engine(RenderEngine *bl_engine, const std::string &render_delegate_name)
RenderEngine * bl_engine_
Definition engine.hh:36
void sync(Depsgraph *depsgraph, bContext *context)
std::unique_ptr< pxr::HdxFreeCameraSceneDelegate > free_camera_delegate_
Definition engine.hh:51
pxr::HdTaskSharedPtrVector tasks()
std::unique_ptr< RenderTaskDelegate > render_task_delegate_
Definition engine.hh:50
pxr::HdPluginRenderDelegateUniqueHandle render_delegate_
Definition engine.hh:44
std::string render_delegate_name_
Definition engine.hh:35
std::unique_ptr< io::hydra::USDSceneDelegate > usd_scene_delegate_
Definition engine.hh:48
std::unique_ptr< pxr::HdRenderIndex > render_index_
Definition engine.hh:45
std::unique_ptr< io::hydra::HydraSceneDelegate > hydra_scene_delegate_
Definition engine.hh:47
pxr::HgiUniquePtr hgi_
Definition engine.hh:42
virtual void set_render_setting(const std::string &key, const pxr::VtValue &val)
std::unique_ptr< LightTasksDelegate > light_tasks_delegate_
Definition engine.hh:52
std::unique_ptr< pxr::HdEngine > engine_
Definition engine.hh:53
const Depsgraph * depsgraph
draw_view in_light_buf[] float
struct CLG_LogRef * LOG_HYDRA_RENDER
RenderEngineType * type
Definition RE_engine.h:134
struct SceneHydra hydra
struct RenderData r