Cycles: Remove round-up trickery for max closure in split OpenCL kernel
authorSergey Sharybin <sergey.vfx@gmail.com>
Sat, 6 Jun 2015 11:14:31 +0000 (13:14 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 8 Jun 2015 09:15:39 +0000 (11:15 +0200)
Round-up was only enabled for viewport render, which was for a long time hardcoded to
use 64 closures. This was done in order to avoid unnecessary kernel re-compilations
when tweaking the shader tree.

We could enable selective closure compilation in the viewport later if it'll give
measurable speed improvements, but even then round-up is to happen outside of the
device level,

This commit also removes early output which happened in cases when max closure did
not change. It was wrong because other requested kernel features might have been
changed.

intern/cycles/device/device_opencl.cpp

index 7873d70c65c812c57e3a57d8442c7f9bd304f279..693bb1956bdd4b56c147fff54884f41368faecf6 100644 (file)
@@ -1674,7 +1674,7 @@ public:
 #endif
 
        /* clos_max value for which the kernels have been loaded currently. */
-       int current_clos_max;
+       int current_max_closure;
 
        /* Marked True in constructor and marked false at the end of path_trace(). */
        bool first_tile;
@@ -1817,7 +1817,7 @@ public:
                work_pool_wgs = NULL;
                max_work_groups = 0;
 #endif
-               current_clos_max = -1;
+               current_max_closure = -1;
                first_tile = true;
 
                /* Get device's maximum memory that can be allocated. */
@@ -1941,23 +1941,6 @@ public:
 
        bool load_kernels(const DeviceRequestedFeatures& requested_features)
        {
-               /* If it is an interactive render; we ceil clos_max value to a multiple
-                * of 5 in order to limit re-compilations.
-                */
-               /* TODO(sergey): Decision about this should be done on higher levels. */
-               int max_closure = requested_features.max_closure;
-               if(!background) {
-                       assert((max_closure != 0) && "clos_max value is 0" );
-                       max_closure = (((max_closure - 1) / 5) + 1) * 5;
-                       /* clos_max value shouldn't be greater than MAX_CLOSURE. */
-                       max_closure = (max_closure > MAX_CLOSURE) ? MAX_CLOSURE : max_closure;
-                       if(current_clos_max == max_closure) {
-                               /* Present kernels have been created with the same closure count
-                                * build option.
-                                */
-                               return true;
-                       }
-               }
                /* Get Shader, bake and film_convert kernels.
                 * It'll also do verification of OpenCL actually initialized.
                 */
@@ -1988,7 +1971,8 @@ public:
                        string_printf("%d", requested_features.max_nodes_group);
                build_options += " -D__NODES_FEATURES__=" +
                        string_printf("%d", requested_features.nodes_features);
-               build_options += string_printf(" -D__MAX_CLOSURE__=%d", max_closure);
+               build_options += string_printf(" -D__MAX_CLOSURE__=%d",
+                                              requested_features.max_closure);
                if(!requested_features.use_hair) {
                        build_options += " -D__NO_HAIR__";
                }
@@ -2074,7 +2058,7 @@ public:
 #undef FIND_KERNEL
 #undef GLUE
 
-               current_clos_max = max_closure;
+               current_max_closure = requested_features.max_closure;
 
                return true;
        }
@@ -2276,7 +2260,7 @@ public:
                        /* TODO(sergey): This will actually over-allocate if
                         * particular kernel does not support multiclosure.
                         */
-                       size_t ShaderClosure_size = get_shader_closure_size(current_clos_max);
+                       size_t ShaderClosure_size = get_shader_closure_size(current_max_closure);
 
 #ifdef __WORK_STEALING__
                        /* Calculate max groups */
@@ -2921,7 +2905,7 @@ public:
        {
                size_t shader_closure_size = 0;
                size_t shaderdata_volume = 0;
-               shader_closure_size = get_shader_closure_size(current_clos_max);
+               shader_closure_size = get_shader_closure_size(current_max_closure);
                /* TODO(sergey): This will actually over-allocate if
                 * particular kernel does not support multiclosure.
                 */