7#ifdef WITH_OPENIMAGEDENOISE
9# include <OpenImageDenoise/oidn.hpp>
17#ifdef WITH_OPENIMAGEDENOISE
21# elif defined(__aarch64__) || defined(_M_ARM64)
33#ifdef WITH_OPENIMAGEDENOISE
34static bool oidn_progress_monitor_function(
void *user_ptr,
double )
36 const NodeOperation *operation =
static_cast<const NodeOperation *
>(user_ptr);
37 return !operation->is_braked();
43#ifdef WITH_OPENIMAGEDENOISE
44 oidn::DeviceRef device_;
46 bool initialized_ =
false;
50#ifdef WITH_OPENIMAGEDENOISE
63 device_ = oidn::newDevice(oidn::DeviceType::CPU);
64 device_.set(
"setAffinity",
false);
66 filter_ = device_.newFilter(
"RT");
67 filter_.setProgressMonitorFunction(oidn_progress_monitor_function, operation);
91 template<
typename T>
void set(
const StringRef option_name, T value)
141 switch (settings->prefilter) {
165 output->fill(output->get_rect(), input_color->
get_elem(0, 0));
174 filter.set_image(
"color", input_color);
176 filter.set_image(
"albedo", input_albedo);
178 filter.set_image(
"normal", input_normal);
184 filter.set(
"hdr", settings->hdr);
185 filter.set(
"srgb",
false);
190 filter.deinit_and_unlock_denoiser();
220 if (input->is_a_single_elem()) {
221 copy_v4_v4(output->get_elem(0, 0), input->get_elem(0, 0));
228 filter.init_and_lock_denoiser(
this, output);
229 filter.set_image(image_name_, input);
231 filter.deinit_and_unlock_denoiser();
239 this->generate_denoise(output, inputs[0]);
MINLINE void copy_v4_v4(float r[4], const float a[4])
int BLI_cpu_support_sse42(void)
#define BLI_MUTEX_INITIALIZER
void BLI_mutex_lock(ThreadMutex *mutex)
void BLI_mutex_unlock(ThreadMutex *mutex)
@ CMP_NODE_DENOISE_PREFILTER_FAST
@ CMP_NODE_DENOISE_PREFILTER_NONE
@ CMP_NODE_DENOISE_PREFILTER_ACCURATE
constexpr const char * data() const
void get_area_of_interest(int input_idx, const rcti &output_area, rcti &r_input_area) override
Get input operation area being read by this operation on rendering given output area.
void init_and_lock_denoiser(NodeOperation *, MemoryBuffer *)
void set(const StringRef, T)
void deinit_and_unlock_denoiser()
void set_image(const StringRef, MemoryBuffer *)
void update_memory_buffer(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
void generate_denoise(MemoryBuffer *output, MemoryBuffer *input_color, MemoryBuffer *input_normal, MemoryBuffer *input_albedo, const NodeDenoise *settings)
void hash_output_params() override
void hash_output_params() override
DenoisePrefilterOperation(DataType data_type)
void update_memory_buffer(MemoryBuffer *output, const rcti &area, Span< MemoryBuffer * > inputs) override
a MemoryBuffer contains access to the data
const rcti & get_rect() const
get the rect of this MemoryBuffer
const int get_width() const
get the width of this MemoryBuffer
const int get_height() const
get the height of this MemoryBuffer
float * get_buffer()
get the data of this MemoryBuffer
bool is_a_single_elem() const
float * get_elem(int x, int y)
uint8_t get_elem_bytes_len() const
NodeOperation contains calculation logic.
void add_output_socket(DataType datatype)
NodeOperationFlags flags_
const rcti & get_canvas() const
void add_input_socket(DataType datatype, ResizeMode resize_mode=ResizeMode::Center)
void hash_params(T1 param1, T2 param2)
DataType
possible data types for sockets
@ Vector
Vector data type.
DO_INLINE void filter(lfVector *V, fmatrix3x3 *S)
bool COM_is_denoise_supported()
constexpr int COM_DATA_TYPE_VALUE_CHANNELS
static bool are_guiding_passes_noise_free(const NodeDenoise *settings)
DepsgraphFromCollectionIDsFilter filter_