Merge pull request #868 from hecrj/wgpu-compatible-surface
Provide `compatible_surface` in `iced_wgpu::Compositor`
This commit is contained in:
commit
08f5591148
|
@ -17,7 +17,10 @@ pub trait Compositor: Sized {
|
||||||
type SwapChain;
|
type SwapChain;
|
||||||
|
|
||||||
/// Creates a new [`Compositor`].
|
/// Creates a new [`Compositor`].
|
||||||
fn new(settings: Self::Settings) -> Result<(Self, Self::Renderer), Error>;
|
fn new<W: HasRawWindowHandle>(
|
||||||
|
settings: Self::Settings,
|
||||||
|
compatible_window: Option<&W>,
|
||||||
|
) -> Result<(Self, Self::Renderer), Error>;
|
||||||
|
|
||||||
/// Crates a new [`Surface`] for the given window.
|
/// Crates a new [`Surface`] for the given window.
|
||||||
///
|
///
|
||||||
|
|
|
@ -1 +1,2 @@
|
||||||
max_width=80
|
max_width=80
|
||||||
|
edition="2018"
|
||||||
|
|
|
@ -21,9 +21,16 @@ impl Compositor {
|
||||||
/// Requests a new [`Compositor`] with the given [`Settings`].
|
/// Requests a new [`Compositor`] with the given [`Settings`].
|
||||||
///
|
///
|
||||||
/// Returns `None` if no compatible graphics adapter could be found.
|
/// Returns `None` if no compatible graphics adapter could be found.
|
||||||
pub async fn request(settings: Settings) -> Option<Self> {
|
pub async fn request<W: HasRawWindowHandle>(
|
||||||
|
settings: Settings,
|
||||||
|
compatible_window: Option<&W>,
|
||||||
|
) -> Option<Self> {
|
||||||
let instance = wgpu::Instance::new(settings.internal_backend);
|
let instance = wgpu::Instance::new(settings.internal_backend);
|
||||||
|
|
||||||
|
#[allow(unsafe_code)]
|
||||||
|
let compatible_surface = compatible_window
|
||||||
|
.map(|window| unsafe { instance.create_surface(window) });
|
||||||
|
|
||||||
let adapter = instance
|
let adapter = instance
|
||||||
.request_adapter(&wgpu::RequestAdapterOptions {
|
.request_adapter(&wgpu::RequestAdapterOptions {
|
||||||
power_preference: if settings.antialiasing.is_none() {
|
power_preference: if settings.antialiasing.is_none() {
|
||||||
|
@ -31,7 +38,7 @@ impl Compositor {
|
||||||
} else {
|
} else {
|
||||||
wgpu::PowerPreference::HighPerformance
|
wgpu::PowerPreference::HighPerformance
|
||||||
},
|
},
|
||||||
compatible_surface: None,
|
compatible_surface: compatible_surface.as_ref(),
|
||||||
})
|
})
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
@ -77,9 +84,15 @@ impl iced_graphics::window::Compositor for Compositor {
|
||||||
type Surface = wgpu::Surface;
|
type Surface = wgpu::Surface;
|
||||||
type SwapChain = wgpu::SwapChain;
|
type SwapChain = wgpu::SwapChain;
|
||||||
|
|
||||||
fn new(settings: Self::Settings) -> Result<(Self, Renderer), Error> {
|
fn new<W: HasRawWindowHandle>(
|
||||||
let compositor = futures::executor::block_on(Self::request(settings))
|
settings: Self::Settings,
|
||||||
.ok_or(Error::AdapterNotFound)?;
|
compatible_window: Option<&W>,
|
||||||
|
) -> Result<(Self, Renderer), Error> {
|
||||||
|
let compositor = futures::executor::block_on(Self::request(
|
||||||
|
settings,
|
||||||
|
compatible_window,
|
||||||
|
))
|
||||||
|
.ok_or(Error::AdapterNotFound)?;
|
||||||
|
|
||||||
let backend = compositor.create_backend();
|
let backend = compositor.create_backend();
|
||||||
|
|
||||||
|
|
|
@ -118,8 +118,6 @@ where
|
||||||
let mut debug = Debug::new();
|
let mut debug = Debug::new();
|
||||||
debug.startup_started();
|
debug.startup_started();
|
||||||
|
|
||||||
let (compositor, renderer) = C::new(compositor_settings)?;
|
|
||||||
|
|
||||||
let event_loop = EventLoop::with_user_event();
|
let event_loop = EventLoop::with_user_event();
|
||||||
|
|
||||||
let mut runtime = {
|
let mut runtime = {
|
||||||
|
@ -150,6 +148,8 @@ where
|
||||||
.build(&event_loop)
|
.build(&event_loop)
|
||||||
.map_err(Error::WindowCreationFailed)?;
|
.map_err(Error::WindowCreationFailed)?;
|
||||||
|
|
||||||
|
let (compositor, renderer) = C::new(compositor_settings, Some(&window))?;
|
||||||
|
|
||||||
let (mut sender, receiver) = mpsc::unbounded();
|
let (mut sender, receiver) = mpsc::unbounded();
|
||||||
|
|
||||||
let mut instance = Box::pin(run_instance::<A, E, C>(
|
let mut instance = Box::pin(run_instance::<A, E, C>(
|
||||||
|
|
Loading…
Reference in New Issue