diff options
Diffstat (limited to 'runtime')
-rw-r--r-- | runtime/Cargo.toml | 2 | ||||
-rw-r--r-- | runtime/build.rs | 1 | ||||
-rw-r--r-- | runtime/errors.rs | 1 | ||||
-rw-r--r-- | runtime/js/99_main.js | 47 | ||||
-rw-r--r-- | runtime/lib.rs | 1 | ||||
-rw-r--r-- | runtime/ops/mod.rs | 1 | ||||
-rw-r--r-- | runtime/ops/webgpu.rs | 421 | ||||
-rw-r--r-- | runtime/web_worker.rs | 1 | ||||
-rw-r--r-- | runtime/worker.rs | 1 |
9 files changed, 476 insertions, 0 deletions
diff --git a/runtime/Cargo.toml b/runtime/Cargo.toml index cdae5a40c..30912c078 100644 --- a/runtime/Cargo.toml +++ b/runtime/Cargo.toml @@ -23,6 +23,7 @@ deno_crypto = { path = "../op_crates/crypto", version = "0.13.0" } deno_fetch = { path = "../op_crates/fetch", version = "0.22.0" } deno_web = { path = "../op_crates/web", version = "0.30.0" } deno_websocket = { path = "../op_crates/websocket", version = "0.5.0" } +deno_webgpu = { path = "../op_crates/webgpu", version = "0.1.0" } [target.'cfg(windows)'.build-dependencies] winres = "0.1.11" @@ -34,6 +35,7 @@ deno_crypto = { path = "../op_crates/crypto", version = "0.13.0" } deno_fetch = { path = "../op_crates/fetch", version = "0.22.0" } deno_web = { path = "../op_crates/web", version = "0.30.0" } deno_websocket = { path = "../op_crates/websocket", version = "0.5.0" } +deno_webgpu = { path = "../op_crates/webgpu", version = "0.1.0" } atty = "0.2.14" dlopen = "0.1.8" diff --git a/runtime/build.rs b/runtime/build.rs index 5a99b86c8..248148568 100644 --- a/runtime/build.rs +++ b/runtime/build.rs @@ -17,6 +17,7 @@ fn create_snapshot( deno_fetch::init(&mut js_runtime); deno_websocket::init(&mut js_runtime); deno_crypto::init(&mut js_runtime); + deno_webgpu::init(&mut js_runtime); // TODO(nayeemrmn): https://github.com/rust-lang/cargo/issues/3946 to get the // workspace root. let display_root = Path::new(env!("CARGO_MANIFEST_DIR")).parent().unwrap(); diff --git a/runtime/errors.rs b/runtime/errors.rs index b3d474504..a8152b075 100644 --- a/runtime/errors.rs +++ b/runtime/errors.rs @@ -151,6 +151,7 @@ fn get_nix_error_class(error: &nix::Error) -> &'static str { pub fn get_error_class_name(e: &AnyError) -> Option<&'static str> { deno_core::error::get_custom_error_class(e) + .or_else(|| deno_webgpu::error::get_error_class_name(e)) .or_else(|| { e.downcast_ref::<dlopen::Error>() .map(get_dlopen_error_class) diff --git a/runtime/js/99_main.js b/runtime/js/99_main.js index 485080812..811412049 100644 --- a/runtime/js/99_main.js +++ b/runtime/js/99_main.js @@ -27,6 +27,7 @@ delete Object.prototype.__proto__; const headers = window.__bootstrap.headers; const streams = window.__bootstrap.streams; const fileReader = window.__bootstrap.fileReader; + const webgpu = window.__bootstrap.webgpu; const webSocket = window.__bootstrap.webSocket; const file = window.__bootstrap.file; const fetch = window.__bootstrap.fetch; @@ -195,6 +196,11 @@ delete Object.prototype.__proto__; core.registerErrorClass("SyntaxError", SyntaxError); core.registerErrorClass("TypeError", TypeError); core.registerErrorClass("URIError", URIError); + core.registerErrorClass( + "DOMExceptionOperationError", + DOMException, + "OperationError", + ); } // https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope @@ -249,6 +255,37 @@ delete Object.prototype.__proto__; performance: util.writable(performance.performance), setInterval: util.writable(timers.setInterval), setTimeout: util.writable(timers.setTimeout), + + GPU: util.nonEnumerable(webgpu.GPU), + GPUAdapter: util.nonEnumerable(webgpu.GPUAdapter), + GPUAdapterLimits: util.nonEnumerable(webgpu.GPUAdapterLimits), + GPUAdapterFeatures: util.nonEnumerable(webgpu.GPUAdapterFeatures), + GPUDevice: util.nonEnumerable(webgpu.GPUDevice), + GPUQueue: util.nonEnumerable(webgpu.GPUQueue), + GPUBuffer: util.nonEnumerable(webgpu.GPUBuffer), + GPUBufferUsage: util.nonEnumerable(webgpu.GPUBufferUsage), + GPUMapMode: util.nonEnumerable(webgpu.GPUMapMode), + GPUTexture: util.nonEnumerable(webgpu.GPUTexture), + GPUTextureUsage: util.nonEnumerable(webgpu.GPUTextureUsage), + GPUTextureView: util.nonEnumerable(webgpu.GPUTextureView), + GPUSampler: util.nonEnumerable(webgpu.GPUSampler), + GPUBindGroupLayout: util.nonEnumerable(webgpu.GPUBindGroupLayout), + GPUPipelineLayout: util.nonEnumerable(webgpu.GPUPipelineLayout), + GPUBindGroup: util.nonEnumerable(webgpu.GPUBindGroup), + GPUShaderModule: util.nonEnumerable(webgpu.GPUShaderModule), + GPUShaderStage: util.nonEnumerable(webgpu.GPUShaderStage), + GPUComputePipeline: util.nonEnumerable(webgpu.GPUComputePipeline), + GPURenderPipeline: util.nonEnumerable(webgpu.GPURenderPipeline), + GPUColorWrite: util.nonEnumerable(webgpu.GPUColorWrite), + GPUCommandEncoder: util.nonEnumerable(webgpu.GPUCommandEncoder), + GPURenderPassEncoder: util.nonEnumerable(webgpu.GPURenderPassEncoder), + GPUComputePassEncoder: util.nonEnumerable(webgpu.GPUComputePassEncoder), + GPUCommandBuffer: util.nonEnumerable(webgpu.GPUCommandBuffer), + GPURenderBundleEncoder: util.nonEnumerable(webgpu.GPURenderBundleEncoder), + GPURenderBundle: util.nonEnumerable(webgpu.GPURenderBundle), + GPUQuerySet: util.nonEnumerable(webgpu.GPUQuerySet), + GPUOutOfMemoryError: util.nonEnumerable(webgpu.GPUOutOfMemoryError), + GPUValidationError: util.nonEnumerable(webgpu.GPUValidationError), }; // The console seems to be the only one that should be writable and non-enumerable @@ -256,12 +293,17 @@ delete Object.prototype.__proto__; // structure, it might be worth it to define a helper in `util` windowOrWorkerGlobalScope.console.enumerable = false; + const windowNavigatorProperties = { + gpu: webgpu.gpu, + }; + const mainRuntimeGlobalProperties = { Location: location.locationConstructorDescriptor, location: location.locationDescriptor, Window: globalInterfaces.windowConstructorDescriptor, window: util.readOnly(globalThis), self: util.readOnly(globalThis), + navigator: util.readOnly(windowNavigatorProperties), // TODO(bartlomieju): from MDN docs (https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope) // it seems those two properties should be available to workers as well onload: util.writable(null), @@ -273,12 +315,17 @@ delete Object.prototype.__proto__; prompt: util.writable(prompt.prompt), }; + const workerNavigatorProperties = { + gpu: webgpu.gpu, + }; + const workerRuntimeGlobalProperties = { WorkerLocation: location.workerLocationConstructorDescriptor, location: location.workerLocationDescriptor, WorkerGlobalScope: globalInterfaces.workerGlobalScopeConstructorDescriptor, DedicatedWorkerGlobalScope: globalInterfaces.dedicatedWorkerGlobalScopeConstructorDescriptor, + navigator: util.readOnly(workerNavigatorProperties), self: util.readOnly(globalThis), onmessage: util.writable(onmessage), onerror: util.writable(onerror), diff --git a/runtime/lib.rs b/runtime/lib.rs index 0d2179494..c523b24b7 100644 --- a/runtime/lib.rs +++ b/runtime/lib.rs @@ -10,6 +10,7 @@ extern crate log; pub use deno_crypto; pub use deno_fetch; pub use deno_web; +pub use deno_webgpu; pub use deno_websocket; pub mod colors; diff --git a/runtime/ops/mod.rs b/runtime/ops/mod.rs index e5dba723a..0ef04ff3c 100644 --- a/runtime/ops/mod.rs +++ b/runtime/ops/mod.rs @@ -21,6 +21,7 @@ pub mod timers; pub mod tls; pub mod tty; pub mod web_worker; +pub mod webgpu; pub mod websocket; pub mod worker_host; diff --git a/runtime/ops/webgpu.rs b/runtime/ops/webgpu.rs new file mode 100644 index 000000000..d3b9cfa19 --- /dev/null +++ b/runtime/ops/webgpu.rs @@ -0,0 +1,421 @@ +use deno_webgpu::*; + +pub fn init(rt: &mut deno_core::JsRuntime) { + { + let op_state = rt.op_state(); + let mut state = op_state.borrow_mut(); + state.put(wgpu_core::hub::Global::new( + "webgpu", + wgpu_core::hub::IdentityManagerFactory, + wgpu_types::BackendBit::PRIMARY, + )); + let unstable_checker = state.borrow::<super::UnstableChecker>(); + let unstable = unstable_checker.unstable; + state.put(Unstable(unstable)); + } + + super::reg_json_async( + rt, + "op_webgpu_request_adapter", + op_webgpu_request_adapter, + ); + super::reg_json_async( + rt, + "op_webgpu_request_device", + op_webgpu_request_device, + ); + super::reg_json_sync( + rt, + "op_webgpu_create_query_set", + op_webgpu_create_query_set, + ); + + { + // buffer + super::reg_json_sync( + rt, + "op_webgpu_create_buffer", + buffer::op_webgpu_create_buffer, + ); + super::reg_json_async( + rt, + "op_webgpu_buffer_get_map_async", + buffer::op_webgpu_buffer_get_map_async, + ); + super::reg_json_sync( + rt, + "op_webgpu_buffer_get_mapped_range", + buffer::op_webgpu_buffer_get_mapped_range, + ); + super::reg_json_sync( + rt, + "op_webgpu_buffer_unmap", + buffer::op_webgpu_buffer_unmap, + ); + } + { + // texture + super::reg_json_sync( + rt, + "op_webgpu_create_texture", + texture::op_webgpu_create_texture, + ); + super::reg_json_sync( + rt, + "op_webgpu_create_texture_view", + texture::op_webgpu_create_texture_view, + ); + } + { + // sampler + super::reg_json_sync( + rt, + "op_webgpu_create_sampler", + sampler::op_webgpu_create_sampler, + ); + } + { + // binding + super::reg_json_sync( + rt, + "op_webgpu_create_bind_group_layout", + binding::op_webgpu_create_bind_group_layout, + ); + super::reg_json_sync( + rt, + "op_webgpu_create_pipeline_layout", + binding::op_webgpu_create_pipeline_layout, + ); + super::reg_json_sync( + rt, + "op_webgpu_create_bind_group", + binding::op_webgpu_create_bind_group, + ); + } + { + // pipeline + super::reg_json_sync( + rt, + "op_webgpu_create_compute_pipeline", + pipeline::op_webgpu_create_compute_pipeline, + ); + super::reg_json_sync( + rt, + "op_webgpu_compute_pipeline_get_bind_group_layout", + pipeline::op_webgpu_compute_pipeline_get_bind_group_layout, + ); + super::reg_json_sync( + rt, + "op_webgpu_create_render_pipeline", + pipeline::op_webgpu_create_render_pipeline, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pipeline_get_bind_group_layout", + pipeline::op_webgpu_render_pipeline_get_bind_group_layout, + ); + } + { + // command_encoder + super::reg_json_sync( + rt, + "op_webgpu_create_command_encoder", + command_encoder::op_webgpu_create_command_encoder, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_begin_render_pass", + command_encoder::op_webgpu_command_encoder_begin_render_pass, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_begin_compute_pass", + command_encoder::op_webgpu_command_encoder_begin_compute_pass, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_copy_buffer_to_buffer", + command_encoder::op_webgpu_command_encoder_copy_buffer_to_buffer, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_copy_buffer_to_texture", + command_encoder::op_webgpu_command_encoder_copy_buffer_to_texture, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_copy_texture_to_buffer", + command_encoder::op_webgpu_command_encoder_copy_texture_to_buffer, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_copy_texture_to_texture", + command_encoder::op_webgpu_command_encoder_copy_texture_to_texture, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_push_debug_group", + command_encoder::op_webgpu_command_encoder_push_debug_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_pop_debug_group", + command_encoder::op_webgpu_command_encoder_pop_debug_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_insert_debug_marker", + command_encoder::op_webgpu_command_encoder_insert_debug_marker, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_write_timestamp", + command_encoder::op_webgpu_command_encoder_write_timestamp, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_resolve_query_set", + command_encoder::op_webgpu_command_encoder_resolve_query_set, + ); + super::reg_json_sync( + rt, + "op_webgpu_command_encoder_finish", + command_encoder::op_webgpu_command_encoder_finish, + ); + } + { + // render_pass + super::reg_json_sync( + rt, + "op_webgpu_render_pass_set_viewport", + render_pass::op_webgpu_render_pass_set_viewport, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_set_scissor_rect", + render_pass::op_webgpu_render_pass_set_scissor_rect, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_set_blend_color", + render_pass::op_webgpu_render_pass_set_blend_color, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_set_stencil_reference", + render_pass::op_webgpu_render_pass_set_stencil_reference, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_begin_pipeline_statistics_query", + render_pass::op_webgpu_render_pass_begin_pipeline_statistics_query, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_end_pipeline_statistics_query", + render_pass::op_webgpu_render_pass_end_pipeline_statistics_query, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_write_timestamp", + render_pass::op_webgpu_render_pass_write_timestamp, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_execute_bundles", + render_pass::op_webgpu_render_pass_execute_bundles, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_end_pass", + render_pass::op_webgpu_render_pass_end_pass, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_set_bind_group", + render_pass::op_webgpu_render_pass_set_bind_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_push_debug_group", + render_pass::op_webgpu_render_pass_push_debug_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_pop_debug_group", + render_pass::op_webgpu_render_pass_pop_debug_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_insert_debug_marker", + render_pass::op_webgpu_render_pass_insert_debug_marker, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_set_pipeline", + render_pass::op_webgpu_render_pass_set_pipeline, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_set_index_buffer", + render_pass::op_webgpu_render_pass_set_index_buffer, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_set_vertex_buffer", + render_pass::op_webgpu_render_pass_set_vertex_buffer, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_draw", + render_pass::op_webgpu_render_pass_draw, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_draw_indexed", + render_pass::op_webgpu_render_pass_draw_indexed, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_draw_indirect", + render_pass::op_webgpu_render_pass_draw_indirect, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_pass_draw_indexed_indirect", + render_pass::op_webgpu_render_pass_draw_indexed_indirect, + ); + } + { + // compute_pass + super::reg_json_sync( + rt, + "op_webgpu_compute_pass_set_pipeline", + compute_pass::op_webgpu_compute_pass_set_pipeline, + ); + super::reg_json_sync( + rt, + "op_webgpu_compute_pass_dispatch", + compute_pass::op_webgpu_compute_pass_dispatch, + ); + super::reg_json_sync( + rt, + "op_webgpu_compute_pass_dispatch_indirect", + compute_pass::op_webgpu_compute_pass_dispatch_indirect, + ); + super::reg_json_sync( + rt, + "op_webgpu_compute_pass_end_pass", + compute_pass::op_webgpu_compute_pass_end_pass, + ); + super::reg_json_sync( + rt, + "op_webgpu_compute_pass_set_bind_group", + compute_pass::op_webgpu_compute_pass_set_bind_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_compute_pass_push_debug_group", + compute_pass::op_webgpu_compute_pass_push_debug_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_compute_pass_pop_debug_group", + compute_pass::op_webgpu_compute_pass_pop_debug_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_compute_pass_insert_debug_marker", + compute_pass::op_webgpu_compute_pass_insert_debug_marker, + ); + } + { + // bundle + super::reg_json_sync( + rt, + "op_webgpu_create_render_bundle_encoder", + bundle::op_webgpu_create_render_bundle_encoder, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_finish", + bundle::op_webgpu_render_bundle_encoder_finish, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_set_bind_group", + bundle::op_webgpu_render_bundle_encoder_set_bind_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_push_debug_group", + bundle::op_webgpu_render_bundle_encoder_push_debug_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_pop_debug_group", + bundle::op_webgpu_render_bundle_encoder_pop_debug_group, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_insert_debug_marker", + bundle::op_webgpu_render_bundle_encoder_insert_debug_marker, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_set_pipeline", + bundle::op_webgpu_render_bundle_encoder_set_pipeline, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_set_index_buffer", + bundle::op_webgpu_render_bundle_encoder_set_index_buffer, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_set_vertex_buffer", + bundle::op_webgpu_render_bundle_encoder_set_vertex_buffer, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_draw", + bundle::op_webgpu_render_bundle_encoder_draw, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_draw_indexed", + bundle::op_webgpu_render_bundle_encoder_draw_indexed, + ); + super::reg_json_sync( + rt, + "op_webgpu_render_bundle_encoder_draw_indirect", + bundle::op_webgpu_render_bundle_encoder_draw_indirect, + ); + } + { + // queue + super::reg_json_sync( + rt, + "op_webgpu_queue_submit", + queue::op_webgpu_queue_submit, + ); + super::reg_json_sync( + rt, + "op_webgpu_write_buffer", + queue::op_webgpu_write_buffer, + ); + super::reg_json_sync( + rt, + "op_webgpu_write_texture", + queue::op_webgpu_write_texture, + ); + } + { + // shader + super::reg_json_sync( + rt, + "op_webgpu_create_shader_module", + shader::op_webgpu_create_shader_module, + ); + } +} diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs index 082cf7267..7f258b3eb 100644 --- a/runtime/web_worker.rs +++ b/runtime/web_worker.rs @@ -237,6 +237,7 @@ impl WebWorker { deno_web::op_domain_to_ascii, ); ops::io::init(js_runtime); + ops::webgpu::init(js_runtime); ops::websocket::init( js_runtime, options.user_agent.clone(), diff --git a/runtime/worker.rs b/runtime/worker.rs index 0b3fe3e10..be6951f51 100644 --- a/runtime/worker.rs +++ b/runtime/worker.rs @@ -142,6 +142,7 @@ impl MainWorker { ops::signal::init(js_runtime); ops::tls::init(js_runtime); ops::tty::init(js_runtime); + ops::webgpu::init(js_runtime); ops::websocket::init( js_runtime, options.user_agent.clone(), |