Files
test2/source/blender/compositor/operations/COM_MultilayerImageOperation.cc
Sergey Sharybin a12bd38853 Fix: Non-thread-safe access to metadata in Compositor
Image's render result might get freed from another thread while the
compositor is running.

Add an utility function which invokes callback on the image's stamp
data from a thread-guarded block.

Ref #118337, #121761

Pull Request: https://projects.blender.org/blender/blender/pulls/121907
2024-05-21 17:29:59 +02:00

62 lines
1.7 KiB
C++

/* SPDX-FileCopyrightText: 2011 Blender Authors
*
* SPDX-License-Identifier: GPL-2.0-or-later */
#include "COM_MultilayerImageOperation.h"
#include "BLI_string.h"
#include "IMB_interp.hh"
namespace blender::compositor {
ImBuf *MultilayerBaseOperation::get_im_buf()
{
if (rd_ == nullptr || image_ == nullptr) {
return nullptr;
}
ImBuf *ibuf = BKE_image_acquire_multilayer_view_ibuf(
*rd_, *image_, image_user_, pass_name_.c_str(), view_name_);
if (ibuf == nullptr || (ibuf->byte_buffer.data == nullptr && ibuf->float_buffer.data == nullptr))
{
BKE_image_release_ibuf(image_, ibuf, nullptr);
return nullptr;
}
return ibuf;
}
void MultilayerBaseOperation::update_memory_buffer_partial(MemoryBuffer *output,
const rcti &area,
Span<MemoryBuffer *> /*inputs*/)
{
if (buffer_) {
output->copy_from(buffer_, area);
}
else {
output->clear();
}
}
std::unique_ptr<MetaData> MultilayerColorOperation::get_meta_data()
{
BLI_assert(buffer_);
if (!image_) {
return nullptr;
}
MetaDataExtractCallbackData callback_data = {nullptr};
std::string full_layer_name = layer_name_ + "." + pass_name_;
blender::StringRef cryptomatte_layer_name =
blender::bke::cryptomatte::BKE_cryptomatte_extract_layer_name(full_layer_name);
callback_data.set_cryptomatte_keys(cryptomatte_layer_name);
BKE_image_multilayer_stamp_info_callback(
&callback_data, *image_, MetaDataExtractCallbackData::extract_cryptomatte_meta_data, false);
return std::move(callback_data.meta_data);
}
} // namespace blender::compositor