[Bf-blender-cvs] [e2161ca] master: Cycles: Remove few function arguments needed only for the split kernel

Sergey Sharybin noreply at git.blender.org
Thu Jan 28 19:00:56 CET 2016


Commit: e2161ca854da03bae8c17c7cfac6dbcd9d62f33b
Author: Sergey Sharybin
Date:   Thu Jan 14 19:58:22 2016 +0500
Branches: master
https://developer.blender.org/rBe2161ca854da03bae8c17c7cfac6dbcd9d62f33b

Cycles: Remove few function arguments needed only for the split kernel

Use KernelGlobals to access all the global arrays for the intermediate
storage instead of passing all this storage things explicitly.

Tested here with Intel OpenCL, NVIDIA GTX580 and AMD Fiji, didn't see
any artifacts, so guess it's all good.

Reviewers: juicyfruit, dingto, lukasstockner97

Differential Revision: https://developer.blender.org/D1736

===================================================================

M	intern/cycles/device/device_opencl.cpp
M	intern/cycles/kernel/kernel_emission.h
M	intern/cycles/kernel/kernel_globals.h
M	intern/cycles/kernel/kernel_shadow.h
M	intern/cycles/kernel/kernels/opencl/kernel_background_buffer_update.cl
M	intern/cycles/kernel/kernels/opencl/kernel_data_init.cl
M	intern/cycles/kernel/kernels/opencl/kernel_direct_lighting.cl
M	intern/cycles/kernel/kernels/opencl/kernel_lamp_emission.cl
M	intern/cycles/kernel/kernels/opencl/kernel_shadow_blocked.cl
M	intern/cycles/kernel/split/kernel_background_buffer_update.h
M	intern/cycles/kernel/split/kernel_data_init.h
M	intern/cycles/kernel/split/kernel_direct_lighting.h
M	intern/cycles/kernel/split/kernel_lamp_emission.h
M	intern/cycles/kernel/split/kernel_shadow_blocked.h

===================================================================

diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp
index 6c7f5b4..4eeec40 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -1968,8 +1968,7 @@ public:
 	cl_mem AOAlpha_coop;
 	cl_mem AOBSDF_coop;
 	cl_mem AOLightRay_coop;
-	cl_mem Intersection_coop_AO;
-	cl_mem Intersection_coop_DL;
+	cl_mem Intersection_coop_shadow;
 
 #ifdef WITH_CYCLES_DEBUG
 	/* DebugData memory */
@@ -2133,8 +2132,7 @@ public:
 		BSDFEval_coop = NULL;
 		ISLamp_coop = NULL;
 		LightRay_coop = NULL;
-		Intersection_coop_AO = NULL;
-		Intersection_coop_DL = NULL;
+		Intersection_coop_shadow = NULL;
 
 #ifdef WITH_CYCLES_DEBUG
 		debugdata_coop = NULL;
@@ -2259,6 +2257,8 @@ public:
 	ccl_global type *name;
 #include "kernel_textures.h"
 #undef KERNEL_TEX
+			void *sd_input;
+			void *isect_shadow;
 		} KernelGlobals;
 
 		return sizeof(KernelGlobals);
@@ -2475,8 +2475,7 @@ public:
 		release_mem_object_safe(BSDFEval_coop);
 		release_mem_object_safe(ISLamp_coop);
 		release_mem_object_safe(LightRay_coop);
-		release_mem_object_safe(Intersection_coop_AO);
-		release_mem_object_safe(Intersection_coop_DL);
+		release_mem_object_safe(Intersection_coop_shadow);
 #ifdef WITH_CYCLES_DEBUG
 		release_mem_object_safe(debugdata_coop);
 #endif
@@ -2672,8 +2671,7 @@ public:
 			BSDFEval_coop = mem_alloc(num_global_elements * sizeof(BsdfEval));
 			ISLamp_coop = mem_alloc(num_global_elements * sizeof(int));
 			LightRay_coop = mem_alloc(num_global_elements * sizeof(Ray));
-			Intersection_coop_AO = mem_alloc(num_global_elements * sizeof(Intersection));
-			Intersection_coop_DL = mem_alloc(num_global_elements * sizeof(Intersection));
+			Intersection_coop_shadow = mem_alloc(2 * num_global_elements * sizeof(Intersection));
 
 #ifdef WITH_CYCLES_DEBUG
 			debugdata_coop = mem_alloc(num_global_elements * sizeof(DebugData));
@@ -2779,6 +2777,7 @@ public:
 			                PathRadiance_coop,
 			                Ray_coop,
 			                PathState_coop,
+			                Intersection_coop_shadow,
 			                ray_state);
 
 /* TODO(sergey): Avoid map lookup here. */
@@ -2838,7 +2837,6 @@ public:
 		                0,
 		                kgbuffer,
 		                d_data,
-		                sd,
 		                throughput_coop,
 		                PathRadiance_coop,
 		                Ray_coop,
@@ -2864,7 +2862,6 @@ public:
 		                 0,
 		                 kgbuffer,
 		                 d_data,
-		                 sd,
 		                 per_sample_output_buffers,
 		                 d_rng_state,
 		                 rng_coop,
@@ -2946,7 +2943,6 @@ public:
 		                kgbuffer,
 		                d_data,
 		                sd,
-		                sd_DL_shadow,
 		                rng_coop,
 		                PathState_coop,
 		                ISLamp_coop,
@@ -2965,8 +2961,6 @@ public:
 		                PathState_coop,
 		                LightRay_coop,
 		                AOLightRay_coop,
-		                Intersection_coop_AO,
-		                Intersection_coop_DL,
 		                ray_state,
 		                Queue_data,
 		                Queue_index,
diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h
index 47d3572..4e662f5 100644
--- a/intern/cycles/kernel/kernel_emission.h
+++ b/intern/cycles/kernel/kernel_emission.h
@@ -18,15 +18,16 @@ CCL_NAMESPACE_BEGIN
 
 /* Direction Emission */
 ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
-	LightSample *ls, ccl_addr_space PathState *state, float3 I, differential3 dI, float t, float time
-#ifdef __SPLIT_KERNEL__
-	,ShaderData *sd_input
-#endif
-)
+                                                LightSample *ls,
+                                                ccl_addr_space PathState *state,
+                                                float3 I,
+                                                differential3 dI,
+                                                float t,
+                                                float time)
 {
 	/* setup shading at emitter */
 #ifdef __SPLIT_KERNEL__
-	ShaderData *sd = sd_input;
+	ShaderData *sd = kg->sd_input;
 #else
 	ShaderData sd_object;
 	ShaderData *sd = &sd_object;
@@ -76,12 +77,13 @@ ccl_device_noinline float3 direct_emissive_eval(KernelGlobals *kg,
 	return eval;
 }
 
-ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd,
-	LightSample *ls, ccl_addr_space PathState *state, Ray *ray, BsdfEval *eval, bool *is_lamp
-#ifdef __SPLIT_KERNEL__
-	, ShaderData *sd_DL
-#endif
-	)
+ccl_device_noinline bool direct_emission(KernelGlobals *kg,
+                                         ShaderData *sd,
+                                         LightSample *ls,
+                                         ccl_addr_space PathState *state,
+                                         Ray *ray,
+                                         BsdfEval *eval,
+                                         bool *is_lamp)
 {
 	if(ls->pdf == 0.0f)
 		return false;
@@ -91,11 +93,13 @@ ccl_device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd,
 
 	/* evaluate closure */
 
-	float3 light_eval = direct_emissive_eval(kg, ls, state, -ls->D, dD, ls->t, ccl_fetch(sd, time)
-#ifdef __SPLIT_KERNEL__
-	                                         ,sd_DL
-#endif
-	                                         );
+	float3 light_eval = direct_emissive_eval(kg,
+	                                         ls,
+	                                         state,
+	                                         -ls->D,
+	                                         dD,
+	                                         ls->t,
+	                                         ccl_fetch(sd, time));
 
 	if(is_zero(light_eval))
 		return false;
@@ -193,11 +197,10 @@ ccl_device_noinline float3 indirect_primitive_emission(KernelGlobals *kg, Shader
 
 /* Indirect Lamp Emission */
 
-ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, ccl_addr_space PathState *state, Ray *ray, float3 *emission
-#ifdef __SPLIT_KERNEL__
-                                                ,ShaderData *sd
-#endif
-                                                )
+ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg,
+                                                ccl_addr_space PathState *state,
+                                                Ray *ray,
+                                                float3 *emission)
 {
 	bool hit_lamp = false;
 
@@ -221,11 +224,13 @@ ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, ccl_addr_spac
 		}
 #endif
 
-		float3 L = direct_emissive_eval(kg, &ls, state, -ray->D, ray->dD, ls.t, ray->time
-#ifdef __SPLIT_KERNEL__
-		                                ,sd
-#endif
-		                                );
+		float3 L = direct_emissive_eval(kg,
+		                                &ls,
+		                                state,
+		                                -ray->D,
+		                                ray->dD,
+		                                ls.t,
+		                                ray->time);
 
 #ifdef __VOLUME__
 		if(state->volume_stack[0].shader != SHADER_NONE) {
@@ -254,11 +259,9 @@ ccl_device_noinline bool indirect_lamp_emission(KernelGlobals *kg, ccl_addr_spac
 
 /* Indirect Background */
 
-ccl_device_noinline float3 indirect_background(KernelGlobals *kg, ccl_addr_space PathState *state, ccl_addr_space Ray *ray
-#ifdef __SPLIT_KERNEL__
-                                               ,ShaderData *sd_global
-#endif
-                                               )
+ccl_device_noinline float3 indirect_background(KernelGlobals *kg,
+                                               ccl_addr_space PathState *state,
+                                               ccl_addr_space Ray *ray)
 {
 #ifdef __BACKGROUND__
 	int shader = kernel_data.background.surface_shader;
@@ -274,13 +277,13 @@ ccl_device_noinline float3 indirect_background(KernelGlobals *kg, ccl_addr_space
 			return make_float3(0.0f, 0.0f, 0.0f);
 	}
 
-#ifdef __SPLIT_KERNEL__
 	/* evaluate background closure */
+#ifdef __SPLIT_KERNEL__
 	Ray priv_ray = *ray;
-	shader_setup_from_background(kg, sd_global, &priv_ray);
+	shader_setup_from_background(kg, kg->sd_input, &priv_ray);
 
 	path_state_modify_bounce(state, true);
-	float3 L = shader_eval_background(kg, sd_global, state, state->flag, SHADER_CONTEXT_EMISSION);
+	float3 L = shader_eval_background(kg, kg->sd_input, state, state->flag, SHADER_CONTEXT_EMISSION);
 	path_state_modify_bounce(state, false);
 #else
 	ShaderData sd;
diff --git a/intern/cycles/kernel/kernel_globals.h b/intern/cycles/kernel/kernel_globals.h
index 17fa189..49f6122 100644
--- a/intern/cycles/kernel/kernel_globals.h
+++ b/intern/cycles/kernel/kernel_globals.h
@@ -86,6 +86,11 @@ typedef ccl_addr_space struct KernelGlobals {
 #define KERNEL_TEX(type, ttype, name) \
 	ccl_global type *name;
 #include "kernel_textures.h"
+
+#ifdef __SPLIT_KERNEL__
+	ShaderData *sd_input;
+	Intersection *isect_shadow;
+#endif
 } KernelGlobals;
 
 #endif
diff --git a/intern/cycles/kernel/kernel_shadow.h b/intern/cycles/kernel/kernel_shadow.h
index e860510..aefa5d5 100644
--- a/intern/cycles/kernel/kernel_shadow.h
+++ b/intern/cycles/kernel/kernel_shadow.h
@@ -186,11 +186,7 @@ ccl_device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *
 ccl_device_noinline bool shadow_blocked(KernelGlobals *kg,
                                         ccl_addr_space PathState *state,
                                         ccl_addr_space Ray *ray_input,
-                                        float3 *shadow
-#ifdef __SPLIT_KERNEL__
-                                        , ShaderData *sd_mem, Intersection *isect_mem
-#endif
-                                       )
+                                        float3 *shadow)
 {
 	*shadow = make_float3(1.0f, 1.0f, 1.0f);
 
@@ -205,7 +201,7 @@ ccl_device_noinline bool shadow_blocked(KernelGlobals *kg,
 #endif
 
 #ifdef __SPLIT_KERNEL__
-	Intersection *isect = isect_mem;
+	Intersection *isect = &kg->isect_shadow[TIDX];
 #else
 	Intersection isect_object;
 	Intersection *isect = &isect_object;
@@ -254,7 +250,7 @@ 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list