From ae48fe07e0a63d30d1ee6b7fe3bb2889c40b7aa8 Mon Sep 17 00:00:00 2001 From: kyren Date: Sun, 19 May 2019 01:22:52 -0400 Subject: [PATCH 1/3] Update API for in-progress wgpu-gl PR to wgpu / gfx --- Cargo.toml | 1 + examples/framework.rs | 70 ++++++++++++++++++++++-------- examples/hello-triangle/main.rs | 75 +++++++++++++++++++++++---------- src/lib.rs | 20 +++++++++ 4 files changed, 127 insertions(+), 39 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index cfdac426b7..64fefc3559 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ metal = ["wgn/gfx-backend-metal"] dx11 = ["wgn/gfx-backend-dx11"] dx12 = ["wgn/gfx-backend-dx12"] vulkan = ["wgn/gfx-backend-vulkan"] +gl = ["wgn/gfx-backend-gl"] [dependencies] #TODO: only depend on the published version diff --git a/examples/framework.rs b/examples/framework.rs index 6d2e8a668d..277dbc4e6f 100644 --- a/examples/framework.rs +++ b/examples/framework.rs @@ -44,16 +44,62 @@ pub fn run(title: &str) { EventsLoop, KeyboardInput, VirtualKeyCode, - Window, WindowEvent, }; - info!("Initializing the device..."); env_logger::init(); - let instance = wgpu::Instance::new(); - let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { - power_preference: wgpu::PowerPreference::LowPower, - }); + + let mut events_loop = EventsLoop::new(); + + info!("Initializing the window..."); + + #[cfg(not(feature = "gl"))] + let (_instance, _window, hidpi_factor, size, surface, adapter) = { + use wgpu::winit::Window; + + let instance = wgpu::Instance::new(); + + let window = Window::new(&events_loop).unwrap(); + window.set_title(title); + let hidpi_factor = window.get_hidpi_factor(); + let size = window + .get_inner_size() + .unwrap() + .to_physical(hidpi_factor); + + let surface = instance.create_surface(&window); + + let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { + power_preference: wgpu::PowerPreference::LowPower, + }); + + (instance, window, hidpi_factor, size, surface, adapter) + }; + + #[cfg(feature = "gl")] + let (hidpi_factor, size, surface, adapter) = { + let wb = wgpu::winit::WindowBuilder::new(); + let cb = wgpu::glutin::ContextBuilder::new().with_vsync(true); + let context = wgpu::glutin::WindowedContext::new_windowed(wb, cb, &events_loop).unwrap(); + context.window().set_title(title); + + let hidpi_factor = context.window().get_hidpi_factor(); + let size = context + .window() + .get_inner_size() + .unwrap() + .to_physical(hidpi_factor); + + let surface = wgpu::Surface::create(context); + + let adapter = surface.get_adapter(&wgpu::AdapterDescriptor { + power_preference: wgpu::PowerPreference::LowPower, + }); + + (hidpi_factor, size, surface, adapter) + }; + + let mut device = adapter.request_device(&wgpu::DeviceDescriptor { extensions: wgpu::Extensions { anisotropic_filtering: false, @@ -61,16 +107,6 @@ pub fn run(title: &str) { limits: wgpu::Limits::default(), }); - info!("Initializing the window..."); - let mut events_loop = EventsLoop::new(); - let window = Window::new(&events_loop).unwrap(); - window.set_title(title); - let size = window - .get_inner_size() - .unwrap() - .to_physical(window.get_hidpi_factor()); - - let surface = instance.create_surface(&window); let mut sc_desc = wgpu::SwapChainDescriptor { usage: wgpu::TextureUsage::OUTPUT_ATTACHMENT, format: wgpu::TextureFormat::Bgra8Unorm, @@ -90,7 +126,7 @@ pub fn run(title: &str) { event: WindowEvent::Resized(size), .. } => { - let physical = size.to_physical(window.get_hidpi_factor()); + let physical = size.to_physical(hidpi_factor); info!("Resizing to {:?}", physical); sc_desc.width = physical.width.round() as u32; sc_desc.height = physical.height.round() as u32; diff --git a/examples/hello-triangle/main.rs b/examples/hello-triangle/main.rs index ca689b0678..43ff42e374 100644 --- a/examples/hello-triangle/main.rs +++ b/examples/hello-triangle/main.rs @@ -1,10 +1,59 @@ fn main() { + use wgpu::winit::{ + ElementState, + Event, + EventsLoop, + KeyboardInput, + VirtualKeyCode, + WindowEvent, + }; + env_logger::init(); - let instance = wgpu::Instance::new(); - let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { - power_preference: wgpu::PowerPreference::LowPower, - }); + let mut events_loop = EventsLoop::new(); + + #[cfg(not(feature = "gl"))] + let (_instance, _window, size, surface, adapter) = { + use wgpu::winit::Window; + + let instance = wgpu::Instance::new(); + + let window = Window::new(&events_loop).unwrap(); + let size = window + .get_inner_size() + .unwrap() + .to_physical(window.get_hidpi_factor()); + + let surface = instance.create_surface(&window); + + let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { + power_preference: wgpu::PowerPreference::LowPower, + }); + + (instance, window, size, surface, adapter) + }; + + #[cfg(feature = "gl")] + let (size, surface, adapter) = { + let wb = wgpu::winit::WindowBuilder::new(); + let cb = wgpu::glutin::ContextBuilder::new().with_vsync(true); + let context = wgpu::glutin::WindowedContext::new_windowed(wb, cb, &events_loop).unwrap(); + + let size = context + .window() + .get_inner_size() + .unwrap() + .to_physical(context.window().get_hidpi_factor()); + + let surface = wgpu::Surface::create(context); + + let adapter = surface.get_adapter(&wgpu::AdapterDescriptor { + power_preference: wgpu::PowerPreference::LowPower, + }); + + (size, surface, adapter) + }; + let mut device = adapter.request_device(&wgpu::DeviceDescriptor { extensions: wgpu::Extensions { anisotropic_filtering: false, @@ -57,24 +106,6 @@ fn main() { sample_count: 1, }); - use wgpu::winit::{ - ElementState, - Event, - EventsLoop, - KeyboardInput, - VirtualKeyCode, - Window, - WindowEvent, - }; - - let mut events_loop = EventsLoop::new(); - let window = Window::new(&events_loop).unwrap(); - let size = window - .get_inner_size() - .unwrap() - .to_physical(window.get_hidpi_factor()); - - let surface = instance.create_surface(&window); let mut swap_chain = device.create_swap_chain( &surface, &wgpu::SwapChainDescriptor { diff --git a/src/lib.rs b/src/lib.rs index 8ef3a71a16..1e33803801 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -60,6 +60,9 @@ pub use wgn::{ VertexFormat, }; +#[cfg(feature = "gl")] +pub use wgn::glutin; + //TODO: avoid heap allocating vectors during resource creation. #[derive(Default)] struct Temp { @@ -72,6 +75,7 @@ struct Temp { /// /// An `Instance` represents the entire context of a running `wgpu` instance. The `Instance` /// allows the querying of [`Adapter`] objects and the creation of [`Surface`] objects. +#[cfg(not(feature = "gl"))] pub struct Instance { id: wgn::InstanceId, } @@ -453,6 +457,7 @@ where } } +#[cfg(not(feature = "gl"))] impl Instance { /// Create a new `Instance` object. pub fn new() -> Self { @@ -491,6 +496,21 @@ impl Instance { } } +#[cfg(feature = "gl")] +impl Surface { + pub fn create(windowed_context: wgn::glutin::WindowedContext) -> Surface { + Surface { + id: wgn::wgpu_gl_create_surface(windowed_context) + } + } + + pub fn get_adapter(&self, desc: &AdapterDescriptor) -> Adapter { + Adapter { + id: wgn::wgpu_gl_surface_get_adapter(self.id, desc), + } + } +} + impl Adapter { /// Requests a connection to a physical device, creating a logical device. /// From 8c53667572a81dffd5639486a80b0c2b0ebd9250 Mon Sep 17 00:00:00 2001 From: kyren Date: Tue, 21 May 2019 17:41:26 -0400 Subject: [PATCH 2/3] Update for new wgpu PR, keep API slightly closer to vanilla --- examples/framework.rs | 22 +++++++++------------- examples/hello-triangle/main.rs | 23 ++++++++++------------- src/lib.rs | 33 ++++++++++++++++----------------- 3 files changed, 35 insertions(+), 43 deletions(-) diff --git a/examples/framework.rs b/examples/framework.rs index 277dbc4e6f..67534c6007 100644 --- a/examples/framework.rs +++ b/examples/framework.rs @@ -54,7 +54,7 @@ pub fn run(title: &str) { info!("Initializing the window..."); #[cfg(not(feature = "gl"))] - let (_instance, _window, hidpi_factor, size, surface, adapter) = { + let (_window, instance, hidpi_factor, size, surface) = { use wgpu::winit::Window; let instance = wgpu::Instance::new(); @@ -69,15 +69,11 @@ pub fn run(title: &str) { let surface = instance.create_surface(&window); - let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { - power_preference: wgpu::PowerPreference::LowPower, - }); - - (instance, window, hidpi_factor, size, surface, adapter) + (window, instance, hidpi_factor, size, surface) }; #[cfg(feature = "gl")] - let (hidpi_factor, size, surface, adapter) = { + let (instance, hidpi_factor, size, surface) = { let wb = wgpu::winit::WindowBuilder::new(); let cb = wgpu::glutin::ContextBuilder::new().with_vsync(true); let context = wgpu::glutin::WindowedContext::new_windowed(wb, cb, &events_loop).unwrap(); @@ -90,15 +86,15 @@ pub fn run(title: &str) { .unwrap() .to_physical(hidpi_factor); - let surface = wgpu::Surface::create(context); + let instance = wgpu::Instance::new(context); + let surface = instance.get_surface(); - let adapter = surface.get_adapter(&wgpu::AdapterDescriptor { - power_preference: wgpu::PowerPreference::LowPower, - }); - - (hidpi_factor, size, surface, adapter) + (instance, hidpi_factor, size, surface) }; + let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { + power_preference: wgpu::PowerPreference::LowPower, + }); let mut device = adapter.request_device(&wgpu::DeviceDescriptor { extensions: wgpu::Extensions { diff --git a/examples/hello-triangle/main.rs b/examples/hello-triangle/main.rs index 43ff42e374..2892d36700 100644 --- a/examples/hello-triangle/main.rs +++ b/examples/hello-triangle/main.rs @@ -13,7 +13,7 @@ fn main() { let mut events_loop = EventsLoop::new(); #[cfg(not(feature = "gl"))] - let (_instance, _window, size, surface, adapter) = { + let (_window, instance, size, surface) = { use wgpu::winit::Window; let instance = wgpu::Instance::new(); @@ -26,15 +26,11 @@ fn main() { let surface = instance.create_surface(&window); - let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { - power_preference: wgpu::PowerPreference::LowPower, - }); - - (instance, window, size, surface, adapter) + (window, instance, size, surface) }; #[cfg(feature = "gl")] - let (size, surface, adapter) = { + let (instance, size, surface) = { let wb = wgpu::winit::WindowBuilder::new(); let cb = wgpu::glutin::ContextBuilder::new().with_vsync(true); let context = wgpu::glutin::WindowedContext::new_windowed(wb, cb, &events_loop).unwrap(); @@ -45,15 +41,16 @@ fn main() { .unwrap() .to_physical(context.window().get_hidpi_factor()); - let surface = wgpu::Surface::create(context); + let instance = wgpu::Instance::new(context); + let surface = instance.get_surface(); - let adapter = surface.get_adapter(&wgpu::AdapterDescriptor { - power_preference: wgpu::PowerPreference::LowPower, - }); - - (size, surface, adapter) + (instance, size, surface) }; + let adapter = instance.get_adapter(&wgpu::AdapterDescriptor { + power_preference: wgpu::PowerPreference::LowPower, + }); + let mut device = adapter.request_device(&wgpu::DeviceDescriptor { extensions: wgpu::Extensions { anisotropic_filtering: false, diff --git a/src/lib.rs b/src/lib.rs index 1e33803801..1e8d926c7d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -75,7 +75,6 @@ struct Temp { /// /// An `Instance` represents the entire context of a running `wgpu` instance. The `Instance` /// allows the querying of [`Adapter`] objects and the creation of [`Surface`] objects. -#[cfg(not(feature = "gl"))] pub struct Instance { id: wgn::InstanceId, } @@ -457,9 +456,9 @@ where } } -#[cfg(not(feature = "gl"))] impl Instance { /// Create a new `Instance` object. + #[cfg(not(feature = "gl"))] pub fn new() -> Self { Instance { id: wgn::wgpu_create_instance(), @@ -475,6 +474,13 @@ impl Instance { /// /// Panics if there are no available adapters. This will occur if none of the graphics backends /// are enabled. + #[cfg(feature = "gl")] + pub fn new(windowed_context: wgn::glutin::WindowedContext) -> Self { + Instance { + id: wgn::wgpu_create_gl_instance(windowed_context) + } + } + pub fn get_adapter(&self, desc: &AdapterDescriptor) -> Adapter { Adapter { id: wgn::wgpu_instance_get_adapter(self.id, desc), @@ -482,12 +488,20 @@ impl Instance { } /// Creates a surface from a window. + #[cfg(not(feature = "gl"))] pub fn create_surface(&self, window: &winit::Window) -> Surface { Surface { id: wgn::wgpu_instance_create_surface_from_winit(self.id, window), } } + #[cfg(feature = "gl")] + pub fn get_surface(&self) -> Surface { + Surface { + id: wgn::wgpu_instance_get_gl_surface(self.id), + } + } + #[cfg(feature = "metal")] pub fn create_surface_with_metal_layer(&self, window: *mut std::ffi::c_void) -> Surface { Surface { @@ -496,21 +510,6 @@ impl Instance { } } -#[cfg(feature = "gl")] -impl Surface { - pub fn create(windowed_context: wgn::glutin::WindowedContext) -> Surface { - Surface { - id: wgn::wgpu_gl_create_surface(windowed_context) - } - } - - pub fn get_adapter(&self, desc: &AdapterDescriptor) -> Adapter { - Adapter { - id: wgn::wgpu_gl_surface_get_adapter(self.id, desc), - } - } -} - impl Adapter { /// Requests a connection to a physical device, creating a logical device. /// From 9faa01adb298631f0b6666f7054d152435cdb9a2 Mon Sep 17 00:00:00 2001 From: kyren Date: Sat, 25 May 2019 16:03:57 -0400 Subject: [PATCH 3/3] Fix merge snafu --- src/lib.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 1e8d926c7d..ba55d63b9b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -465,6 +465,13 @@ impl Instance { } } + #[cfg(feature = "gl")] + pub fn new(windowed_context: wgn::glutin::WindowedContext) -> Self { + Instance { + id: wgn::wgpu_create_gl_instance(windowed_context) + } + } + /// Retrieves an [`Adapter`] which matches the given descriptor. /// /// If there are no available adapters matching `desc`, this function will return another @@ -474,13 +481,6 @@ impl Instance { /// /// Panics if there are no available adapters. This will occur if none of the graphics backends /// are enabled. - #[cfg(feature = "gl")] - pub fn new(windowed_context: wgn::glutin::WindowedContext) -> Self { - Instance { - id: wgn::wgpu_create_gl_instance(windowed_context) - } - } - pub fn get_adapter(&self, desc: &AdapterDescriptor) -> Adapter { Adapter { id: wgn::wgpu_instance_get_adapter(self.id, desc),