fix async

This commit is contained in:
2026-02-17 10:44:36 -08:00
parent 5b5ad0c63e
commit 8eb63436fb
4 changed files with 22 additions and 12 deletions

1
Cargo.lock generated
View File

@@ -1708,6 +1708,7 @@ dependencies = [
"strafesnet_roblox_bot_player", "strafesnet_roblox_bot_player",
"strafesnet_snf", "strafesnet_snf",
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-futures",
"web-sys", "web-sys",
"wgpu", "wgpu",
] ]

View File

@@ -16,6 +16,7 @@ pollster = "0.4.0"
wasm-bindgen = "0.2.108" wasm-bindgen = "0.2.108"
wgpu = "28.0.0" wgpu = "28.0.0"
web-sys = { version = "0.3.85", features = ["HtmlCanvasElement"] } web-sys = { version = "0.3.85", features = ["HtmlCanvasElement"] }
wasm-bindgen-futures = "0.4.58"
[package.metadata.wasm-pack.profile.release] [package.metadata.wasm-pack.profile.release]
wasm-opt = ["-Oz", "--enable-bulk-memory","--enable-nontrapping-float-to-int"] wasm-opt = ["-Oz", "--enable-bulk-memory","--enable-nontrapping-float-to-int"]

View File

@@ -5,6 +5,15 @@ use strafesnet_common::session::Time as SessionTime;
mod setup; mod setup;
#[wasm_bindgen]
pub struct Setup{
setup:setup::SetupContext<'static>,
}
#[wasm_bindgen]
pub async fn setup(canvas:web_sys::HtmlCanvasElement)->Setup{
let setup=setup::setup_and_start(canvas).await;
Setup{setup}
}
#[wasm_bindgen] #[wasm_bindgen]
pub struct Graphics{ pub struct Graphics{
graphics:graphics::Graphics, graphics:graphics::Graphics,
@@ -14,13 +23,12 @@ pub struct Graphics{
impl Graphics{ impl Graphics{
#[wasm_bindgen(constructor)] #[wasm_bindgen(constructor)]
pub fn new( pub fn new(
canvas:web_sys::HtmlCanvasElement, setup:Setup,
data:&[u8], data:&[u8],
)->Result<Self,JsValue>{ )->Result<Self,JsValue>{
let context=crate::setup::setup_and_start(canvas);
Ok(Self{ Ok(Self{
graphics:graphics::Graphics::new(data,context.device,context.queue,context.config).map_err(|e|JsValue::from_str(&e.to_string()))?, graphics:graphics::Graphics::new(data,setup.setup.device,setup.setup.queue,setup.setup.config).map_err(|e|JsValue::from_str(&e.to_string()))?,
surface:context.surface, surface:setup.setup.surface,
}) })
} }
#[wasm_bindgen] #[wasm_bindgen]

View File

@@ -39,13 +39,13 @@ struct SetupContextPartial2<'a>{
surface:wgpu::Surface<'a>, surface:wgpu::Surface<'a>,
} }
impl<'a> SetupContextPartial2<'a>{ impl<'a> SetupContextPartial2<'a>{
fn pick_adapter(self)->SetupContextPartial3<'a>{ async fn pick_adapter(self)->SetupContextPartial3<'a>{
//TODO: prefer adapter that implements optional features //TODO: prefer adapter that implements optional features
//let optional_features=optional_features(); //let optional_features=optional_features();
let required_features=required_features(); let required_features=required_features();
//no helper function smh gotta write it myself //no helper function smh gotta write it myself
let adapters=pollster::block_on(self.instance.enumerate_adapters(self.backends)); let adapters=self.instance.enumerate_adapters(self.backends).await;
let chosen_adapter=adapters.into_iter() let chosen_adapter=adapters.into_iter()
// reverse because we want to select adapters that appear first in ties, // reverse because we want to select adapters that appear first in ties,
@@ -92,14 +92,14 @@ struct SetupContextPartial3<'a>{
adapter:wgpu::Adapter, adapter:wgpu::Adapter,
} }
impl<'a> SetupContextPartial3<'a>{ impl<'a> SetupContextPartial3<'a>{
fn request_device(self)->SetupContextPartial4<'a>{ async fn request_device(self)->SetupContextPartial4<'a>{
let optional_features=optional_features(); let optional_features=optional_features();
let required_features=required_features(); let required_features=required_features();
// Make sure we use the texture resolution limits from the adapter, so we can support images the size of the surface. // Make sure we use the texture resolution limits from the adapter, so we can support images the size of the surface.
let needed_limits=strafesnet_graphics::graphics::required_limits().using_resolution(self.adapter.limits()); let needed_limits=strafesnet_graphics::graphics::required_limits().using_resolution(self.adapter.limits());
let (device, queue)=pollster::block_on(self.adapter let (device, queue)=self.adapter
.request_device( .request_device(
&wgpu::DeviceDescriptor{ &wgpu::DeviceDescriptor{
label:None, label:None,
@@ -109,7 +109,7 @@ impl<'a> SetupContextPartial3<'a>{
trace:wgpu::Trace::Off, trace:wgpu::Trace::Off,
experimental_features:wgpu::ExperimentalFeatures::disabled(), experimental_features:wgpu::ExperimentalFeatures::disabled(),
}, },
)) ).await
.expect("Unable to find a suitable GPU adapter!"); .expect("Unable to find a suitable GPU adapter!");
SetupContextPartial4{ SetupContextPartial4{
@@ -151,7 +151,7 @@ pub struct SetupContext<'a>{
pub config:wgpu::SurfaceConfiguration, pub config:wgpu::SurfaceConfiguration,
} }
pub fn setup_and_start(canvas:web_sys::HtmlCanvasElement)->SetupContext<'static>{ pub async fn setup_and_start(canvas:web_sys::HtmlCanvasElement)->SetupContext<'static>{
let size=(canvas.width(),canvas.height()); let size=(canvas.width(),canvas.height());
println!("Initializing the surface..."); println!("Initializing the surface...");
@@ -160,9 +160,9 @@ pub fn setup_and_start(canvas:web_sys::HtmlCanvasElement)->SetupContext<'static>
let partial_2=partial_1.create_surface(canvas).unwrap(); let partial_2=partial_1.create_surface(canvas).unwrap();
let partial_3=partial_2.pick_adapter(); let partial_3=partial_2.pick_adapter().await;
let partial_4=partial_3.request_device(); let partial_4=partial_3.request_device().await;
let setup_context=partial_4.configure_surface(size); let setup_context=partial_4.configure_surface(size);