summaryrefslogtreecommitdiffstats
path: root/wgpu
diff options
context:
space:
mode:
authorLibravatar Aaron Housh <Dispersia@users.noreply.github.com>2021-05-19 07:14:26 -0700
committerLibravatar Aaron Housh <Dispersia@users.noreply.github.com>2021-05-19 07:14:26 -0700
commitae484429d30a3360893d030a17e52caa4164a052 (patch)
tree4bfe30d3b46c7e30170e0b495d9a4dd1a2a1825f /wgpu
parentcf6af4c2560f5996bc533402ac3e4289c0c94702 (diff)
parent3918257883dba3cf260bd9764cb7b34101c435e6 (diff)
downloadiced-ae484429d30a3360893d030a17e52caa4164a052.tar.gz
iced-ae484429d30a3360893d030a17e52caa4164a052.tar.bz2
iced-ae484429d30a3360893d030a17e52caa4164a052.zip
Merge branch 'hecrj:master' into upgrade-wgpu
Diffstat (limited to 'wgpu')
-rw-r--r--wgpu/src/image/vector.rs22
-rw-r--r--wgpu/src/settings.rs2
-rw-r--r--wgpu/src/window/compositor.rs23
3 files changed, 25 insertions, 22 deletions
diff --git a/wgpu/src/image/vector.rs b/wgpu/src/image/vector.rs
index ab0f67d0..8c7de617 100644
--- a/wgpu/src/image/vector.rs
+++ b/wgpu/src/image/vector.rs
@@ -1,7 +1,8 @@
-use crate::image::atlas::{self, Atlas};
use iced_native::svg;
use std::collections::{HashMap, HashSet};
+use crate::image::atlas::{self, Atlas};
+
pub enum Svg {
Loaded(usvg::Tree),
NotFound,
@@ -111,26 +112,13 @@ impl Cache {
let width = img.width();
let height = img.height();
- let mut rgba = img.take().into_iter();
-
- // TODO: Perform conversion in the GPU
- let bgra: Vec<u8> = std::iter::from_fn(move || {
- use std::iter::once;
-
- let r = rgba.next()?;
- let g = rgba.next()?;
- let b = rgba.next()?;
- let a = rgba.next()?;
-
- Some(once(b).chain(once(g)).chain(once(r)).chain(once(a)))
- })
- .flatten()
- .collect();
+ let mut rgba = img.take();
+ rgba.chunks_exact_mut(4).for_each(|rgba| rgba.swap(0, 2));
let allocation = texture_atlas.upload(
width,
height,
- bytemuck::cast_slice(bgra.as_slice()),
+ bytemuck::cast_slice(rgba.as_slice()),
device,
encoder,
)?;
diff --git a/wgpu/src/settings.rs b/wgpu/src/settings.rs
index abc404dc..6c97d895 100644
--- a/wgpu/src/settings.rs
+++ b/wgpu/src/settings.rs
@@ -47,6 +47,7 @@ impl Settings {
/// - `dx11`
/// - `gl`
/// - `webgpu`
+ /// - `primary`
pub fn from_env() -> Self {
Settings {
internal_backend: backend_from_env()
@@ -78,6 +79,7 @@ fn backend_from_env() -> Option<wgpu::BackendBit> {
"dx11" => wgpu::BackendBit::DX11,
"gl" => wgpu::BackendBit::GL,
"webgpu" => wgpu::BackendBit::BROWSER_WEBGPU,
+ "primary" => wgpu::BackendBit::PRIMARY,
other => panic!("Unknown backend: {}", other),
}
})
diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs
index 6ff499af..9b65596f 100644
--- a/wgpu/src/window/compositor.rs
+++ b/wgpu/src/window/compositor.rs
@@ -21,9 +21,16 @@ impl Compositor {
/// Requests a new [`Compositor`] with the given [`Settings`].
///
/// 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);
+ #[allow(unsafe_code)]
+ let compatible_surface = compatible_window
+ .map(|window| unsafe { instance.create_surface(window) });
+
let adapter = instance
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: if settings.antialiasing.is_none() {
@@ -31,7 +38,7 @@ impl Compositor {
} else {
wgpu::PowerPreference::HighPerformance
},
- compatible_surface: None,
+ compatible_surface: compatible_surface.as_ref(),
})
.await?;
@@ -77,9 +84,15 @@ impl iced_graphics::window::Compositor for Compositor {
type Surface = wgpu::Surface;
type SwapChain = wgpu::SwapChain;
- fn new(settings: Self::Settings) -> Result<(Self, Renderer), Error> {
- let compositor = futures::executor::block_on(Self::request(settings))
- .ok_or(Error::AdapterNotFound)?;
+ fn new<W: HasRawWindowHandle>(
+ settings: Self::Settings,
+ 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();