diff --git a/intern/cycles/scene/image.cpp b/intern/cycles/scene/image.cpp index 1f4d129950d142a9867e830df291a48a8890250d..5559bc8c29b92817e1572ba356d55512d6f1287f 100644 --- a/intern/cycles/scene/image.cpp +++ b/intern/cycles/scene/image.cpp @@ -122,7 +122,7 @@ ImageMetaData ImageHandle::metadata() return ImageMetaData(); } - ImageManager::Image *img = manager->images[tile_slots.front()]; + ImageManager::Image *img = manager->get_image_slot(tile_slots.front()); manager->load_image_metadata(img); return img->metadata; } @@ -134,7 +134,7 @@ int ImageHandle::svm_slot(const int tile_index) const } if (manager->osl_texture_system) { - ImageManager::Image *img = manager->images[tile_slots[tile_index]]; + ImageManager::Image *img = manager->get_image_slot(tile_slots[tile_index]); if (!img->loader->osl_filepath().empty()) { return -1; } @@ -153,12 +153,12 @@ vector<int4> ImageHandle::get_svm_slots() const int4 node; size_t slot = tile_slots[2 * i]; - node.x = manager->images[slot]->loader->get_tile_number(); + node.x = manager->get_image_slot(slot)->loader->get_tile_number(); node.y = slot; if ((2 * i + 1) < tile_slots.size()) { slot = tile_slots[2 * i + 1]; - node.z = manager->images[slot]->loader->get_tile_number(); + node.z = manager->get_image_slot(slot)->loader->get_tile_number(); node.w = slot; } else { @@ -178,8 +178,8 @@ device_texture *ImageHandle::image_memory(const int tile_index) const return NULL; } - ImageManager::Image *img = manager->images[tile_slots[tile_index]]; - return img ? img->mem : NULL; + ImageManager::Image *img = manager->get_image_slot(tile_slots[tile_index]); + return img ? img->mem : nullptr; } VDBImageLoader *ImageHandle::vdb_loader(const int tile_index) const @@ -188,7 +188,7 @@ VDBImageLoader *ImageHandle::vdb_loader(const int tile_index) const return NULL; } - ImageManager::Image *img = manager->images[tile_slots[tile_index]]; + ImageManager::Image *img = manager->get_image_slot(tile_slots[tile_index]); if (img == NULL) { return NULL; @@ -508,6 +508,13 @@ void ImageManager::remove_image_user(size_t slot) } } +ImageManager::Image *ImageManager::get_image_slot(const size_t slot) +{ + /* Need mutex lock, images vector might get resized by another thread. */ + const thread_scoped_lock device_lock(images_mutex); + return images[slot]; +} + static bool image_associate_alpha(ImageManager::Image *img) { /* For typical RGBA images we let OIIO convert to associated alpha, diff --git a/intern/cycles/scene/image.h b/intern/cycles/scene/image.h index ee919aaa7691785fe6c434e1b884dbe0ec08689e..d63db7fb7db1c77a36d40c05b8a125b3827a71cb 100644 --- a/intern/cycles/scene/image.h +++ b/intern/cycles/scene/image.h @@ -227,6 +227,7 @@ class ImageManager { size_t add_image_slot(ImageLoader *loader, const ImageParams ¶ms, const bool builtin); void add_image_user(size_t slot); void remove_image_user(size_t slot); + Image *get_image_slot(const size_t slot); void load_image_metadata(Image *img);