bevy icon indicating copy to clipboard operation
bevy copied to clipboard

Introduce a `WindowWrapper` to extend the lifetime of the window when using pipelined rendering

Open Friz64 opened this issue 10 months ago • 0 comments

Objective

A RawWindowHandle is only valid as long as the window it was retrieved from is alive. Extend the lifetime of the window, so that the RawWindowHandle doesn't outlive it, and bevy doesn't crash when closing a window a pipelined renderer is drawing to.

  • Fix #11236
  • Fix #11150
  • Fix #11734
  • Alternative to / Closes #12524

Solution

Introduce a WindowWrapper that takes ownership of the window. Require it to be used when constructing a RawHandleWrapper. This forces windowing backends to store their window in this wrapper.

The WindowWrapper is implemented by storing the window in an Arc<dyn Any + Send + Sync>.

We use dynamic dispatch here because we later want the RawHandleWrapper to be able dynamically hold a reference to any windowing backend's window.

But alas, the WindowWrapper itself is still practically invisible to windowing backends, because it implements Deref to the underlying window, by storing its type in a PhantomData.


Changelog

Added

  • Added WindowWrapper, which windowing backends are now required to use to store their underlying window.

Fixed

  • Fixed a safety problem which caused crashes when closing bevy windows when using pipelined rendering.

Migration Guide

  • Windowing backends now need to store their window in the new WindowWrapper.

Friz64 avatar Apr 15 '24 15:04 Friz64