Blender Git Commit Log

Git Commits -> Revision e5f51c6

Revision e5f51c6 by Sergey Sharybin (cycles-x)
September 17, 2021, 08:56 (GMT)
Fix wrong display when rendering multiple view layers in Cycles X

The issue was that the texture used by GPUDisplay was never cleared and
was only used for partial updates.

The actual reasoning of that is a bit more tricky than it looks on a
first glance since the GPUDisplay was re-created together with session
via session_reset so one would think it is weird to have a texture from
previous view layer to appear in the new GPUDisplay. Probably caused by
the fact that OpenGL is the same for all view layers, and texture ID is
happened to be the same.

Anyhow, the way texture is created is considered to have an undefined
behavior by the standard when is attempted to be used without explicit
data assignment.

This change makes it so new texture is always guaranteed to be zeroed
and that the GPU display is cleared when rendering multiple views from
within the same session.

The clearing is done by a GPUDisplay subclass, as the parent does not
know details of how to perform the zeroing. For the CPU the zeroing is
done on a mapped memory, as it makes it easy and does not require any
extra OpenGL requirements.

For the graphics interop things a bit more difficult as attempts to map
texture will make graphics interop to fail out (it really wants to be
an exclusive thing which takes care of the memory mapping). So for the
graphics interop clearing is done when memory is mapped by the interop
implementation.

Differential Revision: https://developer.blender.org/D12514

Commit Details:

Full Hash: e5f51c684bf94476864f736aaf6ea25059c345b7
Parent Commit: e597e6a
Lines Changed: +72, -0

9 Modified Paths:

/intern/cycles/blender/blender_gpu_display.cpp (+27, -0) (Diff)
/intern/cycles/blender/blender_gpu_display.h (+7, -0) (Diff)
/intern/cycles/device/cuda/graphics_interop.cpp (+9, -0) (Diff)
/intern/cycles/device/cuda/graphics_interop.h (+3, -0) (Diff)
/intern/cycles/device/device_graphics_interop.h (+3, -0) (Diff)
/intern/cycles/integrator/path_trace.cpp (+5, -0) (Diff)
/intern/cycles/integrator/path_trace.h (+3, -0) (Diff)
/intern/cycles/render/gpu_display.h (+13, -0) (Diff)
/intern/cycles/render/session.cpp (+2, -0) (Diff)
By: Miika HämäläinenLast update: Nov-07-2014 14:18MiikaHweb | 2003-2021