diff options
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/CMakeLists.txt | 7 | ||||
-rw-r--r-- | source/blender/render/RE_engine.h | 1 | ||||
-rw-r--r-- | source/blender/render/RE_shader_ext.h | 83 | ||||
-rw-r--r-- | source/blender/render/RE_texture.h (renamed from source/blender/render/RE_render_ext.h) | 41 | ||||
-rw-r--r-- | source/blender/render/intern/bake.c (renamed from source/blender/render/intern/bake_api.c) | 0 | ||||
-rw-r--r-- | source/blender/render/intern/engine.c (renamed from source/blender/render/intern/external_engine.c) | 121 | ||||
-rw-r--r-- | source/blender/render/intern/multires_bake.c | 7 | ||||
-rw-r--r-- | source/blender/render/intern/pipeline.c | 2 | ||||
-rw-r--r-- | source/blender/render/intern/texture_image.c | 3 | ||||
-rw-r--r-- | source/blender/render/intern/texture_pointdensity.c | 3 | ||||
-rw-r--r-- | source/blender/render/intern/texture_procedural.c | 3 |
11 files changed, 137 insertions, 134 deletions
diff --git a/source/blender/render/CMakeLists.txt b/source/blender/render/CMakeLists.txt index 6e229fd25b7..2516c015924 100644 --- a/source/blender/render/CMakeLists.txt +++ b/source/blender/render/CMakeLists.txt @@ -42,8 +42,8 @@ set(INC set(SRC - intern/bake_api.c - intern/external_engine.c + intern/bake.c + intern/engine.c intern/initrender.c intern/multires_bake.c intern/pipeline.c @@ -57,8 +57,7 @@ set(SRC RE_engine.h RE_multires_bake.h RE_pipeline.h - RE_render_ext.h - RE_shader_ext.h + RE_texture.h intern/initrender.h intern/render_result.h diff --git a/source/blender/render/RE_engine.h b/source/blender/render/RE_engine.h index e53f33eacff..a153c622af8 100644 --- a/source/blender/render/RE_engine.h +++ b/source/blender/render/RE_engine.h @@ -149,6 +149,7 @@ typedef struct RenderEngine { /* Depsgraph */ struct Depsgraph *depsgraph; + bool has_grease_pencil; /* callback for render pass query */ ThreadMutex update_render_passes_mutex; diff --git a/source/blender/render/RE_shader_ext.h b/source/blender/render/RE_shader_ext.h deleted file mode 100644 index d9d5a924949..00000000000 --- a/source/blender/render/RE_shader_ext.h +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - * The Original Code is Copyright (C) 2006 by Blender Foundation - * All rights reserved. - */ -/** \file - * \ingroup render - */ - -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -/* this include is for texture exports */ -/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ - -/* localized texture result data */ -/* note; tr tg tb ta has to remain in this order */ -typedef struct TexResult { - float tin, tr, tg, tb, ta; - int talpha; - float *nor; -} TexResult; - -typedef struct BakeImBufuserData { - float *displacement_buffer; - char *mask_buffer; -} BakeImBufuserData; - -/* node shaders... */ -struct ImagePool; -struct MTex; -struct Tex; - -/* this one uses nodes */ -int multitex_ext(struct Tex *tex, - float texvec[3], - float dxt[3], - float dyt[3], - int osatex, - struct TexResult *texres, - const short thread, - struct ImagePool *pool, - bool scene_color_manage, - const bool skip_load_image); -/* nodes disabled */ -int multitex_ext_safe(struct Tex *tex, - const float texvec[3], - struct TexResult *texres, - struct ImagePool *pool, - bool scene_color_manage, - const bool skip_load_image); -/* only for internal node usage */ -int multitex_nodes(struct Tex *tex, - const float texvec[3], - float dxt[3], - float dyt[3], - int osatex, - struct TexResult *texres, - const short thread, - short which_output, - struct MTex *mtex, - struct ImagePool *pool); - -#ifdef __cplusplus -} -#endif diff --git a/source/blender/render/RE_render_ext.h b/source/blender/render/RE_texture.h index 28a22399892..b394cfeee75 100644 --- a/source/blender/render/RE_render_ext.h +++ b/source/blender/render/RE_texture.h @@ -30,6 +30,7 @@ struct Depsgraph; struct ImagePool; struct MTex; +struct Tex; #ifdef __cplusplus extern "C" { @@ -75,6 +76,46 @@ void RE_point_density_free(struct PointDensity *pd); void RE_point_density_fix_linking(void); +/* texture_procedural.c */ + +/* Texture evaluation result. + * Note; tr tg tb ta has to remain in this order for array access. */ +typedef struct TexResult { + float tin, tr, tg, tb, ta; + int talpha; + float *nor; +} TexResult; + +/* This one uses nodes. */ +int multitex_ext(struct Tex *tex, + float texvec[3], + float dxt[3], + float dyt[3], + int osatex, + struct TexResult *texres, + const short thread, + struct ImagePool *pool, + bool scene_color_manage, + const bool skip_load_image); +/* Nodes disabled. */ +int multitex_ext_safe(struct Tex *tex, + const float texvec[3], + struct TexResult *texres, + struct ImagePool *pool, + bool scene_color_manage, + const bool skip_load_image); +/* Only for internal node usage. */ +int multitex_nodes(struct Tex *tex, + const float texvec[3], + float dxt[3], + float dyt[3], + int osatex, + struct TexResult *texres, + const short thread, + short which_output, + struct MTex *mtex, + struct ImagePool *pool); + #ifdef __cplusplus } #endif diff --git a/source/blender/render/intern/bake_api.c b/source/blender/render/intern/bake.c index 6f5db4986f2..6f5db4986f2 100644 --- a/source/blender/render/intern/bake_api.c +++ b/source/blender/render/intern/bake.c diff --git a/source/blender/render/intern/external_engine.c b/source/blender/render/intern/engine.c index 9a3dc0d000c..84f12b7873b 100644 --- a/source/blender/render/intern/external_engine.c +++ b/source/blender/render/intern/engine.c @@ -617,6 +617,8 @@ static void engine_depsgraph_init(RenderEngine *engine, ViewLayer *view_layer) else { BKE_scene_graph_update_for_newframe(engine->depsgraph); } + + engine->has_grease_pencil = DRW_render_check_grease_pencil(engine->depsgraph); } static void engine_depsgraph_free(RenderEngine *engine) @@ -748,10 +750,63 @@ bool RE_bake_engine(Render *re, /* Render */ +static void engine_render_view_layer(Render *re, + RenderEngine *engine, + ViewLayer *view_layer_iter, + const bool use_engine, + const bool use_grease_pencil) +{ + /* Lock UI so scene can't be edited while we read from it in this render thread. */ + if (re->draw_lock) { + re->draw_lock(re->dlh, 1); + } + + /* Create depsgraph with scene evaluated at render resolution. */ + ViewLayer *view_layer = BLI_findstring( + &re->scene->view_layers, view_layer_iter->name, offsetof(ViewLayer, name)); + engine_depsgraph_init(engine, view_layer); + + /* Sync data to engine, within draw lock so scene data can be accessed safely. */ + if (use_engine) { + if (engine->type->update) { + engine->type->update(engine, re->main, engine->depsgraph); + } + } + + if (re->draw_lock) { + re->draw_lock(re->dlh, 0); + } + + /* Perform render with engine. */ + if (use_engine) { + if (engine->type->flag & RE_USE_GPU_CONTEXT) { + DRW_render_context_enable(engine->re); + } + + engine->type->render(engine, engine->depsgraph); + + if (engine->type->flag & RE_USE_GPU_CONTEXT) { + DRW_render_context_disable(engine->re); + } + } + + /* Optionally composite grease pencil over render result. */ + if (engine->has_grease_pencil && use_grease_pencil && !re->result->do_exr_tile) { + /* NOTE: External engine might have been requested to free its + * dependency graph, which is only allowed if there is no grease + * pencil (pipeline is taking care of that). */ + if (!RE_engine_test_break(engine) && engine->depsgraph != NULL) { + DRW_render_gpencil(engine, engine->depsgraph); + } + } + + /* Free dependency graph, if engine has not done it already. */ + engine_depsgraph_free(engine); +} + int RE_engine_render(Render *re, int do_all) { RenderEngineType *type = RE_engines_find(re->r.engine); - RenderEngine *engine; bool persistent_data = (re->r.mode & R_PERSISTENT_DATA) != 0; /* verify if we can render */ @@ -813,7 +868,7 @@ int RE_engine_render(Render *re, int do_all) BLI_strncpy(re->i.scene_name, re->scene->id.name + 2, sizeof(re->i.scene_name)); /* render */ - engine = re->engine; + RenderEngine *engine = re->engine; if (!engine) { engine = RE_engine_create(type); @@ -851,45 +906,16 @@ int RE_engine_render(Render *re, int do_all) re->draw_lock(re->dlh, 0); } + /* Render view layers. */ + bool delay_grease_pencil = false; + if (type->render) { FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) { - if (re->draw_lock) { - re->draw_lock(re->dlh, 1); - } - - ViewLayer *view_layer = BLI_findstring( - &re->scene->view_layers, view_layer_iter->name, offsetof(ViewLayer, name)); - engine_depsgraph_init(engine, view_layer); - - if (type->update) { - type->update(engine, re->main, engine->depsgraph); - } - - if (re->draw_lock) { - re->draw_lock(re->dlh, 0); - } - - if (engine->type->flag & RE_USE_GPU_CONTEXT) { - DRW_render_context_enable(engine->re); - } - - type->render(engine, engine->depsgraph); - - if (engine->type->flag & RE_USE_GPU_CONTEXT) { - DRW_render_context_disable(engine->re); - } + engine_render_view_layer(re, engine, view_layer_iter, true, true); - /* Grease pencil render over previous render result. - * - * NOTE: External engine might have been requested to free its - * dependency graph, which is only allowed if there is no grease - * pencil (pipeline is taking care of that). - */ - if (!RE_engine_test_break(engine) && engine->depsgraph != NULL) { - DRW_render_gpencil(engine, engine->depsgraph); - } - - engine_depsgraph_free(engine); + /* With save buffers there is no render buffer in memory for compositing, delay + * grease pencil in that case. */ + delay_grease_pencil = engine->has_grease_pencil && re->result->do_exr_tile; if (RE_engine_test_break(engine)) { break; @@ -898,6 +924,7 @@ int RE_engine_render(Render *re, int do_all) FOREACH_VIEW_LAYER_TO_RENDER_END; } + /* Clear tile data */ engine->tile_x = 0; engine->tile_y = 0; engine->flag &= ~RE_ENGINE_RENDERING; @@ -906,10 +933,26 @@ int RE_engine_render(Render *re, int do_all) BLI_rw_mutex_lock(&re->partsmutex, THREAD_LOCK_WRITE); + /* For save buffers, read back from disk. */ if (re->result->do_exr_tile) { render_result_exr_file_end(re, engine); } + /* Perform delayed grease pencil rendering. */ + if (delay_grease_pencil) { + BLI_rw_mutex_unlock(&re->partsmutex); + + FOREACH_VIEW_LAYER_TO_RENDER_BEGIN (re, view_layer_iter) { + engine_render_view_layer(re, engine, view_layer_iter, false, true); + if (RE_engine_test_break(engine)) { + break; + } + } + FOREACH_VIEW_LAYER_TO_RENDER_END; + + BLI_rw_mutex_lock(&re->partsmutex, THREAD_LOCK_WRITE); + } + /* re->engine becomes zero if user changed active render engine during render */ if (!persistent_data || !re->engine) { RE_engine_free(engine); @@ -981,7 +1024,7 @@ void RE_engine_free_blender_memory(RenderEngine *engine) * * TODO(sergey): Find better solution for this. */ - if (DRW_render_check_grease_pencil(engine->depsgraph)) { + if (engine->has_grease_pencil) { return; } DEG_graph_free(engine->depsgraph); diff --git a/source/blender/render/intern/multires_bake.c b/source/blender/render/intern/multires_bake.c index ea18f151e1e..a4f68419c67 100644 --- a/source/blender/render/intern/multires_bake.c +++ b/source/blender/render/intern/multires_bake.c @@ -46,7 +46,7 @@ #include "RE_multires_bake.h" #include "RE_pipeline.h" -#include "RE_shader_ext.h" +#include "RE_texture.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -111,6 +111,11 @@ typedef struct { const int *orig_index_mp_to_orig; } MNormalBakeData; +typedef struct BakeImBufuserData { + float *displacement_buffer; + char *mask_buffer; +} BakeImBufuserData; + static void multiresbake_get_normal(const MResolvePixelData *data, float norm[], const int tri_num, diff --git a/source/blender/render/intern/pipeline.c b/source/blender/render/intern/pipeline.c index 1bc6a056cda..3d19e5e6c15 100644 --- a/source/blender/render/intern/pipeline.c +++ b/source/blender/render/intern/pipeline.c @@ -86,7 +86,7 @@ #include "RE_engine.h" #include "RE_pipeline.h" -#include "RE_render_ext.h" +#include "RE_texture.h" #include "SEQ_sequencer.h" diff --git a/source/blender/render/intern/texture_image.c b/source/blender/render/intern/texture_image.c index 26d9f12c91e..cd34226920d 100644 --- a/source/blender/render/intern/texture_image.c +++ b/source/blender/render/intern/texture_image.c @@ -46,8 +46,7 @@ #include "BKE_image.h" -#include "RE_render_ext.h" -#include "RE_shader_ext.h" +#include "RE_texture.h" #include "render_types.h" #include "texture_common.h" diff --git a/source/blender/render/intern/texture_pointdensity.c b/source/blender/render/intern/texture_pointdensity.c index 0e62eea5b11..e2568e0a013 100644 --- a/source/blender/render/intern/texture_pointdensity.c +++ b/source/blender/render/intern/texture_pointdensity.c @@ -56,8 +56,7 @@ #include "render_types.h" #include "texture_common.h" -#include "RE_render_ext.h" -#include "RE_shader_ext.h" +#include "RE_texture.h" static ThreadMutex sample_mutex = PTHREAD_MUTEX_INITIALIZER; diff --git a/source/blender/render/intern/texture_procedural.c b/source/blender/render/intern/texture_procedural.c index 7f93addb76d..a98f29a705d 100644 --- a/source/blender/render/intern/texture_procedural.c +++ b/source/blender/render/intern/texture_procedural.c @@ -57,8 +57,7 @@ #include "render_types.h" #include "texture_common.h" -#include "RE_render_ext.h" -#include "RE_shader_ext.h" +#include "RE_texture.h" static RNG_THREAD_ARRAY *random_tex_array; |