diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2017-08-08 20:16:25 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2017-08-08 20:16:25 +0300 |
commit | 8563494823bd3ad9643e0e05c88eee7763196be8 (patch) | |
tree | 17b0b19d91f05efe14d75c1d6c3689e04a1bb177 | |
parent | e8b6bcd65c946f5eb9623638eebcd93ed74d9358 (diff) | |
parent | b6d7cdd3cee9312156e20783248a3b12420b7a53 (diff) |
Merge branch 'master' into blender2.8
Conflicts:
source/blender/modifiers/intern/MOD_meshsequencecache.c
-rw-r--r-- | intern/cycles/device/opencl/opencl_base.cpp | 25 | ||||
-rw-r--r-- | intern/cycles/render/image.cpp | 59 | ||||
-rw-r--r-- | intern/cycles/render/image.h | 5 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 1 | ||||
-rw-r--r-- | source/blender/modifiers/intern/MOD_meshsequencecache.c | 26 |
5 files changed, 61 insertions, 55 deletions
diff --git a/intern/cycles/device/opencl/opencl_base.cpp b/intern/cycles/device/opencl/opencl_base.cpp index 63b5e004b7d..d3f0172a7b6 100644 --- a/intern/cycles/device/opencl/opencl_base.cpp +++ b/intern/cycles/device/opencl/opencl_base.cpp @@ -29,6 +29,11 @@ CCL_NAMESPACE_BEGIN +struct texture_slot_t { + string name; + int slot; +}; + bool OpenCLDeviceBase::opencl_error(cl_int err) { if(err != CL_SUCCESS) { @@ -511,7 +516,9 @@ void OpenCLDeviceBase::tex_alloc(const char *name, memory_manager.alloc(name, mem); - textures[name] = {&mem, interpolation, extension}; + textures[name] = (Texture){.mem = &mem, + .interpolation = interpolation, + .extension = extension}; textures_need_update = true; } @@ -609,16 +616,12 @@ void OpenCLDeviceBase::flush_texture_buffers() /* Setup slots for textures. */ int num_slots = 0; - struct texture_slot_t { - string name; - int slot; - }; - vector<texture_slot_t> texture_slots; -#define KERNEL_TEX(type, ttype, name) \ - if(textures.find(#name) != textures.end()) { \ - texture_slots.push_back({#name, num_slots}); \ +#define KERNEL_TEX(type, ttype, slot_name) \ + if(textures.find(#slot_name) != textures.end()) { \ + texture_slots.push_back((texture_slot_t){.name = #slot_name, \ + .slot = num_slots}); \ } \ num_slots++; #include "kernel/kernel_textures.h" @@ -632,7 +635,9 @@ void OpenCLDeviceBase::flush_texture_buffers() int pos = name.rfind("_"); int id = atoi(name.data() + pos + 1); - texture_slots.push_back({name, num_data_slots + id}); + texture_slots.push_back((texture_slot_t){ + .name = name, + .slot = num_data_slots + id}); num_slots = max(num_slots, num_data_slots + id + 1); } diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index 80ec77f8b4a..cfdf26c6787 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -716,12 +716,7 @@ void ImageManager::device_load_image(Device *device, if(dscene->tex_float4_image[slot] == NULL) dscene->tex_float4_image[slot] = new device_vector<float4>(); device_vector<float4>& tex_img = *dscene->tex_float4_image[slot]; - - if(tex_img.device_pointer) { - thread_scoped_lock device_lock(device_mutex); - device->tex_free(tex_img); - } - + device_tex_free_safe(device, tex_img); if(!file_load_image<TypeDesc::FLOAT, float>(img, type, texture_limit, @@ -748,12 +743,7 @@ void ImageManager::device_load_image(Device *device, if(dscene->tex_float_image[slot] == NULL) dscene->tex_float_image[slot] = new device_vector<float>(); device_vector<float>& tex_img = *dscene->tex_float_image[slot]; - - if(tex_img.device_pointer) { - thread_scoped_lock device_lock(device_mutex); - device->tex_free(tex_img); - } - + device_tex_free_safe(device, tex_img); if(!file_load_image<TypeDesc::FLOAT, float>(img, type, texture_limit, @@ -777,12 +767,7 @@ void ImageManager::device_load_image(Device *device, if(dscene->tex_byte4_image[slot] == NULL) dscene->tex_byte4_image[slot] = new device_vector<uchar4>(); device_vector<uchar4>& tex_img = *dscene->tex_byte4_image[slot]; - - if(tex_img.device_pointer) { - thread_scoped_lock device_lock(device_mutex); - device->tex_free(tex_img); - } - + device_tex_free_safe(device, tex_img); if(!file_load_image<TypeDesc::UINT8, uchar>(img, type, texture_limit, @@ -809,12 +794,7 @@ void ImageManager::device_load_image(Device *device, if(dscene->tex_byte_image[slot] == NULL) dscene->tex_byte_image[slot] = new device_vector<uchar>(); device_vector<uchar>& tex_img = *dscene->tex_byte_image[slot]; - - if(tex_img.device_pointer) { - thread_scoped_lock device_lock(device_mutex); - device->tex_free(tex_img); - } - + device_tex_free_safe(device, tex_img); if(!file_load_image<TypeDesc::UINT8, uchar>(img, type, texture_limit, @@ -837,12 +817,7 @@ void ImageManager::device_load_image(Device *device, if(dscene->tex_half4_image[slot] == NULL) dscene->tex_half4_image[slot] = new device_vector<half4>(); device_vector<half4>& tex_img = *dscene->tex_half4_image[slot]; - - if(tex_img.device_pointer) { - thread_scoped_lock device_lock(device_mutex); - device->tex_free(tex_img); - } - + device_tex_free_safe(device, tex_img); if(!file_load_image<TypeDesc::HALF, half>(img, type, texture_limit, @@ -868,12 +843,7 @@ void ImageManager::device_load_image(Device *device, if(dscene->tex_half_image[slot] == NULL) dscene->tex_half_image[slot] = new device_vector<half>(); device_vector<half>& tex_img = *dscene->tex_half_image[slot]; - - if(tex_img.device_pointer) { - thread_scoped_lock device_lock(device_mutex); - device->tex_free(tex_img); - } - + device_tex_free_safe(device, tex_img); if(!file_load_image<TypeDesc::HALF, half>(img, type, texture_limit, @@ -957,11 +927,7 @@ void ImageManager::device_free_image(Device *device, DeviceScene *dscene, ImageD tex_img = NULL; } if(tex_img) { - if(tex_img->device_pointer) { - thread_scoped_lock device_lock(device_mutex); - device->tex_free(*tex_img); - } - + device_tex_free_safe(device, *tex_img); delete tex_img; } } @@ -1097,5 +1063,16 @@ void ImageManager::device_free(Device *device, DeviceScene *dscene) dscene->tex_half_image.clear(); } +void ImageManager::device_tex_free_safe(Device *device, device_memory& mem) +{ + if(mem.device_pointer) { + thread_scoped_lock device_lock(device_mutex); + device->tex_free(mem); + } + else { + device->tex_free(mem); + } +} + CCL_NAMESPACE_END diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h index c86d1cbedbf..abd1abbd729 100644 --- a/intern/cycles/render/image.h +++ b/intern/cycles/render/image.h @@ -160,6 +160,11 @@ private: DeviceScene *dscene, ImageDataType type, int slot); + + /* Will do locking when needed and make sure possible memory manager from + * the device implementation is aware of freed texture. + */ + void device_tex_free_safe(Device *device, device_memory& mem); }; CCL_NAMESPACE_END diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index f2bdbe3865b..d2ab88c9c07 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -2387,7 +2387,6 @@ static void ui_litem_estimate_box(uiLayout *litem) uiStyle *style = litem->root->style; ui_litem_estimate_column(litem, true); - litem->item.flag &= ~UI_ITEM_MIN; litem->w += 2 * style->boxspace; litem->h += 2 * style->boxspace; } diff --git a/source/blender/modifiers/intern/MOD_meshsequencecache.c b/source/blender/modifiers/intern/MOD_meshsequencecache.c index 5d623295edf..5c2f1aba8e1 100644 --- a/source/blender/modifiers/intern/MOD_meshsequencecache.c +++ b/source/blender/modifiers/intern/MOD_meshsequencecache.c @@ -25,12 +25,14 @@ */ #include "DNA_cachefile_types.h" +#include "DNA_mesh_types.h" #include "DNA_modifier_types.h" #include "DNA_object_types.h" #include "DNA_scene_types.h" #include "BKE_cachefile.h" #include "BKE_DerivedMesh.h" +#include "BKE_cdderivedmesh.h" #include "BKE_global.h" #include "BKE_library.h" #include "BKE_library_query.h" @@ -94,11 +96,15 @@ static bool isDisabled(ModifierData *md, int UNUSED(useRenderParams)) static DerivedMesh *applyModifier(ModifierData *md, struct EvaluationContext *UNUSED(eval_ctx), Object *ob, DerivedMesh *dm, - ModifierApplyFlag flag) + ModifierApplyFlag UNUSED(flag)) { #ifdef WITH_ALEMBIC MeshSeqCacheModifierData *mcmd = (MeshSeqCacheModifierData *) md; + /* Only used to check wehther we are operating on org data or not... */ + Mesh *me = (ob->type == OB_MESH) ? ob->data : NULL; + DerivedMesh *org_dm = dm; + Scene *scene = md->scene; const float frame = BKE_scene_frame_get(scene); const float time = BKE_cachefile_time_offset(mcmd->cache_file, frame, FPS); @@ -120,6 +126,16 @@ static DerivedMesh *applyModifier(ModifierData *md, struct EvaluationContext *UN } } + if (me != NULL) { + MVert *mvert = dm->getVertArray(dm); + MEdge *medge = dm->getEdgeArray(dm); + MPoly *mpoly = dm->getPolyArray(dm); + if ((me->mvert == mvert) || (me->medge == medge) || (me->mpoly == mpoly)) { + /* We need to duplicate data here, otherwise we'll modify org mesh, see T51701. */ + dm = CDDM_copy(dm); + } + } + DerivedMesh *result = ABC_read_mesh(mcmd->reader, ob, dm, @@ -131,11 +147,15 @@ static DerivedMesh *applyModifier(ModifierData *md, struct EvaluationContext *UN modifier_setError(md, "%s", err_str); } + if (!ELEM(result, NULL, dm) && (dm != org_dm)) { + dm->release(dm); + dm = org_dm; + } + return result ? result : dm; - UNUSED_VARS(flag); #else return dm; - UNUSED_VARS(md, ob, flag); + UNUSED_VARS(md, ob); #endif } |