Commit: 031a9d6424815ce73897e25800356c9888b1cde2
Author: Lukas Stockner
Date:   Fri Jan 18 01:47:32 2019 +0100
Branches: master
https://developer.blender.org/rB031a9d6424815ce73897e25800356c9888b1cde2

Merge branch 'blender2.7'

===================================================================



===================================================================

diff --cc source/blender/nodes/composite/nodes/node_composite_image.c
index 856b87631d7,7f906ae27ce..ce41e309527
--- a/source/blender/nodes/composite/nodes/node_composite_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@@ -214,6 -213,21 +214,23 @@@ void node_cmp_rlayers_register_pass(bNo
        }
  }
  
 -static void cmp_node_rlayer_create_outputs_cb(RenderEngine *UNUSED(engine), 
Scene *scene, SceneRenderLayer *srl,
++static void cmp_node_rlayer_create_outputs_cb(RenderEngine *UNUSED(engine), 
Scene *scene, ViewLayer *view_layer,
+                                               const char *name, int 
UNUSED(channels), const char *UNUSED(chanid), int type)
+ {
+       /* Register the pass in all scenes that have a render layer node for 
this layer.
+        * Since multiple scenes can be used in the compositor, the code must 
loop over all scenes
+        * and check whether their nodetree has a node that needs to be 
updated. */
+       /* NOTE: using G_MAIN seems valid here,
+        * unless we want to register that for every other temp Main we could 
generate??? */
++      ntreeCompositRegisterPass(scene->nodetree, scene, view_layer, name, 
type);
++
+       for (Scene *sce = G_MAIN->scene.first; sce; sce = sce->id.next) {
 -              if (sce->nodetree) {
 -                      ntreeCompositRegisterPass(sce->nodetree, scene, srl, 
name, type);
++              if (sce->nodetree && sce != scene) {
++                      ntreeCompositRegisterPass(sce->nodetree, scene, 
view_layer, name, type);
+               }
+       }
+ }
+ 
  static void cmp_node_rlayer_create_outputs(bNodeTree *ntree, bNode *node, 
LinkNodePair *available_sockets)
  {
        Scene *scene = (Scene *)node->id;
@@@ -229,7 -243,7 +246,7 @@@
                                node->storage = data;
  
                                RenderEngine *engine = 
RE_engine_create(engine_type);
-                               engine_type->update_render_passes(engine, 
scene, view_layer);
 -                              RE_engine_update_render_passes(engine, scene, 
srl, cmp_node_rlayer_create_outputs_cb);
++                              RE_engine_update_render_passes(engine, scene, 
view_layer, cmp_node_rlayer_create_outputs_cb);
                                RE_engine_free(engine);
  
                                MEM_freeN(data);
diff --cc source/blender/render/extern/include/RE_engine.h
index faa4c8b3184,e23d881c7b1..8a6282aee01
--- a/source/blender/render/extern/include/RE_engine.h
+++ b/source/blender/render/extern/include/RE_engine.h
@@@ -37,12 -37,10 +37,14 @@@
  #include "RNA_types.h"
  #include "RE_bake.h"
  
+ #include "BLI_threads.h"
+ 
  struct bNode;
  struct bNodeTree;
 +struct BakePixel;
 +struct Depsgraph;
 +struct IDProperty;
 +struct Main;
  struct Object;
  struct Render;
  struct RenderData;
@@@ -111,6 -104,9 +113,9 @@@ typedef struct RenderEngineType 
        ExtensionRNA ext;
  } RenderEngineType;
  
 -typedef void (*update_render_passes_cb_t)(struct RenderEngine *engine, struct 
Scene *scene, struct SceneRenderLayer *srl,
++typedef void (*update_render_passes_cb_t)(struct RenderEngine *engine, struct 
Scene *scene, struct ViewLayer *view_layer,
+                                           const char *name, int channels, 
const char *chanid, int type);
+ 
  typedef struct RenderEngine {
        RenderEngineType *type;
        void *py_instance;
@@@ -175,7 -172,9 +184,9 @@@ bool RE_engine_is_external(struct Rende
  
  void RE_engine_frame_set(struct RenderEngine *engine, int frame, float 
subframe);
  
 -void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene 
*scene, struct SceneRenderLayer *srl,
++void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene 
*scene, struct ViewLayer *view_layer,
+                                     update_render_passes_cb_t callback);
 -void RE_engine_register_pass(struct RenderEngine *engine, struct Scene 
*scene, struct SceneRenderLayer *srl,
 +void RE_engine_register_pass(struct RenderEngine *engine, struct Scene 
*scene, struct ViewLayer *view_layer,
                               const char *name, int channels, const char 
*chanid, int type);
  
  /* Engine Types */
diff --cc source/blender/render/intern/source/external_engine.c
index 283f4c414ee,01044804d3e..7e531511944
--- a/source/blender/render/intern/source/external_engine.c
+++ b/source/blender/render/intern/source/external_engine.c
@@@ -711,8 -728,11 +715,8 @@@ int RE_engine_render(Render *re, int do
        engine->tile_y = re->party;
  
        if (re->result->do_exr_tile)
-               render_result_exr_file_begin(re);
+               render_result_exr_file_begin(re, engine);
  
 -      if (type->update)
 -              type->update(engine, re->main, re->scene);
 -
        /* Clear UI drawing locks. */
        if (re->draw_lock) {
                re->draw_lock(re->dlh, 0);
@@@ -798,40 -782,27 +802,42 @@@
        return 1;
  }
  
- void RE_engine_register_pass(struct RenderEngine *engine, struct Scene 
*scene, struct ViewLayer *view_layer,
-                              const char *name, int UNUSED(channels), const 
char *UNUSED(chanid), int type)
 -void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene 
*scene, struct SceneRenderLayer *srl,
++void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene 
*scene, struct ViewLayer *view_layer,
+                                     update_render_passes_cb_t callback)
  {
-       /* The channel information is currently not used, but is part of the 
API in case it's needed in the future. */
- 
-       if (!(scene && view_layer && engine)) {
 -      if (!(scene && srl && engine && callback && 
engine->type->update_render_passes)) {
++      if (!(scene && view_layer && engine && callback && 
engine->type->update_render_passes)) {
                return;
        }
  
-       /* Register the pass in all scenes that have a render layer node for 
this layer.
-        * Since multiple scenes can be used in the compositor, the code must 
loop over all scenes
-        * and check whether their nodetree has a node that needs to be 
updated. */
-       /* NOTE: using G_MAIN seems valid here,
-        * unless we want to register that for every other temp Main we could 
generate??? */
-       ntreeCompositRegisterPass(scene->nodetree, scene, view_layer, name, 
type);
+       BLI_mutex_lock(&engine->update_render_passes_mutex);
  
-       for (Scene *sce = G_MAIN->scene.first; sce; sce = sce->id.next) {
-               if (sce->nodetree && sce != scene) {
-                       ntreeCompositRegisterPass(sce->nodetree, scene, 
view_layer, name, type);
-               }
+       engine->update_render_passes_cb = callback;
 -      engine->type->update_render_passes(engine, scene, srl);
++      engine->type->update_render_passes(engine, scene, view_layer);
+ 
+       BLI_mutex_unlock(&engine->update_render_passes_mutex);
+ }
+ 
 -void RE_engine_register_pass(struct RenderEngine *engine, struct Scene 
*scene, struct SceneRenderLayer *srl,
++void RE_engine_register_pass(struct RenderEngine *engine, struct Scene 
*scene, struct ViewLayer *view_layer,
+                              const char *name, int channels, const char 
*chanid, int type)
+ {
 -      if (!(scene && srl && engine && engine->update_render_passes_cb)) {
++      if (!(scene && view_layer && engine && 
engine->update_render_passes_cb)) {
+               return;
        }
+ 
 -      engine->update_render_passes_cb(engine, scene, srl, name, channels, 
chanid, type);
++      engine->update_render_passes_cb(engine, scene, view_layer, name, 
channels, chanid, type);
 +}
 +
 +void RE_engine_free_blender_memory(RenderEngine *engine)
 +{
 +      /* Weak way to save memory, but not crash grease pencil.
 +       *
 +       * TODO(sergey): Find better solution for this.
 +       * TODO(sergey): Try to find solution which does not involve looping 
over
 +       * all the objects.
 +       */
 +      if (DRW_render_check_grease_pencil(engine->depsgraph)) {
 +              return;
 +      }
 +      DEG_graph_free(engine->depsgraph);
 +      engine->depsgraph = NULL;
  }
diff --cc source/blender/render/intern/source/render_result.c
index 7efe0a5da60,abd23541326..9ec7054ecdf
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@@ -1063,8 -1116,25 +1066,25 @@@ void render_result_save_empty_result_ti
        }
  }
  
 -static void render_result_register_pass_cb(RenderEngine *engine, Scene 
*UNUSED(scene), SceneRenderLayer *srl,
++static void render_result_register_pass_cb(RenderEngine *engine, Scene 
*UNUSED(scene), ViewLayer *view_layer,
+                                            const char *name, int channels, 
const char *chanid, int UNUSED(type))
+ {
 -      RE_engine_add_pass(engine, name, channels, chanid, srl->name);
++      RE_engine_add_pass(engine, name, channels, chanid, view_layer->name);
+ }
+ 
+ static void render_result_create_all_passes(RenderEngine *engine, Render *re, 
RenderLayer *rl)
+ {
+       if (engine && engine->type->update_render_passes) {
 -              SceneRenderLayer *srl;
 -              srl = BLI_findstring(&re->r.layers, rl->name, 
offsetof(SceneRenderLayer, name));
 -              if (srl) {
 -                      RE_engine_update_render_passes(engine, re->scene, srl, 
render_result_register_pass_cb);
++              ViewLayer *view_layer;
++              view_layer = BLI_findstring(&re->view_layers, rl->name, 
offsetof(ViewLayer, name));
++              if (view_layer) {
++                      RE_engine_update_render_passes(engine, re->scene, 
view_layer, render_result_register_pass_cb);
+               }
+       }
+ }
+ 
  /* begin write of exr tile file */
- void render_result_exr_file_begin(Render *re)
+ void render_result_exr_file_begin(Render *re, RenderEngine *engine)
  {
        RenderResult *rr;
        RenderLayer *rl;

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to