wgpu: Store wgpu::Instance in Descriptors

This commit is contained in:
Nathan Adams 2023-07-16 21:11:34 +02:00
parent 030c3c50e8
commit 5597535471
5 changed files with 19 additions and 10 deletions

View File

@ -83,7 +83,7 @@ impl GuiController {
view_formats: Default::default(), view_formats: Default::default(),
}, },
); );
let descriptors = Descriptors::new(adapter, device, queue); let descriptors = Descriptors::new(instance, adapter, device, queue);
let egui_ctx = Context::default(); let egui_ctx = Context::default();
if let Some(Theme::Light) = window.theme() { if let Some(Theme::Light) = window.theme() {
egui_ctx.set_visuals(egui::Visuals::light()); egui_ctx.set_visuals(egui::Visuals::light());

View File

@ -414,7 +414,7 @@ fn main() -> Result<()> {
)) ))
.map_err(|e| anyhow!(e.to_string()))?; .map_err(|e| anyhow!(e.to_string()))?;
let descriptors = Arc::new(Descriptors::new(adapter, device, queue)); let descriptors = Arc::new(Descriptors::new(instance, adapter, device, queue));
if opt.swf.is_file() { if opt.swf.is_file() {
capture_single_swf(descriptors, &opt)?; capture_single_swf(descriptors, &opt)?;

View File

@ -73,7 +73,7 @@ impl WgpuRenderBackend<SwapChainTarget> {
None, None,
) )
.await?; .await?;
let descriptors = Descriptors::new(adapter, device, queue); let descriptors = Descriptors::new(instance, adapter, device, queue);
let target = let target =
SwapChainTarget::new(surface, &descriptors.adapter, (1, 1), &descriptors.device); SwapChainTarget::new(surface, &descriptors.adapter, (1, 1), &descriptors.device);
Self::new(Arc::new(descriptors), target) Self::new(Arc::new(descriptors), target)
@ -107,7 +107,7 @@ impl WgpuRenderBackend<SwapChainTarget> {
power_preference, power_preference,
trace_path, trace_path,
))?; ))?;
let descriptors = Descriptors::new(adapter, device, queue); let descriptors = Descriptors::new(instance, adapter, device, queue);
let target = SwapChainTarget::new(surface, &descriptors.adapter, size, &descriptors.device); let target = SwapChainTarget::new(surface, &descriptors.adapter, size, &descriptors.device);
Self::new(Arc::new(descriptors), target) Self::new(Arc::new(descriptors), target)
} }
@ -138,7 +138,7 @@ impl WgpuRenderBackend<crate::target::TextureTarget> {
power_preference, power_preference,
trace_path, trace_path,
))?; ))?;
let descriptors = Descriptors::new(adapter, device, queue); let descriptors = Descriptors::new(instance, adapter, device, queue);
let target = crate::target::TextureTarget::new(&descriptors.device, size)?; let target = crate::target::TextureTarget::new(&descriptors.device, size)?;
Self::new(Arc::new(descriptors), target) Self::new(Arc::new(descriptors), target)
} }

View File

@ -12,6 +12,7 @@ use std::mem;
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex};
pub struct Descriptors { pub struct Descriptors {
pub wgpu_instance: wgpu::Instance,
pub adapter: wgpu::Adapter, pub adapter: wgpu::Adapter,
pub device: wgpu::Device, pub device: wgpu::Device,
pub limits: wgpu::Limits, pub limits: wgpu::Limits,
@ -34,7 +35,12 @@ impl Debug for Descriptors {
} }
impl Descriptors { impl Descriptors {
pub fn new(adapter: wgpu::Adapter, device: wgpu::Device, queue: wgpu::Queue) -> Self { pub fn new(
instance: wgpu::Instance,
adapter: wgpu::Adapter,
device: wgpu::Device,
queue: wgpu::Queue,
) -> Self {
let limits = device.limits(); let limits = device.limits();
let bind_layouts = BindLayouts::new(&device); let bind_layouts = BindLayouts::new(&device);
let bitmap_samplers = BitmapSamplers::new(&device); let bitmap_samplers = BitmapSamplers::new(&device);
@ -57,6 +63,7 @@ impl Descriptors {
let filters = Filters::new(&device); let filters = Filters::new(&device);
Self { Self {
wgpu_instance: instance,
adapter, adapter,
device, device,
limits, limits,

View File

@ -15,20 +15,22 @@ use std::sync::{Arc, OnceLock};
but for `cargo nextest run` it's a big cost per test if it's not going to use it. but for `cargo nextest run` it's a big cost per test if it's not going to use it.
*/ */
fn create_wgpu_device() -> Option<(wgpu::Adapter, wgpu::Device, wgpu::Queue)> { fn create_wgpu_device() -> Option<(wgpu::Instance, wgpu::Adapter, wgpu::Device, wgpu::Queue)> {
let instance = wgpu::Instance::new(Default::default());
futures::executor::block_on(request_adapter_and_device( futures::executor::block_on(request_adapter_and_device(
wgpu::Backends::all(), wgpu::Backends::all(),
&wgpu::Instance::new(Default::default()), &instance,
None, None,
Default::default(), Default::default(),
None, None,
)) ))
.ok() .ok()
.map(|(adapter, device, queue)| (instance, adapter, device, queue))
} }
fn build_wgpu_descriptors() -> Option<Arc<Descriptors>> { fn build_wgpu_descriptors() -> Option<Arc<Descriptors>> {
if let Some((adapter, device, queue)) = create_wgpu_device() { if let Some((instance, adapter, device, queue)) = create_wgpu_device() {
Some(Arc::new(Descriptors::new(adapter, device, queue))) Some(Arc::new(Descriptors::new(instance, adapter, device, queue)))
} else { } else {
None None
} }