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
This commit is contained in:
Jeroen Bakker
2019-02-26 14:05:54 +01:00
parent e6099c7e46
commit dabe5cd31a
4 changed files with 32 additions and 7 deletions

View File

@@ -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;
}

View File

@@ -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,

View File

@@ -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"));
}

View File

@@ -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);