Cycles: Make requested features struct aware of subsurface BSDF
This way we'll be able to disable SSS for the scene-adaptive kernel.
This commit is contained in:
parent
c08727ebab
commit
f547bf2f10
@ -100,6 +100,9 @@ public:
|
||||
/* Denotes whether baking functionality is needed. */
|
||||
bool use_baking;
|
||||
|
||||
/* Use subsurface scattering materials. */
|
||||
bool use_subsurface;
|
||||
|
||||
DeviceRequestedFeatures()
|
||||
{
|
||||
/* TODO(sergey): Find more meaningful defaults. */
|
||||
@ -111,6 +114,7 @@ public:
|
||||
use_object_motion = false;
|
||||
use_camera_motion = false;
|
||||
use_baking = false;
|
||||
use_subsurface = false;
|
||||
}
|
||||
|
||||
bool modified(const DeviceRequestedFeatures& requested_features)
|
||||
@ -122,7 +126,8 @@ public:
|
||||
use_hair == requested_features.use_hair &&
|
||||
use_object_motion == requested_features.use_object_motion &&
|
||||
use_camera_motion == requested_features.use_camera_motion &&
|
||||
use_baking == requested_features.use_baking);
|
||||
use_baking == requested_features.use_baking &&
|
||||
use_subsurface == requested_features.use_subsurface);
|
||||
}
|
||||
|
||||
/* Convert the requested features structure to a build options,
|
||||
@ -151,6 +156,9 @@ public:
|
||||
if(!use_baking) {
|
||||
build_options += " -D__NO_BAKING__";
|
||||
}
|
||||
if(!use_subsurface) {
|
||||
build_options += " -D__NO_SUBSURFACE__";
|
||||
}
|
||||
return build_options;
|
||||
}
|
||||
};
|
||||
|
@ -180,7 +180,7 @@ CCL_NAMESPACE_BEGIN
|
||||
# define __KERNEL_DEBUG__
|
||||
#endif
|
||||
|
||||
/* Scene-based selective featrues compilation/ */
|
||||
/* Scene-based selective featrues compilation. */
|
||||
#ifdef __NO_CAMERA_MOTION__
|
||||
# undef __CAMERA_MOTION__
|
||||
#endif
|
||||
@ -190,6 +190,9 @@ CCL_NAMESPACE_BEGIN
|
||||
#ifdef __NO_HAIR__
|
||||
# undef __HAIR__
|
||||
#endif
|
||||
#ifdef __NO_SUBSURFACE__
|
||||
# undef __SUBSURFACE__
|
||||
#endif
|
||||
|
||||
/* Random Numbers */
|
||||
|
||||
|
@ -619,8 +619,7 @@ DeviceRequestedFeatures Session::get_requested_device_features()
|
||||
requested_features.max_closure = get_max_closure_count();
|
||||
scene->shader_manager->get_requested_features(
|
||||
scene,
|
||||
requested_features.max_nodes_group,
|
||||
requested_features.nodes_features);
|
||||
&requested_features);
|
||||
}
|
||||
|
||||
/* This features are not being tweaked as often as shaders,
|
||||
|
@ -490,42 +490,42 @@ void ShaderManager::add_default(Scene *scene)
|
||||
}
|
||||
}
|
||||
|
||||
/* NOTE: Expects max_group and features to be initialized in the callee. */
|
||||
void ShaderManager::get_requested_graph_features(ShaderGraph *graph,
|
||||
int& max_group,
|
||||
int& features)
|
||||
DeviceRequestedFeatures *requested_features)
|
||||
{
|
||||
foreach(ShaderNode *node, graph->nodes) {
|
||||
max_group = max(max_group, node->get_group());
|
||||
features |= node->get_feature();
|
||||
requested_features->max_nodes_group = max(requested_features->max_nodes_group,
|
||||
node->get_group());
|
||||
requested_features->nodes_features |= node->get_feature();
|
||||
if(node->special_type == SHADER_SPECIAL_TYPE_CLOSURE) {
|
||||
BsdfNode *bsdf_node = static_cast<BsdfNode*>(node);
|
||||
if(CLOSURE_IS_VOLUME(bsdf_node->closure)) {
|
||||
features |= NODE_FEATURE_VOLUME;
|
||||
requested_features->nodes_features |= NODE_FEATURE_VOLUME;
|
||||
}
|
||||
}
|
||||
if(node->has_surface_bssrdf()) {
|
||||
requested_features->use_subsurface = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ShaderManager::get_requested_features(Scene *scene,
|
||||
int& max_group,
|
||||
int& features)
|
||||
DeviceRequestedFeatures *requested_features)
|
||||
{
|
||||
max_group = NODE_GROUP_LEVEL_0;
|
||||
features = 0;
|
||||
requested_features->max_nodes_group = NODE_GROUP_LEVEL_0;
|
||||
requested_features->nodes_features = 0;
|
||||
for(int i = 0; i < scene->shaders.size(); i++) {
|
||||
Shader *shader = scene->shaders[i];
|
||||
/* Gather requested features from all the nodes from the graph nodes. */
|
||||
get_requested_graph_features(shader->graph, max_group, features);
|
||||
get_requested_graph_features(shader->graph, requested_features);
|
||||
/* Gather requested features from the graph itself. */
|
||||
if(shader->graph_bump) {
|
||||
get_requested_graph_features(shader->graph_bump,
|
||||
max_group,
|
||||
features);
|
||||
requested_features);
|
||||
}
|
||||
ShaderNode *output_node = shader->graph->output();
|
||||
if(output_node->input("Displacement")->link != NULL) {
|
||||
features |= NODE_FEATURE_BUMP;
|
||||
requested_features->nodes_features |= NODE_FEATURE_BUMP;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -43,6 +43,7 @@ CCL_NAMESPACE_BEGIN
|
||||
|
||||
class Device;
|
||||
class DeviceScene;
|
||||
class DeviceRequestedFeatures;
|
||||
class Mesh;
|
||||
class Progress;
|
||||
class Scene;
|
||||
@ -168,8 +169,7 @@ public:
|
||||
|
||||
/* Selective nodes compilation. */
|
||||
void get_requested_features(Scene *scene,
|
||||
int& max_group,
|
||||
int& features);
|
||||
DeviceRequestedFeatures *requested_features);
|
||||
|
||||
protected:
|
||||
ShaderManager();
|
||||
@ -183,8 +183,7 @@ protected:
|
||||
size_t beckmann_table_offset;
|
||||
|
||||
void get_requested_graph_features(ShaderGraph *graph,
|
||||
int& max_group,
|
||||
int& features);
|
||||
DeviceRequestedFeatures *requested_features);
|
||||
};
|
||||
|
||||
CCL_NAMESPACE_END
|
||||
|
Loading…
Reference in New Issue
Block a user