diff options
Diffstat (limited to 'intern/cycles/device')
-rw-r--r-- | intern/cycles/device/optix/device_impl.cpp | 53 | ||||
-rw-r--r-- | intern/cycles/device/optix/device_impl.h | 1 |
2 files changed, 32 insertions, 22 deletions
diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp index 9b9a5ac0de7..8e554d0ba2f 100644 --- a/intern/cycles/device/optix/device_impl.cpp +++ b/intern/cycles/device/optix/device_impl.cpp @@ -48,14 +48,6 @@ OptiXDevice::Denoiser::Denoiser(OptiXDevice *device) { } -OptiXDevice::Denoiser::~Denoiser() -{ - const CUDAContextScope scope(device); - if (optix_denoiser != nullptr) { - optixDenoiserDestroy(optix_denoiser); - } -} - OptiXDevice::OptiXDevice(const DeviceInfo &info, Stats &stats, Profiler &profiler) : CUDADevice(info, stats, profiler), sbt_data(this, "__sbt", MEM_READ_ONLY), @@ -133,6 +125,11 @@ OptiXDevice::~OptiXDevice() } } + /* Make sure denoiser is destroyed before device context! */ + if (denoiser_.optix_denoiser != nullptr) { + optixDenoiserDestroy(denoiser_.optix_denoiser); + } + optixDeviceContextDestroy(context); } @@ -884,27 +881,32 @@ bool OptiXDevice::denoise_configure_if_needed(DenoiseContext &context) optix_assert(optixDenoiserComputeMemoryResources( denoiser_.optix_denoiser, buffer_params.width, buffer_params.height, &sizes)); - denoiser_.scratch_size = sizes.withOverlapScratchSizeInBytes; + /* Denoiser is invoked on whole images only, so no overlap needed (would be used for tiling). */ + denoiser_.scratch_size = sizes.withoutOverlapScratchSizeInBytes; denoiser_.scratch_offset = sizes.stateSizeInBytes; /* Allocate denoiser state if tile size has changed since last setup. */ - denoiser_.state.alloc_to_device(denoiser_.scratch_offset + denoiser_.scratch_size); + denoiser_.state.alloc_to_device(denoiser_.scratch_offset + denoiser_.scratch_size + + sizeof(float)); /* Initialize denoiser state for the current tile size. */ - const OptixResult result = optixDenoiserSetup(denoiser_.optix_denoiser, - denoiser_.queue.stream(), - buffer_params.width, - buffer_params.height, - denoiser_.state.device_pointer, - denoiser_.scratch_offset, - denoiser_.state.device_pointer + - denoiser_.scratch_offset, - denoiser_.scratch_size); + const OptixResult result = optixDenoiserSetup( + denoiser_.optix_denoiser, + 0, /* Work around bug in r495 drivers that causes artifacts when denoiser setup is called + on a stream that is not the default stream */ + buffer_params.width, + buffer_params.height, + denoiser_.state.device_pointer, + denoiser_.scratch_offset, + denoiser_.state.device_pointer + denoiser_.scratch_offset, + denoiser_.scratch_size); if (result != OPTIX_SUCCESS) { set_error("Failed to set up OptiX denoiser"); return false; } + cuda_assert(cuCtxSynchronize()); + denoiser_.is_configured = true; denoiser_.configured_size.x = buffer_params.width; denoiser_.configured_size.y = buffer_params.height; @@ -939,8 +941,6 @@ bool OptiXDevice::denoise_run(DenoiseContext &context, const DenoisePass &pass) color_layer.format = OPTIX_PIXEL_FORMAT_FLOAT3; } - device_vector<float> fake_albedo(this, "fake_albedo", MEM_READ_WRITE); - /* Optional albedo and color passes. */ if (context.num_input_passes > 1) { const device_ptr d_guiding_buffer = context.guiding_params.device_pointer; @@ -971,6 +971,17 @@ bool OptiXDevice::denoise_run(DenoiseContext &context, const DenoisePass &pass) /* Finally run denoising. */ OptixDenoiserParams params = {}; /* All parameters are disabled/zero. */ + params.hdrIntensity = denoiser_.state.device_pointer + denoiser_.scratch_offset + + denoiser_.scratch_size; + + optix_assert( + optixDenoiserComputeIntensity(denoiser_.optix_denoiser, + denoiser_.queue.stream(), + &color_layer, + params.hdrIntensity, + denoiser_.state.device_pointer + denoiser_.scratch_offset, + denoiser_.scratch_size)); + OptixDenoiserLayer image_layers = {}; image_layers.input = color_layer; image_layers.output = output_layer; diff --git a/intern/cycles/device/optix/device_impl.h b/intern/cycles/device/optix/device_impl.h index 3ec98098eb7..5cfc249b430 100644 --- a/intern/cycles/device/optix/device_impl.h +++ b/intern/cycles/device/optix/device_impl.h @@ -82,7 +82,6 @@ class OptiXDevice : public CUDADevice { class Denoiser { public: explicit Denoiser(OptiXDevice *device); - ~Denoiser(); OptiXDevice *device; OptiXDeviceQueue queue; |