From b7fb3296c101bf408455352ec9784a8870672c81 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 9 Jan 2019 16:38:04 +0100 Subject: [PATCH 1/3] Fix T60300, T57774: Cycles OpenCL viewport crash with subsurface scattering. --- intern/cycles/device/device_split_kernel.cpp | 45 +++++++++----------- intern/cycles/device/device_split_kernel.h | 7 ++- 2 files changed, 24 insertions(+), 28 deletions(-) diff --git a/intern/cycles/device/device_split_kernel.cpp b/intern/cycles/device/device_split_kernel.cpp index efaae8c84f4..ab2c11e904d 100644 --- a/intern/cycles/device/device_split_kernel.cpp +++ b/intern/cycles/device/device_split_kernel.cpp @@ -32,10 +32,9 @@ DeviceSplitKernel::DeviceSplitKernel(Device *device) ray_state(device, "ray_state", MEM_READ_WRITE), queue_index(device, "queue_index"), use_queues_flag(device, "use_queues_flag"), - work_pool_wgs(device, "work_pool_wgs") + work_pool_wgs(device, "work_pool_wgs"), + kernel_data_initialized(false) { - first_tile = true; - avg_time_per_sample = 0.0; kernel_path_init = NULL; @@ -116,6 +115,9 @@ bool DeviceSplitKernel::load_kernels(const DeviceRequestedFeatures& requested_fe #undef LOAD_KERNEL + /* Re-initialiaze kernel-dependent data when kernels change. */ + kernel_data_initialized = false; + return true; } @@ -137,33 +139,25 @@ bool DeviceSplitKernel::path_trace(DeviceTask *task, return false; } - /* Get local size */ - size_t local_size[2]; - { + /* Allocate all required global memory once. */ + if(!kernel_data_initialized) { + kernel_data_initialized = true; + + /* Set local size */ int2 lsize = split_kernel_local_size(); local_size[0] = lsize[0]; local_size[1] = lsize[1]; - } - /* Number of elements in the global state buffer */ - int num_global_elements = global_size[0] * global_size[1]; + /* Set global size */ + int2 gsize = split_kernel_global_size(kgbuffer, kernel_data, task); - /* Allocate all required global memory once. */ - if(first_tile) { - first_tile = false; + /* Make sure that set work size is a multiple of local + * work size dimensions. + */ + global_size[0] = round_up(gsize[0], local_size[0]); + global_size[1] = round_up(gsize[1], local_size[1]); - /* Set gloabl size */ - { - int2 gsize = split_kernel_global_size(kgbuffer, kernel_data, task); - - /* Make sure that set work size is a multiple of local - * work size dimensions. - */ - global_size[0] = round_up(gsize[0], local_size[0]); - global_size[1] = round_up(gsize[1], local_size[1]); - } - - num_global_elements = global_size[0] * global_size[1]; + int num_global_elements = global_size[0] * global_size[1]; assert(num_global_elements % WORK_POOL_SIZE == 0); /* Calculate max groups */ @@ -180,6 +174,9 @@ bool DeviceSplitKernel::path_trace(DeviceTask *task, ray_state.alloc(num_global_elements); } + /* Number of elements in the global state buffer */ + int num_global_elements = global_size[0] * global_size[1]; + #define ENQUEUE_SPLIT_KERNEL(name, global_size, local_size) \ if(device->have_error()) { \ return false; \ diff --git a/intern/cycles/device/device_split_kernel.h b/intern/cycles/device/device_split_kernel.h index 5af4367d1b6..622733b843f 100644 --- a/intern/cycles/device/device_split_kernel.h +++ b/intern/cycles/device/device_split_kernel.h @@ -92,10 +92,9 @@ private: /* Work pool with respect to each work group. */ device_only_memory work_pool_wgs; - /* Marked True in constructor and marked false at the end of path_trace(). */ - bool first_tile; - - /* Cached global size */ + /* Cached kernel-dependent data, initialized once. */ + bool kernel_data_initialized; + size_t local_size[2]; size_t global_size[2]; public: From 0bb0e07e6109fc474b8ff1a1d2422e40bd3bec40 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 9 Jan 2019 16:57:01 +0100 Subject: [PATCH 2/3] Fix Cycles viewport render doing some unnecessary work at the start. In some cases it would load adaptive kernels or even start rendering twice because the first time the scene was not fully synced yet. --- intern/cycles/blender/blender_session.cpp | 8 ++++---- intern/cycles/render/session.cpp | 10 +++++++--- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 30ae0bc813d..dfa92dd1bc7 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -110,9 +110,6 @@ BlenderSession::~BlenderSession() void BlenderSession::create() { create_session(); - - if(b_v3d) - session->start(); } void BlenderSession::create_session() @@ -784,7 +781,6 @@ void BlenderSession::synchronize() { free_session(); create_session(); - session->start(); return; } @@ -833,6 +829,10 @@ void BlenderSession::synchronize() /* reset time */ start_resize_time = 0.0; } + + /* Start rendering thread, if it's not running already. Do this + * after all scene data has been synced at least once. */ + session->start(); } bool BlenderSession::draw(int w, int h) diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index d6d0ffb4a6b..edbf9947b70 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -129,7 +129,9 @@ Session::~Session() void Session::start() { - session_thread = new thread(function_bind(&Session::run, this)); + if (!session_thread) { + session_thread = new thread(function_bind(&Session::run, this)); + } } bool Session::ready_to_reset() @@ -830,8 +832,10 @@ void Session::set_pause(bool pause_) void Session::wait() { - session_thread->join(); - delete session_thread; + if (session_thread) { + session_thread->join(); + delete session_thread; + } session_thread = NULL; } From 49e3f08815af17704e94c0e9eba0c6228a43972a Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Wed, 9 Jan 2019 16:53:57 +0100 Subject: [PATCH 3/3] Build Environment: install clang-format for macOS / Linux. It's already there for Windows. --- build_files/build_environment/cmake/harvest.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index f2e9c2fa8db..d79d91f2b90 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -102,7 +102,6 @@ function(harvest from to) FILES_MATCHING PATTERN ${pattern} PATTERN "pkgconfig" EXCLUDE PATTERN "cmake" EXCLUDE - PATTERN "clang" EXCLUDE PATTERN "__pycache__" EXCLUDE PATTERN "tests" EXCLUDE) endif() @@ -129,6 +128,7 @@ harvest(jemalloc/lib jemalloc/lib "*.a") harvest(jpg/include jpeg/include "*.h") harvest(jpg/lib jpeg/lib "libjpeg.a") harvest(lame/lib ffmpeg/lib "*.a") +harvest(clang/bin llvm/bin "clang-format") harvest(llvm/bin llvm/bin "llvm-config") harvest(llvm/lib llvm/lib "libLLVM*.a") harvest(ogg/lib ffmpeg/lib "*.a")