Merge branch 'hecrj:master' into upgrade-wgpu
This commit is contained in:
commit
ae484429d3
13 changed files with 104 additions and 50 deletions
|
|
@ -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,
|
||||
)?;
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
}
|
||||
})
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue