From e3817e5ec179f24b18d58ac60fe0b0969887544e Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Mon, 29 Oct 2018 15:45:58 +0100 Subject: [PATCH 1/3] Cycles: Support generating Denoising passes without actually denoising Needed for the animation denoiser since the denoising filter is done separately there. Reviewers: brecht, sergey Reviewed By: brecht Differential Revision: https://developer.blender.org/D3833 --- intern/cycles/blender/addon/engine.py | 2 +- intern/cycles/blender/addon/ui.py | 15 +++++----- intern/cycles/blender/blender_session.cpp | 4 ++- intern/cycles/blender/blender_sync.cpp | 35 ++++++++++++----------- intern/cycles/render/session.cpp | 2 +- intern/cycles/render/session.h | 2 ++ 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/intern/cycles/blender/addon/engine.py b/intern/cycles/blender/addon/engine.py index 2cdeb97a32d..55638415e66 100644 --- a/intern/cycles/blender/addon/engine.py +++ b/intern/cycles/blender/addon/engine.py @@ -265,7 +265,7 @@ def register_passes(engine, scene, srl): for i in range(0, srl.cycles.pass_crypto_depth, 2): engine.register_pass(scene, srl, "CryptoAsset" + '{:02d}'.format(i), 4, "RGBA", 'COLOR') - if crl.use_denoising: + if crl.use_denoising or crl.denoising_store_passes: engine.register_pass(scene, srl, "Noisy Image", 3, "RGBA", 'COLOR') if crl.denoising_store_passes: engine.register_pass(scene, srl, "Denoising Normal", 3, "XYZ", 'VECTOR') diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index 6f11d3c313d..0fdefe5d442 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -517,6 +517,8 @@ class CYCLES_RENDER_PT_layer_passes(CyclesButtonsPanel, Panel): col.prop(rl, "use_pass_shadow") col.prop(rl, "use_pass_ambient_occlusion") col.separator() + col.prop(crl, "denoising_store_passes", text="Denoising Data") + col.separator() col.prop(rl, "pass_alpha_threshold") col = split.column() @@ -549,12 +551,6 @@ class CYCLES_RENDER_PT_layer_passes(CyclesButtonsPanel, Panel): col.prop(rl, "use_pass_emit", text="Emission") col.prop(rl, "use_pass_environment") - if context.scene.cycles.feature_set == 'EXPERIMENTAL': - col.separator() - sub = col.column() - sub.active = crl.use_denoising - sub.prop(crl, "denoising_store_passes", text="Denoising") - col = layout.column() col.prop(crl, "pass_debug_render_time") if _cycles.with_cycles_debug: @@ -641,9 +637,8 @@ class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel): rl = rd.layers.active crl = rl.cycles - layout.active = crl.use_denoising - split = layout.split() + split.active = crl.use_denoising col = split.column() sub = col.column(align=True) @@ -658,24 +653,28 @@ class CYCLES_RENDER_PT_denoising(CyclesButtonsPanel, Panel): layout.separator() row = layout.row() + row.active = crl.use_denoising or crl.denoising_store_passes row.label(text="Diffuse:") sub = row.row(align=True) sub.prop(crl, "denoising_diffuse_direct", text="Direct", toggle=True) sub.prop(crl, "denoising_diffuse_indirect", text="Indirect", toggle=True) row = layout.row() + row.active = crl.use_denoising or crl.denoising_store_passes row.label(text="Glossy:") sub = row.row(align=True) sub.prop(crl, "denoising_glossy_direct", text="Direct", toggle=True) sub.prop(crl, "denoising_glossy_indirect", text="Indirect", toggle=True) row = layout.row() + row.active = crl.use_denoising or crl.denoising_store_passes row.label(text="Transmission:") sub = row.row(align=True) sub.prop(crl, "denoising_transmission_direct", text="Direct", toggle=True) sub.prop(crl, "denoising_transmission_indirect", text="Indirect", toggle=True) row = layout.row() + row.active = crl.use_denoising or crl.denoising_store_passes row.label(text="Subsurface:") sub = row.row(align=True) sub.prop(crl, "denoising_subsurface_direct", text="Direct", toggle=True) diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index e9e14a9b6c9..e05351eea40 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -410,12 +410,14 @@ void BlenderSession::render() PointerRNA crl = RNA_pointer_get(&b_layer_iter->ptr, "cycles"); bool use_denoising = get_boolean(crl, "use_denoising"); + bool denoising_passes = use_denoising || get_boolean(crl, "denoising_store_passes"); session->tile_manager.schedule_denoising = use_denoising; - buffer_params.denoising_data_pass = use_denoising; + buffer_params.denoising_data_pass = denoising_passes; buffer_params.denoising_clean_pass = (scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES); session->params.use_denoising = use_denoising; + session->params.denoising_passes = denoising_passes; session->params.denoising_radius = get_int(crl, "denoising_radius"); session->params.denoising_strength = get_float(crl, "denoising_strength"); session->params.denoising_feature_strength = get_float(crl, "denoising_feature_strength"); diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp index 076734d105f..70bb6de8b1d 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -578,10 +578,11 @@ vector BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay, Pass::add(pass_type, passes); } - scene->film->denoising_flags = 0; PointerRNA crp = RNA_pointer_get(&b_srlay.ptr, "cycles"); - if(get_boolean(crp, "use_denoising")) - { + bool use_denoising = get_boolean(crp, "use_denoising"); + bool store_denoising_passes = get_boolean(crp, "denoising_store_passes"); + scene->film->denoising_flags = 0; + if(use_denoising || store_denoising_passes) { #define MAP_OPTION(name, flag) if(!get_boolean(crp, name)) scene->film->denoising_flags |= flag; MAP_OPTION("denoising_diffuse_direct", DENOISING_CLEAN_DIFFUSE_DIR); MAP_OPTION("denoising_diffuse_indirect", DENOISING_CLEAN_DIFFUSE_IND); @@ -592,22 +593,22 @@ vector BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay, MAP_OPTION("denoising_subsurface_direct", DENOISING_CLEAN_SUBSURFACE_DIR); MAP_OPTION("denoising_subsurface_indirect", DENOISING_CLEAN_SUBSURFACE_IND); #undef MAP_OPTION - b_engine.add_pass("Noisy Image", 4, "RGBA", b_srlay.name().c_str()); - if(get_boolean(crp, "denoising_store_passes")) { - b_engine.add_pass("Denoising Normal", 3, "XYZ", b_srlay.name().c_str()); - b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_srlay.name().c_str()); - b_engine.add_pass("Denoising Albedo", 3, "RGB", b_srlay.name().c_str()); - b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_srlay.name().c_str()); - b_engine.add_pass("Denoising Depth", 1, "Z", b_srlay.name().c_str()); - b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_srlay.name().c_str()); - b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_srlay.name().c_str()); - b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_srlay.name().c_str()); - b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_srlay.name().c_str()); + } - if(scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES) { - b_engine.add_pass("Denoising Clean", 3, "RGB", b_srlay.name().c_str()); - } + if(store_denoising_passes) { + b_engine.add_pass("Denoising Normal", 3, "XYZ", b_srlay.name().c_str()); + b_engine.add_pass("Denoising Normal Variance", 3, "XYZ", b_srlay.name().c_str()); + b_engine.add_pass("Denoising Albedo", 3, "RGB", b_srlay.name().c_str()); + b_engine.add_pass("Denoising Albedo Variance", 3, "RGB", b_srlay.name().c_str()); + b_engine.add_pass("Denoising Depth", 1, "Z", b_srlay.name().c_str()); + b_engine.add_pass("Denoising Depth Variance", 1, "Z", b_srlay.name().c_str()); + b_engine.add_pass("Denoising Shadow A", 3, "XYV", b_srlay.name().c_str()); + b_engine.add_pass("Denoising Shadow B", 3, "XYV", b_srlay.name().c_str()); + b_engine.add_pass("Denoising Image Variance", 3, "RGB", b_srlay.name().c_str()); + + if(scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES) { + b_engine.add_pass("Denoising Clean", 3, "RGB", b_srlay.name().c_str()); } } #ifdef __KERNEL_DEBUG__ diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 8bc175a094d..d6ecafa19b7 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -682,7 +682,7 @@ DeviceRequestedFeatures Session::get_requested_device_features() BakeManager *bake_manager = scene->bake_manager; requested_features.use_baking = bake_manager->get_baking(); requested_features.use_integrator_branched = (scene->integrator->method == Integrator::BRANCHED_PATH); - if(params.use_denoising) { + if(params.denoising_passes) { requested_features.use_denoising = true; requested_features.use_shadow_tricks = true; } diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h index 61f62f8e712..d2ec13ada1f 100644 --- a/intern/cycles/render/session.h +++ b/intern/cycles/render/session.h @@ -58,6 +58,7 @@ public: bool display_buffer_linear; bool use_denoising; + bool denoising_passes; int denoising_radius; float denoising_strength; float denoising_feature_strength; @@ -89,6 +90,7 @@ public: threads = 0; use_denoising = false; + denoising_passes = false; denoising_radius = 8; denoising_strength = 0.0f; denoising_feature_strength = 0.0f; From 4205cd269dfdace8ab2d3e1cc8363be19979ce53 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 30 Oct 2018 10:46:29 +1100 Subject: [PATCH 2/3] UI: add uiItemMenuFN which frees it's argument --- source/blender/editors/include/UI_interface.h | 1 + .../editors/interface/interface_layout.c | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index 0db6e2c122c..48c917040f7 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -1076,6 +1076,7 @@ void uiItemV(uiLayout *layout, const char *name, int icon, int argval); /* value void uiItemS(uiLayout *layout); /* separator */ void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *arg); +void uiItemMenuFN(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *argN); void uiItemMenuEnumO_ptr(uiLayout *layout, struct bContext *C, struct wmOperatorType *ot, const char *propname, const char *name, int icon); void uiItemMenuEnumO(uiLayout *layout, struct bContext *C, const char *opname, const char *propname, const char *name, int icon); void uiItemMenuEnumR_prop(uiLayout *layout, struct PointerRNA *ptr, PropertyRNA *prop, const char *name, int icon); diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 6550115e50b..4c252ae55bb 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -1941,8 +1941,11 @@ static uiBut *ui_item_menu( else but = uiDefMenuBut(block, func, arg, name, 0, 0, w, h, tip); - if (argN) { /* ugly .. */ - but->poin = (char *)but; + if (argN) { + /* ugly .. */ + if (arg != argN) { + but->poin = (char *)but; + } but->func_argN = argN; } @@ -2078,6 +2081,18 @@ void uiItemMenuF(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc ui_item_menu(layout, name, icon, func, arg, NULL, "", false); } +/** + * Version of #uiItemMenuF that free's `argN`. + */ +void uiItemMenuFN(uiLayout *layout, const char *name, int icon, uiMenuCreateFunc func, void *argN) +{ + if (!func) + return; + + /* Second 'argN' only ensures it gets freed. */ + ui_item_menu(layout, name, icon, func, argN, argN, "", false); +} + typedef struct MenuItemLevel { int opcontext; /* don't use pointers to the strings because python can dynamically From 7c0d37deca32512ff38120bf1736160110fe97cb Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 30 Oct 2018 11:39:44 +0100 Subject: [PATCH 3/3] Fix build error on Windows 32bit, alignment was wrong. --- intern/cycles/kernel/kernel_types.h | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index f46b06f87f9..230e90c8b31 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -1278,13 +1278,11 @@ typedef struct KernelFilm { float mist_start; float mist_inv_depth; float mist_falloff; - + int pass_denoising_data; int pass_denoising_clean; int denoising_flags; - int pad1, pad2; - /* XYZ to rendering color space transform. float4 instead of float3 to * ensure consistent padding/alignment across devices. */ float4 xyz_to_r;