Allow iced_wgpu to render to any TextureView
This commit is contained in:
parent
95880ca74b
commit
f1e20a61f1
13 changed files with 355 additions and 240 deletions
99
wgpu/src/window/backend.rs
Normal file
99
wgpu/src/window/backend.rs
Normal file
|
|
@ -0,0 +1,99 @@
|
|||
use crate::{window::SwapChain, Renderer, Settings, Target};
|
||||
|
||||
use iced_native::MouseCursor;
|
||||
use raw_window_handle::HasRawWindowHandle;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Backend {
|
||||
device: wgpu::Device,
|
||||
queue: wgpu::Queue,
|
||||
}
|
||||
|
||||
impl iced_native::window::Backend for Backend {
|
||||
type Settings = Settings;
|
||||
type Renderer = Renderer;
|
||||
type Surface = wgpu::Surface;
|
||||
type SwapChain = SwapChain;
|
||||
|
||||
fn new(settings: Self::Settings) -> (Backend, Renderer) {
|
||||
let adapter = wgpu::Adapter::request(&wgpu::RequestAdapterOptions {
|
||||
power_preference: wgpu::PowerPreference::Default,
|
||||
backends: wgpu::BackendBit::all(),
|
||||
})
|
||||
.expect("Request adapter");
|
||||
|
||||
let (mut device, queue) =
|
||||
adapter.request_device(&wgpu::DeviceDescriptor {
|
||||
extensions: wgpu::Extensions {
|
||||
anisotropic_filtering: false,
|
||||
},
|
||||
limits: wgpu::Limits { max_bind_groups: 2 },
|
||||
});
|
||||
|
||||
let renderer = Renderer::new(settings, &mut device);
|
||||
|
||||
(Backend { device, queue }, renderer)
|
||||
}
|
||||
|
||||
fn create_surface<W: HasRawWindowHandle>(
|
||||
&mut self,
|
||||
window: &W,
|
||||
) -> wgpu::Surface {
|
||||
wgpu::Surface::create(window)
|
||||
}
|
||||
|
||||
fn create_swap_chain(
|
||||
&mut self,
|
||||
surface: &Self::Surface,
|
||||
width: u32,
|
||||
height: u32,
|
||||
scale_factor: f64,
|
||||
) -> SwapChain {
|
||||
SwapChain::new(&self.device, surface, width, height, scale_factor)
|
||||
}
|
||||
|
||||
fn draw<T: AsRef<str>>(
|
||||
&mut self,
|
||||
renderer: &mut Self::Renderer,
|
||||
swap_chain: &mut SwapChain,
|
||||
output: &<Self::Renderer as iced_native::Renderer>::Output,
|
||||
overlay: &[T],
|
||||
) -> MouseCursor {
|
||||
let (frame, viewport) = swap_chain.next_frame();
|
||||
|
||||
let mut encoder = self.device.create_command_encoder(
|
||||
&wgpu::CommandEncoderDescriptor { todo: 0 },
|
||||
);
|
||||
|
||||
let _ = encoder.begin_render_pass(&wgpu::RenderPassDescriptor {
|
||||
color_attachments: &[wgpu::RenderPassColorAttachmentDescriptor {
|
||||
attachment: &frame.view,
|
||||
resolve_target: None,
|
||||
load_op: wgpu::LoadOp::Clear,
|
||||
store_op: wgpu::StoreOp::Store,
|
||||
clear_color: wgpu::Color {
|
||||
r: 1.0,
|
||||
g: 1.0,
|
||||
b: 1.0,
|
||||
a: 1.0,
|
||||
},
|
||||
}],
|
||||
depth_stencil_attachment: None,
|
||||
});
|
||||
|
||||
let mouse_cursor = renderer.draw(
|
||||
&mut self.device,
|
||||
&mut encoder,
|
||||
Target {
|
||||
texture: &frame.view,
|
||||
viewport,
|
||||
},
|
||||
output,
|
||||
overlay,
|
||||
);
|
||||
|
||||
self.queue.submit(&[encoder.finish()]);
|
||||
|
||||
mouse_cursor
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue