[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 &params)
 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(),
                                    &params,
                                    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(),
                                    &params,
                                    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