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. */ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
