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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] https://lists.blender.org/mailman/listinfo/bf-blender-cvs
