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