Commit: 69806f1f88d4c78b752d902381e94a3e9e668321 Author: Sergey Sharybin Date: Thu Sep 9 18:30:18 2021 +0200 Branches: cycles-x https://developer.blender.org/rB69806f1f88d4c78b752d902381e94a3e9e668321
Fix graphics interop destruction for offline rendering in Cycles X Graphics interop API is to be sued from within an active graphics context, which might not be a case for offline rendering where there is no default graphics context bound. Differential Revision: https://developer.blender.org/D12446 =================================================================== M intern/cycles/blender/blender_gpu_display.cpp M intern/cycles/blender/blender_gpu_display.h M intern/cycles/integrator/path_trace.cpp M intern/cycles/integrator/path_trace.h M intern/cycles/integrator/path_trace_work.h M intern/cycles/integrator/path_trace_work_cpu.cpp M intern/cycles/integrator/path_trace_work_cpu.h M intern/cycles/integrator/path_trace_work_gpu.cpp M intern/cycles/integrator/path_trace_work_gpu.h M intern/cycles/render/gpu_display.cpp M intern/cycles/render/gpu_display.h =================================================================== diff --git a/intern/cycles/blender/blender_gpu_display.cpp b/intern/cycles/blender/blender_gpu_display.cpp index 48c7f67087f..29d483a008f 100644 --- a/intern/cycles/blender/blender_gpu_display.cpp +++ b/intern/cycles/blender/blender_gpu_display.cpp @@ -423,6 +423,24 @@ DeviceGraphicsInteropDestination BlenderGPUDisplay::do_graphics_interop_get() return interop_dst; } +void BlenderGPUDisplay::graphics_interop_activate() +{ + if (!gl_context_) { + return; + } + + WM_opengl_context_activate(gl_context_); +} + +void BlenderGPUDisplay::graphics_interop_deactivate() +{ + if (!gl_context_) { + return; + } + + WM_opengl_context_release(gl_context_); +} + /* -------------------------------------------------------------------- * Drawing. */ diff --git a/intern/cycles/blender/blender_gpu_display.h b/intern/cycles/blender/blender_gpu_display.h index ccfbc358171..8748da08d10 100644 --- a/intern/cycles/blender/blender_gpu_display.h +++ b/intern/cycles/blender/blender_gpu_display.h @@ -100,6 +100,9 @@ class BlenderGPUDisplay : public GPUDisplay { BlenderGPUDisplay(BL::RenderEngine &b_engine, BL::Scene &b_scene); ~BlenderGPUDisplay(); + virtual void graphics_interop_activate() override; + virtual void graphics_interop_deactivate() override; + protected: virtual bool do_update_begin(int texture_width, int texture_height) override; virtual void do_update_end() override; diff --git a/intern/cycles/integrator/path_trace.cpp b/intern/cycles/integrator/path_trace.cpp index 5805fc045b7..edec956e45d 100644 --- a/intern/cycles/integrator/path_trace.cpp +++ b/intern/cycles/integrator/path_trace.cpp @@ -64,6 +64,18 @@ PathTrace::PathTrace(Device *device, render_scheduler.set_need_schedule_rebalance(path_trace_works_.size() > 1); } +PathTrace::~PathTrace() +{ + /* Destroy any GPU resource which was used for graphics interop. + * Need to have access to the GPUDisplay as it is the only source of drawing context which is + * used for interop. */ + if (gpu_display_) { + for (auto &&path_trace_work : path_trace_works_) { + path_trace_work->destroy_gpu_resources(gpu_display_.get()); + } + } +} + void PathTrace::load_kernels() { if (denoiser_) { diff --git a/intern/cycles/integrator/path_trace.h b/intern/cycles/integrator/path_trace.h index b78240308c7..7d9c965f067 100644 --- a/intern/cycles/integrator/path_trace.h +++ b/intern/cycles/integrator/path_trace.h @@ -55,6 +55,7 @@ class PathTrace { DeviceScene *device_scene, RenderScheduler &render_scheduler, TileManager &tile_manager); + ~PathTrace(); /* Create devices and load kernels which are created on-demand (for example, denoising devices). * The progress is reported to the currently configure progress object (via `set_progress`). */ diff --git a/intern/cycles/integrator/path_trace_work.h b/intern/cycles/integrator/path_trace_work.h index 0cde2d8bef5..ca64c1c2ffd 100644 --- a/intern/cycles/integrator/path_trace_work.h +++ b/intern/cycles/integrator/path_trace_work.h @@ -83,6 +83,8 @@ class PathTraceWork { PassMode pass_mode, int num_samples) = 0; + virtual void destroy_gpu_resources(GPUDisplay *gpu_display) = 0; + /* Copy data from/to given render buffers. * Will copy pixels from a corresponding place (from multi-device point of view) of the render * buffers, and copy work's render buffers to the corresponding place of the destination. */ diff --git a/intern/cycles/integrator/path_trace_work_cpu.cpp b/intern/cycles/integrator/path_trace_work_cpu.cpp index cf7e379018d..eaed0d0d636 100644 --- a/intern/cycles/integrator/path_trace_work_cpu.cpp +++ b/intern/cycles/integrator/path_trace_work_cpu.cpp @@ -179,6 +179,10 @@ void PathTraceWorkCPU::copy_to_gpu_display(GPUDisplay *gpu_display, gpu_display->unmap_texture_buffer(); } +void PathTraceWorkCPU::destroy_gpu_resources(GPUDisplay * /*gpu_display*/) +{ +} + bool PathTraceWorkCPU::copy_render_buffers_from_device() { return buffers_->copy_from_device(); diff --git a/intern/cycles/integrator/path_trace_work_cpu.h b/intern/cycles/integrator/path_trace_work_cpu.h index c94f8c0fb89..0ea901e452d 100644 --- a/intern/cycles/integrator/path_trace_work_cpu.h +++ b/intern/cycles/integrator/path_trace_work_cpu.h @@ -51,6 +51,7 @@ class PathTraceWorkCPU : public PathTraceWork { virtual void copy_to_gpu_display(GPUDisplay *gpu_display, PassMode pass_mode, int num_samples) override; + virtual void destroy_gpu_resources(GPUDisplay *gpu_display) override; virtual bool copy_render_buffers_from_device() override; virtual bool copy_render_buffers_to_device() override; diff --git a/intern/cycles/integrator/path_trace_work_gpu.cpp b/intern/cycles/integrator/path_trace_work_gpu.cpp index 218d07bdf0e..af4d416117a 100644 --- a/intern/cycles/integrator/path_trace_work_gpu.cpp +++ b/intern/cycles/integrator/path_trace_work_gpu.cpp @@ -756,6 +756,16 @@ bool PathTraceWorkGPU::copy_to_gpu_display_interop(GPUDisplay *gpu_display, return true; } +void PathTraceWorkGPU::destroy_gpu_resources(GPUDisplay *gpu_display) +{ + if (!device_graphics_interop_) { + return; + } + gpu_display->graphics_interop_activate(); + device_graphics_interop_ = nullptr; + gpu_display->graphics_interop_deactivate(); +} + void PathTraceWorkGPU::get_render_tile_film_pixels(const PassAccessor::Destination &destination, PassMode pass_mode, int num_samples) diff --git a/intern/cycles/integrator/path_trace_work_gpu.h b/intern/cycles/integrator/path_trace_work_gpu.h index 574599e5708..aee54d4a372 100644 --- a/intern/cycles/integrator/path_trace_work_gpu.h +++ b/intern/cycles/integrator/path_trace_work_gpu.h @@ -49,6 +49,7 @@ class PathTraceWorkGPU : public PathTraceWork { virtual void copy_to_gpu_display(GPUDisplay *gpu_display, PassMode pass_mode, int num_samples) override; + virtual void destroy_gpu_resources(GPUDisplay *gpu_display) override; virtual bool copy_render_buffers_from_device() override; virtual bool copy_render_buffers_to_device() override; diff --git a/intern/cycles/render/gpu_display.cpp b/intern/cycles/render/gpu_display.cpp index 2dfb678e61b..61ef69a82d2 100644 --- a/intern/cycles/render/gpu_display.cpp +++ b/intern/cycles/render/gpu_display.cpp @@ -185,6 +185,14 @@ DeviceGraphicsInteropDestination GPUDisplay::graphics_interop_get() return do_graphics_interop_get(); } +void GPUDisplay::graphics_interop_activate() +{ +} + +void GPUDisplay::graphics_interop_deactivate() +{ +} + /* -------------------------------------------------------------------- * Drawing. */ diff --git a/intern/cycles/render/gpu_display.h b/intern/cycles/render/gpu_display.h index e9183666ecf..c9ba89a0665 100644 --- a/intern/cycles/render/gpu_display.h +++ b/intern/cycles/render/gpu_display.h @@ -151,6 +151,11 @@ class GPUDisplay { * device API. */ DeviceGraphicsInteropDestination graphics_interop_get(); + /* (De)activate GPU display for graphics interoperability outside of regular display udpate + * routines. */ + virtual void graphics_interop_activate(); + virtual void graphics_interop_deactivate(); + /* -------------------------------------------------------------------- * Drawing. */ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
