Cycles: Communicate number of closures and nodes feature set to the device
authorSergey Sharybin <sergey.vfx@gmail.com>
Sat, 9 May 2015 14:28:00 +0000 (19:28 +0500)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sat, 9 May 2015 14:28:00 +0000 (19:28 +0500)
This way device can actually make a decision of how it can optimize the kernel
in order to make it most efficient.

intern/cycles/device/device.h
intern/cycles/device/device_network.cpp
intern/cycles/render/session.cpp

index 9815590074849fbf104d7268f90911eafcf6353c..4d40518644e91005d73523f8d8072694faa4cfa3 100644 (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);
        }
 };
 
index 454f7301975cabcd23daaecb9c381ae93bdbe5f7..ca6d668a79d75da6015d3f15befe4b4e12113bb5 100644 (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);
index cfd974346c3d858978521118b04799092ac1ecaf..aacb81faf83f9e9fd7df8e1266c2bec924e3d1a2 100644 (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;
 }