summaryrefslogtreecommitdiff
path: root/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'runtime')
-rw-r--r--runtime/Cargo.toml2
-rw-r--r--runtime/build.rs1
-rw-r--r--runtime/errors.rs1
-rw-r--r--runtime/js/99_main.js47
-rw-r--r--runtime/lib.rs1
-rw-r--r--runtime/ops/mod.rs1
-rw-r--r--runtime/ops/webgpu.rs421
-rw-r--r--runtime/web_worker.rs1
-rw-r--r--runtime/worker.rs1
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(),