1
1

Compare commits

...

22 Commits

Author SHA1 Message Date
082b0253a2 Bring DCI colorspace configuration for DCP creation
Based on LUT and XYZ conversion matrix from OpenDCP.

Expose already-existing DCI view of Display transform (which was
hidden by color management changes for 2.80). Introduce an input
LUT which is what OpenDCP is doing and what makes the output of
Blender's DCI  match OpenDCP result.

Additionally introduce DCI Filimc which will first perform filmic
conversion before the rest of DCI conversion. This allows to export
EXR images sequence directly from Blender as if it was first exported
to PNG/TIFF first.

This is a sub-optimal, but is something we use at the studio to deal
with DCP at this time.
2021-10-27 11:00:58 +02:00
ebb81050c5 VSE: Free animation strip data if they are not visible
Previously we would only free animation strip data when doing final
renders. If not doing a final render or simply just playing back videos
in the VSE, we would not free decoders or non VSE cache data from the
strips.

This would lead to memory usage exploding in complex VSE scenes.

Now we instead use the dumb apporach of freeing everything that is not
currently visible.
2021-10-05 18:57:15 +02:00
02fd9c2ea4 Fix T91803: Freestyle rendering as pass broken after recent changes 2021-09-30 23:27:43 +02:00
feca8c8a2a Fix missing passes result when rendering multiple views
Caused by the lazily pass pixels allocation which didn't reset
allocation state of the render result.

Demo file: F10426591
2021-09-30 23:17:58 +02:00
c666698479 Merge remote-tracking branch 'origin/temp-studio-sprite-fright-cycles' into studio-sprite-fright 2021-09-30 10:15:46 +02:00
315246b7ce Fix Cycles use of uninitialized value in shadow stack intersection on CPU
The patch is against the studio branch. In the master branch it got
fixed with the Cycles X merge.

Differential Revision: https://developer.blender.org/D12705
2021-09-29 20:17:57 +02:00
3172aa9ac5 Fix non-finite curve normal causing Cycles to crash
Similar to the previous change in the area: need to avoid ray
point and direction becoming a non-finite value.

Use the view direction when the geometrical normal can not be
calculated.

Collaboration and sanity inspiration with Brecht!
2021-09-29 19:57:15 +02:00
e7bf9301ac Fix T91458: Displaying dope-sheet with sequencer keyframes crashes
Error in e6194e7357.
2021-09-29 18:12:28 +02:00
4e5bf6718e Fix Cycles use of uninitialized value in volume stack intersection on CPU
Could cause an actual bug but probability is low in practice.
2021-09-29 17:02:41 +02:00
e640664cf8 Fix Cycles crash in certain hair configurations
The issue was caused by hair shader setup setting normal to a non
finite value, which then gets used to create a ray with non-finite
direction, making BVH traversal to run out of stack memory.

Happens with 150_0040_A.lighting.blend frame 112 of the Sprites
project.

Differential Revision: https://developer.blender.org/D12692
2021-09-29 16:14:57 +02:00
7d291fae0f Cycles: Ensure finite displacement and background evaluation
Avoids possible numerical issues in the path tracing kernel, which
is most important for displacement as non-finite values in BVH can
lead to infinite node recursion during traversal.

Differential Revision: https://developer.blender.org/D12690
2021-09-29 14:31:18 +02:00
013d181dca Fix T91679: Crash when saving bordered render as multilayer exr
The related issue which is fixed by this change is the missing noisy
image pass when denoising and border render is used,

Need to allocate passes after the passes has been copied from the
original render result.

This is a manual cherry-pick of rB741fa8180c4f.
2021-09-28 11:55:56 +02:00
19c9d18f4b Increase VSE strip channels limit from 32 to 128
The original limit dates back from 2002 when Blender went open source.
After that many years some productions (e.g., Sprite Fright) are already
experiencing limitations for complex edits.

The future plans is to support an initial shorter (2?) number of
channels with support to "unlimited" channels.

Finally, I'm bumping the minimum file requirement since files with more
than 32 channels won't work well in old Blender versions.

In a future commit I will implement a sanitization so that we only read (and write)
128 channels. Making sure future changes of this number won't corrupt Blender.

Differential Revision: https://developer.blender.org/D12645
2021-09-28 11:53:10 +02:00
5283b647b7 Fix T91255: IDProperty UI as_dict() returns step as default value
Another typo in this section of code.
2021-09-09 11:54:16 +02:00
960bdc8f76 Fix T91187: incorrect socket identifier 2021-09-07 16:57:10 +02:00
ee9154fd28 Nodes: fix incorrect id socket update
The issue was that the entire socket was rebuild, even though
only its `SOCK_HIDE_LABEL` flag changed. This broke e.g.
Object sockets from old files.
2021-09-07 12:03:05 +02:00
b08b0e1055 Merge branch 'master' into studio-sprite-fright 2021-09-06 10:58:02 +02:00
431018c888 Merge branch 'master' into studio-sprite-fright 2021-09-06 09:07:40 +02:00
d2d21a3d9d Merge branch 'master' into studio-sprite-fright 2021-09-03 14:27:53 +02:00
c7106d5b7f Merge branch 'master' into studio-sprite-fright 2021-09-02 15:00:54 +02:00
4f2bd2f2f3 Buildbot config: update to proper paths for SVN branches. 2021-09-02 10:30:39 +02:00
b2e5ac0ab7 Update buildbot configuration to use studio-sprite-fright branches. 2021-09-01 17:31:41 +02:00
20 changed files with 4245 additions and 68 deletions

View File

@@ -5,42 +5,42 @@
update-code:
git:
submodules:
- branch: master
- branch: studio-sprite-fright
commit_id: HEAD
path: release/scripts/addons
- branch: master
- branch: studio-sprite-fright
commit_id: HEAD
path: release/scripts/addons_contrib
- branch: master
- branch: studio-sprite-fright
commit_id: HEAD
path: release/datafiles/locale
- branch: master
- branch: studio-sprite-fright
commit_id: HEAD
path: source/tools
svn:
libraries:
darwin-arm64:
branch: trunk
branch: branches/studio-sprite-fright
commit_id: HEAD
path: lib/darwin_arm64
darwin-x86_64:
branch: trunk
branch: branches/studio-sprite-fright
commit_id: HEAD
path: lib/darwin
linux-x86_64:
branch: trunk
branch: branches/studio-sprite-fright
commit_id: HEAD
path: lib/linux_centos7_x86_64
windows-amd64:
branch: trunk
branch: branches/studio-sprite-fright
commit_id: HEAD
path: lib/win64_vc15
tests:
branch: trunk
branch: branches/studio-sprite-fright
commit_id: HEAD
path: lib/tests
benchmarks:
branch: trunk
branch: branches/studio-sprite-fright
commit_id: HEAD
path: lib/benchmarks

View File

@@ -81,7 +81,7 @@ static void rtc_filter_occluded_func(const RTCFilterFunctionNArguments *args)
if (ctx->num_hits < ctx->max_hits) {
Intersection current_isect;
kernel_embree_convert_hit(kg, ray, hit, &current_isect);
for (size_t i = 0; i < ctx->max_hits; ++i) {
for (size_t i = 0; i < ctx->num_hits; ++i) {
if (current_isect.object == ctx->isect_s[i].object &&
current_isect.prim == ctx->isect_s[i].prim && current_isect.t == ctx->isect_s[i].t) {
/* This intersection was already recorded, skip it. */
@@ -190,7 +190,7 @@ static void rtc_filter_occluded_func(const RTCFilterFunctionNArguments *args)
if (ctx->num_hits < ctx->max_hits) {
Intersection current_isect;
kernel_embree_convert_hit(kg, ray, hit, &current_isect);
for (size_t i = 0; i < ctx->max_hits; ++i) {
for (size_t i = 0; i < ctx->num_hits; ++i) {
if (current_isect.object == ctx->isect_s[i].object &&
current_isect.prim == ctx->isect_s[i].prim && current_isect.t == ctx->isect_s[i].t) {
/* This intersection was already recorded, skip it. */

View File

@@ -711,7 +711,7 @@ ccl_device_inline void curve_shader_setup(KernelGlobals *kg,
P = transform_point(&tfm, P);
D = transform_direction(&tfm, D * t);
D = normalize_len(D, &t);
D = safe_normalize_len(D, &t);
}
int prim = kernel_tex_fetch(__prim_index, isect->prim);
@@ -765,8 +765,10 @@ ccl_device_inline void curve_shader_setup(KernelGlobals *kg,
/* Thick curves, compute normal using direction from inside the curve.
* This could be optimized by recording the normal in the intersection,
* however for Optix this would go beyond the size of the payload. */
/* NOTE: It is possible that P will be the same as P_inside (precision issues, or very small
* radius). In this case use the view direction to approximate the normal. */
const float3 P_inside = float4_to_float3(catmull_rom_basis_eval(P_curve, isect->u));
const float3 Ng = normalize(P - P_inside);
const float3 Ng = (!isequal_float3(P, P_inside)) ? normalize(P - P_inside) : -sd->I;
sd->N = Ng;
sd->Ng = Ng;

View File

@@ -470,6 +470,16 @@ ccl_device void kernel_displace_evaluate(KernelGlobals *kg,
object_inverse_dir_transform(kg, &sd, &D);
#ifdef __KERNEL_DEBUG_NAN__
if (!isfinite3_safe(D)) {
kernel_assert(!"Cycles displacement with non-finite value detected");
}
#endif
/* Ensure finite displacement, preventing BVH from becoming degenerate and avoiding possible
* traversal issues caused by non-finite math. */
D = ensure_finite3(D);
/* write output */
output[i] += make_float4(D.x, D.y, D.z, 0.0f);
}
@@ -508,6 +518,15 @@ ccl_device void kernel_background_evaluate(KernelGlobals *kg,
shader_eval_surface(kg, &sd, &state, NULL, path_flag | PATH_RAY_EMISSION);
float3 color = shader_background_eval(&sd);
#ifdef __KERNEL_DEBUG_NAN__
if (!isfinite3_safe(color)) {
kernel_assert(!"Cycles background with non-finite value detected");
}
#endif
/* Ensure finite color, avoiding possible numerical instabilities in the path tracing kernels. */
color = ensure_finite3(color);
/* write output */
output[i] += make_float4(color.x, color.y, color.z, 0.0f);
}

View File

@@ -59,12 +59,13 @@ displays:
XYZ:
- !<View> {name: Standard, colorspace: XYZ}
- !<View> {name: DCI, colorspace: dci_xyz}
- !<View> {name: DCI Filmic, colorspace: dci_xyz_filmic}
- !<View> {name: Raw, colorspace: Raw}
None:
- !<View> {name: Standard, colorspace: Raw}
active_displays: [sRGB, XYZ, None]
active_views: [Standard, Filmic, Filmic Log, Raw, False Color]
active_views: [Standard, Filmic, Filmic Log, Raw, False Color, DCI, DCI Filmic]
colorspaces:
- !<ColorSpace>
@@ -141,6 +142,26 @@ colorspaces:
allocationvars: [0, 1]
from_reference: !<GroupTransform>
children:
- !<FileTransform> {src: srgb_inv.spi1d, interpolation: linear}
- !<FileTransform> {src: dcp_in.spi1d, interpolation: linear}
- !<FileTransform> {src: srgb_to_xyz.spimtx, interpolation: linear}
- !<FileTransform> {src: dci_xyz.spi1d, interpolation: linear}
- !<ColorSpace>
name: dci_xyz_filmic
family: display
equalitygroup:
bitdepth: 16f
description: |
OpenDCP output LUT with DCI reference white and Gamma 2.6
isdata: false
allocation: uniform
allocationvars: [0, 1]
from_reference: !<GroupTransform>
children:
- !<ColorSpaceTransform> {src: Linear, dst: Filmic Log}
- !<FileTransform> {src: filmic_to_0-70_1-03.spi1d, interpolation: linear}
- !<FileTransform> {src: dcp_in.spi1d, interpolation: linear}
- !<FileTransform> {src: srgb_to_xyz.spimtx, interpolation: linear}
- !<FileTransform> {src: dci_xyz.spi1d, interpolation: linear}

File diff suppressed because it is too large Load Diff

View File

@@ -39,13 +39,13 @@ extern "C" {
/* Blender file format version. */
#define BLENDER_FILE_VERSION BLENDER_VERSION
#define BLENDER_FILE_SUBVERSION 21
#define BLENDER_FILE_SUBVERSION 26
/* Minimum Blender version that supports reading file written with the current
* version. Older Blender versions will test this and show a warning if the file
* was written with too new a version. */
#define BLENDER_FILE_MIN_VERSION 300
#define BLENDER_FILE_MIN_SUBVERSION 11
#define BLENDER_FILE_MIN_SUBVERSION 26
/** User readable version string. */
const char *BKE_blender_version_string(void);

View File

@@ -217,8 +217,6 @@ static void animchan_sync_fcurve_scene(bAnimListElem *ale)
/* Check if this strip is selected. */
Editing *ed = SEQ_editing_get(scene);
seq = SEQ_get_sequence_by_name(ed->seqbasep, seq_name, false);
MEM_freeN(seq_name);
if (seq == NULL) {
return;
}

View File

@@ -503,7 +503,7 @@ void FRS_composite_result(Render *re, ViewLayer *view_layer, Render *freestyle_r
if (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS) {
// Create a blank render pass output.
RE_create_render_pass(
re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname);
re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname, true);
}
return;
}
@@ -539,7 +539,7 @@ void FRS_composite_result(Render *re, ViewLayer *view_layer, Render *freestyle_r
if (view_layer->freestyle_config.flags & FREESTYLE_AS_RENDER_PASS) {
RE_create_render_pass(
re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname);
re->result, RE_PASSNAME_FREESTYLE, 4, "RGBA", view_layer->name, re->viewname, true);
dest = RE_RenderLayerGetPass(rl, RE_PASSNAME_FREESTYLE, re->viewname);
}
else {

View File

@@ -484,7 +484,7 @@ typedef struct SequencerScopes {
struct ImBuf *histogram_ibuf;
} SequencerScopes;
#define MAXSEQ 32
#define MAXSEQ 128
#define SELECT 1

View File

@@ -199,6 +199,20 @@ template<typename Subtype> class IDSocketDeclaration : public SocketDeclaration
{
return matches_id_socket(socket, data_, name_, identifier_);
}
bNodeSocket &update_or_build(bNodeTree &ntree, bNode &node, bNodeSocket &socket) const override
{
if (StringRef(socket.idname) != data_.idname) {
return this->build(ntree, node, (eNodeSocketInOut)socket.in_out);
}
if (data_.hide_label) {
socket.flag |= SOCK_HIDE_LABEL;
}
else {
socket.flag &= ~SOCK_HIDE_LABEL;
}
return socket;
}
};
} // namespace detail

View File

@@ -31,7 +31,11 @@ static void geo_node_mix_attribute_declare(NodeDeclarationBuilder &b)
{
b.add_input<decl::Geometry>("Geometry");
b.add_input<decl::String>("Factor");
b.add_input<decl::Float>("Factor").default_value(0.5f).min(0.0f).max(1.0f).subtype(PROP_FACTOR);
b.add_input<decl::Float>("Factor", "Factor_001")
.default_value(0.5f)
.min(0.0f)
.max(1.0f)
.subtype(PROP_FACTOR);
b.add_input<decl::String>("A");
b.add_input<decl::Float>("A", "A_001");
b.add_input<decl::Vector>("A", "A_002");

View File

@@ -468,7 +468,7 @@ static void idprop_ui_data_to_dict_int(IDProperty *property, PyObject *dict)
Py_DECREF(list);
}
else {
PyDict_SetItemString(dict, "default", item = PyLong_FromLong(ui_data->step));
PyDict_SetItemString(dict, "default", item = PyLong_FromLong(ui_data->default_value));
Py_DECREF(item);
}
}
@@ -499,7 +499,7 @@ static void idprop_ui_data_to_dict_float(IDProperty *property, PyObject *dict)
Py_DECREF(list);
}
else {
PyDict_SetItemString(dict, "default", item = PyFloat_FromDouble(ui_data->step));
PyDict_SetItemString(dict, "default", item = PyFloat_FromDouble(ui_data->default_value));
Py_DECREF(item);
}
}

View File

@@ -236,7 +236,8 @@ void RE_create_render_pass(struct RenderResult *rr,
int channels,
const char *chan_id,
const char *layername,
const char *viewname);
const char *viewname,
const bool allocate);
/* obligatory initialize call, disprect is optional */
void RE_InitState(struct Render *re,

View File

@@ -208,11 +208,10 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y,
/* Add render passes. */
RenderPass *result_pass = render_layer_add_pass(
rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA");
RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA");
RenderPass *differential_pass = render_layer_add_pass(rr, rl, 4, "BakeDifferential", "", "RGBA");
render_result_passes_allocated_ensure(rr);
rr, rl, engine->bake.depth, RE_PASSNAME_COMBINED, "", "RGBA", true);
RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA", true);
RenderPass *differential_pass = render_layer_add_pass(
rr, rl, 4, "BakeDifferential", "", "RGBA", true);
/* Fill render passes from bake pixel array, to be read by the render engine. */
for (int ty = 0; ty < h; ty++) {
@@ -405,7 +404,7 @@ void RE_engine_add_pass(RenderEngine *engine,
return;
}
RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL);
RE_create_render_pass(re->result, name, channels, chan_id, layername, NULL, false);
}
void RE_engine_end_result(

View File

@@ -1041,10 +1041,10 @@ static void render_result_uncrop(Render *re)
render_result_disprect_to_full_resolution(re);
rres = render_result_new(re, &re->disprect, RR_USE_MEM, RR_ALL_LAYERS, RR_ALL_VIEWS);
render_result_passes_allocated_ensure(rres);
rres->stamp_data = BKE_stamp_data_copy(re->result->stamp_data);
render_result_clone_passes(re, rres, NULL);
render_result_passes_allocated_ensure(rres);
render_result_merge(rres, re->result);
render_result_free(re->result);
@@ -1466,7 +1466,7 @@ static void do_render_full_pipeline(Render *re)
/* ensure no images are in memory from previous animated sequences */
BKE_image_all_free_anim_ibufs(re->main, re->r.cfra);
SEQ_relations_free_all_anim_ibufs(re->scene, re->r.cfra);
SEQ_cache_cleanup(re->scene);
if (RE_engine_render(re, true)) {
/* in this case external render overrides all */
@@ -2871,7 +2871,7 @@ RenderPass *RE_create_gp_pass(RenderResult *rr, const char *layername, const cha
BLI_freelinkN(&rl->passes, rp);
}
/* create a totally new pass */
return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA");
return render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, viewname, "RGBA", true);
}
bool RE_allow_render_generic_object(Object *ob)

View File

@@ -213,12 +213,37 @@ static void set_pass_full_name(
/********************************** New **************************************/
static void render_layer_allocate_pass(RenderResult *rr, RenderPass *rp)
{
if (rp->rect != NULL) {
return;
}
const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels;
rp->rect = MEM_callocN(sizeof(float) * rectsize, rp->name);
if (STREQ(rp->name, RE_PASSNAME_VECTOR)) {
/* initialize to max speed */
float *rect = rp->rect;
for (int x = rectsize - 1; x >= 0; x--) {
rect[x] = PASS_VECTOR_MAX;
}
}
else if (STREQ(rp->name, RE_PASSNAME_Z)) {
float *rect = rp->rect;
for (int x = rectsize - 1; x >= 0; x--) {
rect[x] = 10e10;
}
}
}
RenderPass *render_layer_add_pass(RenderResult *rr,
RenderLayer *rl,
int channels,
const char *name,
const char *viewname,
const char *chan_id)
const char *chan_id,
const bool allocate)
{
const int view_id = BLI_findstringindex(&rr->views, viewname, offsetof(RenderView, name));
RenderPass *rpass = MEM_callocN(sizeof(RenderPass), name);
@@ -250,6 +275,14 @@ RenderPass *render_layer_add_pass(RenderResult *rr,
BLI_addtail(&rl->passes, rpass);
if (allocate) {
render_layer_allocate_pass(rr, rpass);
}
else {
/* The result contains non-allocated pass now, so tag it as such. */
rr->passes_allocated = false;
}
return rpass;
}
@@ -330,14 +363,14 @@ RenderResult *render_result_new(
#define RENDER_LAYER_ADD_PASS_SAFE(rr, rl, channels, name, viewname, chan_id) \
do { \
if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id) == NULL) { \
if (render_layer_add_pass(rr, rl, channels, name, viewname, chan_id, false) == NULL) { \
render_result_free(rr); \
return NULL; \
} \
} while (false)
/* A renderlayer should always have a Combined pass. */
render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA");
render_layer_add_pass(rr, rl, 4, "Combined", view, "RGBA", false);
if (view_layer->passflag & SCE_PASS_Z) {
RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 1, RE_PASSNAME_Z, view, "Z");
@@ -440,7 +473,7 @@ RenderResult *render_result_new(
}
/* a renderlayer should always have a Combined pass */
render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, view, "RGBA");
render_layer_add_pass(rr, rl, 4, RE_PASSNAME_COMBINED, view, "RGBA", false);
}
/* NOTE: this has to be in sync with `scene.c`. */
@@ -466,26 +499,7 @@ void render_result_passes_allocated_ensure(RenderResult *rr)
continue;
}
if (rp->rect != NULL) {
continue;
}
const size_t rectsize = ((size_t)rr->rectx) * rr->recty * rp->channels;
rp->rect = MEM_callocN(sizeof(float) * rectsize, rp->name);
if (STREQ(rp->name, RE_PASSNAME_VECTOR)) {
/* initialize to max speed */
float *rect = rp->rect;
for (int x = rectsize - 1; x >= 0; x--) {
rect[x] = PASS_VECTOR_MAX;
}
}
else if (STREQ(rp->name, RE_PASSNAME_Z)) {
float *rect = rp->rect;
for (int x = rectsize - 1; x >= 0; x--) {
rect[x] = 10e10;
}
}
render_layer_allocate_pass(rr, rp);
}
}
@@ -514,7 +528,7 @@ void render_result_clone_passes(Render *re, RenderResult *rr, const char *viewna
&rl->passes, main_rp->fullname, offsetof(RenderPass, fullname));
if (!rp) {
render_layer_add_pass(
rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id);
rr, rl, main_rp->channels, main_rp->name, main_rp->view, main_rp->chan_id, false);
}
}
}
@@ -525,7 +539,8 @@ void RE_create_render_pass(RenderResult *rr,
int channels,
const char *chan_id,
const char *layername,
const char *viewname)
const char *viewname,
const bool allocate)
{
RenderLayer *rl;
RenderPass *rp;
@@ -555,7 +570,7 @@ void RE_create_render_pass(RenderResult *rr,
}
if (!rp) {
render_layer_add_pass(rr, rl, channels, name, view, chan_id);
render_layer_add_pass(rr, rl, channels, name, view, chan_id, allocate);
}
}
}
@@ -1215,7 +1230,7 @@ void render_result_exr_file_begin(Render *re, RenderEngine *engine)
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
LISTBASE_FOREACH (RenderPass *, pass, &templates) {
RE_create_render_pass(
re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL);
re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL, false);
}
BLI_rw_mutex_unlock(&re->resultmutex);
@@ -1263,7 +1278,8 @@ void render_result_exr_file_end(Render *re, RenderEngine *engine)
* mutex locked to avoid deadlock with Python GIL. */
BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
LISTBASE_FOREACH (RenderPass *, pass, &templates) {
RE_create_render_pass(re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL);
RE_create_render_pass(
re->result, pass->name, pass->channels, pass->chan_id, rl->name, NULL, true);
}
BLI_freelistN(&templates);

View File

@@ -93,7 +93,8 @@ struct RenderPass *render_layer_add_pass(struct RenderResult *rr,
int channels,
const char *name,
const char *viewname,
const char *chan_id);
const char *chan_id,
const bool allocate);
void render_result_exr_file_merge(struct RenderResult *rr,
struct RenderResult *rrpart,

View File

@@ -69,6 +69,7 @@
#include "SEQ_iterator.h"
#include "SEQ_modifier.h"
#include "SEQ_proxy.h"
#include "SEQ_relations.h"
#include "SEQ_render.h"
#include "SEQ_sequencer.h"
#include "SEQ_time.h"
@@ -1950,6 +1951,8 @@ ImBuf *SEQ_render_give_ibuf(const SeqRenderData *context, float timeline_frame,
}
seq_cache_free_temp_cache(context->scene, context->task_id, timeline_frame);
/* Make sure we only keep the `anim` data for strips that are in view. */
SEQ_relations_free_all_anim_ibufs(context->scene, timeline_frame);
if (count && !out) {
BLI_mutex_lock(&seq_render_mutex);

View File

@@ -354,7 +354,6 @@ void SEQ_relations_update_changed_seq_and_deps(Scene *scene,
}
}
/* Unused */
static void sequencer_all_free_anim_ibufs(ListBase *seqbase, int timeline_frame)
{
for (Sequence *seq = seqbase->first; seq != NULL; seq = seq->next) {
@@ -367,7 +366,6 @@ static void sequencer_all_free_anim_ibufs(ListBase *seqbase, int timeline_frame)
}
}
/* Unused */
void SEQ_relations_free_all_anim_ibufs(Scene *scene, int timeline_frame)
{
Editing *ed = SEQ_editing_get(scene);
@@ -375,7 +373,6 @@ void SEQ_relations_free_all_anim_ibufs(Scene *scene, int timeline_frame)
return;
}
sequencer_all_free_anim_ibufs(&ed->seqbase, timeline_frame);
SEQ_cache_cleanup(scene);
}
static Sequence *sequencer_check_scene_recursion(Scene *scene, ListBase *seqbase)