Merge branch 'blender2.7'
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 1 Mar 2019 18:29:26 +0000 (19:29 +0100)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Fri, 1 Mar 2019 18:29:26 +0000 (19:29 +0100)
1  2 
build_files/cmake/platform/platform_apple.cmake
source/blender/nodes/composite/nodes/node_composite_image.c
source/blender/render/extern/include/RE_engine.h
source/blender/render/intern/include/render_result.h
source/blender/render/intern/source/external_engine.c
source/blender/render/intern/source/render_result.c

@@@ -389,20 -390,15 +389,20 @@@ if(WITH_OPENMP
                message(STATUS "Using ${LIBDIR}/openmp for OpenMP")
                set(OPENMP_CUSTOM ON)
                set(OPENMP_FOUND ON)
-               set(OpenMP_C_FLAGS "-Xclang -fopenmp -I${LIBDIR}/openmp/include")
-               set(OpenMP_CXX_FLAGS "-Xclang -fopenmp -I${LIBDIR}/openmp/include")
-               set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${LIBDIR}/openmp/lib -lomp")
+               set(OpenMP_C_FLAGS "-Xclang -fopenmp -I\"${LIBDIR}/openmp/include\"")
+               set(OpenMP_CXX_FLAGS "-Xclang -fopenmp -I\"${LIBDIR}/openmp/include\"")
+               set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L\"${LIBDIR}/openmp/lib\" -lomp")
  
                # Copy libomp.dylib to allow executables like datatoc to work.
 +              if(CMAKE_MAKE_PROGRAM MATCHES "xcodebuild")
 +                      set(OPENMP_DYLIB_AUX_PATH "${CMAKE_BINARY_DIR}/bin")
 +              else()
 +                      set(OPENMP_DYLIB_AUX_PATH "${CMAKE_BINARY_DIR}")
 +              endif()
 +
                execute_process(
 -                      COMMAND mkdir -p ${CMAKE_BINARY_DIR}/Resources/lib
 -                      COMMAND cp -p ${LIBDIR}/openmp/lib/libomp.dylib ${CMAKE_BINARY_DIR}/Resources/lib/libomp.dylib
 -              )
 +                              COMMAND mkdir -p ${OPENMP_DYLIB_AUX_PATH}/Resources/lib
 +                              COMMAND cp -p ${LIBDIR}/openmp/lib/libomp.dylib ${OPENMP_DYLIB_AUX_PATH}/Resources/lib/libomp.dylib)
        endif()
  endif()
  
@@@ -206,7 -205,7 +206,7 @@@ void node_cmp_rlayers_register_pass(bNo
        }
  }
  
- static void cmp_node_rlayer_create_outputs_cb(RenderEngine *UNUSED(engine), Scene *scene, ViewLayer *view_layer,
 -static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata), Scene *scene, SceneRenderLayer *srl,
++static void cmp_node_rlayer_create_outputs_cb(void *UNUSED(userdata), 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.
@@@ -238,7 -235,7 +238,7 @@@ static void cmp_node_rlayer_create_outp
                                node->storage = data;
  
                                RenderEngine *engine = RE_engine_create(engine_type);
-                               RE_engine_update_render_passes(engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb);
 -                              RE_engine_update_render_passes(engine, scene, srl, cmp_node_rlayer_create_outputs_cb, NULL);
++                              RE_engine_update_render_passes(engine, scene, view_layer, cmp_node_rlayer_create_outputs_cb, NULL);
                                RE_engine_free(engine);
  
                                MEM_freeN(data);
@@@ -100,7 -96,7 +100,7 @@@ typedef struct RenderEngineType 
        ExtensionRNA ext;
  } RenderEngineType;
  
- typedef void (*update_render_passes_cb_t)(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer,
 -typedef void (*update_render_passes_cb_t)(void *userdata, struct Scene *scene, struct SceneRenderLayer *srl,
++typedef void (*update_render_passes_cb_t)(void *userdata, struct Scene *scene, struct ViewLayer *view_layer,
                                            const char *name, int channels, const char *chanid, int type);
  
  typedef struct RenderEngine {
@@@ -167,9 -165,9 +168,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);
+                                     update_render_passes_cb_t callback, void *callback_data);
 -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 */
@@@ -85,7 -87,7 +85,6 @@@ struct RenderPass *gp_add_pass(struct R
  void render_result_exr_file_merge(struct RenderResult *rr, struct RenderResult *rrpart, const char *viewname);
  
  void render_result_exr_file_path(struct Scene *scene, const char *layname, int sample, char *filepath);
--int render_result_exr_file_read_sample(struct Render *re, int sample, struct RenderEngine *engine);
  int render_result_exr_file_read_path(struct RenderResult *rr, struct RenderLayer *rl_single, const char *filepath);
  
  /* EXR cache */
@@@ -794,17 -771,20 +791,20 @@@ int RE_engine_render(Render *re, int do
        return 1;
  }
  
 -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)
+                                     update_render_passes_cb_t callback, void *callback_data)
  {
 -      if (!(scene && srl && engine && callback && engine->type->update_render_passes)) {
 +      if (!(scene && view_layer && engine && callback && engine->type->update_render_passes)) {
                return;
        }
  
        BLI_mutex_lock(&engine->update_render_passes_mutex);
  
        engine->update_render_passes_cb = callback;
 -      engine->type->update_render_passes(engine, scene, srl);
+       engine->update_render_passes_data = callback_data;
 +      engine->type->update_render_passes(engine, scene, view_layer);
+       engine->update_render_passes_cb = NULL;
+       engine->update_render_passes_data = NULL;
  
        BLI_mutex_unlock(&engine->update_render_passes_mutex);
  }
@@@ -816,20 -796,5 +816,20 @@@ void RE_engine_register_pass(struct Ren
                return;
        }
  
-       engine->update_render_passes_cb(engine, scene, view_layer, name, channels, chanid, type);
 -      engine->update_render_passes_cb(engine->update_render_passes_data, scene, srl, name, channels, chanid, type);
++      engine->update_render_passes_cb(engine->update_render_passes_data, 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;
  }
@@@ -1058,19 -1108,29 +1058,28 @@@ void render_result_save_empty_result_ti
        }
  }
  
- 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))
+ /* Compute list of passes needed by render engine. */
 -static void templates_register_pass_cb(void *userdata, Scene *UNUSED(scene), SceneRenderLayer *UNUSED(srl),
++static void templates_register_pass_cb(void *userdata, Scene *UNUSED(scene), ViewLayer *UNUSED(view_layer),
+                                        const char *name, int channels, const char *chan_id, int UNUSED(type))
  {
-       RE_engine_add_pass(engine, name, channels, chanid, view_layer->name);
+       ListBase *templates = userdata;
+       RenderPass *pass = MEM_callocN(sizeof(RenderPass), "RenderPassTemplate");
+       pass->channels = channels;
+       BLI_strncpy(pass->name, name, sizeof(pass->name));
+       BLI_strncpy(pass->chan_id, chan_id, sizeof(pass->chan_id));
+       BLI_addtail(templates, pass);
  }
  
- static void render_result_create_all_passes(RenderEngine *engine, Render *re, RenderLayer *rl)
+ static void render_result_get_pass_templates(RenderEngine *engine, Render *re, RenderLayer *rl, ListBase *templates)
  {
+       BLI_listbase_clear(templates);
        if (engine && engine->type->update_render_passes) {
-               ViewLayer *view_layer;
-               view_layer = BLI_findstring(&re->view_layers, rl->name, offsetof(ViewLayer, name));
 -              SceneRenderLayer *srl;
 -              srl = BLI_findstring(&re->r.layers, rl->name, offsetof(SceneRenderLayer, name));
 -              if (srl) {
 -                      RE_engine_update_render_passes(engine, re->scene, srl, templates_register_pass_cb, templates);
++              ViewLayer *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);
++                      RE_engine_update_render_passes(engine, re->scene, view_layer, templates_register_pass_cb, templates);
                }
        }
  }
@@@ -1140,31 -1237,38 +1186,6 @@@ void render_result_exr_file_path(Scene 
        BLI_make_file_string("/", filepath, BKE_tempdir_session(), name);
  }
  
--/* only for temp buffer, makes exact copy of render result */
--int render_result_exr_file_read_sample(Render *re, int sample, RenderEngine *engine)
--{
--      RenderLayer *rl;
--      char str[FILE_MAXFILE + MAX_ID_NAME + MAX_ID_NAME + 100] = "";
--      bool success = true;
--
--      RE_FreeRenderResult(re->result);
--      re->result = render_result_new(re, &re->disprect, 0, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS);
--
--      for (rl = re->result->layers.first; rl; rl = rl->next) {
-               render_result_create_all_passes(engine, re, rl);
 -              ListBase templates;
 -              render_result_get_pass_templates(engine, re, rl, &templates);
 -
 -              for (RenderPass *pass = templates.first; pass; pass = pass->next) {
 -                      render_result_add_pass(re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL);
 -              }
 -
 -              BLI_freelistN(&templates);
--
--              render_result_exr_file_path(re->scene, rl->name, sample, str);
--              printf("read exr tmp file: %s\n", str);
--
--              if (!render_result_exr_file_read_path(re->result, rl, str)) {
--                      printf("cannot read: %s\n", str);
--                      success = false;
--              }
--      }
--
--      return success;
--}
--
  /* called for reading temp files, and for external engines */
  int render_result_exr_file_read_path(RenderResult *rr, RenderLayer *rl_single, const char *filepath)
  {