Skip to content
Snippets Groups Projects
Commit 0a569f13 authored by Brecht Van Lommel's avatar Brecht Van Lommel
Browse files

Fix: Cycles random crash loading images

Add mutex lock to avoid accessing vector while it's getting resized.

Found through a flaky test. Thanks Sergey and Alaska for the help
investigating this.

Pull Request: https://projects.blender.org/blender/blender/pulls/132811
parent db795c5a
No related branches found
No related tags found
No related merge requests found
......@@ -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,
......
......@@ -227,6 +227,7 @@ class ImageManager {
size_t add_image_slot(ImageLoader *loader, const ImageParams &params, 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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment