Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorPatrick Mours <pmours@nvidia.com>2021-11-09 16:49:36 +0300
committerPatrick Mours <pmours@nvidia.com>2021-11-09 16:49:47 +0300
commitfaeb2cc9005739efd6d58a7ab1e9170bf064b656 (patch)
tree3798aa5dbb2002d087082e3b6fe926f2001b7db2 /intern
parent0bcf014bcf36d2917b4ab1b77faa621c6345edc7 (diff)
parent440a3475b8f5410e5c41bfbed5ce82771b41356f (diff)
Merge branch 'blender-v3.0-release'
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/device/optix/device_impl.cpp53
-rw-r--r--intern/cycles/device/optix/device_impl.h1
-rw-r--r--intern/cycles/kernel/device/gpu/kernel.h2
3 files changed, 33 insertions, 23 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;
diff --git a/intern/cycles/kernel/device/gpu/kernel.h b/intern/cycles/kernel/device/gpu/kernel.h
index f86a8c692aa..5848ba5df9d 100644
--- a/intern/cycles/kernel/device/gpu/kernel.h
+++ b/intern/cycles/kernel/device/gpu/kernel.h
@@ -788,7 +788,7 @@ ccl_gpu_kernel(GPU_KERNEL_BLOCK_NUM_THREADS, GPU_KERNEL_MAX_REGISTERS)
}
/* Normal pass. */
- if (render_pass_denoising_normal != PASS_UNUSED) {
+ if (guiding_pass_normal != PASS_UNUSED) {
kernel_assert(render_pass_denoising_normal != PASS_UNUSED);
const float *normal_in = buffer + render_pass_denoising_normal;