Blender  V2.93
engine.c
Go to the documentation of this file.
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2006 Blender Foundation.
17  * All rights reserved.
18  */
19 
24 #include <stddef.h>
25 #include <stdlib.h>
26 #include <string.h>
27 
28 #include "MEM_guardedalloc.h"
29 
30 #include "BLT_translation.h"
31 
32 #include "BLI_ghash.h"
33 #include "BLI_listbase.h"
34 #include "BLI_math_bits.h"
35 #include "BLI_rect.h"
36 #include "BLI_string.h"
37 #include "BLI_utildefines.h"
38 
39 #include "DNA_object_types.h"
40 
41 #include "BKE_camera.h"
42 #include "BKE_colortools.h"
43 #include "BKE_global.h"
44 #include "BKE_layer.h"
45 #include "BKE_node.h"
46 #include "BKE_report.h"
47 #include "BKE_scene.h"
48 
49 #include "DEG_depsgraph.h"
50 #include "DEG_depsgraph_debug.h"
51 #include "DEG_depsgraph_query.h"
52 
53 #include "RNA_access.h"
54 
55 #ifdef WITH_PYTHON
56 # include "BPY_extern.h"
57 #endif
58 
59 #include "RE_bake.h"
60 #include "RE_engine.h"
61 #include "RE_pipeline.h"
62 
63 #include "DRW_engine.h"
64 
65 #include "initrender.h"
66 #include "pipeline.h"
67 #include "render_result.h"
68 #include "render_types.h"
69 
70 /* Render Engine Types */
71 
73 
74 void RE_engines_init(void)
75 {
77 }
78 
79 void RE_engines_exit(void)
80 {
82 
84 
85  for (type = R_engines.first; type; type = next) {
86  next = type->next;
87 
89 
90  if (!(type->flag & RE_INTERNAL)) {
91  if (type->rna_ext.free) {
92  type->rna_ext.free(type->rna_ext.data);
93  }
94 
95  MEM_freeN(type);
96  }
97  }
98 }
99 
101 {
102  if (render_type->draw_engine) {
103  DRW_engine_register(render_type->draw_engine);
104  }
105  BLI_addtail(&R_engines, render_type);
106 }
107 
108 RenderEngineType *RE_engines_find(const char *idname)
109 {
111 
112  type = BLI_findstring(&R_engines, idname, offsetof(RenderEngineType, idname));
113  if (!type) {
114  type = BLI_findstring(&R_engines, "BLENDER_EEVEE", offsetof(RenderEngineType, idname));
115  }
116 
117  return type;
118 }
119 
121 {
122  return (re->engine && re->engine->type && re->engine->type->render);
123 }
124 
126 {
127  /* TODO refine? Can we have ogl render engine without ogl render pipeline? */
128  return (render_type->draw_engine != NULL) && DRW_engine_render_support(render_type->draw_engine);
129 }
130 
131 /* Create, Free */
132 
134 {
135  RenderEngine *engine = MEM_callocN(sizeof(RenderEngine), "RenderEngine");
136  engine->type = type;
137 
139 
140  return engine;
141 }
142 
144 {
145  if (engine->depsgraph) {
146  /* Need GPU context since this might free GPU buffers. */
147  const bool use_gpu_context = (engine->type->flag & RE_USE_GPU_CONTEXT);
148  if (use_gpu_context) {
149  DRW_render_context_enable(engine->re);
150  }
151 
152  DEG_graph_free(engine->depsgraph);
153  engine->depsgraph = NULL;
154 
155  if (use_gpu_context) {
157  }
158  }
159 }
160 
162 {
163 #ifdef WITH_PYTHON
164  if (engine->py_instance) {
166  }
167 #endif
168 
169  engine_depsgraph_free(engine);
170 
172 
173  MEM_freeN(engine);
174 }
175 
176 /* Bake Render Results */
177 
178 static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y, int w, int h)
179 {
180  /* Create render result with specified size. */
181  RenderResult *rr = MEM_callocN(sizeof(RenderResult), __func__);
182 
183  rr->rectx = w;
184  rr->recty = h;
185  rr->tilerect.xmin = x;
186  rr->tilerect.ymin = y;
187  rr->tilerect.xmax = x + w;
188  rr->tilerect.ymax = y + h;
189 
190  /* Add single baking render layer. */
191  RenderLayer *rl = MEM_callocN(sizeof(RenderLayer), "bake render layer");
192  rl->rectx = w;
193  rl->recty = h;
194  BLI_addtail(&rr->layers, rl);
195 
196  /* Add render passes. */
197  RenderPass *result_pass = render_layer_add_pass(
198  rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA");
199  RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA");
200  RenderPass *differential_pass = render_layer_add_pass(rr, rl, 4, "BakeDifferential", "", "RGBA");
201 
202  /* Fill render passes from bake pixel array, to be read by the render engine. */
203  for (int ty = 0; ty < h; ty++) {
204  size_t offset = ty * w * 4;
205  float *primitive = primitive_pass->rect + offset;
206  float *differential = differential_pass->rect + offset;
207 
208  size_t bake_offset = (y + ty) * engine->bake.width + x;
209  const BakePixel *bake_pixel = engine->bake.pixels + bake_offset;
210 
211  for (int tx = 0; tx < w; tx++) {
212  if (bake_pixel->object_id != engine->bake.object_id) {
213  primitive[0] = int_as_float(-1);
214  primitive[1] = int_as_float(-1);
215  }
216  else {
217  primitive[0] = int_as_float(bake_pixel->seed);
218  primitive[1] = int_as_float(bake_pixel->primitive_id);
219  primitive[2] = bake_pixel->uv[0];
220  primitive[3] = bake_pixel->uv[1];
221 
222  differential[0] = bake_pixel->du_dx;
223  differential[1] = bake_pixel->du_dy;
224  differential[2] = bake_pixel->dv_dx;
225  differential[3] = bake_pixel->dv_dy;
226  }
227 
228  primitive += 4;
229  differential += 4;
230  bake_pixel++;
231  }
232  }
233 
234  /* Initialize tile render result from full image bake result. */
235  for (int ty = 0; ty < h; ty++) {
236  size_t offset = ty * w * engine->bake.depth;
237  size_t bake_offset = ((y + ty) * engine->bake.width + x) * engine->bake.depth;
238  size_t size = w * engine->bake.depth * sizeof(float);
239 
240  memcpy(result_pass->rect + offset, engine->bake.result + bake_offset, size);
241  }
242 
243  return rr;
244 }
245 
247 {
249 
250  if (!rpass) {
251  return;
252  }
253 
254  /* Copy from tile render result to full image bake result. */
255  int x = rr->tilerect.xmin;
256  int y = rr->tilerect.ymin;
257  int w = rr->tilerect.xmax - rr->tilerect.xmin;
258  int h = rr->tilerect.ymax - rr->tilerect.ymin;
259 
260  for (int ty = 0; ty < h; ty++) {
261  size_t offset = ty * w * engine->bake.depth;
262  size_t bake_offset = ((y + ty) * engine->bake.width + x) * engine->bake.depth;
263  size_t size = w * engine->bake.depth * sizeof(float);
264 
265  memcpy(engine->bake.result + bake_offset, rpass->rect + offset, size);
266  }
267 }
268 
269 /* Render Results */
270 
272 {
273  rcti key = result->tilerect;
274  BLI_rcti_translate(&key, re->disprect.xmin, re->disprect.ymin);
275 
276  return BLI_ghash_lookup(re->parts, &key);
277 }
278 
280  RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname)
281 {
282  if (engine->bake.pixels) {
283  RenderResult *result = render_result_from_bake(engine, x, y, w, h);
284  BLI_addtail(&engine->fullresult, result);
285  return result;
286  }
287 
288  Render *re = engine->re;
290  rcti disprect;
291 
292  /* ensure the coordinates are within the right limits */
293  CLAMP(x, 0, re->result->rectx);
294  CLAMP(y, 0, re->result->recty);
295  CLAMP(w, 0, re->result->rectx);
296  CLAMP(h, 0, re->result->recty);
297 
298  if (x + w > re->result->rectx) {
299  w = re->result->rectx - x;
300  }
301  if (y + h > re->result->recty) {
302  h = re->result->recty - y;
303  }
304 
305  /* allocate a render result */
306  disprect.xmin = x;
307  disprect.xmax = x + w;
308  disprect.ymin = y;
309  disprect.ymax = y + h;
310 
311  result = render_result_new(re, &disprect, RR_USE_MEM, layername, viewname);
312 
313  /* todo: make this thread safe */
314 
315  /* can be NULL if we CLAMP the width or height to 0 */
316  if (result) {
317  render_result_clone_passes(re, result, viewname);
318 
319  RenderPart *pa;
320 
321  /* Copy EXR tile settings, so pipeline knows whether this is a result
322  * for Save Buffers enabled rendering.
323  */
324  result->do_exr_tile = re->result->do_exr_tile;
325 
326  BLI_addtail(&engine->fullresult, result);
327 
328  result->tilerect.xmin += re->disprect.xmin;
329  result->tilerect.xmax += re->disprect.xmin;
330  result->tilerect.ymin += re->disprect.ymin;
331  result->tilerect.ymax += re->disprect.ymin;
332 
333  pa = get_part_from_result(re, result);
334 
335  if (pa) {
337  }
338  }
339 
340  return result;
341 }
342 
344 {
345  if (engine->bake.pixels) {
346  /* No interactive baking updates for now. */
347  return;
348  }
349 
350  Render *re = engine->re;
351 
352  if (result) {
354  result->renlay = result->layers.first; /* weak, draws first layer always */
355  re->display_update(re->duh, result, NULL);
356  }
357 }
358 
360  const char *name,
361  int channels,
362  const char *chan_id,
363  const char *layername)
364 {
365  Render *re = engine->re;
366 
367  if (!re || !re->result) {
368  return;
369  }
370 
371  RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL);
372 }
373 
375  RenderEngine *engine, RenderResult *result, bool cancel, bool highlight, bool merge_results)
376 {
377  Render *re = engine->re;
378 
379  if (!result) {
380  return;
381  }
382 
383  if (engine->bake.pixels) {
384  render_result_to_bake(engine, result);
385  BLI_remlink(&engine->fullresult, result);
387  return;
388  }
389 
390  /* merge. on break, don't merge in result for preview renders, looks nicer */
391  if (!highlight) {
392  /* for exr tile render, detect tiles that are done */
394 
395  if (pa) {
396  pa->status = (!cancel && merge_results) ? PART_STATUS_MERGED : PART_STATUS_RENDERED;
397  }
398  else if (re->result->do_exr_tile) {
399  /* If written result does not match any tile and we are using save
400  * buffers, we are going to get OpenEXR save errors. */
401  fprintf(stderr, "RenderEngine.end_result: dimensions do not match any OpenEXR tile.\n");
402  }
403  }
404 
405  if (!cancel || merge_results) {
406  if (re->result->do_exr_tile) {
407  if (!cancel && merge_results) {
410  }
411  }
412  else if (!(re->test_break(re->tbh) && (re->r.scemode & R_BUTS_PREVIEW))) {
414  }
415 
416  /* draw */
417  if (!re->test_break(re->tbh)) {
418  result->renlay = result->layers.first; /* weak, draws first layer always */
419  re->display_update(re->duh, result, NULL);
420  }
421  }
422 
423  /* free */
424  BLI_remlink(&engine->fullresult, result);
426 }
427 
429 {
430  return engine->re->result;
431 }
432 
433 /* Cancel */
434 
436 {
437  Render *re = engine->re;
438 
439  if (re) {
440  return re->test_break(re->tbh);
441  }
442 
443  return 0;
444 }
445 
446 /* Statistics */
447 
448 void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info)
449 {
450  Render *re = engine->re;
451 
452  /* stats draw callback */
453  if (re) {
454  re->i.statstr = stats;
455  re->i.infostr = info;
456  re->stats_draw(re->sdh, &re->i);
457  re->i.infostr = NULL;
458  re->i.statstr = NULL;
459  }
460 
461  /* set engine text */
462  engine->text[0] = '\0';
463 
464  if (stats && stats[0] && info && info[0]) {
465  BLI_snprintf(engine->text, sizeof(engine->text), "%s | %s", stats, info);
466  }
467  else if (info && info[0]) {
468  BLI_strncpy(engine->text, info, sizeof(engine->text));
469  }
470  else if (stats && stats[0]) {
471  BLI_strncpy(engine->text, stats, sizeof(engine->text));
472  }
473 }
474 
475 void RE_engine_update_progress(RenderEngine *engine, float progress)
476 {
477  Render *re = engine->re;
478 
479  if (re) {
480  CLAMP(progress, 0.0f, 1.0f);
481  re->progress(re->prh, progress);
482  }
483 }
484 
485 void RE_engine_update_memory_stats(RenderEngine *engine, float mem_used, float mem_peak)
486 {
487  Render *re = engine->re;
488 
489  if (re) {
490  re->i.mem_used = mem_used;
491  re->i.mem_peak = mem_peak;
492  }
493 }
494 
495 void RE_engine_report(RenderEngine *engine, int type, const char *msg)
496 {
497  Render *re = engine->re;
498 
499  if (re) {
500  BKE_report(engine->re->reports, type, msg);
501  }
502  else if (engine->reports) {
503  BKE_report(engine->reports, type, msg);
504  }
505 }
506 
507 void RE_engine_set_error_message(RenderEngine *engine, const char *msg)
508 {
509  Render *re = engine->re;
510  if (re != NULL) {
512  if (rr) {
513  if (rr->error != NULL) {
514  MEM_freeN(rr->error);
515  }
516  rr->error = BLI_strdup(msg);
517  }
518  RE_ReleaseResult(re);
519  }
520 }
521 
523 {
524  Render *re = engine->re;
525  return RE_GetActiveRenderView(re);
526 }
527 
528 void RE_engine_active_view_set(RenderEngine *engine, const char *viewname)
529 {
530  Render *re = engine->re;
531  RE_SetActiveRenderView(re, viewname);
532 }
533 
534 float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera, bool use_spherical_stereo)
535 {
536  /* When using spherical stereo, get camera shift without multiview,
537  * leaving stereo to be handled by the engine. */
538  Render *re = engine->re;
539  if (use_spherical_stereo || re == NULL) {
540  return BKE_camera_multiview_shift_x(NULL, camera, NULL);
541  }
542 
543  return BKE_camera_multiview_shift_x(&re->r, camera, re->viewname);
544 }
545 
547  Object *camera,
548  bool use_spherical_stereo,
549  float *r_modelmat)
550 {
551  /* When using spherical stereo, get model matrix without multiview,
552  * leaving stereo to be handled by the engine. */
553  Render *re = engine->re;
554  if (use_spherical_stereo || re == NULL) {
555  BKE_camera_multiview_model_matrix(NULL, camera, NULL, (float(*)[4])r_modelmat);
556  }
557  else {
558  BKE_camera_multiview_model_matrix(&re->r, camera, re->viewname, (float(*)[4])r_modelmat);
559  }
560 }
561 
563 {
564  Render *re = engine->re;
565  return BKE_camera_multiview_spherical_stereo(re ? &re->r : NULL, camera) ? 1 : 0;
566 }
567 
568 rcti *RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_free)
569 {
570  static rcti tiles_static[BLENDER_MAX_THREADS];
571  const int allocation_step = BLENDER_MAX_THREADS;
572  int total_tiles = 0;
573  rcti *tiles = tiles_static;
574  int allocation_size = BLENDER_MAX_THREADS;
575 
577 
578  *r_needs_free = false;
579 
580  if (!re->parts || (re->engine && (re->engine->flag & RE_ENGINE_HIGHLIGHT_TILES) == 0)) {
581  *r_total_tiles = 0;
583  return NULL;
584  }
585 
586  GHashIterator pa_iter;
587  GHASH_ITER (pa_iter, re->parts) {
588  RenderPart *pa = BLI_ghashIterator_getValue(&pa_iter);
589  if (pa->status == PART_STATUS_IN_PROGRESS) {
590  if (total_tiles >= allocation_size) {
591  /* Just in case we're using crazy network rendering with more
592  * workers than BLENDER_MAX_THREADS.
593  */
594  allocation_size += allocation_step;
595  if (tiles == tiles_static) {
596  /* Can not realloc yet, tiles are pointing to a
597  * stack memory.
598  */
599  tiles = MEM_mallocN(allocation_size * sizeof(rcti), "current engine tiles");
600  }
601  else {
602  tiles = MEM_reallocN(tiles, allocation_size * sizeof(rcti));
603  }
604  *r_needs_free = true;
605  }
606  tiles[total_tiles] = pa->disprect;
607 
608  total_tiles++;
609  }
610  }
612  *r_total_tiles = total_tiles;
613  return tiles;
614 }
615 
617 {
618  return &re->r;
619 }
620 
622 {
623  /* Re-rendering is not supported with GPU contexts, since the GPU context
624  * is destroyed when the render thread exists. */
625  return (engine->re->r.mode & R_PERSISTENT_DATA) && !(engine->type->flag & RE_USE_GPU_CONTEXT);
626 }
627 
629 {
630  /* For persistent data or GPU engines like Eevee, reuse the depsgraph between
631  * view layers and animation frames. For renderers like Cycles that create
632  * their own copy of the scene, persistent data must be explicitly enabled to
633  * keep memory usage low by default. */
634  return (engine->re->r.mode & R_PERSISTENT_DATA) || (engine->type->flag & RE_USE_GPU_CONTEXT);
635 }
636 
637 /* Depsgraph */
638 static void engine_depsgraph_init(RenderEngine *engine, ViewLayer *view_layer)
639 {
640  Main *bmain = engine->re->main;
641  Scene *scene = engine->re->scene;
642  bool reuse_depsgraph = false;
643 
644  /* Reuse depsgraph from persistent data if possible. */
645  if (engine->depsgraph) {
646  if (DEG_get_bmain(engine->depsgraph) != bmain ||
647  DEG_get_input_scene(engine->depsgraph) != scene) {
648  /* If bmain or scene changes, we need a completely new graph. */
649  engine_depsgraph_free(engine);
650  }
651  else if (DEG_get_input_view_layer(engine->depsgraph) != view_layer) {
652  /* If only view layer changed, reuse depsgraph in the hope of reusing
653  * objects shared between view layers. */
654  DEG_graph_replace_owners(engine->depsgraph, bmain, scene, view_layer);
656  }
657 
658  reuse_depsgraph = true;
659  }
660 
661  if (!engine->depsgraph) {
662  /* Ensure we only use persistent data for one scene / view layer at a time,
663  * to avoid excessive memory usage. */
665 
666  /* Create new depsgraph if not cached with persistent data. */
667  engine->depsgraph = DEG_graph_new(bmain, scene, view_layer, DAG_EVAL_RENDER);
668  DEG_debug_name_set(engine->depsgraph, "RENDER");
669  }
670 
671  if (engine->re->r.scemode & R_BUTS_PREVIEW) {
672  /* Update for preview render. */
673  Depsgraph *depsgraph = engine->depsgraph;
675 
676  /* Need GPU context since this might free GPU buffers. */
677  const bool use_gpu_context = (engine->type->flag & RE_USE_GPU_CONTEXT) && reuse_depsgraph;
678  if (use_gpu_context) {
679  DRW_render_context_enable(engine->re);
680  }
681 
683 
684  if (use_gpu_context) {
686  }
687  }
688  else {
689  /* Go through update with full Python callbacks for regular render. */
691  }
692 
694 }
695 
697 {
698  if (engine->depsgraph) {
699  if (engine_keep_depsgraph(engine)) {
700  /* Clear recalc flags since the engine should have handled the updates for the currently
701  * rendered framed by now. */
702  DEG_ids_clear_recalc(engine->depsgraph, false);
703  }
704  else {
705  /* Free immediately to save memory. */
706  engine_depsgraph_free(engine);
707  }
708  }
709 }
710 
711 void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe)
712 {
713  if (!engine->depsgraph) {
714  return;
715  }
716 
717  /* Clear recalc flags before update so engine can detect what changed. */
718  DEG_ids_clear_recalc(engine->depsgraph, false);
719 
720  Render *re = engine->re;
721  double cfra = (double)frame + (double)subframe;
722 
723  CLAMP(cfra, MINAFRAME, MAXFRAME);
724  BKE_scene_frame_set(re->scene, cfra);
726 
728 }
729 
730 /* Bake */
732 {
733  re->scene = scene;
734  re->main = bmain;
735  render_copy_renderdata(&re->r, &scene->r);
736 }
737 
739 {
741  return (type->bake != NULL);
742 }
743 
746  Object *object,
747  const int object_id,
748  const BakePixel pixel_array[],
749  const BakeTargets *targets,
750  const eScenePassType pass_type,
751  const int pass_filter,
752  float result[])
753 {
755  RenderEngine *engine;
756 
757  /* set render info */
758  re->i.cfra = re->scene->r.cfra;
759  BLI_strncpy(re->i.scene_name, re->scene->id.name + 2, sizeof(re->i.scene_name) - 2);
760 
761  /* render */
762  engine = re->engine;
763 
764  if (!engine) {
765  engine = RE_engine_create(type);
766  re->engine = engine;
767  }
768 
769  engine->flag |= RE_ENGINE_RENDERING;
770 
771  /* TODO: actually link to a parent which shouldn't happen */
772  engine->re = re;
773 
774  engine->resolution_x = re->winx;
775  engine->resolution_y = re->winy;
776 
778  RE_parts_init(re);
779  engine->tile_x = re->r.tilex;
780  engine->tile_y = re->r.tiley;
782 
783  if (type->bake) {
784  engine->depsgraph = depsgraph;
785 
786  /* update is only called so we create the engine.session */
787  if (type->update) {
788  type->update(engine, re->main, engine->depsgraph);
789  }
790 
791  for (int i = 0; i < targets->num_images; i++) {
792  const BakeImage *image = targets->images + i;
793 
794  engine->bake.pixels = pixel_array + image->offset;
795  engine->bake.result = result + image->offset * targets->num_channels;
796  engine->bake.width = image->width;
797  engine->bake.height = image->height;
798  engine->bake.depth = targets->num_channels;
799  engine->bake.object_id = object_id;
800 
801  type->bake(
802  engine, engine->depsgraph, object, pass_type, pass_filter, image->width, image->height);
803 
804  memset(&engine->bake, 0, sizeof(engine->bake));
805  }
806 
807  engine->depsgraph = NULL;
808  }
809 
810  engine->tile_x = 0;
811  engine->tile_y = 0;
812  engine->flag &= ~RE_ENGINE_RENDERING;
813 
814  /* Free depsgraph outside of parts mutex lock, since this locks OpenGL context
815  * while the the UI drawing might also lock the OpenGL context and parts mutex. */
816  engine_depsgraph_free(engine);
818 
819  RE_engine_free(engine);
820  re->engine = NULL;
821 
822  RE_parts_free(re);
824 
826  G.is_break = true;
827  }
828 
829  return true;
830 }
831 
832 /* Render */
833 
835  RenderEngine *engine,
836  ViewLayer *view_layer_iter,
837  const bool use_engine,
838  const bool use_grease_pencil)
839 {
840  /* Lock UI so scene can't be edited while we read from it in this render thread. */
841  if (re->draw_lock) {
842  re->draw_lock(re->dlh, true);
843  }
844 
845  /* Create depsgraph with scene evaluated at render resolution. */
846  ViewLayer *view_layer = BLI_findstring(
847  &re->scene->view_layers, view_layer_iter->name, offsetof(ViewLayer, name));
848  engine_depsgraph_init(engine, view_layer);
849 
850  /* Sync data to engine, within draw lock so scene data can be accessed safely. */
851  if (use_engine) {
852  if (engine->type->update) {
853  engine->type->update(engine, re->main, engine->depsgraph);
854  }
855  }
856 
857  if (re->draw_lock) {
858  re->draw_lock(re->dlh, false);
859  }
860 
861  /* Perform render with engine. */
862  if (use_engine) {
863  const bool use_gpu_context = (engine->type->flag & RE_USE_GPU_CONTEXT);
864  if (use_gpu_context) {
865  DRW_render_context_enable(engine->re);
866  }
867 
868  engine->type->render(engine, engine->depsgraph);
869 
870  if (use_gpu_context) {
872  }
873  }
874 
875  /* Optionally composite grease pencil over render result. */
876  if (engine->has_grease_pencil && use_grease_pencil && !re->result->do_exr_tile) {
877  /* NOTE: External engine might have been requested to free its
878  * dependency graph, which is only allowed if there is no grease
879  * pencil (pipeline is taking care of that). */
880  if (!RE_engine_test_break(engine) && engine->depsgraph != NULL) {
881  DRW_render_gpencil(engine, engine->depsgraph);
882  }
883  }
884 
885  /* Free dependency graph, if engine has not done it already. */
886  engine_depsgraph_exit(engine);
887 }
888 
889 bool RE_engine_render(Render *re, bool do_all)
890 {
892 
893  /* verify if we can render */
894  if (!type->render) {
895  return false;
896  }
897  if ((re->r.scemode & R_BUTS_PREVIEW) && !(type->flag & RE_USE_PREVIEW)) {
898  return false;
899  }
900  if (do_all && !(type->flag & RE_USE_POSTPROCESS)) {
901  return false;
902  }
903  if (!do_all && (type->flag & RE_USE_POSTPROCESS)) {
904  return false;
905  }
906 
907  /* Lock drawing in UI during data phase. */
908  if (re->draw_lock) {
909  re->draw_lock(re->dlh, true);
910  }
911 
912  /* update animation here so any render layer animation is applied before
913  * creating the render result */
914  if ((re->r.scemode & (R_NO_FRAME_UPDATE | R_BUTS_PREVIEW)) == 0) {
916  }
917 
918  /* create render result */
920  if (re->result == NULL || !(re->r.scemode & R_BUTS_PREVIEW)) {
921  int savebuffers = RR_USE_MEM;
922 
923  if (re->result) {
925  }
926 
927  if ((type->flag & RE_USE_SAVE_BUFFERS) && (re->r.scemode & R_EXR_TILE_FILE)) {
928  savebuffers = RR_USE_EXR;
929  }
930  re->result = render_result_new(re, &re->disprect, savebuffers, RR_ALL_LAYERS, RR_ALL_VIEWS);
931  }
933 
934  if (re->result == NULL) {
935  /* Clear UI drawing locks. */
936  if (re->draw_lock) {
937  re->draw_lock(re->dlh, false);
938  }
939  /* Too small image is handled earlier, here it could only happen if
940  * there was no sufficient memory to allocate all passes.
941  */
942  BKE_report(re->reports, RPT_ERROR, "Failed allocate render result, out of memory");
943  G.is_break = true;
944  return true;
945  }
946 
947  /* set render info */
948  re->i.cfra = re->scene->r.cfra;
949  BLI_strncpy(re->i.scene_name, re->scene->id.name + 2, sizeof(re->i.scene_name));
950 
951  /* render */
952  RenderEngine *engine = re->engine;
953 
954  if (!engine) {
955  engine = RE_engine_create(type);
956  re->engine = engine;
957  }
958 
959  engine->flag |= RE_ENGINE_RENDERING;
960 
961  /* TODO: actually link to a parent which shouldn't happen */
962  engine->re = re;
963 
964  if (re->flag & R_ANIMATION) {
965  engine->flag |= RE_ENGINE_ANIMATION;
966  }
967  if (re->r.scemode & R_BUTS_PREVIEW) {
968  engine->flag |= RE_ENGINE_PREVIEW;
969  }
970  engine->camera_override = re->camera_override;
971 
972  engine->resolution_x = re->winx;
973  engine->resolution_y = re->winy;
974 
976  RE_parts_init(re);
977  engine->tile_x = re->partx;
978  engine->tile_y = re->party;
980 
981  if (re->result->do_exr_tile) {
982  render_result_exr_file_begin(re, engine);
983  }
984 
985  /* Clear UI drawing locks. */
986  if (re->draw_lock) {
987  re->draw_lock(re->dlh, false);
988  }
989 
990  /* Render view layers. */
991  bool delay_grease_pencil = false;
992 
993  if (type->render) {
994  FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) {
995  engine_render_view_layer(re, engine, view_layer_iter, true, true);
996 
997  /* With save buffers there is no render buffer in memory for compositing, delay
998  * grease pencil in that case. */
999  delay_grease_pencil = engine->has_grease_pencil && re->result->do_exr_tile;
1000 
1001  if (RE_engine_test_break(engine)) {
1002  break;
1003  }
1004  }
1006  }
1007 
1008  /* Clear tile data */
1009  engine->tile_x = 0;
1010  engine->tile_y = 0;
1011  engine->flag &= ~RE_ENGINE_RENDERING;
1012 
1014 
1016 
1017  /* For save buffers, read back from disk. */
1018  if (re->result->do_exr_tile) {
1019  render_result_exr_file_end(re, engine);
1020  }
1021 
1022  /* Perform delayed grease pencil rendering. */
1023  if (delay_grease_pencil) {
1025 
1026  FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) {
1027  engine_render_view_layer(re, engine, view_layer_iter, false, true);
1028  if (RE_engine_test_break(engine)) {
1029  break;
1030  }
1031  }
1033 
1035  }
1036 
1037  /* re->engine becomes zero if user changed active render engine during render */
1038  if (!engine_keep_depsgraph(engine) || !re->engine) {
1039  /* Free depsgraph outside of parts mutex lock, since this locks OpenGL context
1040  * while the the UI drawing might also lock the OpenGL context and parts mutex. */
1042  engine_depsgraph_free(engine);
1044 
1045  RE_engine_free(engine);
1046  re->engine = NULL;
1047  }
1048 
1049  if (re->r.scemode & R_EXR_CACHE_FILE) {
1053  }
1054 
1055  RE_parts_free(re);
1057 
1059  G.is_break = true;
1060  }
1061 
1062 #ifdef WITH_FREESTYLE
1063  if (re->r.mode & R_EDGE_FRS) {
1064  RE_RenderFreestyleExternal(re);
1065  }
1066 #endif
1067 
1068  return true;
1069 }
1070 
1072  struct Scene *scene,
1073  struct ViewLayer *view_layer,
1075  void *callback_data)
1076 {
1077  if (!(scene && view_layer && engine && callback && engine->type->update_render_passes)) {
1078  return;
1079  }
1080 
1082 
1084  engine->update_render_passes_data = callback_data;
1085  engine->type->update_render_passes(engine, scene, view_layer);
1086  engine->update_render_passes_cb = NULL;
1087  engine->update_render_passes_data = NULL;
1088 
1090 }
1091 
1093  struct Scene *scene,
1094  struct ViewLayer *view_layer,
1095  const char *name,
1096  int channels,
1097  const char *chanid,
1099 {
1100  if (!(scene && view_layer && engine && engine->update_render_passes_cb)) {
1101  return;
1102  }
1103 
1104  engine->update_render_passes_cb(
1105  engine->update_render_passes_data, scene, view_layer, name, channels, chanid, type);
1106 }
1107 
1109 {
1110  /* Weak way to save memory, but not crash grease pencil.
1111  *
1112  * TODO(sergey): Find better solution for this.
1113  */
1114  if (engine->has_grease_pencil || engine_keep_depsgraph(engine)) {
1115  return;
1116  }
1117  engine_depsgraph_free(engine);
1118 }
typedef float(TangentPoint)[2]
Camera data-block and utility functions.
float BKE_camera_multiview_shift_x(const struct RenderData *rd, const struct Object *camera, const char *viewname)
void BKE_camera_multiview_model_matrix(const struct RenderData *rd, const struct Object *camera, const char *viewname, float r_modelmat[4][4])
bool BKE_camera_multiview_spherical_stereo(const struct RenderData *rd, const struct Object *camera)
void BKE_report(ReportList *reports, ReportType type, const char *message)
Definition: report.c:104
bool BKE_reports_contain(ReportList *reports, ReportType level)
Definition: report.c:308
void BKE_scene_frame_set(struct Scene *scene, double cfra)
Definition: scene.c:2475
bool BKE_scene_camera_switch_update(struct Scene *scene)
Definition: scene.c:2349
void BKE_scene_graph_update_for_newframe_ex(struct Depsgraph *depsgraph, const bool clear_recalc)
Definition: scene.c:2724
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.h:150
#define GHASH_ITER(gh_iter_, ghash_)
Definition: BLI_ghash.h:169
void * BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:803
void * BLI_findstring(const struct ListBase *listbase, const char *id, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:133
MINLINE float int_as_float(int i)
void BLI_rcti_translate(struct rcti *rect, int x, int y)
Definition: rct.c:597
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
Definition: string.c:70
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
void BLI_mutex_end(ThreadMutex *mutex)
Definition: threads.cc:416
#define THREAD_LOCK_READ
Definition: BLI_threads.h:121
void BLI_mutex_init(ThreadMutex *mutex)
Definition: threads.cc:396
#define THREAD_LOCK_WRITE
Definition: BLI_threads.h:122
void BLI_rw_mutex_lock(ThreadRWMutex *mutex, int mode)
Definition: threads.cc:516
void BLI_mutex_lock(ThreadMutex *mutex)
Definition: threads.cc:401
void BLI_mutex_unlock(ThreadMutex *mutex)
Definition: threads.cc:406
#define BLENDER_MAX_THREADS
Definition: BLI_threads.h:35
void BLI_rw_mutex_unlock(ThreadRWMutex *mutex)
Definition: threads.cc:526
void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr)
typedef double(DMatrix)[4][4]
Depsgraph * DEG_graph_new(struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer, eEvaluationMode mode)
Definition: depsgraph.cc:281
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
void DEG_ids_clear_recalc(Depsgraph *depsgraph, const bool backup)
@ DAG_EVAL_RENDER
Definition: DEG_depsgraph.h:62
void DEG_evaluate_on_framechange(Depsgraph *graph, float ctime)
void DEG_graph_replace_owners(struct Depsgraph *depsgraph, struct Main *bmain, struct Scene *scene, struct ViewLayer *view_layer)
Definition: depsgraph.cc:292
void DEG_graph_free(Depsgraph *graph)
Definition: depsgraph.cc:314
void DEG_graph_tag_relations_update(struct Depsgraph *graph)
void DEG_graph_relations_update(struct Depsgraph *graph)
void DEG_debug_name_set(struct Depsgraph *depsgraph, const char *name)
struct Scene * DEG_get_input_scene(const Depsgraph *graph)
struct Main * DEG_get_bmain(const Depsgraph *graph)
struct ViewLayer * DEG_get_input_view_layer(const Depsgraph *graph)
eNodeSocketDatatype
Object is a sort of wrapper for general info.
#define RE_PASSNAME_COMBINED
#define R_PERSISTENT_DATA
#define MINAFRAME
#define CFRA
#define R_BUTS_PREVIEW
#define R_EXR_CACHE_FILE
#define R_EXR_TILE_FILE
#define R_EDGE_FRS
#define R_NO_FRAME_UPDATE
eScenePassType
#define MAXFRAME
bool DRW_render_check_grease_pencil(struct Depsgraph *depsgraph)
void DRW_engines_free(void)
void DRW_engines_register(void)
void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph)
void DRW_engine_register(struct DrawEngineType *draw_engine_type)
bool DRW_engine_render_support(struct DrawEngineType *draw_engine_type)
void DRW_render_context_disable(struct Render *render)
void DRW_render_context_enable(struct Render *render)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
Group RGB to Bright Vector Camera CLAMP
#define RE_INTERNAL
Definition: RE_engine.h:57
#define RE_ENGINE_ANIMATION
Definition: RE_engine.h:70
#define RE_USE_SAVE_BUFFERS
Definition: RE_engine.h:62
#define RE_USE_GPU_CONTEXT
Definition: RE_engine.h:66
#define RE_ENGINE_PREVIEW
Definition: RE_engine.h:71
#define RE_ENGINE_RENDERING
Definition: RE_engine.h:74
#define RE_ENGINE_HIGHLIGHT_TILES
Definition: RE_engine.h:75
#define RE_USE_PREVIEW
Definition: RE_engine.h:59
void(* update_render_passes_cb_t)(void *userdata, struct Scene *scene, struct ViewLayer *view_layer, const char *name, int channels, const char *chanid, eNodeSocketDatatype type)
Definition: RE_engine.h:117
#define RE_USE_POSTPROCESS
Definition: RE_engine.h:60
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition: btDbvt.cpp:52
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition: btQuadWord.h:119
Scene scene
const Depsgraph * depsgraph
DEGForeachIDComponentCallback callback
RenderEngine * RE_engine_create(RenderEngineType *type)
Definition: engine.c:133
RenderEngineType * RE_engines_find(const char *idname)
Definition: engine.c:108
bool RE_engine_is_external(const Render *re)
Definition: engine.c:120
bool RE_engine_is_opengl(RenderEngineType *render_type)
Definition: engine.c:125
bool RE_bake_engine(Render *re, Depsgraph *depsgraph, Object *object, const int object_id, const BakePixel pixel_array[], const BakeTargets *targets, const eScenePassType pass_type, const int pass_filter, float result[])
Definition: engine.c:744
void RE_engine_frame_set(RenderEngine *engine, int frame, float subframe)
Definition: engine.c:711
void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer, update_render_passes_cb_t callback, void *callback_data)
Definition: engine.c:1071
static void engine_depsgraph_exit(RenderEngine *engine)
Definition: engine.c:696
void RE_engine_add_pass(RenderEngine *engine, const char *name, int channels, const char *chan_id, const char *layername)
Definition: engine.c:359
static void engine_depsgraph_init(RenderEngine *engine, ViewLayer *view_layer)
Definition: engine.c:638
void RE_engine_report(RenderEngine *engine, int type, const char *msg)
Definition: engine.c:495
static RenderResult * render_result_from_bake(RenderEngine *engine, int x, int y, int w, int h)
Definition: engine.c:178
void RE_engine_active_view_set(RenderEngine *engine, const char *viewname)
Definition: engine.c:528
bool RE_engine_use_persistent_data(RenderEngine *engine)
Definition: engine.c:621
void RE_engine_get_camera_model_matrix(RenderEngine *engine, Object *camera, bool use_spherical_stereo, float *r_modelmat)
Definition: engine.c:546
float RE_engine_get_camera_shift_x(RenderEngine *engine, Object *camera, bool use_spherical_stereo)
Definition: engine.c:534
void RE_engine_update_result(RenderEngine *engine, RenderResult *result)
Definition: engine.c:343
static void engine_render_view_layer(Render *re, RenderEngine *engine, ViewLayer *view_layer_iter, const bool use_engine, const bool use_grease_pencil)
Definition: engine.c:834
void RE_engine_update_memory_stats(RenderEngine *engine, float mem_used, float mem_peak)
Definition: engine.c:485
void RE_engines_init(void)
Definition: engine.c:74
bool RE_engine_get_spherical_stereo(RenderEngine *engine, Object *camera)
Definition: engine.c:562
bool RE_engine_render(Render *re, bool do_all)
Definition: engine.c:889
bool RE_engine_test_break(RenderEngine *engine)
Definition: engine.c:435
void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer, const char *name, int channels, const char *chanid, eNodeSocketDatatype type)
Definition: engine.c:1092
void RE_engine_update_stats(RenderEngine *engine, const char *stats, const char *info)
Definition: engine.c:448
void RE_bake_engine_set_engine_parameters(Render *re, Main *bmain, Scene *scene)
Definition: engine.c:731
static void engine_depsgraph_free(RenderEngine *engine)
Definition: engine.c:143
void RE_engines_exit(void)
Definition: engine.c:79
void RE_engines_register(RenderEngineType *render_type)
Definition: engine.c:100
void RE_engine_free(RenderEngine *engine)
Definition: engine.c:161
void RE_engine_free_blender_memory(RenderEngine *engine)
Definition: engine.c:1108
RenderResult * RE_engine_get_result(RenderEngine *engine)
Definition: engine.c:428
void RE_engine_set_error_message(RenderEngine *engine, const char *msg)
Definition: engine.c:507
const char * RE_engine_active_view_get(RenderEngine *engine)
Definition: engine.c:522
RenderData * RE_engine_get_render_data(Render *re)
Definition: engine.c:616
void RE_engine_end_result(RenderEngine *engine, RenderResult *result, bool cancel, bool highlight, bool merge_results)
Definition: engine.c:374
ListBase R_engines
Definition: engine.c:72
RenderResult * RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, int h, const char *layername, const char *viewname)
Definition: engine.c:279
static bool engine_keep_depsgraph(RenderEngine *engine)
Definition: engine.c:628
bool RE_bake_has_engine(Render *re)
Definition: engine.c:738
static void render_result_to_bake(RenderEngine *engine, RenderResult *rr)
Definition: engine.c:246
static RenderPart * get_part_from_result(Render *re, RenderResult *result)
Definition: engine.c:271
void RE_engine_update_progress(RenderEngine *engine, float progress)
Definition: engine.c:475
rcti * RE_engine_get_current_tiles(Render *re, int *r_total_tiles, bool *r_needs_free)
Definition: engine.c:568
void RE_parts_free(Render *re)
Definition: initrender.c:250
void RE_parts_init(Render *re)
Definition: initrender.c:265
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:47
static ulong * next
RenderResult * RE_AcquireResultRead(Render *re)
Definition: pipeline.c:343
void render_copy_renderdata(RenderData *to, RenderData *from)
Definition: pipeline.c:775
void RE_FreePersistentData(const Scene *scene)
Definition: pipeline.c:700
void render_update_anim_renderdata(Render *re, RenderData *rd, ListBase *render_layers)
Definition: pipeline.c:898
void RE_ReleaseResult(Render *re)
Definition: pipeline.c:379
RenderPass * RE_pass_find_by_name(volatile RenderLayer *rl, const char *name, const char *viewname)
Definition: pipeline.c:2764
const char * RE_GetActiveRenderView(Render *re)
Definition: pipeline.c:1746
void RE_SetActiveRenderView(Render *re, const char *viewname)
Definition: pipeline.c:1741
void render_result_exr_file_cache_write(Render *re)
void render_result_exr_file_end(Render *re, RenderEngine *engine)
void RE_create_render_pass(RenderResult *rr, const char *name, int channels, const char *chan_id, const char *layername, const char *viewname)
void render_result_merge(RenderResult *rr, RenderResult *rrpart)
void render_result_free(RenderResult *rr)
Definition: render_result.c:85
RenderPass * render_layer_add_pass(RenderResult *rr, RenderLayer *rl, int channels, const char *name, const char *viewname, const char *chan_id)
void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewname)
void render_result_exr_file_begin(Render *re, RenderEngine *engine)
void render_result_free_list(ListBase *lb, RenderResult *rr)
RenderResult * render_result_new(Render *re, rcti *partrct, int savebuffers, const char *layername, const char *viewname)
void render_result_exr_file_merge(RenderResult *rr, RenderResult *rrpart, const char *viewname)
#define FOREACH_VIEW_LAYER_TO_RENDER_END
#define RR_USE_EXR
Definition: render_result.h:29
#define RR_USE_MEM
Definition: render_result.h:28
#define RR_ALL_VIEWS
Definition: render_result.h:32
#define RR_ALL_LAYERS
Definition: render_result.h:31
#define FOREACH_VIEW_LAYER_TO_RENDER_BEGIN(re_, iter_)
@ PART_STATUS_IN_PROGRESS
Definition: render_types.h:64
@ PART_STATUS_MERGED
Definition: render_types.h:66
@ PART_STATUS_RENDERED
Definition: render_types.h:65
#define R_ANIMATION
Definition: render_types.h:164
int height
Definition: RE_bake.h:38
size_t offset
Definition: RE_bake.h:39
int width
Definition: RE_bake.h:37
int num_images
Definition: RE_bake.h:45
int num_channels
Definition: RE_bake.h:54
BakeImage * images
Definition: RE_bake.h:44
char name[66]
Definition: DNA_ID.h:283
void * first
Definition: DNA_listBase.h:47
Definition: BKE_main.h:116
char engine[32]
void(* render)(struct RenderEngine *engine, struct Depsgraph *depsgraph)
Definition: RE_engine.h:88
void(* update)(struct RenderEngine *engine, struct Main *bmain, struct Depsgraph *depsgraph)
Definition: RE_engine.h:87
struct DrawEngineType * draw_engine
Definition: RE_engine.h:111
void(* update_render_passes)(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
Definition: RE_engine.h:107
struct ReportList * reports
Definition: RE_engine.h:142
struct Depsgraph * depsgraph
Definition: RE_engine.h:152
RenderEngineType * type
Definition: RE_engine.h:126
const struct BakePixel * pixels
Definition: RE_engine.h:145
float * result
Definition: RE_engine.h:146
char text[512]
Definition: RE_engine.h:138
bool has_grease_pencil
Definition: RE_engine.h:153
struct Render * re
Definition: RE_engine.h:136
void * update_render_passes_data
Definition: RE_engine.h:158
ListBase fullresult
Definition: RE_engine.h:137
void * py_instance
Definition: RE_engine.h:127
struct RenderEngine::@1136 bake
int resolution_x
Definition: RE_engine.h:140
update_render_passes_cb_t update_render_passes_cb
Definition: RE_engine.h:157
int resolution_y
Definition: RE_engine.h:140
ThreadMutex update_render_passes_mutex
Definition: RE_engine.h:156
struct Object * camera_override
Definition: RE_engine.h:130
short status
Definition: render_types.h:59
rcti disprect
Definition: render_types.h:56
float * rect
Definition: RE_pipeline.h:82
ListBase layers
Definition: RE_pipeline.h:135
char * error
Definition: RE_pipeline.h:155
const char * statstr
Definition: RE_pipeline.h:164
char scene_name[MAX_ID_NAME - 2]
Definition: RE_pipeline.h:165
float mem_peak
Definition: RE_pipeline.h:166
float mem_used
Definition: RE_pipeline.h:166
const char * infostr
Definition: RE_pipeline.h:164
void * sdh
Definition: render_types.h:140
void(* progress)(void *handle, float i)
Definition: render_types.h:141
void * duh
Definition: render_types.h:135
void * prh
Definition: render_types.h:142
RenderResult * result
Definition: render_types.h:79
RenderData r
Definition: render_types.h:113
int winy
Definition: render_types.h:92
struct RenderEngine * engine
Definition: render_types.h:122
struct Main * main
Definition: render_types.h:111
void * dlh
Definition: render_types.h:145
Scene * scene
Definition: render_types.h:112
ThreadRWMutex partsmutex
Definition: render_types.h:118
int partx
Definition: render_types.h:101
int party
Definition: render_types.h:101
short flag
Definition: render_types.h:76
struct GHash * parts
Definition: render_types.h:119
ThreadRWMutex resultmutex
Definition: render_types.h:87
char viewname[MAX_NAME]
Definition: render_types.h:154
RenderStats i
Definition: render_types.h:149
void * tbh
Definition: render_types.h:147
int winx
Definition: render_types.h:92
void(* draw_lock)(void *handle, bool lock)
Definition: render_types.h:144
void(* stats_draw)(void *handle, RenderStats *ri)
Definition: render_types.h:139
int(* test_break)(void *handle)
Definition: render_types.h:146
struct ReportList * reports
Definition: render_types.h:151
rcti disprect
Definition: render_types.h:93
struct Object * camera_override
Definition: render_types.h:116
void(* display_update)(void *handle, RenderResult *rr, volatile rcti *rect)
Definition: render_types.h:134
struct RenderData r
ListBase view_layers
char name[64]
int ymin
Definition: DNA_vec_types.h:80
int ymax
Definition: DNA_vec_types.h:80
int xmin
Definition: DNA_vec_types.h:79
int xmax
Definition: DNA_vec_types.h:79
#define G(x, y, z)