Cycles: Communicate number of closures and nodes feature set to the device

This way device can actually make a decision of how it can optimize the kernel
in order to make it most efficient.
This commit is contained in:
Sergey Sharybin 2015-05-09 19:28:00 +05:00
parent 6fc1669679
commit f680c1b54a
3 changed files with 42 additions and 1 deletions

View File

@ -74,14 +74,37 @@ public:
/* Use experimental feature set. */
bool experimental;
/* Maximum number of closures in shader trees. */
int max_closure;
/* Selective nodes compilation. */
/* Identifier of a node group up to which all the nodes needs to be
* compiled in. Nodes from higher group indices will be ignores.
*/
int max_nodes_group;
/* Features bitfield indicating which features from the requested group
* will be compiled in. Nodes which corresponds to features which are not
* in this bitfield will be ignored even if they're in the requested group.
*/
int nodes_features;
DeviceRequestedFeatures()
{
/* TODO(sergey): Find more meaningful defaults. */
experimental = false;
max_closure = 0;
max_nodes_group = 0;
nodes_features = 0;
}
bool modified(const DeviceRequestedFeatures& requested_features)
{
return !(experimental == requested_features.experimental);
return !(experimental == requested_features.experimental &&
max_closure == requested_features.max_closure &&
max_nodes_group == requested_features.max_nodes_group &&
nodes_features == requested_features.nodes_features);
}
};

View File

@ -205,6 +205,9 @@ public:
RPCSend snd(socket, &error_func, "load_kernels");
snd.add(requested_features.experimental);
snd.add(requested_features.max_closure);
snd.add(requested_features.max_nodes_group);
snd.add(requested_features.nodes_features);
snd.write();
bool result;
@ -609,6 +612,9 @@ protected:
else if(rcv.name == "load_kernels") {
DeviceRequestedFeatures requested_features;
rcv.read(requested_features.experimental);
rcv.read(requested_features.max_closure);
rcv.read(requested_features.max_nodes_group);
rcv.read(requested_features.nodes_features);
bool result;
result = device->load_kernels(requested_features);

View File

@ -601,6 +601,18 @@ DeviceRequestedFeatures Session::get_requested_device_features()
{
DeviceRequestedFeatures requested_features;
requested_features.experimental = params.experimental;
if(!params.background) {
requested_features.max_closure = 64;
requested_features.max_nodes_group = NODE_GROUP_LEVEL_2;
requested_features.nodes_features = NODE_FEATURE_ALL;
}
else {
requested_features.max_closure = get_max_closure_count();
scene->shader_manager->get_requested_features(
scene,
requested_features.max_nodes_group,
requested_features.nodes_features);
}
return requested_features;
}