diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-05-04 17:27:31 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-05-04 17:28:22 +0300 |
commit | a523dfd2fd8c19ca0fbf9891a3be0988945d585f (patch) | |
tree | d2031a29a8422202c2bc55b1965e9f99c8dd5a10 | |
parent | b180900e52a5e662faf354d6343cb2ad620d9866 (diff) |
Fix T51412: Instant crash with texture plugged into the Displacement output
The issue was caused by unlimited textures commit, root of the issue is that
displacement code updates some of the image slots directly, so it needs to
ensure device vectors are all proper size.
-rw-r--r-- | intern/cycles/render/image.cpp | 27 | ||||
-rw-r--r-- | intern/cycles/render/image.h | 1 | ||||
-rw-r--r-- | intern/cycles/render/mesh.cpp | 1 |
3 files changed, 20 insertions, 9 deletions
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index d26ea3e14e0..b66d694c82a 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -949,16 +949,8 @@ void ImageManager::device_free_image(Device *device, DeviceScene *dscene, ImageD } } -void ImageManager::device_update(Device *device, - DeviceScene *dscene, - Scene *scene, - Progress& progress) +void ImageManager::device_prepare_update(DeviceScene *dscene) { - if(!need_update) - return; - - TaskPool pool; - for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) { switch(type) { case IMAGE_DATA_TYPE_FLOAT4: @@ -986,6 +978,23 @@ void ImageManager::device_update(Device *device, dscene->tex_half_image.resize(tex_num_images[IMAGE_DATA_TYPE_HALF]); break; } + } +} + +void ImageManager::device_update(Device *device, + DeviceScene *dscene, + Scene *scene, + Progress& progress) +{ + if(!need_update) { + return; + } + + /* Make sure arrays are proper size. */ + device_prepare_update(dscene); + + TaskPool pool; + for(int type = 0; type < IMAGE_DATA_NUM_TYPES; type++) { for(size_t slot = 0; slot < images[type].size(); slot++) { if(!images[type][slot]) continue; diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h index 5550d019868..77214bf25bc 100644 --- a/intern/cycles/render/image.h +++ b/intern/cycles/render/image.h @@ -59,6 +59,7 @@ public: bool use_alpha); ImageDataType get_image_metadata(const string& filename, void *builtin_data, bool& is_linear); + void device_prepare_update(DeviceScene *dscene); void device_update(Device *device, DeviceScene *dscene, Scene *scene, diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp index a4dc06c4345..33d1936659b 100644 --- a/intern/cycles/render/mesh.cpp +++ b/intern/cycles/render/mesh.cpp @@ -1944,6 +1944,7 @@ void MeshManager::device_update_displacement_images(Device *device, } } } + image_manager->device_prepare_update(dscene); foreach(int slot, bump_images) { pool.push(function_bind(&ImageManager::device_update_slot, image_manager, |