diff options
-rw-r--r-- | intern/cycles/blender/blender_python.cpp | 12 | ||||
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 3 | ||||
-rw-r--r-- | intern/cycles/kernel/kernel_subsurface.h | 8 | ||||
-rw-r--r-- | intern/cycles/render/light.cpp | 2 | ||||
-rw-r--r-- | source/blender/blenlib/intern/storage.c | 13 | ||||
-rw-r--r-- | source/blender/editors/render/render_internal.c | 7 |
6 files changed, 30 insertions, 15 deletions
diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp index 0daad310543..785ca6b4e01 100644 --- a/intern/cycles/blender/blender_python.cpp +++ b/intern/cycles/blender/blender_python.cpp @@ -35,6 +35,7 @@ #include "util/util_path.h" #include "util/util_string.h" #include "util/util_task.h" +#include "util/util_tbb.h" #include "util/util_types.h" #ifdef WITH_OSL @@ -288,9 +289,11 @@ static PyObject *render_func(PyObject * /*self*/, PyObject *args) RNA_pointer_create(NULL, &RNA_Depsgraph, (ID *)PyLong_AsVoidPtr(pydepsgraph), &depsgraphptr); BL::Depsgraph b_depsgraph(depsgraphptr); + /* Allow Blender to execute other Python scripts, and isolate TBB tasks so we + * don't get deadlocks with Blender threads accessing shared data like images. */ python_thread_state_save(&session->python_thread_state); - session->render(b_depsgraph); + tbb::this_task_arena::isolate([&] { session->render(b_depsgraph); }); python_thread_state_restore(&session->python_thread_state); @@ -327,7 +330,8 @@ static PyObject *bake_func(PyObject * /*self*/, PyObject *args) python_thread_state_save(&session->python_thread_state); - session->bake(b_depsgraph, b_object, pass_type, pass_filter, width, height); + tbb::this_task_arena::isolate( + [&] { session->bake(b_depsgraph, b_object, pass_type, pass_filter, width, height); }); python_thread_state_restore(&session->python_thread_state); @@ -373,7 +377,7 @@ static PyObject *reset_func(PyObject * /*self*/, PyObject *args) python_thread_state_save(&session->python_thread_state); - session->reset_session(b_data, b_depsgraph); + tbb::this_task_arena::isolate([&] { session->reset_session(b_data, b_depsgraph); }); python_thread_state_restore(&session->python_thread_state); @@ -395,7 +399,7 @@ static PyObject *sync_func(PyObject * /*self*/, PyObject *args) python_thread_state_save(&session->python_thread_state); - session->synchronize(b_depsgraph); + tbb::this_task_arena::isolate([&] { session->synchronize(b_depsgraph); }); python_thread_state_restore(&session->python_thread_state); diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index ab081ada3dc..89854f6a0e5 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -237,6 +237,9 @@ void BlenderSession::reset_session(BL::BlendData &b_data, BL::Depsgraph &b_depsg sync->sync_recalc(b_depsgraph, b_v3d); } + BL::Object b_camera_override(b_engine.camera_override()); + sync->sync_camera(b_render, b_camera_override, width, height, ""); + BL::SpaceView3D b_null_space_view3d(PointerRNA_NULL); BL::RegionView3D b_null_region_view3d(PointerRNA_NULL); BufferParams buffer_params = BlenderSync::get_buffer_params(b_render, diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h index 0a56f867158..b70df747a73 100644 --- a/intern/cycles/kernel/kernel_subsurface.h +++ b/intern/cycles/kernel/kernel_subsurface.h @@ -606,10 +606,10 @@ ccl_device_noinline t = ray->t; } else if (bounce == 0) { - /* Restore original position if nothing was hit after the first bounce. - * Otherwise if the ray_offset() to avoid self-intersection is relatively - * large compared to the scattering radius, we go never backup high enough - * to exit the surface. */ + /* Restore original position if nothing was hit after the first bounce, + * without the ray_offset() that was added to avoid self-intersection. + * Otherwise if that offset is relatively large compared to the scattering + * radius, we never go back up high enough to exit the surface. */ ray->P = sd->P; } diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp index 9b975daff0b..5290d68e75a 100644 --- a/intern/cycles/render/light.cpp +++ b/intern/cycles/render/light.cpp @@ -865,7 +865,7 @@ void LightManager::device_update_points(Device *, DeviceScene *dscene, Scene *sc const float min_spread_angle = 1.0f * M_PI_F / 180.0f; const float spread_angle = 0.5f * (M_PI_F - max(light->spread, min_spread_angle)); /* Normalization computed using: - * integrate cos(x) (1 - tan(x) * tan(a)) * sin(x) from x = a to pi/2. */ + * integrate cos(x) * (1 - tan(x) * tan(a)) * sin(x) from x = 0 to pi/2 - a. */ const float tan_spread = tanf(spread_angle); const float normalize_spread = 2.0f / (2.0f + (2.0f * spread_angle - M_PI_F) * tan_spread); diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c index 287334a34ee..cb2634e6fda 100644 --- a/source/blender/blenlib/intern/storage.c +++ b/source/blender/blenlib/intern/storage.c @@ -299,12 +299,16 @@ bool BLI_file_alias_target(const char *filepath, return false; } - IShellLinkW *Shortcut = NULL; - bool success = false; - CoInitializeEx(NULL, COINIT_MULTITHREADED); + HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); + if (FAILED(hr)) { + return false; + } - HRESULT hr = CoCreateInstance( + IShellLinkW *Shortcut = NULL; + hr = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, &IID_IShellLinkW, (LPVOID *)&Shortcut); + + bool success = false; if (SUCCEEDED(hr)) { IPersistFile *PersistFile; hr = Shortcut->lpVtbl->QueryInterface(Shortcut, &IID_IPersistFile, (LPVOID *)&PersistFile); @@ -328,6 +332,7 @@ bool BLI_file_alias_target(const char *filepath, Shortcut->lpVtbl->Release(Shortcut); } + CoUninitialize(); return (success && r_targetpath[0]); # else UNUSED_VARS(r_targetpath, filepath); diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 0b5a8db0115..0bec509cd7e 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -574,9 +574,12 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec return; } if (rj->image_outdated) { - /* update entire render */ + /* Free all render buffer caches when switching slots, with lock to ensure main + * thread is not drawing the buffer at the same time. */ rj->image_outdated = false; - BKE_image_signal(rj->main, ima, NULL, IMA_SIGNAL_COLORMANAGE); + ibuf = BKE_image_acquire_ibuf(ima, &rj->iuser, &lock); + BKE_image_free_buffers(ima); + BKE_image_release_ibuf(ima, ibuf, lock); *(rj->do_update) = true; return; } |