Cycles; Make baking a feature-specific option
authorSergey Sharybin <sergey.vfx@gmail.com>
Sat, 18 Jul 2015 13:34:32 +0000 (15:34 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Sat, 18 Jul 2015 14:02:08 +0000 (16:02 +0200)
This means render devices now might skip building baking kernels in cases when
only actual render-related functionality is used.

For now it's only implemented for OpenCL split kernel device and mainly needed
to work around some compiler-specific bugs which crashes on building the kernel.

Using OpenCL for baking might still crash the driver, but at least there is now
higher probability of that GPU will be usable to render the scene.

Real fix should actually be done in the driver side.

intern/cycles/blender/blender_session.cpp
intern/cycles/device/device.h
intern/cycles/device/device_opencl.cpp
intern/cycles/render/session.cpp

index cdc447489232b82bc8c39432542eb60965b3af3b..7342ed3b4f1609aa602658162e57f59b5817e716 100644 (file)
@@ -543,6 +543,11 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, const in
        size_t object_index = OBJECT_NONE;
        int tri_offset = 0;
 
+       /* Set baking flag in advance, so kernel loading can check if we need
+        * any baking capabilities.
+        */
+       scene->bake_manager->set_baking(true);
+
        /* ensure kernels are loaded before we do any scene updates */
        session->load_kernels();
 
@@ -572,7 +577,6 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, const in
        BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, b_v3d, b_rv3d, scene->camera, width, height);
 
        scene->bake_manager->set_shader_limit((size_t)b_engine.tile_x(), (size_t)b_engine.tile_y());
-       scene->bake_manager->set_baking(true);
 
        /* set number of samples */
        session->tile_manager.set_samples(session_params.samples);
index 6b4a190bbf098e4c0fef60c9ef7448c3949e5620..7c4f5b61a4856d40eb40aca97c5d9eb48dfd476c 100644 (file)
@@ -97,6 +97,9 @@ public:
        bool use_object_motion;
        bool use_camera_motion;
 
+       /* Denotes whether baking functionality is needed. */
+       bool use_baking;
+
        DeviceRequestedFeatures()
        {
                /* TODO(sergey): Find more meaningful defaults. */
@@ -107,6 +110,7 @@ public:
                use_hair = false;
                use_object_motion = false;
                use_camera_motion = false;
+               use_baking = false;
        }
 
        bool modified(const DeviceRequestedFeatures& requested_features)
@@ -114,7 +118,11 @@ public:
                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);
+                        nodes_features == requested_features.nodes_features &&
+                        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);
        }
 };
 
index 3305ef4bb1430d8dacde31e4580215911ad14a20..3581026621842ec85c43ea1c8e0e3365f375feb4 100644 (file)
@@ -1560,6 +1560,9 @@ protected:
                if(!requested_features.use_camera_motion) {
                        build_options += " -D__NO_CAMERA_MOTION__";
                }
+               if(!requested_features.use_baking) {
+                       build_options += " -D__NO_BAKING__";
+               }
                return build_options;
        }
 
index 57c1500628a057ae755664379b8c0a4908db1e00..f3acebd33d5238b344e7efc08a6ee4460ad57e4e 100644 (file)
@@ -637,6 +637,9 @@ DeviceRequestedFeatures Session::get_requested_device_features()
                requested_features.use_camera_motion |= mesh->use_motion_blur;
        }
 
+       BakeManager *bake_manager = scene->bake_manager;
+       requested_features.use_baking = bake_manager->get_baking();
+
        return requested_features;
 }