Blender V4.5
render_types.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#pragma once
10
11/* ------------------------------------------------------------------------- */
12/* exposed internal in render module only! */
13/* ------------------------------------------------------------------------- */
14
15#include "DNA_scene_types.h"
16
17#include "BLI_mutex.hh"
18#include "BLI_threads.h"
19
20#include "RE_compositor.hh"
21#include "RE_pipeline.h"
22
23#include "tile_highlight.h"
24
25namespace blender::compositor {
26class RenderContext;
27class Profiler;
28enum class OutputTypes : uint8_t;
29} // namespace blender::compositor
30
31struct bNodeTree;
32struct Depsgraph;
33struct Main;
34struct Object;
35struct RenderEngine;
36struct ReportList;
37struct Scene;
38
39struct BaseRender {
40 BaseRender() = default;
41 virtual ~BaseRender();
42
43 /* Get class which manages highlight of tiles.
44 * Note that it might not exist: for example, viewport render does not support the tile
45 * highlight. */
47
48 virtual void compositor_execute(const Scene &scene,
49 const RenderData &render_data,
50 const bNodeTree &node_tree,
51 const char *view_name,
54 blender::compositor::OutputTypes needed_outputs) = 0;
55 virtual void compositor_free() = 0;
56
57 virtual void display_init(RenderResult *render_result) = 0;
58 virtual void display_clear(RenderResult *render_result) = 0;
59 virtual void display_update(RenderResult *render_result, rcti *rect) = 0;
60 virtual void current_scene_update(struct Scene *scene) = 0;
61
62 virtual void stats_draw(RenderStats *render_stats) = 0;
63 virtual void progress(float progress) = 0;
64
65 virtual void draw_lock() = 0;
66 virtual void draw_unlock() = 0;
67
68 /* Test whether render is to be stopped: if the function returns true rendering will be stopped
69 * as soon as the render pipeline allows it. */
70 virtual bool test_break() = 0;
71
78 virtual bool prepare_viewlayer(struct ViewLayer *view_layer, struct Depsgraph *depsgraph) = 0;
79
80 /* Result of rendering */
81 RenderResult *result = nullptr;
82
83 /* Read/write mutex, all internal code that writes to the `result` must use a
84 * write lock, all external code must use a read lock. Internal code is assumed
85 * to not conflict with writes, so no lock used for that. */
87
88 /* Render engine. */
89 struct RenderEngine *engine = nullptr;
90
91 /* Guard for drawing render result using engine's `draw()` callback. */
93};
94
95struct ViewRender : public BaseRender {
97 {
98 return nullptr;
99 }
100
101 void compositor_execute(const Scene & /*scene*/,
102 const RenderData & /*render_data*/,
103 const bNodeTree & /*node_tree*/,
104 const char * /*view_name*/,
105 blender::compositor::RenderContext * /*render_context*/,
106 blender::compositor::Profiler * /*profiler*/,
107 blender::compositor::OutputTypes /*needed_outputs*/) override
108 {
109 }
110 void compositor_free() override {}
111
112 void display_init(RenderResult * /*render_result*/) override {}
113 void display_clear(RenderResult * /*render_result*/) override {}
114 void display_update(RenderResult * /*render_result*/, rcti * /*rect*/) override {}
115 void current_scene_update(struct Scene * /*scene*/) override {}
116
117 void stats_draw(RenderStats * /*render_stats*/) override {}
118 void progress(const float /*progress*/) override {}
119
120 void draw_lock() override {}
121 void draw_unlock() override {}
122
123 bool test_break() override
124 {
125 return false;
126 }
127
128 bool prepare_viewlayer(struct ViewLayer * /*view_layer*/,
129 struct Depsgraph * /*depsgraph*/) override
130 {
131 return true;
132 }
133};
134
136struct Render : public BaseRender {
137 /* NOTE: Currently unused, provision for the future.
138 * Add these now to allow the guarded memory allocator to catch C-specific function calls. */
139 Render() = default;
140 ~Render() override;
141
146
147 void compositor_execute(const Scene &scene,
148 const RenderData &render_data,
149 const bNodeTree &node_tree,
150 const char *view_name,
153 blender::compositor::OutputTypes needed_outputs) override;
154 void compositor_free() override;
155
156 void display_init(RenderResult *render_result) override;
157 void display_clear(RenderResult *render_result) override;
158 void display_update(RenderResult *render_result, rcti *rect) override;
159 void current_scene_update(struct Scene *scene) override;
160
161 void stats_draw(RenderStats *render_stats) override;
162 void progress(float progress) override;
163
164 void draw_lock() override;
165 void draw_unlock() override;
166
167 bool test_break() override;
168
169 bool prepare_viewlayer(struct ViewLayer *view_layer, struct Depsgraph *depsgraph) override;
170
171 char name[RE_MAXNAME] = "";
172
173 /* state settings */
174 short flag = 0;
175 bool ok = false;
176
177 /* if render with single-layer option, other rendered layers are stored here */
180 ListBase fullresult = {nullptr, nullptr};
181 /* True if result has GPU textures, to quickly skip cache clear. */
183
187 int winx = 0, winy = 0;
188 rcti disprect = {0, 0, 0, 0}; /* part within winx winy */
189 rctf viewplane = {0, 0, 0, 0}; /* mapped on winx winy */
190
191 /* final picture width and height (within disprect) */
192 int rectx = 0, recty = 0;
193
194 /* Camera transform. Used by Freestyle, Eevee, and other draw manager engines.. */
195 float winmat[4][4] = {{0}};
196
197 /* Clipping. */
198 float clip_start = 0.0f;
199 float clip_end = 0.0f;
200
201 /* main, scene, and its full copy of renderdata and world */
202 struct Main *main = nullptr;
203 Scene *scene = nullptr;
206 struct Object *camera_override = nullptr;
207
209
210 /* NOTE: This is a minimal dependency graph and evaluated scene which is enough to access view
211 * layer visibility and use for postprocessing (compositor and sequencer). */
212 struct Depsgraph *pipeline_depsgraph = nullptr;
214
215 /* Compositor.
216 * NOTE: Use bare pointer instead of smart pointer because the it is a fully opaque type. */
219
220 /* Callbacks for the corresponding base class method implementation. */
221 void (*display_init_cb)(void *handle, RenderResult *rr) = nullptr;
222 void *dih = nullptr;
223 void (*display_clear_cb)(void *handle, RenderResult *rr) = nullptr;
224 void *dch = nullptr;
225 void (*display_update_cb)(void *handle, RenderResult *rr, rcti *rect) = nullptr;
226 void *duh = nullptr;
227 void (*current_scene_update_cb)(void *handle, struct Scene *scene) = nullptr;
228 void *suh = nullptr;
229
230 void (*stats_draw_cb)(void *handle, RenderStats *ri) = nullptr;
231 void *sdh = nullptr;
232 void (*progress_cb)(void *handle, float i) = nullptr;
233 void *prh = nullptr;
234
235 void (*draw_lock_cb)(void *handle, bool lock) = nullptr;
236 void *dlh = nullptr;
237 bool (*test_break_cb)(void *handle) = nullptr;
238 void *tbh = nullptr;
239
240 bool (*prepare_viewlayer_cb)(void *handle, struct ViewLayer *vl, struct Depsgraph *depsgraph);
242
244
249 struct ReportList *reports = nullptr;
250
252 char viewname[MAX_NAME] = "";
253
254 /* TODO: replace by a whole draw manager. */
255 void *system_gpu_context = nullptr;
256 void *blender_gpu_context = nullptr;
257};
258
259/* **************** defines ********************* */
260
262#define R_ANIMATION 1 << 0
263/* Indicates that the render pipeline should not write its render result. This happens for instance
264 * when the render pipeline uses the compositor, but the compositor node tree does not have an
265 * output composite node or a render layer input, and consequently no render result. In that case,
266 * the output will be written from the File Output nodes, since the render pipeline will early fail
267 * if neither a File Output nor a Composite node exist in the scene. */
268#define R_SKIP_WRITE 1 << 1
pthread_rwlock_t ThreadRWMutex
#define BLI_RWLOCK_INITIALIZER
#define BLI_MUTEX_INITIALIZER
Definition BLI_threads.h:80
pthread_mutex_t ThreadMutex
Definition BLI_threads.h:79
#define RE_MAXNAME
Definition RE_pipeline.h:34
float progress
Definition WM_types.hh:1019
volatile int lock
BPy_StructRNA * depsgraph
#define MAX_NAME
std::mutex Mutex
Definition BLI_mutex.hh:47
virtual void compositor_free()=0
virtual void display_update(RenderResult *render_result, rcti *rect)=0
virtual void draw_lock()=0
virtual void stats_draw(RenderStats *render_stats)=0
ThreadMutex engine_draw_mutex
virtual void current_scene_update(struct Scene *scene)=0
virtual void draw_unlock()=0
virtual ~BaseRender()
virtual bool test_break()=0
virtual void progress(float progress)=0
virtual void display_clear(RenderResult *render_result)=0
struct RenderEngine * engine
virtual bool prepare_viewlayer(struct ViewLayer *view_layer, struct Depsgraph *depsgraph)=0
virtual void compositor_execute(const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const char *view_name, blender::compositor::RenderContext *render_context, blender::compositor::Profiler *profiler, blender::compositor::OutputTypes needed_outputs)=0
ThreadRWMutex resultmutex
virtual void display_init(RenderResult *render_result)=0
BaseRender()=default
RenderResult * result
virtual blender::render::TilesHighlight * get_tile_highlight()=0
void compositor_free() override
void * blender_gpu_context
void * dch
float winmat[4][4]
~Render() override
void * sdh
Scene * pipeline_scene_eval
void * duh
void * prh
void draw_unlock() override
void draw_lock() override
bool(* prepare_viewlayer_cb)(void *handle, struct ViewLayer *vl, struct Depsgraph *depsgraph)
void display_update(RenderResult *render_result, rcti *rect) override
bool test_break() override
bool result_has_gpu_texture_caches
RenderResult * pushedresult
float clip_start
RenderData r
blender::render::Compositor * compositor
Render()=default
struct Main * main
void * dih
void * system_gpu_context
float clip_end
bool prepare_viewlayer(struct ViewLayer *view_layer, struct Depsgraph *depsgraph) override
void(* current_scene_update_cb)(void *handle, struct Scene *scene)
void * dlh
void(* progress_cb)(void *handle, float i)
Scene * scene
ListBase fullresult
void display_init(RenderResult *render_result) override
void(* display_init_cb)(void *handle, RenderResult *rr)
blender::Mutex compositor_mutex
struct Depsgraph * pipeline_depsgraph
blender::render::TilesHighlight * get_tile_highlight() override
void * prepare_vl_handle
void(* display_clear_cb)(void *handle, RenderResult *rr)
short flag
blender::render::TilesHighlight tile_highlight
bool(* test_break_cb)(void *handle)
char single_view_layer[MAX_NAME]
char viewname[MAX_NAME]
void display_clear(RenderResult *render_result) override
RenderStats i
void current_scene_update(struct Scene *scene) override
void * tbh
void compositor_execute(const Scene &scene, const RenderData &render_data, const bNodeTree &node_tree, const char *view_name, blender::compositor::RenderContext *render_context, blender::compositor::Profiler *profiler, blender::compositor::OutputTypes needed_outputs) override
rctf viewplane
void * suh
struct ReportList * reports
rcti disprect
struct Object * camera_override
void(* draw_lock_cb)(void *handle, bool lock)
void(* display_update_cb)(void *handle, RenderResult *rr, rcti *rect)
char name[RE_MAXNAME]
void(* stats_draw_cb)(void *handle, RenderStats *ri)
blender::Vector< MovieWriter * > movie_writers
void stats_draw(RenderStats *render_stats) override
void stats_draw(RenderStats *) override
bool test_break() override
void compositor_execute(const Scene &, const RenderData &, const bNodeTree &, const char *, blender::compositor::RenderContext *, blender::compositor::Profiler *, blender::compositor::OutputTypes) override
void progress(const float) override
blender::render::TilesHighlight * get_tile_highlight() override
void display_update(RenderResult *, rcti *) override
void current_scene_update(struct Scene *) override
void compositor_free() override
void display_clear(RenderResult *) override
void draw_unlock() override
void draw_lock() override
void display_init(RenderResult *) override
bool prepare_viewlayer(struct ViewLayer *, struct Depsgraph *) override