Introduce a `WindowWrapper` to extend the lifetime of the window when using pipelined rendering
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.