Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/CMakeLists.txt7
-rw-r--r--source/blender/render/RE_engine.h1
-rw-r--r--source/blender/render/RE_shader_ext.h83
-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.c7
-rw-r--r--source/blender/render/intern/pipeline.c2
-rw-r--r--source/blender/render/intern/texture_image.c3
-rw-r--r--source/blender/render/intern/texture_pointdensity.c3
-rw-r--r--source/blender/render/intern/texture_procedural.c3
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;