[Bf-blender-cvs] [e2856c85e45] cycles-x: Cycles X: first step to restore baking support
Brecht Van Lommel
noreply at git.blender.org
Mon Jun 7 18:39:36 CEST 2021
Commit: e2856c85e45d4ef23eea22926da09d3bab9ce724
Author: Brecht Van Lommel
Date: Tue May 4 14:51:10 2021 +0200
Branches: cycles-x
https://developer.blender.org/rBe2856c85e45d4ef23eea22926da09d3bab9ce724
Cycles X: first step to restore baking support
Minimal changes to get the baking pipeline operational, only bakes the Combined
pass.
* Add integrator_init_from_bake kernel, that reads the primitive and uv from
the render passes and sets up data structures for shade_surface.
* Add back support for reading render passes from Blender.
Since this reuses most of the path tracing code, baking now works with OptiX,
adaptive sampling and denoising.
Differential Revision: https://developer.blender.org/D11485
===================================================================
M intern/cycles/blender/addon/ui.py
M intern/cycles/blender/blender_session.cpp
M intern/cycles/blender/blender_session.h
M intern/cycles/device/cpu/kernel.cpp
M intern/cycles/device/cpu/kernel.h
M intern/cycles/device/cuda/queue.cpp
M intern/cycles/device/device_kernel.cpp
M intern/cycles/device/optix/device_impl.cpp
M intern/cycles/device/optix/queue.cpp
M intern/cycles/integrator/pass_accessor.cpp
M intern/cycles/integrator/pass_accessor.h
M intern/cycles/integrator/path_trace.cpp
M intern/cycles/integrator/path_trace.h
M intern/cycles/integrator/path_trace_work_cpu.cpp
M intern/cycles/integrator/path_trace_work_gpu.cpp
M intern/cycles/kernel/CMakeLists.txt
M intern/cycles/kernel/device/cpu/kernel_arch.h
M intern/cycles/kernel/device/cpu/kernel_arch_impl.h
M intern/cycles/kernel/device/cuda/kernel.cu
A intern/cycles/kernel/integrator/integrator_init_from_bake.h
M intern/cycles/kernel/integrator/integrator_state_flow.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/render/bake.cpp
M intern/cycles/render/buffers.cpp
M intern/cycles/render/buffers.h
M intern/cycles/render/session.cpp
M intern/cycles/render/session.h
===================================================================
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index 307445a722d..6f764c84fba 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -1643,9 +1643,6 @@ class CYCLES_RENDER_PT_bake(CyclesButtonsPanel, Panel):
cbk = scene.render.bake
rd = scene.render
- if use_optix(context):
- layout.label(text="Baking is performed using CUDA instead of OptiX", icon='INFO')
-
if rd.use_bake_multires:
layout.operator("object.bake_image", icon='RENDER_STILL')
layout.prop(rd, "use_bake_multires")
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index c52934c3e73..3f1a47da5aa 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -352,6 +352,44 @@ void BlenderSession::do_write_update_render_tile(bool do_update_only)
b_engine.end_result(b_rr, true, false, true);
}
+void BlenderSession::read_render_tile()
+{
+ const int2 tile_offset = session->get_render_tile_offset();
+ const int2 tile_size = session->get_render_tile_size();
+
+ /* get render result */
+ BL::RenderResult b_rr = b_engine.begin_result(tile_offset.x,
+ tile_offset.y,
+ tile_size.x,
+ tile_size.y,
+ b_rlay_name.c_str(),
+ b_rview_name.c_str());
+
+ /* can happen if the intersected rectangle gives 0 width or height */
+ if (b_rr.ptr.data == NULL) {
+ return;
+ }
+
+ BL::RenderResult::layers_iterator b_single_rlay;
+ b_rr.layers.begin(b_single_rlay);
+
+ /* layer will be missing if it was disabled in the UI */
+ if (b_single_rlay == b_rr.layers.end())
+ return;
+
+ BL::RenderLayer b_rlay = *b_single_rlay;
+
+ vector<float> pixels(tile_size.x * tile_size.y * 4);
+
+ /* Copy each pass.
+ * TODO:copy only the required ones for better performance? */
+ for (BL::RenderPass &b_pass : b_rlay.passes) {
+ session->set_render_tile_pixels(b_pass.name(), b_pass.channels(), (float *)b_pass.rect());
+ }
+
+ b_engine.end_result(b_rr, false, false, false);
+}
+
void BlenderSession::write_render_tile()
{
do_write_update_render_tile(false);
@@ -594,6 +632,7 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_,
* name. */
Pass::add(PASS_COMBINED, scene->passes, "Combined");
+ session->read_render_tile_cb = [&]() { read_render_tile(); };
session->write_render_tile_cb = [&]() { write_render_tile(); };
if (!session->progress.get_cancel()) {
@@ -637,6 +676,7 @@ void BlenderSession::bake(BL::Depsgraph &b_depsgraph_,
session->wait();
}
+ session->read_render_tile_cb = function_null;
session->write_render_tile_cb = function_null;
}
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index ce491615b89..439ae292c56 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -75,6 +75,9 @@ class BlenderSession {
void update_render_result(BL::RenderLayer &b_rlay);
void update_render_tile();
+ /* read functions for baking input */
+ void read_render_tile();
+
/* interactive updates */
void synchronize(BL::Depsgraph &b_depsgraph);
diff --git a/intern/cycles/device/cpu/kernel.cpp b/intern/cycles/device/cpu/kernel.cpp
index 59daf836560..d9c8e5bd373 100644
--- a/intern/cycles/device/cpu/kernel.cpp
+++ b/intern/cycles/device/cpu/kernel.cpp
@@ -30,6 +30,7 @@ CCL_NAMESPACE_BEGIN
CPUKernels::CPUKernels()
: /* Integrator. */
REGISTER_KERNEL(integrator_init_from_camera),
+ REGISTER_KERNEL(integrator_init_from_bake),
REGISTER_KERNEL(integrator_intersect_closest),
REGISTER_KERNEL(integrator_intersect_shadow),
REGISTER_KERNEL(integrator_intersect_subsurface),
diff --git a/intern/cycles/device/cpu/kernel.h b/intern/cycles/device/cpu/kernel.h
index b691061b2a3..62497d21ecd 100644
--- a/intern/cycles/device/cpu/kernel.h
+++ b/intern/cycles/device/cpu/kernel.h
@@ -39,6 +39,7 @@ class CPUKernels {
ccl_global float *render_buffer)>;
IntegratorInitFunction integrator_init_from_camera;
+ IntegratorInitFunction integrator_init_from_bake;
IntegratorFunction integrator_intersect_closest;
IntegratorFunction integrator_intersect_shadow;
IntegratorFunction integrator_intersect_subsurface;
diff --git a/intern/cycles/device/cuda/queue.cpp b/intern/cycles/device/cuda/queue.cpp
index 09131176223..7b00e918a1d 100644
--- a/intern/cycles/device/cuda/queue.cpp
+++ b/intern/cycles/device/cuda/queue.cpp
@@ -99,6 +99,7 @@ bool CUDADeviceQueue::enqueue(DeviceKernel kernel, const int work_size, void *ar
shared_mem_bytes = (num_threads_per_block + 1) * sizeof(int);
break;
case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA:
+ case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_BAKE:
case DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST:
case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SHADOW:
case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SUBSURFACE:
diff --git a/intern/cycles/device/device_kernel.cpp b/intern/cycles/device/device_kernel.cpp
index 49ab49d404d..345d0befc0e 100644
--- a/intern/cycles/device/device_kernel.cpp
+++ b/intern/cycles/device/device_kernel.cpp
@@ -26,6 +26,8 @@ const char *device_kernel_as_string(DeviceKernel kernel)
/* Integrator. */
case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA:
return "integrator_init_from_camera";
+ case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_BAKE:
+ return "integrator_init_from_bake";
case DEVICE_KERNEL_INTEGRATOR_INTERSECT_CLOSEST:
return "integrator_intersect_closest";
case DEVICE_KERNEL_INTEGRATOR_INTERSECT_SHADOW:
diff --git a/intern/cycles/device/optix/device_impl.cpp b/intern/cycles/device/optix/device_impl.cpp
index 558fb09b3e0..c026daaf287 100644
--- a/intern/cycles/device/optix/device_impl.cpp
+++ b/intern/cycles/device/optix/device_impl.cpp
@@ -141,11 +141,6 @@ unique_ptr<DeviceQueue> OptiXDevice::gpu_queue_create()
BVHLayoutMask OptiXDevice::get_bvh_layout_mask() const
{
- /* CUDA kernels are used when doing baking, so need to build a BVH those can understand too! */
- if (optix_module == NULL) {
- return CUDADevice::get_bvh_layout_mask();
- }
-
/* OptiX has its own internal acceleration structure format. */
return BVH_LAYOUT_OPTIX;
}
@@ -181,10 +176,8 @@ bool OptiXDevice::load_kernels(const DeviceRequestedFeatures &requested_features
return false;
}
- /* Baking is currently performed using CUDA, so no need to load OptiX kernels.
- * Can also skip creating OptiX module if only doing denoising (no path tracing).
- */
- if (requested_features.use_baking || !requested_features.use_path_tracing) {
+ /* Skip creating OptiX module if only doing denoising. */
+ if (!(requested_features.use_path_tracing || requested_features.use_baking)) {
return true;
}
@@ -930,12 +923,6 @@ bool OptiXDevice::build_optix_bvh(BVHOptiX *bvh,
void OptiXDevice::build_bvh(BVH *bvh, Progress &progress, bool refit)
{
- if (bvh->params.bvh_layout == BVH_LAYOUT_BVH2) {
- /* For baking CUDA is used, build appropriate BVH for that. */
- Device::build_bvh(bvh, progress, refit);
- return;
- }
-
const bool use_fast_trace_bvh = (bvh->params.bvh_type == BVH_TYPE_STATIC);
free_bvh_memory_delayed();
diff --git a/intern/cycles/device/optix/queue.cpp b/intern/cycles/device/optix/queue.cpp
index 573a618a7c7..dc99e1e0ed7 100644
--- a/intern/cycles/device/optix/queue.cpp
+++ b/intern/cycles/device/optix/queue.cpp
@@ -105,6 +105,7 @@ bool OptiXDeviceQueue::enqueue(DeviceKernel kernel, const int work_size, void *a
break;
case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_CAMERA:
+ case DEVICE_KERNEL_INTEGRATOR_INIT_FROM_BAKE:
case DEVICE_KERNEL_INTEGRATOR_SHADE_BACKGROUND:
case DEVICE_KERNEL_INTEGRATOR_SHADE_LIGHT:
case DEVICE_KERNEL_INTEGRATOR_SHADE_SURFACE:
diff --git a/intern/cycles/integrator/pass_accessor.cpp b/intern/cycles/integrator/pass_accessor.cpp
index 0d8312932c1..5b75cb42660 100644
--- a/intern/cycles/integrator/pass_accessor.cpp
+++ b/intern/cycles/integrator/pass_accessor.cpp
@@ -71,6 +71,15 @@ PassAccessor::Destination::Destination(const PassType pass_type)
}
}
+/* --------------------------------------------------------------------
+ * Pass source.
+ */
+
+PassAccessor::Source::Source(const float *pixels, int num_components)
+ : pixels(pixels), num_components(num_components)
+{
+}
+
/* --------------------------------------------------------------------
* Pass accessor.
*/
@@ -266,4 +275,27 @@ void PassAccessor::init_kernel_film_convert(KernelFilmConvert *kfilm_convert,
kfilm_convert->show_active_pixels = pass_access_info_.show_active_pixels;
}
+bool PassAccessor::set_render_tile_pixels(RenderBuffers *render_buffers, const Source &source)
+{
+ if (render_buffers == nullptr || render_buffers->buffer.data() == nullptr) {
+ return false;
+ }
+
+ const BufferParams &buffer_params = render_buffers->params;
+
+ float *buffer_data = render_buffers->buffer.data();
+ const int pass_stride = buffer_params.pass_stride;
+ const int size = buffer_params.width * buffer_params.height;
+ const int num_components = source.num_components;
+
+ float *out = buffer_data + pass_access_info_.offset;
+ const float *in = source.pixels;
+
+ for (int i = 0; i < size; i++, out += pass_stride, in += num_components) {
+ memcpy(out, in, sizeof(float) * num_components);
+ }
+
+ return true;
+}
+
CCL_NAMESPACE_END
diff --git a/intern/cycles/integrator/pass_accessor.h b/intern/cycles/integrator/pass_accessor.h
index 88e38e91003..69046533c64 100644
--- a/intern/cycles/integrator/pass_accessor.h
+++ b/intern/cycles/integrator/pass_accessor.h
@@ -70,6 +70,16 @@ class PassAccessor {
int num_components = 0;
};
+ class Source {
+ public:
+ Source() = default;
+ Source(const float *pixels, int num_components);
+
+ /* CPU-side pointers. only usable
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list