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:
@@ -74,6 +74,10 @@ std::ostream& operator <<(std::ostream &os,
|
|||||||
<< string_from_bool(requested_features.use_principled) << std::endl;
|
<< string_from_bool(requested_features.use_principled) << std::endl;
|
||||||
os << "Use Denoising: "
|
os << "Use Denoising: "
|
||||||
<< string_from_bool(requested_features.use_denoising) << std::endl;
|
<< 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;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -149,6 +149,12 @@ public:
|
|||||||
/* Use raytracing in shaders. */
|
/* Use raytracing in shaders. */
|
||||||
bool use_shader_raytrace;
|
bool use_shader_raytrace;
|
||||||
|
|
||||||
|
/* Use true displacement */
|
||||||
|
bool use_true_displacement;
|
||||||
|
|
||||||
|
/* Use background lights */
|
||||||
|
bool use_background_light;
|
||||||
|
|
||||||
DeviceRequestedFeatures()
|
DeviceRequestedFeatures()
|
||||||
{
|
{
|
||||||
/* TODO(sergey): Find more meaningful defaults. */
|
/* TODO(sergey): Find more meaningful defaults. */
|
||||||
@@ -168,6 +174,8 @@ public:
|
|||||||
use_principled = false;
|
use_principled = false;
|
||||||
use_denoising = false;
|
use_denoising = false;
|
||||||
use_shader_raytrace = false;
|
use_shader_raytrace = false;
|
||||||
|
use_true_displacement = false;
|
||||||
|
use_background_light = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool modified(const DeviceRequestedFeatures& requested_features)
|
bool modified(const DeviceRequestedFeatures& requested_features)
|
||||||
@@ -187,7 +195,9 @@ public:
|
|||||||
use_shadow_tricks == requested_features.use_shadow_tricks &&
|
use_shadow_tricks == requested_features.use_shadow_tricks &&
|
||||||
use_principled == requested_features.use_principled &&
|
use_principled == requested_features.use_principled &&
|
||||||
use_denoising == requested_features.use_denoising &&
|
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,
|
/* Convert the requested features structure to a build options,
|
||||||
|
@@ -650,13 +650,18 @@ bool OpenCLDevice::load_kernels(const DeviceRequestedFeatures& requested_feature
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
vector<OpenCLProgram*> programs;
|
vector<OpenCLProgram*> programs;
|
||||||
|
|
||||||
|
if (requested_features.use_true_displacement) {
|
||||||
displace_program = OpenCLProgram(this, "displace", "kernel_displace.cl", get_build_options(requested_features, "displace"));
|
displace_program = OpenCLProgram(this, "displace", "kernel_displace.cl", get_build_options(requested_features, "displace"));
|
||||||
displace_program.add_kernel(ustring("displace"));
|
displace_program.add_kernel(ustring("displace"));
|
||||||
programs.push_back(&displace_program);
|
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 = OpenCLProgram(this, "background", "kernel_background.cl", get_build_options(requested_features, "background"));
|
||||||
background_program.add_kernel(ustring("background"));
|
background_program.add_kernel(ustring("background"));
|
||||||
programs.push_back(&background_program);
|
programs.push_back(&background_program);
|
||||||
|
}
|
||||||
|
|
||||||
bool single_program = OpenCLInfo::use_single_program();
|
bool single_program = OpenCLInfo::use_single_program();
|
||||||
|
|
||||||
@@ -1719,9 +1724,11 @@ void OpenCLDevice::shader(DeviceTask& task)
|
|||||||
kernel = bake_program(ustring("bake"));
|
kernel = bake_program(ustring("bake"));
|
||||||
}
|
}
|
||||||
else if(task.shader_eval_type == SHADER_EVAL_DISPLACE) {
|
else if(task.shader_eval_type == SHADER_EVAL_DISPLACE) {
|
||||||
|
assert(displace_program);
|
||||||
kernel = displace_program(ustring("displace"));
|
kernel = displace_program(ustring("displace"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
assert(background_program);
|
||||||
kernel = background_program(ustring("background"));
|
kernel = background_program(ustring("background"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -22,6 +22,7 @@
|
|||||||
#include "device/device.h"
|
#include "device/device.h"
|
||||||
#include "render/graph.h"
|
#include "render/graph.h"
|
||||||
#include "render/integrator.h"
|
#include "render/integrator.h"
|
||||||
|
#include "render/light.h"
|
||||||
#include "render/mesh.h"
|
#include "render/mesh.h"
|
||||||
#include "render/object.h"
|
#include "render/object.h"
|
||||||
#include "render/scene.h"
|
#include "render/scene.h"
|
||||||
@@ -687,8 +688,11 @@ DeviceRequestedFeatures Session::get_requested_device_features()
|
|||||||
if(object->is_shadow_catcher) {
|
if(object->is_shadow_catcher) {
|
||||||
requested_features.use_shadow_tricks = true;
|
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;
|
BakeManager *bake_manager = scene->bake_manager;
|
||||||
requested_features.use_baking = bake_manager->get_baking();
|
requested_features.use_baking = bake_manager->get_baking();
|
||||||
requested_features.use_integrator_branched = (scene->integrator->method == Integrator::BRANCHED_PATH);
|
requested_features.use_integrator_branched = (scene->integrator->method == Integrator::BRANCHED_PATH);
|
||||||
|
Reference in New Issue
Block a user