[Bf-blender-cvs] [dabe5cd31ad] blender2.7: T61971: Compilation Displacement/Background Kernel

Jeroen Bakker noreply at git.blender.org
Tue Feb 26 14:07:06 CET 2019


Commit: dabe5cd31add8aa55b9ad4bce1b591ed4e98f1a1
Author: Jeroen Bakker
Date:   Tue Feb 26 14:05:54 2019 +0100
Branches: blender2.7
https://developer.blender.org/rBdabe5cd31add8aa55b9ad4bce1b591ed4e98f1a1

T61971: Compilation Displacement/Background Kernel

Displacement and Background kernels are selectively used, but always compiled. This patch will not compile these kernels when they are not needed.

Displacement kernel is only used for true displacement.
Background kernel is only used when there is a (Cycles)Light of type `LIGHT_BACKGROUND`.

Reviewed By: brecht, #cycles

Tags: #cycles

Maniphest Tasks: T61971

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

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

M	intern/cycles/device/device.cpp
M	intern/cycles/device/device.h
M	intern/cycles/device/opencl/opencl_split.cpp
M	intern/cycles/render/session.cpp

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

diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index 327ba8e2a59..55ba62e5967 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -74,6 +74,10 @@ std::ostream& operator <<(std::ostream &os,
 	   << string_from_bool(requested_features.use_principled) << std::endl;
 	os << "Use Denoising: "
 	   << string_from_bool(requested_features.use_denoising) << std::endl;
+	os << "Use Displacement: "
+	   << string_from_bool(requested_features.use_true_displacement) << std::endl;
+	os << "Use Background Light: "
+	   << string_from_bool(requested_features.use_background_light) << std::endl;
 	return os;
 }
 
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 082f9f758a8..3bf978600d5 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -149,6 +149,12 @@ public:
 	/* Use raytracing in shaders. */
 	bool use_shader_raytrace;
 
+	/* Use true displacement */
+	bool use_true_displacement;
+
+	/* Use background lights */
+	bool use_background_light;
+
 	DeviceRequestedFeatures()
 	{
 		/* TODO(sergey): Find more meaningful defaults. */
@@ -168,6 +174,8 @@ public:
 		use_principled = false;
 		use_denoising = false;
 		use_shader_raytrace = false;
+		use_true_displacement = false;
+		use_background_light = false;
 	}
 
 	bool modified(const DeviceRequestedFeatures& requested_features)
@@ -187,7 +195,9 @@ public:
 		         use_shadow_tricks == requested_features.use_shadow_tricks &&
 		         use_principled == requested_features.use_principled &&
 		         use_denoising == requested_features.use_denoising &&
-		         use_shader_raytrace == requested_features.use_shader_raytrace);
+		         use_shader_raytrace == requested_features.use_shader_raytrace &&
+		         use_true_displacement == requested_features.use_true_displacement &&
+		         use_background_light == requested_features.use_background_light);
 	}
 
 	/* Convert the requested features structure to a build options,
diff --git a/intern/cycles/device/opencl/opencl_split.cpp b/intern/cycles/device/opencl/opencl_split.cpp
index 0b60c498bfc..2880de62662 100644
--- a/intern/cycles/device/opencl/opencl_split.cpp
+++ b/intern/cycles/device/opencl/opencl_split.cpp
@@ -650,13 +650,18 @@ bool OpenCLDevice::load_kernels(const DeviceRequestedFeatures& requested_feature
 		return false;
 
 	vector<OpenCLProgram*> programs;
-	displace_program = OpenCLProgram(this, "displace", "kernel_displace.cl", get_build_options(requested_features, "displace"));
-	displace_program.add_kernel(ustring("displace"));
-	programs.push_back(&displace_program);
 
-	background_program = OpenCLProgram(this, "background", "kernel_background.cl", get_build_options(requested_features, "background"));
-	background_program.add_kernel(ustring("background"));
-	programs.push_back(&background_program);
+	if (requested_features.use_true_displacement) {
+		displace_program = OpenCLProgram(this, "displace", "kernel_displace.cl", get_build_options(requested_features, "displace"));
+		displace_program.add_kernel(ustring("displace"));
+		programs.push_back(&displace_program);
+	}
+
+	if (requested_features.use_background_light) {
+		background_program = OpenCLProgram(this, "background", "kernel_background.cl", get_build_options(requested_features, "background"));
+		background_program.add_kernel(ustring("background"));
+		programs.push_back(&background_program);
+	}
 
 	bool single_program = OpenCLInfo::use_single_program();
 
@@ -1719,9 +1724,11 @@ void OpenCLDevice::shader(DeviceTask& task)
 		kernel = bake_program(ustring("bake"));
 	}
 	else if(task.shader_eval_type == SHADER_EVAL_DISPLACE) {
+		assert(displace_program);
 		kernel = displace_program(ustring("displace"));
 	}
 	else {
+		assert(background_program);
 		kernel = background_program(ustring("background"));
 	}
 
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 69969987352..87c46ec44c8 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -22,6 +22,7 @@
 #include "device/device.h"
 #include "render/graph.h"
 #include "render/integrator.h"
+#include "render/light.h"
 #include "render/mesh.h"
 #include "render/object.h"
 #include "render/scene.h"
@@ -687,8 +688,11 @@ DeviceRequestedFeatures Session::get_requested_device_features()
 		if(object->is_shadow_catcher) {
 			requested_features.use_shadow_tricks = true;
 		}
+		requested_features.use_true_displacement |= mesh->has_true_displacement();
 	}
 
+	requested_features.use_background_light = scene->light_manager->has_background_light(scene);
+
 	BakeManager *bake_manager = scene->bake_manager;
 	requested_features.use_baking = bake_manager->get_baking();
 	requested_features.use_integrator_branched = (scene->integrator->method == Integrator::BRANCHED_PATH);



More information about the Bf-blender-cvs mailing list