5#ifdef WITH_OPENIMAGEDENOISE
24# include <OpenImageDenoise/oidn.hpp>
32DenoisedAuxiliaryPassKey::DenoisedAuxiliaryPassKey(
const DenoisedAuxiliaryPassType type,
33 const oidn::Quality quality)
34 : type(type), quality(quality)
38uint64_t DenoisedAuxiliaryPassKey::hash()
const
43bool operator==(
const DenoisedAuxiliaryPassKey &a,
const DenoisedAuxiliaryPassKey &
b)
45 return a.type ==
b.type && a.quality ==
b.quality;
57static bool oidn_progress_monitor_function(
void *user_ptr,
double )
59 const Context *
context =
static_cast<const Context *
>(user_ptr);
63static const char *get_pass_name(
const DenoisedAuxiliaryPassType type)
66 case DenoisedAuxiliaryPassType::Albedo:
68 case DenoisedAuxiliaryPassType::Normal:
76DenoisedAuxiliaryPass::DenoisedAuxiliaryPass(Context &context,
78 const DenoisedAuxiliaryPassType type,
79 const oidn::Quality quality)
87 this->denoised_buffer =
static_cast<float *
>(
MEM_dupallocN(pass.cpu_data().data()));
90 const int width = pass.domain().size.x;
91 const int height = pass.domain().size.y;
95 const int channels_count =
context.use_gpu() ?
97 pass.channels_count();
98 const int pixel_stride =
sizeof(
float) * channels_count;
100 oidn::DeviceRef device = create_oidn_device(context);
103 const int64_t buffer_size =
int64_t(width) * height * channels_count;
105 oidn::BufferRef buffer = create_oidn_buffer(device, buffer_span);
108 oidn::FilterRef
filter = device.newFilter(
"RT");
109 const char *pass_name = get_pass_name(type);
110 filter.setImage(pass_name, buffer, oidn::Format::Float3, width, height, 0, pixel_stride);
111 filter.setImage(
"output", buffer, oidn::Format::Float3, width, height, 0, pixel_stride);
112 filter.set(
"quality", quality);
113 filter.setProgressMonitorFunction(oidn_progress_monitor_function, &context);
117 if (buffer.getStorage() != oidn::Storage::Host) {
118 buffer.read(0, buffer_size *
sizeof(
float), this->denoised_buffer);
122DenoisedAuxiliaryPass::~DenoisedAuxiliaryPass()
131DenoisedAuxiliaryPass &DenoisedAuxiliaryPassContainer::get(Context &context,
133 const DenoisedAuxiliaryPassType type,
134 const oidn::Quality quality)
136 const DenoisedAuxiliaryPassKey key(type, quality);
138 return *map_.lookup_or_add_cb(key, [&]() {
139 return std::make_unique<DenoisedAuxiliaryPass>(context, pass, type, quality);
#define BLI_assert_unreachable()
@ GPU_BARRIER_TEXTURE_UPDATE
void GPU_memory_barrier(GPUBarrier barrier)
size_t GPU_texture_component_len(blender::gpu::TextureFormat format)
blender::gpu::TextureFormat GPU_texture_format(const blender::gpu::Texture *texture)
void * GPU_texture_read(blender::gpu::Texture *texture, eGPUDataFormat data_format, int mip_level)
Read Guarded memory(de)allocation.
bool operator==(const AssetWeakReference &a, const AssetWeakReference &b)
unsigned long long int uint64_t
void * MEM_dupallocN(const void *vmemh)
void MEM_freeN(void *vmemh)
int context(const bContext *C, const char *member, bContextDataResult *result)
uint64_t get_default_hash(const T &v, const Args &...args)