Commit: cdb0b3b1dcd4e9962426422868b2f40535670a5c
Author: Brecht Van Lommel
Date:   Sun Oct 8 04:32:25 2017 +0200
Branches: master
https://developer.blender.org/rBcdb0b3b1dcd4e9962426422868b2f40535670a5c

Code refactor: use DeviceInfo to enable QBVH and decoupled volume shading.

===================================================================

M       intern/cycles/blender/blender_session.cpp
M       intern/cycles/blender/blender_sync.cpp
M       intern/cycles/blender/blender_sync.h
M       intern/cycles/device/device.cpp
M       intern/cycles/device/device.h
M       intern/cycles/device/device_cpu.cpp
M       intern/cycles/device/device_cuda.cpp
M       intern/cycles/device/device_network.cpp
M       intern/cycles/device/device_opencl.cpp
M       intern/cycles/kernel/kernel_path.h
M       intern/cycles/kernel/kernel_path_branched.h
M       intern/cycles/kernel/kernel_types.h
M       intern/cycles/kernel/kernel_volume.h
M       intern/cycles/render/integrator.cpp
M       intern/cycles/render/mesh.cpp
M       intern/cycles/render/mesh.h
M       intern/cycles/render/scene.h
M       intern/cycles/render/shader.cpp

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp 
b/intern/cycles/blender/blender_session.cpp
index 12de3da063f..9e54b7de573 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -115,8 +115,7 @@ void BlenderSession::create()
 void BlenderSession::create_session()
 {
        SessionParams session_params = 
BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
-       bool is_cpu = session_params.device.type == DEVICE_CPU;
-       SceneParams scene_params = BlenderSync::get_scene_params(b_scene, 
background, is_cpu);
+       SceneParams scene_params = BlenderSync::get_scene_params(b_scene, 
background);
        bool session_pause = BlenderSync::get_session_pause(b_scene, 
background);
 
        /* reset status/progress */
@@ -141,7 +140,7 @@ void BlenderSession::create_session()
        session->set_pause(session_pause);
 
        /* create sync */
-       sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, 
session->progress, is_cpu);
+       sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, 
session->progress);
        BL::Object b_camera_override(b_engine.camera_override());
        if(b_v3d) {
                if(session_pause == false) {
@@ -179,8 +178,7 @@ void BlenderSession::reset_session(BL::BlendData& b_data_, 
BL::Scene& b_scene_)
        b_scene = b_scene_;
 
        SessionParams session_params = 
BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
-       const bool is_cpu = session_params.device.type == DEVICE_CPU;
-       SceneParams scene_params = BlenderSync::get_scene_params(b_scene, 
background, is_cpu);
+       SceneParams scene_params = BlenderSync::get_scene_params(b_scene, 
background);
 
        width = render_resolution_x(b_render);
        height = render_resolution_y(b_render);
@@ -211,7 +209,7 @@ void BlenderSession::reset_session(BL::BlendData& b_data_, 
BL::Scene& b_scene_)
        session->stats.mem_peak = session->stats.mem_used;
 
        /* sync object should be re-created */
-       sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, 
session->progress, is_cpu);
+       sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, 
session->progress);
 
        /* for final render we will do full data sync per render layer, only
         * do some basic syncing here, no objects or materials for speed */
@@ -736,8 +734,7 @@ void BlenderSession::synchronize()
 
        /* on session/scene parameter changes, we recreate session entirely */
        SessionParams session_params = 
BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
-       const bool is_cpu = session_params.device.type == DEVICE_CPU;
-       SceneParams scene_params = BlenderSync::get_scene_params(b_scene, 
background, is_cpu);
+       SceneParams scene_params = BlenderSync::get_scene_params(b_scene, 
background);
        bool session_pause = BlenderSync::get_session_pause(b_scene, 
background);
 
        if(session->params.modified(session_params) ||
diff --git a/intern/cycles/blender/blender_sync.cpp 
b/intern/cycles/blender/blender_sync.cpp
index 42e3721883f..2e3301c4209 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -47,8 +47,7 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
                          BL::Scene& b_scene,
                          Scene *scene,
                          bool preview,
-                         Progress &progress,
-                         bool is_cpu)
+                         Progress &progress)
 : b_engine(b_engine),
   b_data(b_data),
   b_scene(b_scene),
@@ -62,7 +61,6 @@ BlenderSync::BlenderSync(BL::RenderEngine& b_engine,
   scene(scene),
   preview(preview),
   experimental(false),
-  is_cpu(is_cpu),
   dicing_rate(1.0f),
   max_subdivisions(12),
   progress(progress)
@@ -613,8 +611,7 @@ array<Pass> 
BlenderSync::sync_render_passes(BL::RenderLayer& b_rlay,
 /* Scene Parameters */
 
 SceneParams BlenderSync::get_scene_params(BL::Scene& b_scene,
-                                          bool background,
-                                          bool is_cpu)
+                                          bool background)
 {
        BL::RenderSettings r = b_scene.render();
        SceneParams params;
@@ -654,15 +651,7 @@ SceneParams BlenderSync::get_scene_params(BL::Scene& 
b_scene,
                params.texture_limit = 0;
        }
 
-#if !(defined(__GNUC__) && (defined(i386) || defined(_M_IX86)))
-       if(is_cpu) {
-               params.use_qbvh = DebugFlags().cpu.qbvh && 
system_cpu_support_sse2();
-       }
-       else
-#endif
-       {
-               params.use_qbvh = false;
-       }
+       params.use_qbvh = DebugFlags().cpu.qbvh;
 
        return params;
 }
diff --git a/intern/cycles/blender/blender_sync.h 
b/intern/cycles/blender/blender_sync.h
index 4ec46424b5a..11e279b81c4 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -54,8 +54,7 @@ public:
                    BL::Scene& b_scene,
                    Scene *scene,
                    bool preview,
-                   Progress &progress,
-                   bool is_cpu);
+                   Progress &progress);
        ~BlenderSync();
 
        /* sync */
@@ -83,8 +82,7 @@ public:
 
        /* get parameters */
        static SceneParams get_scene_params(BL::Scene& b_scene,
-                                           bool background,
-                                           bool is_cpu);
+                                           bool background);
        static SessionParams get_session_params(BL::RenderEngine& b_engine,
                                                BL::UserPreferences& b_userpref,
                                                BL::Scene& b_scene,
@@ -177,7 +175,6 @@ private:
        Scene *scene;
        bool preview;
        bool experimental;
-       bool is_cpu;
 
        float dicing_rate;
        int max_subdivisions;
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index f64436aec7b..533294407ea 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -379,10 +379,14 @@ DeviceInfo Device::get_multi_device(vector<DeviceInfo> 
subdevices)
        info.num = 0;
 
        info.has_bindless_textures = true;
+       info.has_volume_decoupled = true;
+       info.has_qbvh = true;
        foreach(DeviceInfo &device, subdevices) {
                assert(device.type == info.multi_devices[0].type);
 
                info.has_bindless_textures &= device.has_bindless_textures;
+               info.has_volume_decoupled &= device.has_volume_decoupled;
+               info.has_qbvh &= device.has_qbvh;
        }
 
        return info;
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 0e0a0079209..c134fc9411e 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -55,6 +55,8 @@ public:
        bool display_device;
        bool advanced_shading;
        bool has_bindless_textures; /* flag for GPU and Multi device */
+       bool has_volume_decoupled;
+       bool has_qbvh;
        bool use_split_kernel; /* Denotes if the device is going to run cycles 
using split-kernel */
        vector<DeviceInfo> multi_devices;
 
@@ -66,6 +68,8 @@ public:
                display_device = false;
                advanced_shading = true;
                has_bindless_textures = false;
+               has_volume_decoupled = false;
+               has_qbvh = false;
                use_split_kernel = false;
        }
 
diff --git a/intern/cycles/device/device_cpu.cpp 
b/intern/cycles/device/device_cpu.cpp
index ac6d3246d38..a17caabc850 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -1024,6 +1024,8 @@ void device_cpu_info(vector<DeviceInfo>& devices)
        info.id = "CPU";
        info.num = 0;
        info.advanced_shading = true;
+       info.has_qbvh = system_cpu_support_sse2();
+       info.has_volume_decoupled = true;
 
        devices.insert(devices.begin(), info);
 }
diff --git a/intern/cycles/device/device_cuda.cpp 
b/intern/cycles/device/device_cuda.cpp
index dcbe6033bcc..56a56c5217c 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -2128,6 +2128,8 @@ void device_cuda_info(vector<DeviceInfo>& devices)
 
                info.advanced_shading = (major >= 2);
                info.has_bindless_textures = (major >= 3);
+               info.has_volume_decoupled = false;
+               info.has_qbvh = false;
 
                int pci_location[3] = {0, 0, 0};
                cuDeviceGetAttribute(&pci_location[0], 
CU_DEVICE_ATTRIBUTE_PCI_DOMAIN_ID, num);
diff --git a/intern/cycles/device/device_network.cpp 
b/intern/cycles/device/device_network.cpp
index deea59f1d23..ced10c98dc9 100644
--- a/intern/cycles/device/device_network.cpp
+++ b/intern/cycles/device/device_network.cpp
@@ -343,7 +343,11 @@ void device_network_info(vector<DeviceInfo>& devices)
        info.description = "Network Device";
        info.id = "NETWORK";
        info.num = 0;
-       info.advanced_shading = true; /* todo: get this info from device */
+
+       /* todo: get this info from device */
+       info.advanced_shading = true;
+       info.has_volume_decoupled = false;
+       info.has_qbvh = false;
 
        devices.push_back(info);
 }
diff --git a/intern/cycles/device/device_opencl.cpp 
b/intern/cycles/device/device_opencl.cpp
index 9d89decaaaf..5808a31e605 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -123,6 +123,8 @@ void device_opencl_info(vector<DeviceInfo>& devices)
                info.advanced_shading = 
OpenCLInfo::kernel_use_advanced_shading(platform_name);
                info.use_split_kernel = 
OpenCLInfo::kernel_use_split(platform_name,
                                                                     
device_type);
+               info.has_volume_decoupled = false;
+               info.has_qbvh = false;
                info.id = string("OPENCL_") + platform_name + "_" + device_name 
+ "_" + hardware_id;
                devices.push_back(info);
                num_devices++;
diff --git a/intern/cycles/kernel/kernel_path.h 
b/intern/cycles/kernel/kernel_path.h
index 6b6c5603b70..652777a77a0 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -170,87 +170,90 @@ ccl_device_forceinline VolumeIntegrateResult 
kernel_path_volume(
        if(!hit) {
                kernel_volume_clean_stack(kg, state->volume_stack);
        }
+
+       if(state->volume_stack[0].shader == SHADER_NONE) {
+               return VOLUME_PATH_ATTENUATED;
+       }
+
        /* volume attenuation, emission, scatter */
-       if(state->volume_stack[0].shader != SHADER_NONE) {
-               Ray volume_ray = *ray;
-               volume_ray.t = (hit)? isect->t: FLT_MAX;
+       Ray volume_ray = *ray;
+       volume_ray.t = (hit)? isect->t: FLT_MAX;
 
-               bool heterogeneous = volume_stack_is_heterogeneous(kg, 
state->volume_stack);
+       bool heterogeneous = volume_stack_is_heterogeneous(kg, 
state->volume_stack);
 
 #  ifdef __VOLUME_DECOUPLED__


@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to