From 087331c495b04ebd37903c0dc0e46262354cf026 Mon Sep 17 00:00:00 2001 From: Mai Lavelle Date: Thu, 9 Nov 2017 00:49:15 -0500 Subject: Cycles: Replace __MAX_CLOSURE__ build option with runtime integrator variable Goal is to reduce OpenCL kernel recompilations. Currently viewport renders are still set to use 64 closures as this seems to be faster and we don't want to cause a performance regression there. Needs to be investigated. Reviewed By: brecht Differential Revision: https://developer.blender.org/D2775 --- intern/cycles/device/device.cpp | 1 - intern/cycles/device/device.h | 6 ------ intern/cycles/device/device_cpu.cpp | 1 - intern/cycles/device/device_cuda.cpp | 4 ---- intern/cycles/device/device_split_kernel.cpp | 3 --- intern/cycles/device/device_split_kernel.h | 3 --- intern/cycles/kernel/kernel_bake.h | 8 ++++---- intern/cycles/kernel/kernel_path.h | 4 ++-- intern/cycles/kernel/kernel_path_branched.h | 2 +- intern/cycles/kernel/kernel_subsurface.h | 10 +++++----- intern/cycles/kernel/kernel_types.h | 13 +++++++++---- intern/cycles/kernel/kernel_volume.h | 2 +- intern/cycles/kernel/split/kernel_branched.h | 12 ++++++++++-- intern/cycles/kernel/split/kernel_direct_lighting.h | 2 +- intern/cycles/kernel/split/kernel_do_volume.h | 4 ++-- ...ernel_holdout_emission_blurring_pathtermination_ao.h | 2 +- intern/cycles/kernel/split/kernel_indirect_background.h | 2 +- intern/cycles/kernel/split/kernel_lamp_emission.h | 2 +- .../cycles/kernel/split/kernel_next_iteration_setup.h | 4 ++-- intern/cycles/kernel/split/kernel_shader_eval.h | 6 +++--- intern/cycles/kernel/split/kernel_shader_setup.h | 2 +- intern/cycles/kernel/split/kernel_shader_sort.h | 2 +- intern/cycles/kernel/split/kernel_shadow_blocked_ao.h | 2 +- intern/cycles/kernel/split/kernel_shadow_blocked_dl.h | 2 +- intern/cycles/kernel/split/kernel_split_data.h | 17 +++++++++++++++++ intern/cycles/kernel/split/kernel_split_data_types.h | 14 +++++++++++--- intern/cycles/kernel/split/kernel_subsurface_scatter.h | 4 ++-- intern/cycles/render/session.cpp | 12 ++++++++++-- 28 files changed, 87 insertions(+), 59 deletions(-) diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp index 641e3fde140..a3ff5481cef 100644 --- a/intern/cycles/device/device.cpp +++ b/intern/cycles/device/device.cpp @@ -47,7 +47,6 @@ std::ostream& operator <<(std::ostream &os, { os << "Experimental features: " << (requested_features.experimental ? "On" : "Off") << std::endl; - os << "Max closure count: " << requested_features.max_closure << std::endl; os << "Max nodes group: " << requested_features.max_nodes_group << std::endl; /* TODO(sergey): Decode bitflag into list of names. */ os << "Nodes features: " << requested_features.nodes_features << std::endl; diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h index 6bf3bbe6c25..35b545388f2 100644 --- a/intern/cycles/device/device.h +++ b/intern/cycles/device/device.h @@ -91,9 +91,6 @@ public: /* Use experimental feature set. */ bool experimental; - /* Maximum number of closures in shader trees. */ - int max_closure; - /* Selective nodes compilation. */ /* Identifier of a node group up to which all the nodes needs to be @@ -146,7 +143,6 @@ public: { /* TODO(sergey): Find more meaningful defaults. */ experimental = false; - max_closure = 0; max_nodes_group = 0; nodes_features = 0; use_hair = false; @@ -167,7 +163,6 @@ public: bool modified(const DeviceRequestedFeatures& requested_features) { return !(experimental == requested_features.experimental && - max_closure == requested_features.max_closure && max_nodes_group == requested_features.max_nodes_group && nodes_features == requested_features.nodes_features && use_hair == requested_features.use_hair && @@ -198,7 +193,6 @@ public: string_printf("%d", max_nodes_group); build_options += " -D__NODES_FEATURES__=" + string_printf("%d", nodes_features); - build_options += string_printf(" -D__MAX_CLOSURE__=%d", max_closure); if(!use_hair) { build_options += " -D__NO_HAIR__"; } diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp index 1a54c3380ee..0f4001ab1a6 100644 --- a/intern/cycles/device/device_cpu.cpp +++ b/intern/cycles/device/device_cpu.cpp @@ -760,7 +760,6 @@ public: CPUSplitKernel *split_kernel = NULL; if(use_split_kernel) { split_kernel = new CPUSplitKernel(this); - requested_features.max_closure = MAX_CLOSURE; if(!split_kernel->load_kernels(requested_features)) { thread_kernel_globals_free((KernelGlobals*)kgbuffer.device_pointer); kgbuffer.free(); diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp index 14e3ddc8c7b..d230a0c565d 100644 --- a/intern/cycles/device/device_cuda.cpp +++ b/intern/cycles/device/device_cuda.cpp @@ -1861,10 +1861,6 @@ public: DeviceRequestedFeatures requested_features; if(use_split_kernel()) { - if(!use_adaptive_compilation()) { - requested_features.max_closure = 64; - } - if(split_kernel == NULL) { split_kernel = new CUDASplitKernel(this); split_kernel->load_kernels(requested_features); diff --git a/intern/cycles/device/device_split_kernel.cpp b/intern/cycles/device/device_split_kernel.cpp index 115273d9f0a..566d4020b33 100644 --- a/intern/cycles/device/device_split_kernel.cpp +++ b/intern/cycles/device/device_split_kernel.cpp @@ -34,7 +34,6 @@ DeviceSplitKernel::DeviceSplitKernel(Device *device) use_queues_flag(device, "use_queues_flag"), work_pool_wgs(device, "work_pool_wgs") { - current_max_closure = -1; first_tile = true; avg_time_per_sample = 0.0; @@ -116,8 +115,6 @@ bool DeviceSplitKernel::load_kernels(const DeviceRequestedFeatures& requested_fe #undef LOAD_KERNEL - current_max_closure = requested_features.max_closure; - return true; } diff --git a/intern/cycles/device/device_split_kernel.h b/intern/cycles/device/device_split_kernel.h index 0647c664447..2ec0261e847 100644 --- a/intern/cycles/device/device_split_kernel.h +++ b/intern/cycles/device/device_split_kernel.h @@ -92,9 +92,6 @@ private: /* Work pool with respect to each work group. */ device_only_memory work_pool_wgs; - /* clos_max value for which the kernels have been loaded currently. */ - int current_max_closure; - /* Marked True in constructor and marked false at the end of path_trace(). */ bool first_tile; diff --git a/intern/cycles/kernel/kernel_bake.h b/intern/cycles/kernel/kernel_bake.h index 73cddeb27f7..8788e89c40e 100644 --- a/intern/cycles/kernel/kernel_bake.h +++ b/intern/cycles/kernel/kernel_bake.h @@ -51,7 +51,7 @@ ccl_device_inline void compute_light_pass(KernelGlobals *kg, path_state_init(kg, &emission_sd, &state, rng_hash, sample, NULL); /* evaluate surface shader */ - shader_eval_surface(kg, sd, &state, state.flag, MAX_CLOSURE); + shader_eval_surface(kg, sd, &state, state.flag, kernel_data.integrator.max_closures); /* TODO, disable more closures we don't need besides transparent */ shader_bsdf_disable_transparency(kg, sd); @@ -228,12 +228,12 @@ ccl_device float3 kernel_bake_evaluate_direct_indirect(KernelGlobals *kg, } else { /* surface color of the pass only */ - shader_eval_surface(kg, sd, state, 0, MAX_CLOSURE); + shader_eval_surface(kg, sd, state, 0, kernel_data.integrator.max_closures); return kernel_bake_shader_bsdf(kg, sd, type); } } else { - shader_eval_surface(kg, sd, state, 0, MAX_CLOSURE); + shader_eval_surface(kg, sd, state, 0, kernel_data.integrator.max_closures); color = kernel_bake_shader_bsdf(kg, sd, type); } @@ -333,7 +333,7 @@ ccl_device void kernel_bake_evaluate(KernelGlobals *kg, ccl_global uint4 *input, { float3 N = sd.N; if((sd.flag & SD_HAS_BUMP)) { - shader_eval_surface(kg, &sd, &state, 0, MAX_CLOSURE); + shader_eval_surface(kg, &sd, &state, 0, kernel_data.integrator.max_closures); N = shader_bsdf_average_normal(kg, &sd); } diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 8519e0682e1..207ba741e6f 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -443,7 +443,7 @@ ccl_device void kernel_path_indirect(KernelGlobals *kg, sd, &isect, ray); - shader_eval_surface(kg, sd, state, state->flag, MAX_CLOSURE); + shader_eval_surface(kg, sd, state, state->flag, kernel_data.integrator.max_closures); shader_prepare_closures(sd, state); /* Apply shadow catcher, holdout, emission. */ @@ -594,7 +594,7 @@ ccl_device_forceinline void kernel_path_integrate( /* Setup and evaluate shader. */ shader_setup_from_ray(kg, &sd, &isect, ray); - shader_eval_surface(kg, &sd, state, state->flag, MAX_CLOSURE); + shader_eval_surface(kg, &sd, state, state->flag, kernel_data.integrator.max_closures); shader_prepare_closures(&sd, state); /* Apply shadow catcher, holdout, emission. */ diff --git a/intern/cycles/kernel/kernel_path_branched.h b/intern/cycles/kernel/kernel_path_branched.h index b37bc65f4df..9996f52f9a4 100644 --- a/intern/cycles/kernel/kernel_path_branched.h +++ b/intern/cycles/kernel/kernel_path_branched.h @@ -474,7 +474,7 @@ ccl_device void kernel_branched_path_integrate(KernelGlobals *kg, /* Setup and evaluate shader. */ shader_setup_from_ray(kg, &sd, &isect, &ray); - shader_eval_surface(kg, &sd, &state, state.flag, MAX_CLOSURE); + shader_eval_surface(kg, &sd, &state, state.flag, kernel_data.integrator.max_closures); shader_merge_closures(&sd); /* Apply shadow catcher, holdout, emission. */ diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h index 87e7d7ff398..616ad71af3c 100644 --- a/intern/cycles/kernel/kernel_subsurface.h +++ b/intern/cycles/kernel/kernel_subsurface.h @@ -76,11 +76,11 @@ ccl_device_inline float3 subsurface_scatter_eval(ShaderData *sd, } /* replace closures with a single diffuse bsdf closure after scatter step */ -ccl_device void subsurface_scatter_setup_diffuse_bsdf(ShaderData *sd, const ShaderClosure *sc, float3 weight, bool hit, float3 N) +ccl_device void subsurface_scatter_setup_diffuse_bsdf(KernelGlobals *kg, ShaderData *sd, const ShaderClosure *sc, float3 weight, bool hit, float3 N) { sd->flag &= ~SD_CLOSURE_FLAGS; sd->num_closure = 0; - sd->num_closure_left = MAX_CLOSURE; + sd->num_closure_left = kernel_data.integrator.max_closures; if(hit) { Bssrdf *bssrdf = (Bssrdf *)sc; @@ -154,7 +154,7 @@ ccl_device void subsurface_color_bump_blur(KernelGlobals *kg, if(bump || texture_blur > 0.0f) { /* average color and normal at incoming point */ - shader_eval_surface(kg, sd, state, state_flag, MAX_CLOSURE); + shader_eval_surface(kg, sd, state, state_flag, kernel_data.integrator.max_closures); float3 in_color = shader_bssrdf_sum(sd, (bump)? N: NULL, NULL); /* we simply divide out the average color and multiply with the average @@ -342,7 +342,7 @@ ccl_device_noinline void subsurface_scatter_multi_setup( subsurface_color_bump_blur(kg, sd, state, state_flag, &weight, &N); /* Setup diffuse BSDF. */ - subsurface_scatter_setup_diffuse_bsdf(sd, sc, weight, true, N); + subsurface_scatter_setup_diffuse_bsdf(kg, sd, sc, weight, true, N); } /* subsurface scattering step, from a point on the surface to another nearby point on the same object */ @@ -439,7 +439,7 @@ ccl_device void subsurface_scatter_step(KernelGlobals *kg, ShaderData *sd, ccl_a subsurface_color_bump_blur(kg, sd, state, state_flag, &eval, &N); /* setup diffuse bsdf */ - subsurface_scatter_setup_diffuse_bsdf(sd, sc, eval, (ss_isect.num_hits > 0), N); + subsurface_scatter_setup_diffuse_bsdf(kg, sd, sc, eval, (ss_isect.num_hits > 0), N); } CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h index fc3e7b3da98..919dafbc780 100644 --- a/intern/cycles/kernel/kernel_types.h +++ b/intern/cycles/kernel/kernel_types.h @@ -782,10 +782,14 @@ typedef struct AttributeDescriptor { /* Closure data */ #ifdef __MULTI_CLOSURE__ -# ifndef __MAX_CLOSURE__ -# define MAX_CLOSURE 64 +# ifdef __SPLIT_KERNEL__ +# define MAX_CLOSURE 1 # else -# define MAX_CLOSURE __MAX_CLOSURE__ +# ifndef __MAX_CLOSURE__ +# define MAX_CLOSURE 64 +# else +# define MAX_CLOSURE __MAX_CLOSURE__ +# endif # endif #else # define MAX_CLOSURE 1 @@ -1313,7 +1317,8 @@ typedef struct KernelIntegrator { int volume_samples; int start_sample; - int pad; + + int max_closures; } KernelIntegrator; static_assert_align(KernelIntegrator, 16); diff --git a/intern/cycles/kernel/kernel_volume.h b/intern/cycles/kernel/kernel_volume.h index fb3c5437275..5604d8e5163 100644 --- a/intern/cycles/kernel/kernel_volume.h +++ b/intern/cycles/kernel/kernel_volume.h @@ -62,7 +62,7 @@ ccl_device_inline bool volume_shader_sample(KernelGlobals *kg, VolumeShaderCoefficients *coeff) { sd->P = P; - shader_eval_volume(kg, sd, state, state->volume_stack, state->flag, MAX_CLOSURE); + shader_eval_volume(kg, sd, state, state->volume_stack, state->flag, kernel_data.integrator.max_closures); if(!(sd->flag & (SD_EXTINCTION|SD_SCATTER|SD_EMISSION))) return false; diff --git a/intern/cycles/kernel/split/kernel_branched.h b/intern/cycles/kernel/split/kernel_branched.h index 2313feac089..6456636caaa 100644 --- a/intern/cycles/kernel/split/kernel_branched.h +++ b/intern/cycles/kernel/split/kernel_branched.h @@ -30,10 +30,14 @@ ccl_device_inline void kernel_split_branched_path_indirect_loop_init(KernelGloba BRANCHED_STORE(path_state); BRANCHED_STORE(throughput); BRANCHED_STORE(ray); - BRANCHED_STORE(sd); BRANCHED_STORE(isect); BRANCHED_STORE(ray_state); + branched_state->sd = *kernel_split_sd(sd, ray_index); + for(int i = 0; i < branched_state->sd.num_closure; i++) { + branched_state->sd.closure[i] = kernel_split_sd(sd, ray_index)->closure[i]; + } + #undef BRANCHED_STORE /* set loop counters to intial position */ @@ -53,10 +57,14 @@ ccl_device_inline void kernel_split_branched_path_indirect_loop_end(KernelGlobal BRANCHED_RESTORE(path_state); BRANCHED_RESTORE(throughput); BRANCHED_RESTORE(ray); - BRANCHED_RESTORE(sd); BRANCHED_RESTORE(isect); BRANCHED_RESTORE(ray_state); + *kernel_split_sd(sd, ray_index) = branched_state->sd; + for(int i = 0; i < branched_state->sd.num_closure; i++) { + kernel_split_sd(sd, ray_index)->closure[i] = branched_state->sd.closure[i]; + } + #undef BRANCHED_RESTORE /* leave indirect loop */ diff --git a/intern/cycles/kernel/split/kernel_direct_lighting.h b/intern/cycles/kernel/split/kernel_direct_lighting.h index 832b0e5b265..ca79602c565 100644 --- a/intern/cycles/kernel/split/kernel_direct_lighting.h +++ b/intern/cycles/kernel/split/kernel_direct_lighting.h @@ -58,7 +58,7 @@ ccl_device void kernel_direct_lighting(KernelGlobals *kg, if(IS_STATE(kernel_split_state.ray_state, ray_index, RAY_ACTIVE)) { ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); /* direct lighting */ #ifdef __EMISSION__ diff --git a/intern/cycles/kernel/split/kernel_do_volume.h b/intern/cycles/kernel/split/kernel_do_volume.h index 02881da6c04..fb5bd3d48dd 100644 --- a/intern/cycles/kernel/split/kernel_do_volume.h +++ b/intern/cycles/kernel/split/kernel_do_volume.h @@ -29,7 +29,7 @@ ccl_device_noinline bool kernel_split_branched_path_volume_indirect_light_iter(K { SplitBranchedState *branched_state = &kernel_split_state.branched_state[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); PathRadiance *L = &kernel_split_state.path_radiance[ray_index]; ShaderData *emission_sd = AS_SHADER_DATA(&kernel_split_state.sd_DL_shadow[ray_index]); @@ -140,7 +140,7 @@ ccl_device void kernel_do_volume(KernelGlobals *kg) ccl_global float3 *throughput = &kernel_split_state.throughput[ray_index]; ccl_global Ray *ray = &kernel_split_state.ray[ray_index]; ccl_global Intersection *isect = &kernel_split_state.isect[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); ShaderData *emission_sd = AS_SHADER_DATA(&kernel_split_state.sd_DL_shadow[ray_index]); bool hit = ! IS_STATE(ray_state, ray_index, RAY_HIT_BACKGROUND); diff --git a/intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h b/intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h index bc8ca3aa3ca..88919f47c7a 100644 --- a/intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h +++ b/intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h @@ -94,7 +94,7 @@ ccl_device void kernel_holdout_emission_blurring_pathtermination_ao( float3 throughput; ccl_global char *ray_state = kernel_split_state.ray_state; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); if(IS_STATE(ray_state, ray_index, RAY_ACTIVE)) { uint buffer_offset = kernel_split_state.buffer_offset[ray_index]; diff --git a/intern/cycles/kernel/split/kernel_indirect_background.h b/intern/cycles/kernel/split/kernel_indirect_background.h index 0c894bd3d71..4cf88a02590 100644 --- a/intern/cycles/kernel/split/kernel_indirect_background.h +++ b/intern/cycles/kernel/split/kernel_indirect_background.h @@ -55,7 +55,7 @@ ccl_device void kernel_indirect_background(KernelGlobals *kg) PathRadiance *L = &kernel_split_state.path_radiance[ray_index]; ccl_global Ray *ray = &kernel_split_state.ray[ray_index]; float3 throughput = kernel_split_state.throughput[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); kernel_path_background(kg, state, ray, throughput, sd, L); kernel_split_path_end(kg, ray_index); diff --git a/intern/cycles/kernel/split/kernel_lamp_emission.h b/intern/cycles/kernel/split/kernel_lamp_emission.h index d5099ac66e6..c14f66f664f 100644 --- a/intern/cycles/kernel/split/kernel_lamp_emission.h +++ b/intern/cycles/kernel/split/kernel_lamp_emission.h @@ -58,7 +58,7 @@ ccl_device void kernel_lamp_emission(KernelGlobals *kg) float3 throughput = kernel_split_state.throughput[ray_index]; Ray ray = kernel_split_state.ray[ray_index]; ccl_global Intersection *isect = &kernel_split_state.isect[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); kernel_path_lamp_emission(kg, state, &ray, throughput, isect, sd, L); } diff --git a/intern/cycles/kernel/split/kernel_next_iteration_setup.h b/intern/cycles/kernel/split/kernel_next_iteration_setup.h index c3373174582..bb6bf1cc7e6 100644 --- a/intern/cycles/kernel/split/kernel_next_iteration_setup.h +++ b/intern/cycles/kernel/split/kernel_next_iteration_setup.h @@ -58,7 +58,7 @@ ccl_device void kernel_split_branched_indirect_light_end(KernelGlobals *kg, int kernel_split_branched_path_indirect_loop_end(kg, ray_index); ccl_global float3 *throughput = &kernel_split_state.throughput[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; ccl_global Ray *ray = &kernel_split_state.ray[ray_index]; @@ -126,7 +126,7 @@ ccl_device void kernel_next_iteration_setup(KernelGlobals *kg, if(active) { ccl_global float3 *throughput = &kernel_split_state.throughput[ray_index]; ccl_global Ray *ray = &kernel_split_state.ray[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; PathRadiance *L = &kernel_split_state.path_radiance[ray_index]; diff --git a/intern/cycles/kernel/split/kernel_shader_eval.h b/intern/cycles/kernel/split/kernel_shader_eval.h index 22602537524..2409d1ba28b 100644 --- a/intern/cycles/kernel/split/kernel_shader_eval.h +++ b/intern/cycles/kernel/split/kernel_shader_eval.h @@ -50,15 +50,15 @@ ccl_device void kernel_shader_eval(KernelGlobals *kg) if(IS_STATE(ray_state, ray_index, RAY_ACTIVE)) { ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; - shader_eval_surface(kg, &kernel_split_state.sd[ray_index], state, state->flag, MAX_CLOSURE); + shader_eval_surface(kg, kernel_split_sd(sd, ray_index), state, state->flag, kernel_data.integrator.max_closures); #ifdef __BRANCHED_PATH__ if(kernel_data.integrator.branched) { - shader_merge_closures(&kernel_split_state.sd[ray_index]); + shader_merge_closures(kernel_split_sd(sd, ray_index)); } else #endif { - shader_prepare_closures(&kernel_split_state.sd[ray_index], state); + shader_prepare_closures(kernel_split_sd(sd, ray_index), state); } } } diff --git a/intern/cycles/kernel/split/kernel_shader_setup.h b/intern/cycles/kernel/split/kernel_shader_setup.h index 0432689d9fa..9d428ee8139 100644 --- a/intern/cycles/kernel/split/kernel_shader_setup.h +++ b/intern/cycles/kernel/split/kernel_shader_setup.h @@ -61,7 +61,7 @@ ccl_device void kernel_shader_setup(KernelGlobals *kg, Ray ray = kernel_split_state.ray[ray_index]; shader_setup_from_ray(kg, - &kernel_split_state.sd[ray_index], + kernel_split_sd(sd, ray_index), &isect, &ray); } diff --git a/intern/cycles/kernel/split/kernel_shader_sort.h b/intern/cycles/kernel/split/kernel_shader_sort.h index 5a55b680695..2132c42220f 100644 --- a/intern/cycles/kernel/split/kernel_shader_sort.h +++ b/intern/cycles/kernel/split/kernel_shader_sort.h @@ -47,7 +47,7 @@ ccl_device void kernel_shader_sort(KernelGlobals *kg, int ray_index = kernel_split_state.queue_data[add]; bool valid = (ray_index != QUEUE_EMPTY_SLOT) && IS_STATE(kernel_split_state.ray_state, ray_index, RAY_ACTIVE); if(valid) { - value = kernel_split_state.sd[ray_index].shader & SHADER_MASK; + value = kernel_split_sd(sd, ray_index)->shader & SHADER_MASK; } } local_value[i + lid] = value; diff --git a/intern/cycles/kernel/split/kernel_shadow_blocked_ao.h b/intern/cycles/kernel/split/kernel_shadow_blocked_ao.h index b50de615fc8..a4cffd77eff 100644 --- a/intern/cycles/kernel/split/kernel_shadow_blocked_ao.h +++ b/intern/cycles/kernel/split/kernel_shadow_blocked_ao.h @@ -33,7 +33,7 @@ ccl_device void kernel_shadow_blocked_ao(KernelGlobals *kg) return; } - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); ShaderData *emission_sd = AS_SHADER_DATA(&kernel_split_state.sd_DL_shadow[ray_index]); PathRadiance *L = &kernel_split_state.path_radiance[ray_index]; ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; diff --git a/intern/cycles/kernel/split/kernel_shadow_blocked_dl.h b/intern/cycles/kernel/split/kernel_shadow_blocked_dl.h index 9a6bdfbdffe..da072fd5f1a 100644 --- a/intern/cycles/kernel/split/kernel_shadow_blocked_dl.h +++ b/intern/cycles/kernel/split/kernel_shadow_blocked_dl.h @@ -43,7 +43,7 @@ ccl_device void kernel_shadow_blocked_dl(KernelGlobals *kg) ccl_global PathState *state = &kernel_split_state.path_state[ray_index]; Ray ray = kernel_split_state.light_ray[ray_index]; PathRadiance *L = &kernel_split_state.path_radiance[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); float3 throughput = kernel_split_state.throughput[ray_index]; BsdfEval L_light = kernel_split_state.bsdf_eval[ray_index]; diff --git a/intern/cycles/kernel/split/kernel_split_data.h b/intern/cycles/kernel/split/kernel_split_data.h index eac22050a38..fa2f0b20a83 100644 --- a/intern/cycles/kernel/split/kernel_split_data.h +++ b/intern/cycles/kernel/split/kernel_split_data.h @@ -31,6 +31,14 @@ ccl_device_inline uint64_t split_data_buffer_size(KernelGlobals *kg, size_t num_ size = size SPLIT_DATA_ENTRIES; #undef SPLIT_DATA_ENTRY + uint64_t closure_size = sizeof(ShaderClosure) * (kernel_data.integrator.max_closures-1); + +#ifdef __BRANCHED_PATH__ + size += align_up(closure_size * num_elements, 16); +#endif + + size += align_up(num_elements * (sizeof(ShaderData) + closure_size), 16); + return size; } @@ -49,6 +57,15 @@ ccl_device_inline void split_data_init(KernelGlobals *kg, SPLIT_DATA_ENTRIES; #undef SPLIT_DATA_ENTRY + uint64_t closure_size = sizeof(ShaderClosure) * (kernel_data.integrator.max_closures-1); + +#ifdef __BRANCHED_PATH__ + p += align_up(closure_size * num_elements, 16); +#endif + + split_data->_sd = (ShaderData*)p; + p += align_up(num_elements * (sizeof(ShaderData) + closure_size), 16); + split_data->ray_state = ray_state; } diff --git a/intern/cycles/kernel/split/kernel_split_data_types.h b/intern/cycles/kernel/split/kernel_split_data_types.h index 5c2aadcf4ec..9ac3f904819 100644 --- a/intern/cycles/kernel/split/kernel_split_data_types.h +++ b/intern/cycles/kernel/split/kernel_split_data_types.h @@ -51,7 +51,6 @@ typedef ccl_global struct SplitBranchedState { float3 throughput; Ray ray; - struct ShaderData sd; Intersection isect; char ray_state; @@ -77,6 +76,9 @@ typedef ccl_global struct SplitBranchedState { int shared_sample_count; /* number of branched samples shared with other threads */ int original_ray; /* index of original ray when sharing branched samples */ bool waiting_on_shared_samples; + + /* Must be last in to allow for dynamic size of closures */ + struct ShaderData sd; } SplitBranchedState; #define SPLIT_DATA_BRANCHED_ENTRIES \ @@ -110,11 +112,11 @@ typedef ccl_global struct SplitBranchedState { SPLIT_DATA_ENTRY(ccl_global Ray, light_ray, 1) \ SPLIT_DATA_ENTRY(ccl_global int, queue_data, (NUM_QUEUES*2)) /* TODO(mai): this is too large? */ \ SPLIT_DATA_ENTRY(ccl_global uint, buffer_offset, 1) \ - SPLIT_DATA_ENTRY(ShaderData, sd, 1) \ SPLIT_DATA_ENTRY(ShaderDataTinyStorage, sd_DL_shadow, 1) \ SPLIT_DATA_SUBSURFACE_ENTRIES \ SPLIT_DATA_VOLUME_ENTRIES \ SPLIT_DATA_BRANCHED_ENTRIES \ + SPLIT_DATA_ENTRY(ShaderData, _sd, 0) /* entries to be copied to inactive rays when sharing branched samples (TODO: which are actually needed?) */ #define SPLIT_DATA_ENTRIES_BRANCHED_SHARED \ @@ -126,11 +128,11 @@ typedef ccl_global struct SplitBranchedState { SPLIT_DATA_ENTRY(ccl_global BsdfEval, bsdf_eval, 1) \ SPLIT_DATA_ENTRY(ccl_global int, is_lamp, 1) \ SPLIT_DATA_ENTRY(ccl_global Ray, light_ray, 1) \ - SPLIT_DATA_ENTRY(ShaderData, sd, 1) \ SPLIT_DATA_ENTRY(ShaderDataTinyStorage, sd_DL_shadow, 1) \ SPLIT_DATA_SUBSURFACE_ENTRIES \ SPLIT_DATA_VOLUME_ENTRIES \ SPLIT_DATA_BRANCHED_ENTRIES \ + SPLIT_DATA_ENTRY(ShaderData, _sd, 0) /* struct that holds pointers to data in the shared state buffer */ typedef struct SplitData { @@ -154,6 +156,12 @@ __device__ SplitParams __split_param_data; # define kernel_split_params (__split_param_data) #endif /* __KERNEL_CUDA__ */ +#define kernel_split_sd(sd, ray_index) ((ShaderData*) \ + ( \ + ((ccl_global char*)kernel_split_state._##sd) + \ + (sizeof(ShaderData) + sizeof(ShaderClosure)*(kernel_data.integrator.max_closures-1)) * (ray_index) \ + )) + /* Local storage for queue_enqueue kernel. */ typedef struct QueueEnqueueLocals { uint queue_atomics[2]; diff --git a/intern/cycles/kernel/split/kernel_subsurface_scatter.h b/intern/cycles/kernel/split/kernel_subsurface_scatter.h index c5504d0a89b..887c3e313d1 100644 --- a/intern/cycles/kernel/split/kernel_subsurface_scatter.h +++ b/intern/cycles/kernel/split/kernel_subsurface_scatter.h @@ -98,7 +98,7 @@ ccl_device_noinline bool kernel_split_branched_path_subsurface_indirect_light_it /* compute lighting with the BSDF closure */ for(int hit = branched_state->next_hit; hit < branched_state->num_hits; hit++) { - ShaderData *bssrdf_sd = &kernel_split_state.sd[ray_index]; + ShaderData *bssrdf_sd = kernel_split_sd(sd, ray_index); *bssrdf_sd = *sd; /* note: copy happens each iteration of inner loop, this is * important as the indirect path will write into bssrdf_sd */ @@ -228,7 +228,7 @@ ccl_device void kernel_subsurface_scatter(KernelGlobals *kg) ccl_global Ray *ray = &kernel_split_state.ray[ray_index]; ccl_global float3 *throughput = &kernel_split_state.throughput[ray_index]; ccl_global SubsurfaceIndirectRays *ss_indirect = &kernel_split_state.ss_rays[ray_index]; - ShaderData *sd = &kernel_split_state.sd[ray_index]; + ShaderData *sd = kernel_split_sd(sd, ray_index); ShaderData *emission_sd = AS_SHADER_DATA(&kernel_split_state.sd_DL_shadow[ray_index]); if(sd->flag & SD_BSSRDF) { diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 74cfd02e1a4..e8d9558c38d 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -642,13 +642,11 @@ DeviceRequestedFeatures Session::get_requested_device_features() DeviceRequestedFeatures requested_features; requested_features.experimental = params.experimental; - requested_features.max_closure = get_max_closure_count(); scene->shader_manager->get_requested_features( scene, &requested_features); if(!params.background) { /* Avoid too much re-compilations for viewport render. */ - requested_features.max_closure = 64; requested_features.max_nodes_group = NODE_GROUP_LEVEL_MAX; requested_features.nodes_features = NODE_FEATURE_ALL; } @@ -858,6 +856,16 @@ void Session::update_scene() if(scene->need_update()) { load_kernels(false); + /* Update max_closures. */ + KernelIntegrator *kintegrator = &scene->dscene.data.integrator; + if(params.background) { + kintegrator->max_closures = get_max_closure_count(); + } + else { + /* Currently viewport render is faster with higher max_closures, needs investigating. */ + kintegrator->max_closures = 64; + } + progress.set_status("Updating Scene"); MEM_GUARDED_CALL(&progress, scene->device_update, device, progress); } -- cgit v1.2.3 From 449687d50aab1d0947373263c386ba30166d318e Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Nov 2017 17:30:28 +0100 Subject: Depsgraph: Assert when node uses unhandled ID type --- source/blender/depsgraph/intern/builder/deg_builder_nodes.cc | 3 +++ source/blender/depsgraph/intern/builder/deg_builder_relations.cc | 3 +++ 2 files changed, 6 insertions(+) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 10da33fc0dd..26b3460e741 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -976,6 +976,9 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree) build_nodetree(group_ntree); } } + else { + BLI_assert(!"Unknown ID type used for node"); + } } } diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 3854850e778..f0368998796 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -1736,6 +1736,9 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree) DEG_OPCODE_PARAMETERS_EVAL); add_relation(group_parameters_key, parameters_key, "Group Node"); } + else { + BLI_assert(!"Unknown ID type used for node"); + } } } -- cgit v1.2.3 From 98425563ed33b95648eee511f783e866c92a1cae Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Nov 2017 17:32:03 +0100 Subject: Depsgraph: Cleanup, reduce indentation level --- .../depsgraph/intern/builder/deg_builder_nodes.cc | 39 ++++++++++---------- .../intern/builder/deg_builder_relations.cc | 42 +++++++++++----------- 2 files changed, 42 insertions(+), 39 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 26b3460e741..166df70d8d7 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -959,27 +959,28 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree) /* nodetree's nodes... */ LINKLIST_FOREACH (bNode *, bnode, &ntree->nodes) { ID *id = bnode->id; - if (id != NULL) { - ID_Type id_type = GS(id->name); - if (id_type == ID_MA) { - build_material((Material *)id); - } - else if (id_type == ID_TE) { - build_texture((Tex *)id); - } - else if (id_type == ID_IM) { - build_image((Image *)id); - } - else if (bnode->type == NODE_GROUP) { - bNodeTree *group_ntree = (bNodeTree *)id; - if ((group_ntree->id.tag & LIB_TAG_DOIT) == 0) { - build_nodetree(group_ntree); - } - } - else { - BLI_assert(!"Unknown ID type used for node"); + if (id == NULL) { + continue; + } + ID_Type id_type = GS(id->name); + if (id_type == ID_MA) { + build_material((Material *)id); + } + else if (id_type == ID_TE) { + build_texture((Tex *)id); + } + else if (id_type == ID_IM) { + build_image((Image *)id); + } + else if (bnode->type == NODE_GROUP) { + bNodeTree *group_ntree = (bNodeTree *)id; + if ((group_ntree->id.tag & LIB_TAG_DOIT) == 0) { + build_nodetree(group_ntree); } } + else { + BLI_assert(!"Unknown ID type used for node"); + } } // TODO: link from nodetree to owner_component? diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index f0368998796..4a6e0765069 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -1718,27 +1718,29 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree) /* nodetree's nodes... */ LINKLIST_FOREACH (bNode *, bnode, &ntree->nodes) { - if (bnode->id) { - if (GS(bnode->id->name) == ID_MA) { - build_material((Material *)bnode->id); - } - else if (bnode->type == ID_TE) { - build_texture((Tex *)bnode->id); - } - else if (bnode->type == NODE_GROUP) { - bNodeTree *group_ntree = (bNodeTree *)bnode->id; - if ((group_ntree->id.tag & LIB_TAG_DOIT) == 0) { - build_nodetree(group_ntree); - group_ntree->id.tag |= LIB_TAG_DOIT; - } - OperationKey group_parameters_key(&group_ntree->id, - DEG_NODE_TYPE_PARAMETERS, - DEG_OPCODE_PARAMETERS_EVAL); - add_relation(group_parameters_key, parameters_key, "Group Node"); - } - else { - BLI_assert(!"Unknown ID type used for node"); + ID *id = bnode->id; + if (id == NULL) { + continue; + } + if (GS(id->name) == ID_MA) { + build_material((Material *)bnode->id); + } + else if (bnode->type == ID_TE) { + build_texture((Tex *)bnode->id); + } + else if (bnode->type == NODE_GROUP) { + bNodeTree *group_ntree = (bNodeTree *)id; + if ((group_ntree->id.tag & LIB_TAG_DOIT) == 0) { + build_nodetree(group_ntree); + group_ntree->id.tag |= LIB_TAG_DOIT; } + OperationKey group_parameters_key(&group_ntree->id, + DEG_NODE_TYPE_PARAMETERS, + DEG_OPCODE_PARAMETERS_EVAL); + add_relation(group_parameters_key, parameters_key, "Group Node"); + } + else { + BLI_assert(!"Unknown ID type used for node"); } } -- cgit v1.2.3 From 1018683defa987eb51ba28df7fc6fa4a92eda335 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Nov 2017 17:33:46 +0100 Subject: Depsgraph: Fix wrong ID type being compared --- source/blender/depsgraph/intern/builder/deg_builder_relations.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 4a6e0765069..dcae17eebd7 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -1722,10 +1722,11 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree) if (id == NULL) { continue; } - if (GS(id->name) == ID_MA) { + ID_Type id_type = GS(id->name); + if (id_type == ID_MA) { build_material((Material *)bnode->id); } - else if (bnode->type == ID_TE) { + else if (id_type == ID_TE) { build_texture((Tex *)bnode->id); } else if (bnode->type == NODE_GROUP) { -- cgit v1.2.3 From 9f0842bbe8ea6b78621a140ec18125cb8ded4dcf Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Nov 2017 17:34:19 +0100 Subject: Depsgraph: Synchronize nodes and relations builders --- source/blender/depsgraph/intern/builder/deg_builder_relations.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index dcae17eebd7..d673a05552f 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -1729,6 +1729,9 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree) else if (id_type == ID_TE) { build_texture((Tex *)bnode->id); } + else if (id_type == ID_IM) { + /* nothing for now. */ + } else if (bnode->type == NODE_GROUP) { bNodeTree *group_ntree = (bNodeTree *)id; if ((group_ntree->id.tag & LIB_TAG_DOIT) == 0) { -- cgit v1.2.3 From 70e34ac186ebe86422a89fdccf8d20907743e503 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Nov 2017 17:38:42 +0100 Subject: Depsgraph: Cleanup, use google style for private members --- .../depsgraph/intern/builder/deg_builder_nodes.cc | 12 ++++++------ .../depsgraph/intern/builder/deg_builder_nodes.h | 4 ++-- .../intern/builder/deg_builder_relations.cc | 20 ++++++++++---------- .../depsgraph/intern/builder/deg_builder_relations.h | 2 +- .../intern/builder/deg_builder_relations_scene.cc | 4 ++-- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 166df70d8d7..98d2e8893c1 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -153,8 +153,8 @@ void constraint_walk(bConstraint * /*con*/, /* **** General purpose functions **** */ DepsgraphNodeBuilder::DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph) : - m_bmain(bmain), - m_graph(graph) + bmain_(bmain), + graph_(graph) { } @@ -164,12 +164,12 @@ DepsgraphNodeBuilder::~DepsgraphNodeBuilder() IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id) { - return m_graph->add_id_node(id, id->name); + return graph_->add_id_node(id, id->name); } TimeSourceDepsNode *DepsgraphNodeBuilder::add_time_source() { - return m_graph->add_time_source(); + return graph_->add_time_source(); } ComponentDepsNode *DepsgraphNodeBuilder::add_component_node( @@ -195,7 +195,7 @@ OperationDepsNode *DepsgraphNodeBuilder::add_operation_node( name_tag); if (op_node == NULL) { op_node = comp_node->add_operation(op, opcode, name, name_tag); - m_graph->operations.push_back(op_node); + graph_->operations.push_back(op_node); } else { fprintf(stderr, @@ -315,7 +315,7 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob) { const bool has_object = (ob->id.tag & LIB_TAG_DOIT); IDDepsNode *id_node = (has_object) - ? m_graph->find_id_node(&ob->id) + ? graph_->find_id_node(&ob->id) : add_id_node(&ob->id); /* Update node layers. * Do it for both new and existing ID nodes. This is so because several diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index a54b1c76c77..2c698b3335d 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -156,8 +156,8 @@ struct DepsgraphNodeBuilder { void build_movieclip(MovieClip *clip); protected: - Main *m_bmain; - Depsgraph *m_graph; + Main *bmain_; + Depsgraph *graph_; }; } // namespace DEG diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index d673a05552f..bd6be70a831 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -194,7 +194,7 @@ RNAPathKey::RNAPathKey(ID *id, const char *path) : } DepsgraphRelationBuilder::DepsgraphRelationBuilder(Depsgraph *graph) : - m_graph(graph) + graph_(graph) { } @@ -206,14 +206,14 @@ TimeSourceDepsNode *DepsgraphRelationBuilder::find_node( return NULL; } else { - return m_graph->time_source; + return graph_->time_source; } } ComponentDepsNode *DepsgraphRelationBuilder::find_node( const ComponentKey &key) const { - IDDepsNode *id_node = m_graph->find_id_node(key.id); + IDDepsNode *id_node = graph_->find_id_node(key.id); if (!id_node) { fprintf(stderr, "find_node component: Could not find ID %s\n", (key.id != NULL) ? key.id->name : ""); @@ -227,7 +227,7 @@ ComponentDepsNode *DepsgraphRelationBuilder::find_node( OperationDepsNode *DepsgraphRelationBuilder::find_node( const OperationKey &key) const { - IDDepsNode *id_node = m_graph->find_id_node(key.id); + IDDepsNode *id_node = graph_->find_id_node(key.id); if (!id_node) { fprintf(stderr, "find_node operation: Could not find ID\n"); return NULL; @@ -252,13 +252,13 @@ OperationDepsNode *DepsgraphRelationBuilder::find_node( DepsNode *DepsgraphRelationBuilder::find_node(const RNAPathKey &key) const { - return m_graph->find_node_from_pointer(&key.ptr, key.prop); + return graph_->find_node_from_pointer(&key.ptr, key.prop); } OperationDepsNode *DepsgraphRelationBuilder::has_node( const OperationKey &key) const { - IDDepsNode *id_node = m_graph->find_id_node(key.id); + IDDepsNode *id_node = graph_->find_id_node(key.id); if (!id_node) { return NULL; } @@ -275,7 +275,7 @@ void DepsgraphRelationBuilder::add_time_relation(TimeSourceDepsNode *timesrc, const char *description) { if (timesrc && node_to) { - m_graph->add_new_relation(timesrc, node_to, description); + graph_->add_new_relation(timesrc, node_to, description); } else { DEG_DEBUG_PRINTF("add_time_relation(%p = %s, %p = %s, %s) Failed\n", @@ -291,7 +291,7 @@ void DepsgraphRelationBuilder::add_operation_relation( const char *description) { if (node_from && node_to) { - m_graph->add_new_relation(node_from, node_to, description); + graph_->add_new_relation(node_from, node_to, description); } else { DEG_DEBUG_PRINTF("add_operation_relation(%p = %s, %p = %s, %s) Failed\n", @@ -366,7 +366,7 @@ void DepsgraphRelationBuilder::add_forcefield_relations(const OperationKey &key, Depsgraph *DepsgraphRelationBuilder::getGraph() { - return m_graph; + return graph_; } /* **** Functions to build relations between entities **** */ @@ -1019,7 +1019,7 @@ void DepsgraphRelationBuilder::build_driver(ID *id, FCurve *fcu) /* Drivers on armature-level bone settings (i.e. bbone stuff), * which will affect the evaluation of corresponding pose bones. */ - IDDepsNode *arm_node = m_graph->find_id_node(id); + IDDepsNode *arm_node = graph_->find_id_node(id); char *bone_name = BLI_str_quoted_substrN(rna_path, "bones["); if (arm_node && bone_name) { diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 02f8fc69070..da0d4b9f96b 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -252,7 +252,7 @@ protected: bool needs_animdata_node(ID *id); private: - Depsgraph *m_graph; + Depsgraph *graph_; }; struct DepsNodeHandle diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc index 6a9568e7e8d..318534d0b43 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc @@ -114,8 +114,8 @@ void DepsgraphRelationBuilder::build_scene(Main *bmain, Scene *scene) build_movieclip(clip); } - for (Depsgraph::OperationNodes::const_iterator it_op = m_graph->operations.begin(); - it_op != m_graph->operations.end(); + for (Depsgraph::OperationNodes::const_iterator it_op = graph_->operations.begin(); + it_op != graph_->operations.end(); ++it_op) { OperationDepsNode *node = *it_op; -- cgit v1.2.3 From 887c2e5c0dead416c40fd6a0524a3da579aa24ae Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Nov 2017 17:43:53 +0100 Subject: Depsgraph: Make bmain part of builder state and remove bmain from public API --- source/blender/depsgraph/intern/builder/deg_builder_nodes.cc | 12 ++++++------ source/blender/depsgraph/intern/builder/deg_builder_nodes.h | 4 ++-- .../depsgraph/intern/builder/deg_builder_nodes_scene.cc | 10 +++++----- .../depsgraph/intern/builder/deg_builder_relations.cc | 12 +++++++----- .../blender/depsgraph/intern/builder/deg_builder_relations.h | 7 ++++--- .../depsgraph/intern/builder/deg_builder_relations_scene.cc | 10 +++++----- source/blender/depsgraph/intern/depsgraph_build.cc | 10 +++++----- 7 files changed, 34 insertions(+), 31 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 98d2e8893c1..89a2dba87c8 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -152,9 +152,9 @@ void constraint_walk(bConstraint * /*con*/, /* **** General purpose functions **** */ -DepsgraphNodeBuilder::DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph) : - bmain_(bmain), - graph_(graph) +DepsgraphNodeBuilder::DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph) + : bmain_(bmain), + graph_(graph) { } @@ -277,17 +277,17 @@ OperationDepsNode *DepsgraphNodeBuilder::find_operation_node( /* **** Build functions for entity nodes **** */ -void DepsgraphNodeBuilder::begin_build(Main *bmain) { +void DepsgraphNodeBuilder::begin_build() { /* LIB_TAG_DOIT is used to indicate whether node for given ID was already * created or not. This flag is being set in add_id_node(), so functions * shouldn't bother with setting it, they only might query this flag when * needed. */ - BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false); + BKE_main_id_tag_all(bmain_, LIB_TAG_DOIT, false); /* XXX nested node trees are not included in tag-clearing above, * so we need to do this manually. */ - FOREACH_NODETREE(bmain, nodetree, id) + FOREACH_NODETREE(bmain_, nodetree, id) { if (id != (ID *)nodetree) { nodetree->id.tag &= ~LIB_TAG_DOIT; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 2c698b3335d..db57b2921ea 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -70,7 +70,7 @@ struct DepsgraphNodeBuilder { DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph); ~DepsgraphNodeBuilder(); - void begin_build(Main *bmain); + void begin_build(); IDDepsNode *add_id_node(ID *id); TimeSourceDepsNode *add_time_source(); @@ -118,7 +118,7 @@ struct DepsgraphNodeBuilder { const char *name = "", int name_tag = -1); - void build_scene(Main *bmain, Scene *scene); + void build_scene(Scene *scene); void build_group(Scene *scene, Base *base, Group *group); void build_object(Scene *scene, Base *base, Object *ob); void build_object_transform(Scene *scene, Object *ob); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc index 521276bc608..4d048d30d55 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc @@ -63,7 +63,7 @@ extern "C" { namespace DEG { -void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene) +void DepsgraphNodeBuilder::build_scene(Scene *scene) { /* scene ID block */ add_id_node(&scene->id); @@ -75,7 +75,7 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene) // XXX: depending on how this goes, that scene itself could probably store its // own little partial depsgraph? if (scene->set) { - build_scene(bmain, scene->set); + build_scene(scene->set); } /* scene objects */ @@ -113,17 +113,17 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene) } /* Cache file. */ - LINKLIST_FOREACH (CacheFile *, cachefile, &bmain->cachefiles) { + LINKLIST_FOREACH (CacheFile *, cachefile, &bmain_->cachefiles) { build_cachefile(cachefile); } /* Masks. */ - LINKLIST_FOREACH (Mask *, mask, &bmain->mask) { + LINKLIST_FOREACH (Mask *, mask, &bmain_->mask) { build_mask(mask); } /* Movie clips. */ - LINKLIST_FOREACH (MovieClip *, clip, &bmain->movieclip) { + LINKLIST_FOREACH (MovieClip *, clip, &bmain_->movieclip) { build_movieclip(clip); } diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index bd6be70a831..072783a4320 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -193,8 +193,10 @@ RNAPathKey::RNAPathKey(ID *id, const char *path) : } } -DepsgraphRelationBuilder::DepsgraphRelationBuilder(Depsgraph *graph) : - graph_(graph) +DepsgraphRelationBuilder::DepsgraphRelationBuilder(Main *bmain, + Depsgraph *graph) + : bmain_(bmain), + graph_(graph) { } @@ -371,16 +373,16 @@ Depsgraph *DepsgraphRelationBuilder::getGraph() /* **** Functions to build relations between entities **** */ -void DepsgraphRelationBuilder::begin_build(Main *bmain) +void DepsgraphRelationBuilder::begin_build() { /* LIB_TAG_DOIT is used to indicate whether node for given ID was already * created or not. */ - BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false); + BKE_main_id_tag_all(bmain_, LIB_TAG_DOIT, false); /* XXX nested node trees are notr included in tag-clearing above, * so we need to do this manually. */ - FOREACH_NODETREE(bmain, nodetree, id) + FOREACH_NODETREE(bmain_, nodetree, id) { if (id != (ID *)nodetree) { nodetree->id.tag &= ~LIB_TAG_DOIT; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index da0d4b9f96b..4b1c6fd5562 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -165,9 +165,9 @@ struct RNAPathKey struct DepsgraphRelationBuilder { - DepsgraphRelationBuilder(Depsgraph *graph); + DepsgraphRelationBuilder(Main *bmain, Depsgraph *graph); - void begin_build(Main *bmain); + void begin_build(); template void add_relation(const KeyFrom& key_from, @@ -184,7 +184,7 @@ struct DepsgraphRelationBuilder const DepsNodeHandle *handle, const char *description); - void build_scene(Main *bmain, Scene *scene); + void build_scene(Scene *scene); void build_group(Main *bmain, Scene *scene, Object *object, Group *group); void build_object(Main *bmain, Scene *scene, Object *ob); void build_object_parent(Object *ob); @@ -252,6 +252,7 @@ protected: bool needs_animdata_node(ID *id); private: + Main *bmain_; Depsgraph *graph_; }; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc index 318534d0b43..d5a8ead10dc 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc @@ -67,16 +67,16 @@ extern "C" { namespace DEG { -void DepsgraphRelationBuilder::build_scene(Main *bmain, Scene *scene) +void DepsgraphRelationBuilder::build_scene(Scene *scene) { if (scene->set) { - build_scene(bmain, scene->set); + build_scene(scene->set); } /* scene objects */ LINKLIST_FOREACH (Base *, base, &scene->base) { Object *ob = base->object; - build_object(bmain, scene, ob); + build_object(bmain_, scene, ob); } /* rigidbody */ @@ -105,12 +105,12 @@ void DepsgraphRelationBuilder::build_scene(Main *bmain, Scene *scene) } /* Masks. */ - LINKLIST_FOREACH (Mask *, mask, &bmain->mask) { + LINKLIST_FOREACH (Mask *, mask, &bmain_->mask) { build_mask(mask); } /* Movie clips. */ - LINKLIST_FOREACH (MovieClip *, clip, &bmain->movieclip) { + LINKLIST_FOREACH (MovieClip *, clip, &bmain_->movieclip) { build_movieclip(clip); } diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc index 47bf5e7ecbb..fb762505ed2 100644 --- a/source/blender/depsgraph/intern/depsgraph_build.cc +++ b/source/blender/depsgraph/intern/depsgraph_build.cc @@ -207,15 +207,15 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene) /* 1) Generate all the nodes in the graph first */ DEG::DepsgraphNodeBuilder node_builder(bmain, deg_graph); - node_builder.begin_build(bmain); - node_builder.build_scene(bmain, scene); + node_builder.begin_build(); + node_builder.build_scene(scene); /* 2) Hook up relationships between operations - to determine evaluation * order. */ - DEG::DepsgraphRelationBuilder relation_builder(deg_graph); - relation_builder.begin_build(bmain); - relation_builder.build_scene(bmain, scene); + DEG::DepsgraphRelationBuilder relation_builder(bmain, deg_graph); + relation_builder.begin_build(); + relation_builder.build_scene(scene); /* Detect and solve cycles. */ DEG::deg_graph_detect_cycles(deg_graph); -- cgit v1.2.3 From ad986ae29ec6024394e179dca57c5749b1734a36 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Nov 2017 17:47:00 +0100 Subject: Depsgraph: Remove bmain from internal builder API Use the one from state. --- .../intern/builder/deg_builder_relations.cc | 30 ++++++++++------------ .../intern/builder/deg_builder_relations.h | 6 ++--- .../intern/builder/deg_builder_relations_scene.cc | 2 +- 3 files changed, 17 insertions(+), 21 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 072783a4320..4218771b48d 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -117,7 +117,6 @@ namespace { struct BuilderWalkUserData { DepsgraphRelationBuilder *builder; - Main *bmain; Scene *scene; }; @@ -128,7 +127,7 @@ static void modifier_walk(void *user_data, { BuilderWalkUserData *data = (BuilderWalkUserData *)user_data; if (*obpoin) { - data->builder->build_object(data->bmain, data->scene, *obpoin); + data->builder->build_object(data->scene, *obpoin); } } @@ -141,7 +140,7 @@ void constraint_walk(bConstraint * /*con*/, if (*idpoin) { ID *id = *idpoin; if (GS(id->name) == ID_OB) { - data->builder->build_object(data->bmain, data->scene, (Object *)id); + data->builder->build_object(data->scene, (Object *)id); } } } @@ -391,8 +390,7 @@ void DepsgraphRelationBuilder::begin_build() FOREACH_NODETREE_END; } -void DepsgraphRelationBuilder::build_group(Main *bmain, - Scene *scene, +void DepsgraphRelationBuilder::build_group(Scene *scene, Object *object, Group *group) { @@ -403,7 +401,7 @@ void DepsgraphRelationBuilder::build_group(Main *bmain, DEG_OPCODE_TRANSFORM_LOCAL); LINKLIST_FOREACH (GroupObject *, go, &group->gobject) { if (!group_done) { - build_object(bmain, scene, go->ob); + build_object(scene, go->ob); } ComponentKey dupli_transform_key(&go->ob->id, DEG_NODE_TYPE_TRANSFORM); add_relation(dupli_transform_key, object_local_transform_key, "Dupligroup"); @@ -411,7 +409,7 @@ void DepsgraphRelationBuilder::build_group(Main *bmain, group_id->tag |= LIB_TAG_DOIT; } -void DepsgraphRelationBuilder::build_object(Main *bmain, Scene *scene, Object *ob) +void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) { if (ob->id.tag & LIB_TAG_DOIT) { return; @@ -440,14 +438,12 @@ void DepsgraphRelationBuilder::build_object(Main *bmain, Scene *scene, Object *o if (ob->modifiers.first != NULL) { BuilderWalkUserData data; data.builder = this; - data.bmain = bmain; data.scene = scene; modifiers_foreachObjectLink(ob, modifier_walk, &data); } if (ob->constraints.first != NULL) { BuilderWalkUserData data; data.builder = this; - data.bmain = bmain; data.scene = scene; BKE_constraints_id_loop(&ob->constraints, constraint_walk, &data); } @@ -515,7 +511,7 @@ void DepsgraphRelationBuilder::build_object(Main *bmain, Scene *scene, Object *o case OB_MBALL: case OB_LATTICE: { - build_obdata_geom(bmain, scene, ob); + build_obdata_geom(scene, ob); break; } @@ -558,7 +554,7 @@ void DepsgraphRelationBuilder::build_object(Main *bmain, Scene *scene, Object *o /* Object that this is a proxy for. */ if (ob->proxy != NULL) { ob->proxy->proxy_from = ob; - build_object(bmain, scene, ob->proxy); + build_object(scene, ob->proxy); /* TODO(sergey): This is an inverted relation, matches old depsgraph * behavior and need to be investigated if it still need to be inverted. */ @@ -569,7 +565,7 @@ void DepsgraphRelationBuilder::build_object(Main *bmain, Scene *scene, Object *o /* Object dupligroup. */ if (ob->dup_group != NULL) { - build_group(bmain, scene, ob, ob->dup_group); + build_group(scene, ob, ob->dup_group); } } @@ -1473,7 +1469,7 @@ void DepsgraphRelationBuilder::build_shapekeys(ID *obdata, Key *key) * re-evaluation of the individual instances of this geometry. */ // TODO: Materials and lighting should probably get their own component, instead of being lumped under geometry? -void DepsgraphRelationBuilder::build_obdata_geom(Main *bmain, Scene *scene, Object *ob) +void DepsgraphRelationBuilder::build_obdata_geom(Scene *scene, Object *ob) { ID *obdata = (ID *)ob->data; @@ -1500,7 +1496,7 @@ void DepsgraphRelationBuilder::build_obdata_geom(Main *bmain, Scene *scene, Obje DepsNodeHandle handle = create_node_handle(obdata_ubereval_key); mti->updateDepsgraph( md, - bmain, + bmain_, scene, ob, reinterpret_cast< ::DepsNodeHandle* >(&handle)); @@ -1605,18 +1601,18 @@ void DepsgraphRelationBuilder::build_obdata_geom(Main *bmain, Scene *scene, Obje // XXX: these needs geom data, but where is geom stored? if (cu->bevobj) { ComponentKey bevob_key(&cu->bevobj->id, DEG_NODE_TYPE_GEOMETRY); - build_object(bmain, scene, cu->bevobj); + build_object(scene, cu->bevobj); add_relation(bevob_key, geom_key, "Curve Bevel"); } if (cu->taperobj) { ComponentKey taperob_key(&cu->taperobj->id, DEG_NODE_TYPE_GEOMETRY); - build_object(bmain, scene, cu->taperobj); + build_object(scene, cu->taperobj); add_relation(taperob_key, geom_key, "Curve Taper"); } if (ob->type == OB_FONT) { if (cu->textoncurve) { ComponentKey textoncurve_key(&cu->textoncurve->id, DEG_NODE_TYPE_GEOMETRY); - build_object(bmain, scene, cu->textoncurve); + build_object(scene, cu->textoncurve); add_relation(textoncurve_key, geom_key, "Text on Curve"); } } diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 4b1c6fd5562..ef012cf6c9b 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -185,8 +185,8 @@ struct DepsgraphRelationBuilder const char *description); void build_scene(Scene *scene); - void build_group(Main *bmain, Scene *scene, Object *object, Group *group); - void build_object(Main *bmain, Scene *scene, Object *ob); + void build_group(Scene *scene, Object *object, Group *group); + void build_object(Scene *scene, Object *ob); void build_object_parent(Object *ob); void build_constraints(Scene *scene, ID *id, eDepsNode_Type component_type, @@ -210,7 +210,7 @@ struct DepsgraphRelationBuilder void build_rig(Scene *scene, Object *ob); void build_proxy_rig(Object *ob); void build_shapekeys(ID *obdata, Key *key); - void build_obdata_geom(Main *bmain, Scene *scene, Object *ob); + void build_obdata_geom(Scene *scene, Object *ob); void build_camera(Object *ob); void build_lamp(Object *ob); void build_nodetree(bNodeTree *ntree); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc index d5a8ead10dc..cebb7c79bfc 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc @@ -76,7 +76,7 @@ void DepsgraphRelationBuilder::build_scene(Scene *scene) /* scene objects */ LINKLIST_FOREACH (Base *, base, &scene->base) { Object *ob = base->object; - build_object(bmain_, scene, ob); + build_object(scene, ob); } /* rigidbody */ -- cgit v1.2.3 From f424d5b5c9da1e8ce79ce34e5854e8d90ffe2460 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 8 Nov 2017 18:06:51 +0100 Subject: Depsgraph: Cleanup, remove scene being passed all over Use the state one instead. --- .../depsgraph/intern/builder/deg_builder_nodes.cc | 72 +++++++++++----------- .../depsgraph/intern/builder/deg_builder_nodes.h | 28 +++++---- .../intern/builder/deg_builder_nodes_rig.cc | 28 ++++----- .../intern/builder/deg_builder_nodes_scene.cc | 4 +- .../intern/builder/deg_builder_relations.cc | 3 +- .../intern/builder/deg_builder_relations.h | 4 ++ 6 files changed, 73 insertions(+), 66 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 89a2dba87c8..fdbd4100640 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -117,7 +117,6 @@ namespace { struct BuilderWalkUserData { DepsgraphNodeBuilder *builder; - Scene *scene; }; static void modifier_walk(void *user_data, @@ -127,7 +126,7 @@ static void modifier_walk(void *user_data, { BuilderWalkUserData *data = (BuilderWalkUserData *)user_data; if (*obpoin) { - data->builder->build_object(data->scene, NULL, *obpoin); + data->builder->build_object(NULL, *obpoin); } } @@ -140,7 +139,7 @@ void constraint_walk(bConstraint * /*con*/, if (*idpoin) { ID *id = *idpoin; if (GS(id->name) == ID_OB) { - data->builder->build_object(data->scene, NULL, (Object *)id); + data->builder->build_object(NULL, (Object *)id); } } } @@ -154,7 +153,8 @@ void constraint_walk(bConstraint * /*con*/, DepsgraphNodeBuilder::DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph) : bmain_(bmain), - graph_(graph) + graph_(graph), + scene_(NULL) { } @@ -296,9 +296,7 @@ void DepsgraphNodeBuilder::begin_build() { FOREACH_NODETREE_END; } -void DepsgraphNodeBuilder::build_group(Scene *scene, - Base *base, - Group *group) +void DepsgraphNodeBuilder::build_group(Base *base, Group *group) { ID *group_id = &group->id; if (group_id->tag & LIB_TAG_DOIT) { @@ -307,11 +305,11 @@ void DepsgraphNodeBuilder::build_group(Scene *scene, group_id->tag |= LIB_TAG_DOIT; LINKLIST_FOREACH (GroupObject *, go, &group->gobject) { - build_object(scene, base, go->ob); + build_object(base, go->ob); } } -void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob) +void DepsgraphNodeBuilder::build_object(Base *base, Object *ob) { const bool has_object = (ob->id.tag & LIB_TAG_DOIT); IDDepsNode *id_node = (has_object) @@ -339,21 +337,19 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob) ob->customdata_mask = 0; /* Standard components. */ - build_object_transform(scene, ob); + build_object_transform(ob); if (ob->parent != NULL) { - build_object(scene, NULL, ob->parent); + build_object(NULL, ob->parent); } if (ob->modifiers.first != NULL) { BuilderWalkUserData data; data.builder = this; - data.scene = scene; modifiers_foreachObjectLink(ob, modifier_walk, &data); } if (ob->constraints.first != NULL) { BuilderWalkUserData data; data.builder = this; - data.scene = scene; BKE_constraints_id_loop(&ob->constraints, constraint_walk, &data); } @@ -367,7 +363,7 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob) case OB_SURF: case OB_MBALL: case OB_LATTICE: - build_obdata_geom(scene, ob); + build_obdata_geom(ob); /* TODO(sergey): Only for until we support granular * update of curves. */ @@ -384,7 +380,7 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob) build_proxy_rig(ob); } else { - build_rig(scene, ob); + build_rig(ob); } break; @@ -417,7 +413,7 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob) /* particle systems */ if (ob->particlesystem.first != NULL) { - build_particles(scene, ob); + build_particles(ob); } /* Grease pencil. */ @@ -428,35 +424,35 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Base *base, Object *ob) /* Object that this is a proxy for. */ if (ob->proxy) { ob->proxy->proxy_from = ob; - build_object(scene, base, ob->proxy); + build_object(base, ob->proxy); } /* Object dupligroup. */ if (ob->dup_group != NULL) { - build_group(scene, base, ob->dup_group); + build_group(base, ob->dup_group); } } -void DepsgraphNodeBuilder::build_object_transform(Scene *scene, Object *ob) +void DepsgraphNodeBuilder::build_object_transform(Object *ob) { OperationDepsNode *op_node; /* local transforms (from transform channels - loc/rot/scale + deltas) */ op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM, - function_bind(BKE_object_eval_local_transform, _1, scene, ob), + function_bind(BKE_object_eval_local_transform, _1, scene_, ob), DEG_OPCODE_TRANSFORM_LOCAL); op_node->set_as_entry(); /* object parent */ if (ob->parent) { add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM, - function_bind(BKE_object_eval_parent, _1, scene, ob), + function_bind(BKE_object_eval_parent, _1, scene_, ob), DEG_OPCODE_TRANSFORM_PARENT); } /* object constraints */ if (ob->constraints.first) { - build_object_constraints(scene, ob); + build_object_constraints(ob); } /* Temporary uber-update node, which does everything. @@ -467,7 +463,7 @@ void DepsgraphNodeBuilder::build_object_transform(Scene *scene, Object *ob) * TODO(sergey): Get rid of this node. */ add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM, - function_bind(BKE_object_eval_uber_transform, _1, scene, ob), + function_bind(BKE_object_eval_uber_transform, _1, scene_, ob), DEG_OPCODE_TRANSFORM_OBJECT_UBEREVAL); /* object transform is done */ @@ -494,11 +490,11 @@ void DepsgraphNodeBuilder::build_object_transform(Scene *scene, Object *ob) * * -- Aligorith, August 2013 */ -void DepsgraphNodeBuilder::build_object_constraints(Scene *scene, Object *ob) +void DepsgraphNodeBuilder::build_object_constraints(Object *ob) { /* create node for constraint stack */ add_operation_node(&ob->id, DEG_NODE_TYPE_TRANSFORM, - function_bind(BKE_object_eval_constraints, _1, scene, ob), + function_bind(BKE_object_eval_constraints, _1, scene_, ob), DEG_OPCODE_TRANSFORM_CONSTRAINTS); } @@ -650,7 +646,7 @@ void DepsgraphNodeBuilder::build_rigidbody(Scene *scene) } } -void DepsgraphNodeBuilder::build_particles(Scene *scene, Object *ob) +void DepsgraphNodeBuilder::build_particles(Object *ob) { /** * Particle Systems Nodes @@ -674,7 +670,7 @@ void DepsgraphNodeBuilder::build_particles(Scene *scene, Object *ob) add_operation_node(psys_comp, function_bind(BKE_particle_system_eval_init, _1, - scene, + scene_, ob), DEG_OPCODE_PARTICLE_SYSTEM_EVAL_INIT); @@ -698,13 +694,13 @@ void DepsgraphNodeBuilder::build_particles(Scene *scene, Object *ob) // TODO... } -void DepsgraphNodeBuilder::build_cloth(Scene *scene, Object *object) +void DepsgraphNodeBuilder::build_cloth(Object *object) { add_operation_node(&object->id, DEG_NODE_TYPE_CACHE, function_bind(BKE_object_eval_cloth, _1, - scene, + scene_, object), DEG_OPCODE_GEOMETRY_CLOTH_MODIFIER); } @@ -721,7 +717,7 @@ void DepsgraphNodeBuilder::build_shapekeys(Key *key) /* ObData Geometry Evaluation */ // XXX: what happens if the datablock is shared! -void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob) +void DepsgraphNodeBuilder::build_obdata_geom(Object *ob) { ID *obdata = (ID *)ob->data; OperationDepsNode *op_node; @@ -746,7 +742,10 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob) */ op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_GEOMETRY, - function_bind(BKE_object_eval_uber_data, _1, scene, ob), + function_bind(BKE_object_eval_uber_data, + _1, + scene_, + ob), DEG_OPCODE_GEOMETRY_UBEREVAL); op_node->set_as_exit(); @@ -762,7 +761,7 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob) /* Cloyth modifier. */ LINKLIST_FOREACH (ModifierData *, md, &ob->modifiers) { if (md->type == eModifierType_Cloth) { - build_cloth(scene, ob); + build_cloth(ob); } } @@ -813,8 +812,7 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob) case OB_MBALL: { - Object *mom = BKE_mball_basis_find(scene, ob); - + Object *mom = BKE_mball_basis_find(scene_, ob); /* Motherball - mom depends on children! */ if (mom == ob) { /* metaball evaluation operations */ @@ -851,13 +849,13 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob) */ Curve *cu = (Curve *)obdata; if (cu->bevobj != NULL) { - build_object(scene, NULL, cu->bevobj); + build_object(NULL, cu->bevobj); } if (cu->taperobj != NULL) { - build_object(scene, NULL, cu->taperobj); + build_object(NULL, cu->taperobj); } if (ob->type == OB_FONT && cu->textoncurve != NULL) { - build_object(scene, NULL, cu->textoncurve); + build_object(NULL, cu->textoncurve); } break; } diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index db57b2921ea..ec9fe6a40a2 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -119,28 +119,26 @@ struct DepsgraphNodeBuilder { int name_tag = -1); void build_scene(Scene *scene); - void build_group(Scene *scene, Base *base, Group *group); - void build_object(Scene *scene, Base *base, Object *ob); - void build_object_transform(Scene *scene, Object *ob); - void build_object_constraints(Scene *scene, Object *ob); - void build_pose_constraints(Scene *scene, Object *ob, bPoseChannel *pchan); + void build_group(Base *base, Group *group); + void build_object(Base *base, Object *ob); + void build_object_transform(Object *ob); + void build_object_constraints(Object *ob); + void build_pose_constraints(Object *ob, bPoseChannel *pchan); void build_rigidbody(Scene *scene); - void build_particles(Scene *scene, Object *ob); - void build_cloth(Scene *scene, Object *object); + void build_particles(Object *ob); + void build_cloth(Object *object); void build_animdata(ID *id); OperationDepsNode *build_driver(ID *id, FCurve *fcurve); - void build_ik_pose(Scene *scene, - Object *ob, + void build_ik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con); - void build_splineik_pose(Scene *scene, - Object *ob, + void build_splineik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con); - void build_rig(Scene *scene, Object *ob); + void build_rig(Object *ob); void build_proxy_rig(Object *ob); void build_shapekeys(Key *key); - void build_obdata_geom(Scene *scene, Object *ob); + void build_obdata_geom(Object *ob); void build_camera(Object *ob); void build_lamp(Object *ob); void build_nodetree(bNodeTree *ntree); @@ -156,8 +154,12 @@ struct DepsgraphNodeBuilder { void build_movieclip(MovieClip *clip); protected: + /* State which never changes, same for the whole builder time. */ Main *bmain_; Depsgraph *graph_; + + /* State which demotes currently built entities. */ + Scene *scene_; }; } // namespace DEG diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc index f99be191529..a1f20b1c683 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc @@ -64,16 +64,16 @@ extern "C" { namespace DEG { -void DepsgraphNodeBuilder::build_pose_constraints(Scene *scene, Object *ob, bPoseChannel *pchan) +void DepsgraphNodeBuilder::build_pose_constraints(Object *ob, bPoseChannel *pchan) { /* create node for constraint stack */ add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, - function_bind(BKE_pose_constraints_evaluate, _1, scene, ob, pchan), + function_bind(BKE_pose_constraints_evaluate, _1, scene_, ob, pchan), DEG_OPCODE_BONE_CONSTRAINTS); } /* IK Solver Eval Steps */ -void DepsgraphNodeBuilder::build_ik_pose(Scene *scene, Object *ob, bPoseChannel *pchan, bConstraint *con) +void DepsgraphNodeBuilder::build_ik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con) { bKinematicConstraint *data = (bKinematicConstraint *)con->data; @@ -91,12 +91,12 @@ void DepsgraphNodeBuilder::build_ik_pose(Scene *scene, Object *ob, bPoseChannel /* Operation node for evaluating/running IK Solver. */ add_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name, - function_bind(BKE_pose_iktree_evaluate, _1, scene, ob, rootchan), + function_bind(BKE_pose_iktree_evaluate, _1, scene_, ob, rootchan), DEG_OPCODE_POSE_IK_SOLVER); } /* Spline IK Eval Steps */ -void DepsgraphNodeBuilder::build_splineik_pose(Scene *scene, Object *ob, bPoseChannel *pchan, bConstraint *con) +void DepsgraphNodeBuilder::build_splineik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con) { bSplineIKConstraint *data = (bSplineIKConstraint *)con->data; @@ -107,12 +107,12 @@ void DepsgraphNodeBuilder::build_splineik_pose(Scene *scene, Object *ob, bPoseCh * Store the "root bone" of this chain in the solver, so it knows where to start. */ add_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE, rootchan->name, - function_bind(BKE_pose_splineik_evaluate, _1, scene, ob, rootchan), + function_bind(BKE_pose_splineik_evaluate, _1, scene_, ob, rootchan), DEG_OPCODE_POSE_SPLINE_IK_SOLVER); } /* Pose/Armature Bones Graph */ -void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob) +void DepsgraphNodeBuilder::build_rig(Object *ob) { bArmature *arm = (bArmature *)ob->data; OperationDepsNode *op_node; @@ -179,18 +179,18 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob) /* pose eval context */ op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE, - function_bind(BKE_pose_eval_init, _1, scene, ob, ob->pose), + function_bind(BKE_pose_eval_init, _1, scene_, ob, ob->pose), DEG_OPCODE_POSE_INIT); op_node->set_as_entry(); op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE, - function_bind(BKE_pose_eval_init_ik, _1, scene, ob, ob->pose), + function_bind(BKE_pose_eval_init_ik, _1, scene_, ob, ob->pose), DEG_OPCODE_POSE_INIT_IK); op_node = add_operation_node(&ob->id, DEG_NODE_TYPE_EVAL_POSE, - function_bind(BKE_pose_eval_flush, _1, scene, ob, ob->pose), + function_bind(BKE_pose_eval_flush, _1, scene_, ob, ob->pose), DEG_OPCODE_POSE_DONE); op_node->set_as_exit(); @@ -202,7 +202,7 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob) op_node->set_as_entry(); add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, - function_bind(BKE_pose_eval_bone, _1, scene, ob, pchan), + function_bind(BKE_pose_eval_bone, _1, scene_, ob, pchan), DEG_OPCODE_BONE_POSE_PARENT); add_operation_node(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, @@ -216,7 +216,7 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob) /* constraints */ if (pchan->constraints.first != NULL) { - build_pose_constraints(scene, ob, pchan); + build_pose_constraints(ob, pchan); } /** @@ -233,11 +233,11 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *ob) LINKLIST_FOREACH (bConstraint *, con, &pchan->constraints) { switch (con->type) { case CONSTRAINT_TYPE_KINEMATIC: - build_ik_pose(scene, ob, pchan, con); + build_ik_pose(ob, pchan, con); break; case CONSTRAINT_TYPE_SPLINEIK: - build_splineik_pose(scene, ob, pchan, con); + build_splineik_pose(ob, pchan, con); break; default: diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc index 4d048d30d55..8a3c1c6727f 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc @@ -78,10 +78,12 @@ void DepsgraphNodeBuilder::build_scene(Scene *scene) build_scene(scene->set); } + scene_ = scene; + /* scene objects */ LINKLIST_FOREACH (Base *, base, &scene->base) { Object *ob = base->object; - build_object(scene, base, ob); + build_object(base, ob); } /* rigidbody */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 4218771b48d..6a7906717d5 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -195,7 +195,8 @@ RNAPathKey::RNAPathKey(ID *id, const char *path) : DepsgraphRelationBuilder::DepsgraphRelationBuilder(Main *bmain, Depsgraph *graph) : bmain_(bmain), - graph_(graph) + graph_(graph), + scene_(NULL) { } diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index ef012cf6c9b..c14cbc3a309 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -252,8 +252,12 @@ protected: bool needs_animdata_node(ID *id); private: + /* State which never changes, same for the whole builder time. */ Main *bmain_; Depsgraph *graph_; + + /* State which demotes currently built entities. */ + Scene *scene_; }; struct DepsNodeHandle -- cgit v1.2.3 From 5e38ee996cd0ca18d651d87573a1dfe61e893a13 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 9 Nov 2017 09:17:47 +0100 Subject: Depsgraph: Remove chains of scene being passed all over in relations builder --- .../intern/builder/deg_builder_nodes_scene.cc | 1 + .../intern/builder/deg_builder_relations.cc | 62 +++++++++------------- .../intern/builder/deg_builder_relations.h | 30 +++++++---- .../intern/builder/deg_builder_relations_rig.cc | 4 +- .../intern/builder/deg_builder_relations_scene.cc | 5 +- 5 files changed, 54 insertions(+), 48 deletions(-) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc index 8a3c1c6727f..1ea44093cd7 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc @@ -78,6 +78,7 @@ void DepsgraphNodeBuilder::build_scene(Scene *scene) build_scene(scene->set); } + /* Setup currently building context. */ scene_ = scene; /* scene objects */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 6a7906717d5..883a756eef1 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -117,7 +117,6 @@ namespace { struct BuilderWalkUserData { DepsgraphRelationBuilder *builder; - Scene *scene; }; static void modifier_walk(void *user_data, @@ -127,7 +126,7 @@ static void modifier_walk(void *user_data, { BuilderWalkUserData *data = (BuilderWalkUserData *)user_data; if (*obpoin) { - data->builder->build_object(data->scene, *obpoin); + data->builder->build_object(*obpoin); } } @@ -140,7 +139,7 @@ void constraint_walk(bConstraint * /*con*/, if (*idpoin) { ID *id = *idpoin; if (GS(id->name) == ID_OB) { - data->builder->build_object(data->scene, (Object *)id); + data->builder->build_object((Object *)id); } } } @@ -391,9 +390,7 @@ void DepsgraphRelationBuilder::begin_build() FOREACH_NODETREE_END; } -void DepsgraphRelationBuilder::build_group(Scene *scene, - Object *object, - Group *group) +void DepsgraphRelationBuilder::build_group(Object *object, Group *group) { ID *group_id = &group->id; bool group_done = (group_id->tag & LIB_TAG_DOIT) != 0; @@ -402,7 +399,7 @@ void DepsgraphRelationBuilder::build_group(Scene *scene, DEG_OPCODE_TRANSFORM_LOCAL); LINKLIST_FOREACH (GroupObject *, go, &group->gobject) { if (!group_done) { - build_object(scene, go->ob); + build_object(go->ob); } ComponentKey dupli_transform_key(&go->ob->id, DEG_NODE_TYPE_TRANSFORM); add_relation(dupli_transform_key, object_local_transform_key, "Dupligroup"); @@ -410,7 +407,7 @@ void DepsgraphRelationBuilder::build_group(Scene *scene, group_id->tag |= LIB_TAG_DOIT; } -void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) +void DepsgraphRelationBuilder::build_object(Object *ob) { if (ob->id.tag & LIB_TAG_DOIT) { return; @@ -439,13 +436,11 @@ void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) if (ob->modifiers.first != NULL) { BuilderWalkUserData data; data.builder = this; - data.scene = scene; modifiers_foreachObjectLink(ob, modifier_walk, &data); } if (ob->constraints.first != NULL) { BuilderWalkUserData data; data.builder = this; - data.scene = scene; BKE_constraints_id_loop(&ob->constraints, constraint_walk, &data); } @@ -456,10 +451,7 @@ void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) DEG_OPCODE_TRANSFORM_CONSTRAINTS); /* constraint relations */ - // TODO: provide base op - // XXX: this is broken - build_constraints(scene, - &ob->id, + build_constraints(&ob->id, DEG_NODE_TYPE_TRANSFORM, "", &ob->constraints, @@ -512,7 +504,7 @@ void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) case OB_MBALL: case OB_LATTICE: { - build_obdata_geom(scene, ob); + build_obdata_geom(ob); break; } @@ -521,7 +513,7 @@ void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) build_proxy_rig(ob); } else { - build_rig(scene, ob); + build_rig(ob); } break; @@ -544,7 +536,7 @@ void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) /* Particle systems. */ if (ob->particlesystem.first != NULL) { - build_particles(scene, ob); + build_particles(ob); } /* Grease pencil. */ @@ -555,7 +547,7 @@ void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) /* Object that this is a proxy for. */ if (ob->proxy != NULL) { ob->proxy->proxy_from = ob; - build_object(scene, ob->proxy); + build_object(ob->proxy); /* TODO(sergey): This is an inverted relation, matches old depsgraph * behavior and need to be investigated if it still need to be inverted. */ @@ -566,7 +558,7 @@ void DepsgraphRelationBuilder::build_object(Scene *scene, Object *ob) /* Object dupligroup. */ if (ob->dup_group != NULL) { - build_group(scene, ob, ob->dup_group); + build_group(ob, ob->dup_group); } } @@ -662,7 +654,7 @@ void DepsgraphRelationBuilder::build_object_parent(Object *ob) } } -void DepsgraphRelationBuilder::build_constraints(Scene *scene, ID *id, +void DepsgraphRelationBuilder::build_constraints(ID *id, eDepsNode_Type component_type, const char *component_subdata, ListBase *constraints, @@ -713,8 +705,8 @@ void DepsgraphRelationBuilder::build_constraints(Scene *scene, ID *id, else if (cti->type == CONSTRAINT_TYPE_OBJECTSOLVER) { depends_on_camera = true; } - if (depends_on_camera && scene->camera) { - ComponentKey camera_key(&scene->camera->id, DEG_NODE_TYPE_TRANSFORM); + if (depends_on_camera && scene_->camera != NULL) { + ComponentKey camera_key(&scene_->camera->id, DEG_NODE_TYPE_TRANSFORM); add_relation(camera_key, constraint_op_key, cti->name); } /* TODO(sergey): This is more a TimeSource -> MovieClip -> @@ -1328,7 +1320,7 @@ void DepsgraphRelationBuilder::build_rigidbody(Scene *scene) } } -void DepsgraphRelationBuilder::build_particles(Scene *scene, Object *ob) +void DepsgraphRelationBuilder::build_particles(Object *ob) { TimeSourceKey time_src_key; OperationKey obdata_ubereval_key(&ob->id, @@ -1366,14 +1358,14 @@ void DepsgraphRelationBuilder::build_particles(Scene *scene, Object *ob) /* collisions */ if (part->type != PART_HAIR) { - add_collision_relations(psys_key, scene, ob, part->collision_group, ob->lay, true, "Particle Collision"); + add_collision_relations(psys_key, scene_, ob, part->collision_group, ob->lay, true, "Particle Collision"); } else if ((psys->flag & PSYS_HAIR_DYNAMICS) && psys->clmd && psys->clmd->coll_parms) { - add_collision_relations(psys_key, scene, ob, psys->clmd->coll_parms->group, ob->lay | scene->lay, true, "Hair Collision"); + add_collision_relations(psys_key, scene_, ob, psys->clmd->coll_parms->group, ob->lay | scene_->lay, true, "Hair Collision"); } /* effectors */ - add_forcefield_relations(psys_key, scene, ob, psys, part->effector_weights, part->type == PART_HAIR, "Particle Field"); + add_forcefield_relations(psys_key, scene_, ob, psys, part->effector_weights, part->type == PART_HAIR, "Particle Field"); /* boids */ if (part->boids) { @@ -1412,8 +1404,7 @@ void DepsgraphRelationBuilder::build_particles(Scene *scene, Object *ob) // TODO... } -void DepsgraphRelationBuilder::build_cloth(Scene * /*scene*/, - Object *object, +void DepsgraphRelationBuilder::build_cloth(Object *object, ModifierData * /*md*/) { OperationKey cache_key(&object->id, @@ -1470,7 +1461,7 @@ void DepsgraphRelationBuilder::build_shapekeys(ID *obdata, Key *key) * re-evaluation of the individual instances of this geometry. */ // TODO: Materials and lighting should probably get their own component, instead of being lumped under geometry? -void DepsgraphRelationBuilder::build_obdata_geom(Scene *scene, Object *ob) +void DepsgraphRelationBuilder::build_obdata_geom(Object *ob) { ID *obdata = (ID *)ob->data; @@ -1498,7 +1489,7 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene *scene, Object *ob) mti->updateDepsgraph( md, bmain_, - scene, + scene_, ob, reinterpret_cast< ::DepsNodeHandle* >(&handle)); } @@ -1520,7 +1511,7 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene *scene, Object *ob) } if (md->type == eModifierType_Cloth) { - build_cloth(scene, ob, md); + build_cloth(ob, md); } } } @@ -1580,8 +1571,7 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene *scene, Object *ob) case OB_MBALL: { - Object *mom = BKE_mball_basis_find(scene, ob); - + Object *mom = BKE_mball_basis_find(scene_, ob); /* motherball - mom depends on children! */ if (mom != ob) { /* non-motherball -> cannot be directly evaluated! */ @@ -1602,18 +1592,18 @@ void DepsgraphRelationBuilder::build_obdata_geom(Scene *scene, Object *ob) // XXX: these needs geom data, but where is geom stored? if (cu->bevobj) { ComponentKey bevob_key(&cu->bevobj->id, DEG_NODE_TYPE_GEOMETRY); - build_object(scene, cu->bevobj); + build_object(cu->bevobj); add_relation(bevob_key, geom_key, "Curve Bevel"); } if (cu->taperobj) { ComponentKey taperob_key(&cu->taperobj->id, DEG_NODE_TYPE_GEOMETRY); - build_object(scene, cu->taperobj); + build_object(cu->taperobj); add_relation(taperob_key, geom_key, "Curve Taper"); } if (ob->type == OB_FONT) { if (cu->textoncurve) { ComponentKey textoncurve_key(&cu->textoncurve->id, DEG_NODE_TYPE_GEOMETRY); - build_object(scene, cu->textoncurve); + build_object(cu->textoncurve); add_relation(textoncurve_key, geom_key, "Text on Curve"); } } diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index c14cbc3a309..86227f4aaf8 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -185,10 +185,10 @@ struct DepsgraphRelationBuilder const char *description); void build_scene(Scene *scene); - void build_group(Scene *scene, Object *object, Group *group); - void build_object(Scene *scene, Object *ob); + void build_group(Object *object, Group *group); + void build_object(Object *ob); void build_object_parent(Object *ob); - void build_constraints(Scene *scene, ID *id, + void build_constraints(ID *id, eDepsNode_Type component_type, const char *component_subdata, ListBase *constraints, @@ -197,8 +197,8 @@ struct DepsgraphRelationBuilder void build_driver(ID *id, FCurve *fcurve); void build_world(World *world); void build_rigidbody(Scene *scene); - void build_particles(Scene *scene, Object *ob); - void build_cloth(Scene *scene, Object *object, ModifierData *md); + void build_particles(Object *ob); + void build_cloth(Object *object, ModifierData *md); void build_ik_pose(Object *ob, bPoseChannel *pchan, bConstraint *con, @@ -207,10 +207,10 @@ struct DepsgraphRelationBuilder bPoseChannel *pchan, bConstraint *con, RootPChanMap *root_map); - void build_rig(Scene *scene, Object *ob); + void build_rig(Object *ob); void build_proxy_rig(Object *ob); void build_shapekeys(ID *obdata, Key *key); - void build_obdata_geom(Scene *scene, Object *ob); + void build_obdata_geom(Object *ob); void build_camera(Object *ob); void build_lamp(Object *ob); void build_nodetree(bNodeTree *ntree); @@ -223,8 +223,20 @@ struct DepsgraphRelationBuilder void build_mask(Mask *mask); void build_movieclip(MovieClip *clip); - void add_collision_relations(const OperationKey &key, Scene *scene, Object *ob, Group *group, int layer, bool dupli, const char *name); - void add_forcefield_relations(const OperationKey &key, Scene *scene, Object *ob, ParticleSystem *psys, EffectorWeights *eff, bool add_absorption, const char *name); + void add_collision_relations(const OperationKey &key, + Scene *scene, + Object *ob, + Group *group, + int layer, + bool dupli, + const char *name); + void add_forcefield_relations(const OperationKey &key, + Scene *scene, + Object *ob, + ParticleSystem *psys, + EffectorWeights *eff, + bool add_absorption, + const char *name); template OperationDepsNode *find_operation_node(const KeyType &key); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc index bde3c0fae10..6ff21393ed6 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc @@ -302,7 +302,7 @@ void DepsgraphRelationBuilder::build_splineik_pose(Object *ob, } /* Pose/Armature Bones Graph */ -void DepsgraphRelationBuilder::build_rig(Scene *scene, Object *ob) +void DepsgraphRelationBuilder::build_rig(Object *ob) { /* Armature-Data */ bArmature *arm = (bArmature *)ob->data; @@ -420,7 +420,7 @@ void DepsgraphRelationBuilder::build_rig(Scene *scene, Object *ob) /* constraints */ if (pchan->constraints.first != NULL) { /* constraints stack and constraint dependencies */ - build_constraints(scene, &ob->id, DEG_NODE_TYPE_BONE, pchan->name, &pchan->constraints, &root_map); + build_constraints(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, &pchan->constraints, &root_map); /* pose -> constraints */ OperationKey constraints_key(&ob->id, DEG_NODE_TYPE_BONE, pchan->name, DEG_OPCODE_BONE_CONSTRAINTS); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc index cebb7c79bfc..bedcb5aa223 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc @@ -73,10 +73,13 @@ void DepsgraphRelationBuilder::build_scene(Scene *scene) build_scene(scene->set); } + /* Setup currently building context. */ + scene_ = scene; + /* scene objects */ LINKLIST_FOREACH (Base *, base, &scene->base) { Object *ob = base->object; - build_object(scene, ob); + build_object(ob); } /* rigidbody */ -- cgit v1.2.3 From 8d7ec519dff93b04fdec548aeef4b90137d788c8 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 9 Nov 2017 09:46:50 +0100 Subject: Depsgraph: Add missing handlers of node IDs Worst thing was that point density did not pull object into dependency graph, which could lead to wrong render results. --- source/blender/depsgraph/intern/builder/deg_builder_nodes.cc | 8 ++++++++ source/blender/depsgraph/intern/builder/deg_builder_relations.cc | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index fdbd4100640..7ac94141f39 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -970,6 +970,14 @@ void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree) else if (id_type == ID_IM) { build_image((Image *)id); } + else if (id_type == ID_OB) { + build_object(NULL, (Object *)id); + } + else if (id_type == ID_SCE) { + /* Scenes are used by compositor trees, and handled by render + * pipeline. No need to build dependencies for them here. + */ + } else if (bnode->type == NODE_GROUP) { bNodeTree *group_ntree = (bNodeTree *)id; if ((group_ntree->id.tag & LIB_TAG_DOIT) == 0) { diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 883a756eef1..3448525a50d 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -1721,6 +1721,14 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree *ntree) else if (id_type == ID_IM) { /* nothing for now. */ } + else if (id_type == ID_OB) { + build_object((Object *)id); + } + else if (id_type == ID_SCE) { + /* Scenes are used by compositor trees, and handled by render + * pipeline. No need to build dependencies for them here. + */ + } else if (bnode->type == NODE_GROUP) { bNodeTree *group_ntree = (bNodeTree *)id; if ((group_ntree->id.tag & LIB_TAG_DOIT) == 0) { -- cgit v1.2.3