[Bf-blender-cvs] [acbf2c9f484] cycles-x: Merge branch 'master' into cycles-x
Brecht Van Lommel
noreply at git.blender.org
Tue Jul 6 11:48:45 CEST 2021
Commit: acbf2c9f484b7b536f15995f4f1af78902f4aaff
Author: Brecht Van Lommel
Date: Tue Jul 6 11:36:32 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBacbf2c9f484b7b536f15995f4f1af78902f4aaff
Merge branch 'master' into cycles-x
===================================================================
===================================================================
diff --cc intern/cycles/blender/blender_sync.cpp
index 9659acc2cdd,3b3a193b3e8..ebea976f134
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@@ -285,9 -279,8 +285,8 @@@ void BlenderSync::sync_data(BL::RenderS
/* Integrator */
-void BlenderSync::sync_integrator()
+void BlenderSync::sync_integrator(BL::ViewLayer &b_view_layer, bool background)
{
- BL::RenderSettings r = b_scene.render();
PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
experimental = (get_enum(cscene, "feature_set") != 0);
@@@ -331,27 -324,60 +330,27 @@@
integrator->set_sample_clamp_direct(get_float(cscene, "sample_clamp_direct"));
integrator->set_sample_clamp_indirect(get_float(cscene, "sample_clamp_indirect"));
if (!preview) {
- integrator->set_motion_blur(r.use_motion_blur());
+ integrator->set_motion_blur(view_layer.use_motion_blur);
}
- integrator->set_method((Integrator::Method)get_enum(
- cscene, "progressive", Integrator::NUM_METHODS, Integrator::PATH));
-
- integrator->set_sample_all_lights_direct(get_boolean(cscene, "sample_all_lights_direct"));
- integrator->set_sample_all_lights_indirect(get_boolean(cscene, "sample_all_lights_indirect"));
integrator->set_light_sampling_threshold(get_float(cscene, "light_sampling_threshold"));
+ const bool use_adaptive_sampling = RNA_boolean_get(&cscene, "use_adaptive_sampling");
+
SamplingPattern sampling_pattern = (SamplingPattern)get_enum(
cscene, "sampling_pattern", SAMPLING_NUM_PATTERNS, SAMPLING_PATTERN_SOBOL);
-
- int adaptive_min_samples = INT_MAX;
-
- if (RNA_boolean_get(&cscene, "use_adaptive_sampling")) {
+ if (use_adaptive_sampling) {
sampling_pattern = SAMPLING_PATTERN_PMJ;
- adaptive_min_samples = get_int(cscene, "adaptive_min_samples");
- integrator->set_adaptive_threshold(get_float(cscene, "adaptive_threshold"));
- }
- else {
- integrator->set_adaptive_threshold(0.0f);
}
-
integrator->set_sampling_pattern(sampling_pattern);
- int diffuse_samples = get_int(cscene, "diffuse_samples");
- int glossy_samples = get_int(cscene, "glossy_samples");
- int transmission_samples = get_int(cscene, "transmission_samples");
- int ao_samples = get_int(cscene, "ao_samples");
- int mesh_light_samples = get_int(cscene, "mesh_light_samples");
- int subsurface_samples = get_int(cscene, "subsurface_samples");
- int volume_samples = get_int(cscene, "volume_samples");
+ integrator->set_use_adaptive_sampling(use_adaptive_sampling);
+ integrator->set_adaptive_threshold(get_float(cscene, "adaptive_threshold"));
+ int adaptive_min_samples = get_int(cscene, "adaptive_min_samples");
if (get_boolean(cscene, "use_square_samples")) {
- integrator->set_diffuse_samples(diffuse_samples * diffuse_samples);
- integrator->set_glossy_samples(glossy_samples * glossy_samples);
- integrator->set_transmission_samples(transmission_samples * transmission_samples);
- integrator->set_ao_samples(ao_samples * ao_samples);
- integrator->set_mesh_light_samples(mesh_light_samples * mesh_light_samples);
- integrator->set_subsurface_samples(subsurface_samples * subsurface_samples);
- integrator->set_volume_samples(volume_samples * volume_samples);
adaptive_min_samples = min(adaptive_min_samples * adaptive_min_samples, INT_MAX);
}
- else {
- integrator->set_diffuse_samples(diffuse_samples);
- integrator->set_glossy_samples(glossy_samples);
- integrator->set_transmission_samples(transmission_samples);
- integrator->set_ao_samples(ao_samples);
- integrator->set_mesh_light_samples(mesh_light_samples);
- integrator->set_subsurface_samples(subsurface_samples);
- integrator->set_volume_samples(volume_samples);
- }
-
integrator->set_adaptive_min_samples(adaptive_min_samples);
if (get_boolean(cscene, "use_fast_gi")) {
@@@ -582,23 -601,14 +583,24 @@@ void BlenderSync::sync_render_passes(BL
/* loop over passes */
for (BL::RenderPass &b_pass : b_rlay.passes) {
- PassType pass_type = get_pass_type(b_pass);
+ const BlenderPassInfo pass_info = get_blender_pass_info(b_pass);
- if (pass_type == PASS_MOTION &&
+ if (pass_info.type == PASS_NONE) {
+ LOG(ERROR) << "Unknown pass " << b_pass.name();
+ continue;
+ }
+
- if (pass_info.type == PASS_MOTION && b_scene.render().use_motion_blur()) {
++ if (pass_info.type == PASS_MOTION &&
+ (b_view_layer.use_motion_blur() && b_scene.render().use_motion_blur())) {
continue;
}
- if (pass_type != PASS_NONE)
- Pass::add(pass_type, passes, b_pass.name().c_str());
+
+ if (pass_info.mode == PassMode::DENOISED) {
+ Pass::add_denoising_read(passes, pass_info.type, b_pass.name().c_str());
+ }
+ else {
+ Pass::add(passes, pass_info.type, b_pass.name().c_str());
+ }
}
PointerRNA crl = RNA_pointer_get(&b_view_layer.ptr, "cycles");
diff --cc intern/cycles/device/optix/device_impl.h
index 78a7d382440,00000000000..65619d42b7b
mode 100644,000000..100644
--- a/intern/cycles/device/optix/device_impl.h
+++ b/intern/cycles/device/optix/device_impl.h
@@@ -1,177 -1,0 +1,177 @@@
+/*
+ * Copyright 2019, NVIDIA Corporation.
+ * Copyright 2019, Blender Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#ifdef WITH_OPTIX
+
+# include "device/cuda/device_impl.h"
+# include "device/optix/queue.h"
+# include "device/optix/util.h"
+# include "kernel/kernel_types.h"
+
+CCL_NAMESPACE_BEGIN
+
+class BVHOptiX;
+struct KernelParamsOptiX;
+
+/* List of OptiX program groups. */
+enum {
+ PG_RGEN_INTERSECT_CLOSEST,
+ PG_RGEN_INTERSECT_SHADOW,
+ PG_RGEN_INTERSECT_SUBSURFACE,
+ PG_RGEN_SHADE_SURFACE_RAYTRACE,
+ PG_MISS,
+ PG_HITD, /* Default hit group. */
+ PG_HITS, /* __SHADOW_RECORD_ALL__ hit group. */
+ PG_HITL, /* __BVH_LOCAL__ hit group (only used for triangles). */
+# if OPTIX_ABI_VERSION >= 36
+ PG_HITD_MOTION,
+ PG_HITS_MOTION,
+# endif
+ PG_CALL_SVM_AO,
+ PG_CALL_SVM_BEVEL,
+ NUM_PROGRAM_GROUPS
+};
+
+static const int MISS_PROGRAM_GROUP_OFFSET = PG_MISS;
+static const int NUM_MIS_PROGRAM_GROUPS = 1;
+static const int HIT_PROGAM_GROUP_OFFSET = PG_HITD;
+# if OPTIX_ABI_VERSION >= 36
+static const int NUM_HIT_PROGRAM_GROUPS = 5;
+# else
+static const int NUM_HIT_PROGRAM_GROUPS = 3;
+# endif
+static const int CALLABLE_PROGRAM_GROUPS_BASE = PG_CALL_SVM_AO;
+static const int NUM_CALLABLE_PROGRAM_GROUPS = 2;
+
+/* List of OptiX pipelines. */
+enum { PIP_SHADE_RAYTRACE, PIP_INTERSECT, NUM_PIPELINES };
+
+/* A single shader binding table entry. */
+struct SbtRecord {
+ char header[OPTIX_SBT_RECORD_HEADER_SIZE];
+};
+
+class OptiXDevice : public CUDADevice {
+ public:
+ OptixDeviceContext context = NULL;
+
+ OptixModule optix_module = NULL; /* All necessary OptiX kernels are in one module. */
+ OptixModule builtin_modules[2] = {};
+ OptixPipeline pipelines[NUM_PIPELINES] = {};
+
+ bool motion_blur = false;
+ device_vector<SbtRecord> sbt_data;
+ device_only_memory<KernelParamsOptiX> launch_params;
+ OptixTraversableHandle tlas_handle = 0;
+
+ vector<device_only_memory<char>> delayed_free_bvh_memory;
+ thread_mutex delayed_free_bvh_mutex;
+
+ class Denoiser {
+ public:
+ explicit Denoiser(OptiXDevice *device);
+ ~Denoiser();
+
+ OptiXDevice *device;
+ OptiXDeviceQueue queue;
+
+ OptixDenoiser optix_denoiser = nullptr;
+
+ /* Configuration size, as provided to `optixDenoiserSetup`.
+ * If the `optixDenoiserSetup()` was never used on the current `optix_denoiser` the
+ * `is_configured` will be false. */
+ bool is_configured = false;
+ int2 configured_size = make_int2(0, 0);
+
+ /* OptiX denoiser state and scratch buffers, stored in a single memory buffer.
+ * The memory layout goes as following: [denoiser state][scratch buffer]. */
+ device_only_memory<unsigned char> state;
+ size_t scratch_offset = 0;
+ size_t scratch_size = 0;
+
+ int input_passes = 0;
+ };
+ Denoiser denoiser_;
+
+ public:
+ OptiXDevice(const DeviceInfo &info, Stats &stats, Profiler &profiler);
+ ~OptiXDevice();
+
+ private:
+ BVHLayoutMask get_bvh_layout_mask() const override;
+
+ string compile_kernel_get_common_cflags(
+ const DeviceRequestedFeatures &requested_features) override;
+
+ bool load_kernels(const DeviceRequestedFeatures &requested_features) override;
+
+ bool build_optix_bvh(BVHOptiX *bvh,
+ OptixBuildOperation operation,
+ const OptixBuildInput &build_input,
+ uint16_t num_motion_steps);
+
+ void build_bvh(BVH *bvh, Progress &progress, bool refit) override;
+
+ void release_optix_bvh(BVH *bvh) override;
+ void free_bvh_memory_delayed();
+
+ void const_copy_to(const char *name, void *host, size_t size) override;
+
+ void update_launch_params(size_t offset, void *data, size_t data_size);
+
+ virtual unique_ptr<DeviceQueue> gpu_queue_create() override;
+
+ /* --------------------------------------------------------------------
+ * Denoising.
+ */
+
+ class DenoiseContext;
+ class DenoisePass;
+
+ virtual void denoise_buffer(const DeviceDenoiseTask &task) override;
- virtual DeviceQueue *get_denoise_queue();
++ virtual DeviceQueue *get_denoise_queue() override;
+
+ 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_r
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list