bevy
bevy copied to clipboard
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
.