[Bf-blender-cvs] [14b32883b20] cycles-x: Cycles X: Ensure OptiX denoiser setup and usage uses the same stream
Sergey Sharybin
noreply at git.blender.org
Tue Jun 29 18:13:11 CEST 2021
Commit: 14b32883b20173fca0e403bc7abb6e9c08ac5cf2
Author: Sergey Sharybin
Date: Tue Jun 29 16:39:11 2021 +0200
Branches: cycles-x
https://developer.blender.org/rB14b32883b20173fca0e403bc7abb6e9c08ac5cf2
Cycles X: Ensure OptiX denoiser setup and usage uses the same stream
Avoids possible access of denoiser non-initialized state without
explicit sync.
Differential Revision: https://developer.blender.org/D11741
===================================================================
M intern/cycles/device/optix/device_impl.cpp
M intern/cycles/device/optix/device_impl.h
===================================================================
diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp
index 44f7964304d..e4b78ece648 100644
--- a/intern/cycles/device/optix/device_impl.cpp
+++ b/intern/cycles/device/optix/device_impl.cpp
@@ -41,8 +41,8 @@
CCL_NAMESPACE_BEGIN
-OptiXDevice::Denoiser::Denoiser(CUDADevice *device)
- : device(device), state(device, "__denoiser_state")
+OptiXDevice::Denoiser::Denoiser(OptiXDevice *device)
+ : device(device), queue(device), state(device, "__denoiser_state")
{
}
@@ -542,8 +542,7 @@ static int denoise_buffer_pass_stride(const DenoiseParams ¶ms)
class OptiXDevice::DenoiseContext {
public:
explicit DenoiseContext(OptiXDevice *device, const DeviceDenoiseTask &task)
- : queue(device),
- denoise_params(task.params),
+ : denoise_params(task.params),
render_buffers(task.render_buffers),
buffer_params(task.buffer_params),
input_rgb(device, "denoiser input rgb"),
@@ -555,8 +554,6 @@ class OptiXDevice::DenoiseContext {
pass_sample_count = buffer_params.get_pass_offset(PASS_SAMPLE_COUNT);
}
- OptiXDeviceQueue queue;
-
const DenoiseParams &denoise_params;
RenderBuffers *render_buffers;
@@ -635,10 +632,10 @@ void OptiXDevice::denoise_pass(DenoiseContext &context, PassType pass_type)
return;
}
- context.queue.synchronize();
+ denoiser_.queue.synchronize();
}
-void OptiXDevice::denoise_read_input_pixels(DenoiseContext &context, const DenoisePass &pass) const
+void OptiXDevice::denoise_read_input_pixels(DenoiseContext &context, const DenoisePass &pass)
{
PassAccessor::PassAccessInfo pass_access_info;
pass_access_info.type = pass.type;
@@ -653,7 +650,8 @@ void OptiXDevice::denoise_read_input_pixels(DenoiseContext &context, const Denoi
/* TODO(sergey): Consider adding support of actual exposure, to avoid clamping in extreme cases.
*/
- const PassAccessorGPU pass_accessor(&context.queue, pass_access_info, 1.0f, context.num_samples);
+ const PassAccessorGPU pass_accessor(
+ &denoiser_.queue, pass_access_info, 1.0f, context.num_samples);
PassAccessor::Destination destination(pass_access_info.type);
destination.d_pixels = context.input_rgb.device_pointer;
@@ -692,7 +690,7 @@ bool OptiXDevice::denoise_filter_convert_to_rgb(DenoiseContext &context, const D
const_cast<int *>(&context.num_samples),
const_cast<int *>(&context.pass_sample_count)};
- return context.queue.enqueue(DEVICE_KERNEL_FILTER_CONVERT_TO_RGB, work_size, args);
+ return denoiser_.queue.enqueue(DEVICE_KERNEL_FILTER_CONVERT_TO_RGB, work_size, args);
}
bool OptiXDevice::denoise_filter_convert_from_rgb(DenoiseContext &context, const DenoisePass &pass)
@@ -715,7 +713,7 @@ bool OptiXDevice::denoise_filter_convert_from_rgb(DenoiseContext &context, const
const_cast<int *>(&pass.denoised_offset),
const_cast<int *>(&context.pass_sample_count)};
- return context.queue.enqueue(DEVICE_KERNEL_FILTER_CONVERT_FROM_RGB, work_size, args);
+ return denoiser_.queue.enqueue(DEVICE_KERNEL_FILTER_CONVERT_FROM_RGB, work_size, args);
}
bool OptiXDevice::denoise_ensure(const DeviceDenoiseTask &task)
@@ -808,7 +806,7 @@ bool OptiXDevice::denoise_configure_if_needed(const DeviceDenoiseTask &task)
/* Initialize denoiser state for the current tile size. */
const OptixResult result = optixDenoiserSetup(denoiser_.optix_denoiser,
- 0,
+ denoiser_.queue.stream(),
task.buffer_params.width,
task.buffer_params.height,
denoiser_.state.device_pointer,
@@ -868,7 +866,7 @@ bool OptiXDevice::denoise_run(DenoiseContext &context)
guide_layers.normal = input_layers[2];
optix_assert(optixDenoiserInvoke(denoiser_.optix_denoiser,
- context.queue.stream(),
+ denoiser_.queue.stream(),
¶ms,
denoiser_.state.device_pointer,
denoiser_.scratch_offset,
@@ -883,7 +881,7 @@ bool OptiXDevice::denoise_run(DenoiseContext &context)
const int input_passes = denoise_buffer_num_passes(context.denoise_params);
optix_assert(optixDenoiserInvoke(denoiser_.optix_denoiser,
- context.queue.stream(),
+ denoiser_.queue.stream(),
¶ms,
denoiser_.state.device_pointer,
denoiser_.scratch_offset,
diff --git a/intern/cycles/device/optix/device_impl.h b/intern/cycles/device/optix/device_impl.h
index 6eeab6e6b58..caab62c4f05 100644
--- a/intern/cycles/device/optix/device_impl.h
+++ b/intern/cycles/device/optix/device_impl.h
@@ -85,10 +85,11 @@ class OptiXDevice : public CUDADevice {
class Denoiser {
public:
- explicit Denoiser(CUDADevice *device);
+ explicit Denoiser(OptiXDevice *device);
~Denoiser();
- CUDADevice *device;
+ OptiXDevice *device;
+ OptiXDeviceQueue queue;
OptixDenoiser optix_denoiser = nullptr;
@@ -148,7 +149,7 @@ class OptiXDevice : public CUDADevice {
void denoise_pass(DenoiseContext &context, PassType pass_type);
/* Read pixels from the input noisy image and store scaled result in the given memory. */
- void denoise_read_input_pixels(DenoiseContext &context, const DenoisePass &pass) const;
+ void denoise_read_input_pixels(DenoiseContext &context, const DenoisePass &pass);
/* Run corresponding conversion kernels, preparing data for the denoiser or copying data from the
* denoiser result to the render buffer. */
More information about the Bf-blender-cvs
mailing list