diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 79ab25483e2..942a60d59dc 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -86,8 +86,9 @@ void BlenderSession::create() void BlenderSession::create_session() { - SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); 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); bool session_pause = BlenderSync::get_session_pause(b_scene, background); /* reset status/progress */ @@ -112,7 +113,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, session_params.device.type == DEVICE_CPU); + sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress, is_cpu); if(b_v3d) { if(session_pause == false) { @@ -142,8 +143,9 @@ void BlenderSession::reset_session(BL::BlendData b_data_, BL::Scene b_scene_) b_render = b_engine.render(); b_scene = b_scene_; - SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); 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); width = render_resolution_x(b_render); height = render_resolution_y(b_render); @@ -174,7 +176,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, session_params.device.type == DEVICE_CPU); + sync = new BlenderSync(b_engine, b_data, b_scene, scene, !background, session->progress, is_cpu); /* for final render we will do full data sync per render layer, only * do some basic syncing here, no objects or materials for speed */ @@ -641,8 +643,9 @@ void BlenderSession::synchronize() return; /* on session/scene parameter changes, we recreate session entirely */ - SceneParams scene_params = BlenderSync::get_scene_params(b_scene, background); 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); 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 ee492dd00e4..f83eb113a88 100644 --- a/intern/cycles/blender/blender_sync.cpp +++ b/intern/cycles/blender/blender_sync.cpp @@ -353,7 +353,7 @@ void BlenderSync::sync_render_layers(BL::SpaceView3D b_v3d, const char *layer) /* Scene Parameters */ -SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background) +SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background, bool is_cpu) { BL::RenderSettings r = b_scene.render(); SceneParams params; @@ -378,6 +378,13 @@ SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background) else params.persistent_data = false; + if(is_cpu) { + params.use_qbvh = system_cpu_support_sse2(); + } + else { + params.use_qbvh = false; + } + return params; } diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h index 9c4175ef690..a37488ee2bc 100644 --- a/intern/cycles/blender/blender_sync.h +++ b/intern/cycles/blender/blender_sync.h @@ -62,7 +62,7 @@ public: int get_layer_bound_samples() { return render_layer.bound_samples; } /* get parameters */ - static SceneParams get_scene_params(BL::Scene b_scene, bool background); + static SceneParams get_scene_params(BL::Scene b_scene, bool background, bool is_cpu); static SessionParams get_session_params(BL::RenderEngine b_engine, BL::UserPreferences b_userpref, BL::Scene b_scene, bool background); static bool get_session_pause(BL::Scene b_scene, bool background); static BufferParams get_buffer_params(BL::RenderSettings b_render, BL::Scene b_scene, BL::SpaceView3D b_v3d, BL::RegionView3D b_rv3d, Camera *cam, int width, int height); diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index f8671db18dd..18334ccb62b 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -30,6 +30,7 @@ #include "util_cache.h" #include "util_foreach.h" +#include "util_logging.h" #include "util_progress.h" #include "util_set.h" @@ -980,6 +981,9 @@ void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene * /* bvh build */ progress.set_status("Updating Scene BVH", "Building"); + VLOG(1) << (scene->params.use_qbvh ? "Using QBVH optimization structure" + : "Using regular BVH optimization structure"); + BVHParams bparams; bparams.top_level = true; bparams.use_qbvh = scene->params.use_qbvh;