From ef879c72dfbadac2a8ffff32730930c2028d9694 Mon Sep 17 00:00:00 2001
From: gterzian <2792687+gterzian@users.noreply.github.com>
Date: Fri, 24 Apr 2026 13:59:12 +0700
Subject: [PATCH 1/4] setup pages
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
---
docs/COMMAND_LINE_ARGS.md | 7 --
docs/HACKING_QUICKSTART.md | 5 -
docs/ORGANIZATION.md | 6 -
docs/STYLE_GUIDE.md | 6 -
docs/components/style.md | 6 -
docs/components/webxr.md | 6 -
docs/debugging.md | 6 -
docs/glossary.md | 6 -
docs/index.html | 28 +++++
docs/media/avplayback.md | 104 ------------------
docs/media/images/modular-routing1.png | Bin 3259 -> 0 bytes
docs/media/images/webaudiopipeline.png | Bin 7623 -> 0 bytes
.../media/images/webaudiopipeline_decoder.png | Bin 10594 -> 0 bytes
docs/media/overview.md | 12 --
docs/media/webaudio.md | 87 ---------------
15 files changed, 28 insertions(+), 251 deletions(-)
delete mode 100644 docs/COMMAND_LINE_ARGS.md
delete mode 100644 docs/HACKING_QUICKSTART.md
delete mode 100644 docs/ORGANIZATION.md
delete mode 100644 docs/STYLE_GUIDE.md
delete mode 100644 docs/components/style.md
delete mode 100644 docs/components/webxr.md
delete mode 100644 docs/debugging.md
delete mode 100644 docs/glossary.md
create mode 100644 docs/index.html
delete mode 100644 docs/media/avplayback.md
delete mode 100644 docs/media/images/modular-routing1.png
delete mode 100644 docs/media/images/webaudiopipeline.png
delete mode 100644 docs/media/images/webaudiopipeline_decoder.png
delete mode 100644 docs/media/overview.md
delete mode 100644 docs/media/webaudio.md
diff --git a/docs/COMMAND_LINE_ARGS.md b/docs/COMMAND_LINE_ARGS.md
deleted file mode 100644
index 80626fdf5fa..00000000000
--- a/docs/COMMAND_LINE_ARGS.md
+++ /dev/null
@@ -1,7 +0,0 @@
-# Command line arguments
-
-Moved to the Servo book:
-
-- [Running servoshell](https://book.servo.org/running-servoshell.html)
-- Hacking on Servo
- - [Running servoshell](https://book.servo.org/hacking/running-servoshell.html)
diff --git a/docs/HACKING_QUICKSTART.md b/docs/HACKING_QUICKSTART.md
deleted file mode 100644
index 94a247b128b..00000000000
--- a/docs/HACKING_QUICKSTART.md
+++ /dev/null
@@ -1,5 +0,0 @@
-# Hacking Servo - Quickstart
-
-Moved to the Servo book:
-
-- [Hacking on Servo](https://book.servo.org/hacking/mach.html)
diff --git a/docs/ORGANIZATION.md b/docs/ORGANIZATION.md
deleted file mode 100644
index 4f955b33c2a..00000000000
--- a/docs/ORGANIZATION.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Servo’s directory structure
-
-Moved to the Servo book:
-
-- Servo’s architecture
- - [Directory structure](https://book.servo.org/architecture/directory-structure.html)
diff --git a/docs/STYLE_GUIDE.md b/docs/STYLE_GUIDE.md
deleted file mode 100644
index 8f011f5a64f..00000000000
--- a/docs/STYLE_GUIDE.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Style Guide
-
-Moved to the Servo book:
-
-- Pre-book docs
- - [docs/STYLE_GUIDE.md](https://book.servo.org/old/STYLE_GUIDE.html)
diff --git a/docs/components/style.md b/docs/components/style.md
deleted file mode 100644
index 6b63b9a96ba..00000000000
--- a/docs/components/style.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Servo's style system overview
-
-Moved to the Servo book:
-
-- Servo’s architecture
- - [Style](https://book.servo.org/architecture/style.html)
diff --git a/docs/components/webxr.md b/docs/components/webxr.md
deleted file mode 100644
index 85faba5e5d9..00000000000
--- a/docs/components/webxr.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# How WebXR works in Servo
-
-Moved to the Servo book:
-
-- Servo’s architecture
- - [WebXR](https://book.servo.org/architecture/webxr.html)
diff --git a/docs/debugging.md b/docs/debugging.md
deleted file mode 100644
index ed93c46cd2d..00000000000
--- a/docs/debugging.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Servo debugging guide
-
-Moved to the Servo book:
-
-- Hacking on Servo
- - [Debugging](https://book.servo.org/hacking/debugging.html)
diff --git a/docs/glossary.md b/docs/glossary.md
deleted file mode 100644
index b6bea10a1f9..00000000000
--- a/docs/glossary.md
+++ /dev/null
@@ -1,6 +0,0 @@
-# Glossary
-
-Moved to the Servo book:
-
-- Pre-book docs
- - [docs/glossary.md](https://book.servo.org/old/glossary.html)
diff --git a/docs/index.html b/docs/index.html
new file mode 100644
index 00000000000..c10a5c0cfb1
--- /dev/null
+++ b/docs/index.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Servo WebNN Conformance Report
+
+
+
+
+ No report generated yet. Run python scratchpad/runwpt2.py to generate results.
+
+
+
\ No newline at end of file
diff --git a/docs/media/avplayback.md b/docs/media/avplayback.md
deleted file mode 100644
index 90e5235e394..00000000000
--- a/docs/media/avplayback.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# A/V Playback through HTMLMediaElement
-
-Media elements are used to present audio and/or video data to the user. The [HTMLMediaElement](https://html.spec.whatwg.org/multipage/media.html#htmlmediaelement) interface adds to [HTMLElement](https://html.spec.whatwg.org/multipage/dom.html#htmlelement) the properties and methods needed to support basic media-related capabilities that are common to audio and video. The [HTMLVideoElement](https://html.spec.whatwg.org/multipage/media.html#htmlvideoelement) (``) and [HTMLAudioElement](https://html.spec.whatwg.org/multipage/media.html#htmlaudioelement) (``) elements both inherit this interface.
-
-
-`servo-media` exposes a Rust `Player` API that provides audio and video playback capabilities and it is used by Servo to [implement](https://github.com/servo/servo/blob/7bfa9179319d714656e7184e5159ea42595086e5/components/script/dom/htmlmediaelement.rs#L1) the HTMLMediaElement API.
-```rust
-/*
- This is an example of a very basic Player playing media from a file.
- NOTE: Some boilerplate has been removed for simplicity.
- Please, visit the examples folder for a more complete version.
-*/
-
-// Create Player instance
-let (sender, receiver) = ipc::channel().unwrap();
-let player = servo_media.create_player(
- &ClientContextId::build(1, 1),
- StreamType::Seekable,
- sender,
- None,
- None,
- Box::new(PlayerContextDummy()),
-);
-
-// Open file and set input size.
-let file = match File::open(&path)?;
-if let Ok(metadata) = file.metadata() {
- player
- .lock()
- .unwrap()
- .set_input_size(metadata.len())
- .unwrap();
-}
-
-// Read from file and push buffers to the player.
-let player_clone = Arc::clone(&player);
-thread::spawn(move || {
- let player = &player_clone;
- let mut buf_reader = BufReader::new(file);
- let mut buffer = [0; 1024];
- let mut read = |offset| {
- match buf_reader.read(&mut buffer[..]) {
- Ok(0) => {
- println!("Finished pushing data");
- break;
- }
- Ok(size) => player
- .lock()
- .unwrap()
- .push_data(Vec::from(&buffer[0..size]))
- .unwrap(),
- Err(e) => {
- eprintln!("Error: {}", e);
- break;
- }
- }
- };
-});
-
-// Start playing.
-player.lock().unwrap().play().unwrap();
-
-// Listen for Player events.
-while let Ok(event) = receiver.recv() {
- match event {
- PlayerEvent::EndOfStream => {
- println!("\nEOF");
- break;
- }
- PlayerEvent::Error(ref s) => {
- println!("\nError {:?}", s);
- break;
- }
- PlayerEvent::MetadataUpdated(ref m) => {
- println!("\nMetadata updated! {:?}", m);
- }
- PlayerEvent::DurationChanged(d) => {
- println!("\nDuration changed! {:?}", d);
- },
- PlayerEvent::StateChanged(ref s) => {
- println!("\nPlayer state changed to {:?}", s);
- }
- PlayerEvent::VideoFrameUpdated => eprint!("."),
- PlayerEvent::PositionChanged(p) => {}
- PlayerEvent::SeekData(_, _) => {}
- PlayerEvent::SeekDone(_) => {},
- PlayerEvent::NeedData => println!("\nNeedData"),
- PlayerEvent::EnoughData => println!("\nEnoughData"),
- }
-}
-```
-
-## Implementation
-The entry point of the media player implementation is the [ServoMedia.create_player()](https://github.com/servo/media/blob/b64b86b727ade722eaf571e65ff678364b69fc08/servo-media/lib.rs#L34) method that, among others, takes as argument an `IpcSender` to get events from the `Player` instance, and shared references to instances of [VideoFrameRenderer](https://github.com/servo/media/blob/main/player/video.rs#L71) and [AudioFrameRenderer](https://github.com/servo/media/blob/b64b86b727ade722eaf571e65ff678364b69fc08/player/audio.rs#L1) that will receive the video and audio frames respectively as they are produced by the media player.
-
-Backends are required to implement the [Player](https://github.com/servo/media/blob/main/player/lib.rs#L92) trait, which exposes a basic API to control a/v playback.
-
-The media player implementation does not deal with fetching the media data from any source. That task is left to the client. The `Player` trait exposes a [push_data()](https://github.com/servo/media/blob/b64b86b727ade722eaf571e65ff678364b69fc08/player/lib.rs#L101) method that gets a buffer of media data. The code that deals with fetching the media data in Servo lives within the [HTMLMediaElement implementation](https://github.com/servo/servo/blob/7bfa9179319d714656e7184e5159ea42595086e5/components/script/dom/htmlmediaelement.rs#L900). As Servo fetches data from the network or from a file, it [feeds](https://github.com/servo/servo/blob/7bfa9179319d714656e7184e5159ea42595086e5/components/script/dom/htmlmediaelement.rs#L2702) the media backend with media buffers. The media player decodes the given media data and builds the audio and/or video frames to be rendered by Servo. In the case of video frames, `servo-media` outputs frames either as raw images, by default, or as GL textures, if hardware acceleration is available. [WebRender](https://github.com/servo/webrender) is responsible for [rendering](https://github.com/servo/servo/blob/b41f5f97f26895f874514ce88cb359d65915738c/components/layout/display_list/builder.rs#L1883) the images that `servo-media` [outputs](https://github.com/servo/servo/blob/7bfa9179319d714656e7184e5159ea42595086e5/components/script/dom/htmlmediaelement.rs#L179).
-
-The [GStreamer](https://github.com/servo/media/blob/main/backends/gstreamer/player.rs#L776) implementation is mostly a wrapper around [GstPlayer](https://gstreamer.freedesktop.org/documentation/player/gstplayer.html?gi-language=c), which is a very convenient media playback API that hides many of the complex GStreamer details. It is built on top of the [playbin](https://gstreamer.freedesktop.org/documentation/playback/playbin3.html?gi-language=c) element, which provides a stand-alone everything-in-one abstraction for an audio and/or video player and that dynamically builds the appropriate decoding pipeline for the given media content.
-
-### Hardware acceleration
-TODO
-
diff --git a/docs/media/images/modular-routing1.png b/docs/media/images/modular-routing1.png
deleted file mode 100644
index f63746e9277ea0983b014f5827452148c9286ebc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3259
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
D@5~b_
diff --git a/docs/media/overview.md b/docs/media/overview.md
deleted file mode 100644
index eaaa69baeff..00000000000
--- a/docs/media/overview.md
+++ /dev/null
@@ -1,12 +0,0 @@
- # Servo Media - Overview
-
- The `servo-media` crate contains the backend implementation to support all [Servo](https://github.com/servo/servo) multimedia related functionality. This is:
- - the [HTMLMediaElement](https://html.spec.whatwg.org/multipage/media.html#htmlmediaelement) and the `` and `` elements.
- - the [WebAudio API](https://webaudio.github.io/web-audio-api).
- - the [WebRTC API](https://w3c.github.io/webrtc-pc/).
- - the [Media Capture and Streams APIs](https://w3c.github.io/mediacapture-main/#dom-mediadeviceinfo-groupid).
-
-`servo-media` is supposed to run properly on Linux, macOS, Windows and Android. Check the [build](https://github.com/servo/media/tree/f96c33b7374d5b9915b8bae8623723b2d23ec457#build) instructions for each specific platform.
-
-`servo-media` is built modularly from different crates and it provides an abstraction that allows the implementation of multiple media backends. For now, the only functional backend is [GStreamer](https://github.com/servo/media/tree/f96c33b7374d5b9915b8bae8623723b2d23ec457/backends/gstreamer). New backend implementations are required to implement the [Backend](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/servo-media/lib.rs#L33) trait. This trait is the public API that `servo-media` exposes to clients through the [ServoMedia](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/servo-media/lib.rs#L90) entry point. Check the [examples](https://github.com/servo/media/tree/f96c33b7374d5b9915b8bae8623723b2d23ec457/examples) folder to get a sense of how to use it effectively. Alternatively, you can also check how `servo-media` is integrated and used in [Servo](https://github.com/servo/servo).
-
diff --git a/docs/media/webaudio.md b/docs/media/webaudio.md
deleted file mode 100644
index cd6c78bd587..00000000000
--- a/docs/media/webaudio.md
+++ /dev/null
@@ -1,87 +0,0 @@
-# WebAudio
-
-The [WebAudio API](https://webaudio.github.io/web-audio-api/) is a high-level JavaScript API for processing and synthesizing audio in web applications.
-
-WebAudio uses a [Modular Routing](https://webaudio.github.io/web-audio-api/#ModularRouting) based model for processing audio, that allows connecting multiple different [AudioNode](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/node.rs#L122) inputs and/or outputs and make the audio flow through these connected nodes. In this model, nodes can be `sources` (no inputs and a single output), `destinations` (one input and no output) or `filters` (one or multiple inputs and outputs). The simplest example is a single source routed directly to the output.
-
-
-
-In WebAudio everything happens within an [AudioContext](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/context.rs#L105) instance that manages and plays all sounds to its single [AudioDestinationNode](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/destination_node.rs#L6). The audio can be rendered to hardware or to a buffer, for example, through [OfflineAudioContext](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/context.rs#L94).
-
-The `servo-media` Rust API for WebAudio is deliverately close to the actual WebAudio JavaScript API.
-
-```rust
-/*
- This is an example of a very basic WebAudio pipeline with an OscillatorNode connected to a GainNode.
- ------------------------------------------------------------
- | AudioContext |
- | OscillatorNode -> GainNode -> AudioDestinationNode |
- ------------------------------------------------------------
- NOTE: Some boilerplate has been removed for simplicity.
- Please, visit the examples folder for a more complete version.
-*/
-
-// Context creation.
-let context =
- servo_media.create_audio_context(&ClientContextId::build(1, 1), Default::default());
-
-// Create and configure nodes.
-let osc = context.create_node(
- AudioNodeInit::OscillatorNode(Default::default()),
- Default::default(),
-).expect("Failed to create oscillator node");
-let mut options = GainNodeOptions::default();
-options.gain = 0.5;
-let gain = context.create_node(AudioNodeInit::GainNode(options), Default::default())
- .expect("Failed to create gain node");
-
-// Connect nodes.
-let dest = context.dest_node();
-context.connect_ports(osc.output(0), gain.input(0));
-context.connect_ports(gain.output(0), dest.input(0));
-
-// Start playing.
-context.message_node(
- osc,
- AudioNodeMessage::AudioScheduledSourceNode(AudioScheduledSourceNodeMessage::Start(0.)),
-);
-```
-
-## Implementation
-
-### Threading model
-
-Following the [WebAudio API specification](https://webaudio.github.io/web-audio-api/#control-thread-and-rendering-thread), `servo-media` implements the concepts of [control thread](https://webaudio.github.io/web-audio-api/#control-thread) and [rendering thread](https://webaudio.github.io/web-audio-api/#rendering-thread).
-
-The `control thread` is the thread from which the `AudioContext` is instantiated and from which authors manipulate the audio graph. In Servo's case, this is the [script](https://github.com/servo/servo/blob/594ea14d5bd7b76d09b679fd0454165259ffbe7a/components/script/script_thread.rs#L5) thread.
-
-The `rendering thread` is where the magic and the actual audio processing happens. This thread keeps an [event loop](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/render_thread.rs#L250) that listens and handles control messages coming from the `control thread` and the audio backend and processes the audio coming from the audio graph in blocks of 128 samples-frames called [render quantums](https://webaudio.github.io/web-audio-api/#render-quantum). For each spin of the loop, the [AudioRenderThread.process](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/render_thread.rs#L233) method is called. This method internally runs a [DFS](https://en.wikipedia.org/wiki/Depth-first_search) traversal on the internal graph calling the [process](https://github.com/servo/media/blob/main/audio/node.rs#L126) method for each node. The resulting chunk of audio data is [pushed](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/render_thread.rs#L337) to the audio sink.
-
-### Audio Playback
-
-WebAudio allows clients to render the processed audio to hardware or to an audio buffer. To abstract this behavior, `servo-media` exposes the [AudioSink](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/sink.rs#L16) trait.
-
-For offline rendering to an audio buffer, there is an [OfflineAudioSink](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/audio/offline_sink.rs#L38) implementation of the `AudioSink` trait.
-
-For hardware rendering, the `AudioSink` trait is expected to be implemented by the media backends. For `GStreamer` the [implementation](https://github.com/servo/media/blob/2610789d1abfbe4443579021113c822ba05f34dc/backends/gstreamer/audio_sink.rs#L73) creates a simple audio pipeline as the following:
-
-
-
-The core piece of the audio sink is the initial [appsrc](https://gstreamer.freedesktop.org/documentation/applib/gstappsrc.html?gi-language=c) element, that we use to insert the audio chunks into the GStreamer pipeline. We use the `appsrc` in push mode, where we repeatedly call the [push-buffer](https://gstreamer.freedesktop.org/documentation/applib/gstappsrc.html?gi-language=c#gst_app_src_push_buffer) method with a new buffer.
-To make audio playback nice and smooth and to continue processing control events coming from the `control thread`, we cannot use the appsrc's `block` property, that would essentially block the render thread when we fill the appsrc internal queue. Instead, we set the maximum amount of bytes that can be queued in the appsrc to 1 and use a combination of [get_current_level_bytes](https://gstreamer.freedesktop.org/documentation/applib/gstappsrc.html?gi-language=c#gst_app_src_get_current_level_bytes) and the [need-data](https://gstreamer.freedesktop.org/documentation/applib/gstappsrc.html?gi-language=c#GstAppSrc::need-data) signal to decide whether we should push the new audio buffer or not.
-
-### Audio Decoding
-
-WebAudio also supports decoding audio data.
-
-`servo-media` exposes a very simple [AudioDecoder](https://github.com/ferjm/media/blob/a95e063729324c359976236104d825244bb180e8/servo-media/src/audio/decoder.rs#L92) trait, that exposes a single `decode` method taking among other arguments the audio data to be decoded and an instance of [AudioDecoderCallbacks](https://github.com/ferjm/media/blob/a95e063729324c359976236104d825244bb180e8/servo-media/src/audio/decoder.rs#L1) containing the callbacks for the end-of-stream, error and progress events that are triggered during the decoding process.
-
-`servo-media` backends are required to implement this trait.
-
-The GStreamer backend implementation of the `AudioDecoder` trait creates a pipeline that has this form:
-
-
-
-The `decodebin` element is the core element of this pipeline and it auto-magically constructs a decoding pipeline using available decoders and demuxers via auto-plugging.
-
-
From 20c8f7bbc97f018d73c2ef5feac34ed51a81fde3 Mon Sep 17 00:00:00 2001
From: gterzian <2792687+gterzian@users.noreply.github.com>
Date: Fri, 24 Apr 2026 14:56:07 +0700
Subject: [PATCH 2/4] add report
Signed-off-by: gterzian <2792687+gterzian@users.noreply.github.com>
---
docs/index.html | 1167 ++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 1161 insertions(+), 6 deletions(-)
diff --git a/docs/index.html b/docs/index.html
index c10a5c0cfb1..a549e74d0f9 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -5,24 +5,1179 @@
Servo WebNN Conformance Report
- No report generated yet. Run python scratchpad/runwpt2.py to generate results.
+
+ Servo WebNN Conformance
+ Test Report
+ Generated: 2026-04-24 07:53:17 UTC
+
+
+
+
+ Total Tests
+ 11244
+
+
+ Passed
+ 4998
+
+
+ Pass Rate
+ 44.5%
+
+
+
+
+
+ Conformance Tests
+
+ Total: 7512 | Passes: 2994 |
+ Rate: 39.9%
+
+
+
+
+ Test
+ Total
+ Passes
+ Pass Rate
+
+
+
+
+ abs
+ 57
+ 24
+ 42.1%
+
+
+ arg_min_max
+ 108
+ 54
+ 50.0%
+
+
+ averagePool2d
+ 120
+ 27
+ 22.5%
+
+
+ batch_normalization
+ 78
+ 27
+ 34.6%
+
+
+ batch_normalization_constant
+ 12
+ 6
+ 50.0%
+
+
+ byob_readtensor
+ 12
+ 0
+ 0.0%
+
+
+ cast
+ 90
+ 27
+ 30.0%
+
+
+ ceil
+ 48
+ 24
+ 50.0%
+
+
+ clamp
+ 144
+ 54
+ 37.5%
+
+
+ concat
+ 141
+ 63
+ 44.7%
+
+
+ constant-reshape-optimization
+ 9
+ 6
+ 66.7%
+
+
+ conv2d
+ 126
+ 42
+ 33.3%
+
+
+ conv_transpose2d
+ 132
+ 48
+ 36.4%
+
+
+ cos
+ 48
+ 24
+ 50.0%
+
+
+ cumulative_sum
+ 27
+ 15
+ 55.6%
+
+
+ dequantizeLinear
+ 45
+ 6
+ 13.3%
+
+
+ div
+ 66
+ 36
+ 54.5%
+
+
+ elu
+ 66
+ 30
+ 45.5%
+
+
+ equal
+ 72
+ 36
+ 50.0%
+
+
+ erf
+ 48
+ 24
+ 50.0%
+
+
+ exp
+ 48
+ 24
+ 50.0%
+
+
+ expand
+ 138
+ 57
+ 41.3%
+
+
+ floor
+ 48
+ 24
+ 50.0%
+
+
+ gather
+ 120
+ 54
+ 45.0%
+
+
+ gatherElements
+ 33
+ 15
+ 45.5%
+
+
+ gatherND
+ 42
+ 6
+ 14.3%
+
+
+ gelu
+ 45
+ 6
+ 13.3%
+
+
+ gemm
+ 144
+ 30
+ 20.8%
+
+
+ graph_devices
+ 6
+ 3
+ 50.0%
+
+
+ greater
+ 72
+ 33
+ 45.8%
+
+
+ greater_or_equal
+ 72
+ 36
+ 50.0%
+
+
+ gru
+ 78
+ 6
+ 7.7%
+
+
+ gru_cell
+ 30
+ 6
+ 20.0%
+
+
+ hard_sigmoid
+ 96
+ 48
+ 50.0%
+
+
+ hard_swish
+ 48
+ 24
+ 50.0%
+
+
+ identity
+ 102
+ 12
+ 11.8%
+
+
+ inputs-are-not-modified
+ 24
+ 18
+ 75.0%
+
+
+ inputs-with-special-names
+ 30
+ 9
+ 30.0%
+
+
+ instance_normalization
+ 48
+ 15
+ 31.2%
+
+
+ is_infinite
+ 51
+ 6
+ 11.8%
+
+
+ is_nan
+ 42
+ 6
+ 14.3%
+
+
+ l2Pool2d
+ 90
+ 6
+ 6.7%
+
+
+ layer_normalization
+ 81
+ 24
+ 29.6%
+
+
+ leaky_relu
+ 66
+ 33
+ 50.0%
+
+
+ lesser
+ 72
+ 33
+ 45.8%
+
+
+ lesser_or_equal
+ 72
+ 33
+ 45.8%
+
+
+ linear
+ 84
+ 42
+ 50.0%
+
+
+ log
+ 48
+ 24
+ 50.0%
+
+
+ logical_and
+ 39
+ 30
+ 76.9%
+
+
+ logical_not
+ 27
+ 24
+ 88.9%
+
+
+ logical_or
+ 39
+ 30
+ 76.9%
+
+
+ logical_xor
+ 39
+ 30
+ 76.9%
+
+
+ lstm
+ 90
+ 6
+ 6.7%
+
+
+ lstm_cell
+ 36
+ 6
+ 16.7%
+
+
+ matmul
+ 72
+ 42
+ 58.3%
+
+
+ max
+ 66
+ 36
+ 54.5%
+
+
+ maxPool2d
+ 84
+ 27
+ 32.1%
+
+
+ min
+ 66
+ 36
+ 54.5%
+
+
+ mlNumber
+ 12
+ 6
+ 50.0%
+
+
+ mul
+ 66
+ 36
+ 54.5%
+
+
+ neg
+ 57
+ 24
+ 42.1%
+
+
+ not_equal
+ 72
+ 33
+ 45.8%
+
+
+ operations-with-special-names
+ 18
+ 18
+ 100.0%
+
+
+ pad
+ 75
+ 6
+ 8.0%
+
+
+ parallel-dispatch
+ 66
+ 36
+ 54.5%
+
+
+ pow
+ 60
+ 27
+ 45.0%
+
+
+ prelu
+ 78
+ 9
+ 11.5%
+
+
+ qdq_subgraph
+ 228
+ 12
+ 5.3%
+
+
+ quantizeLinear
+ 48
+ 6
+ 12.5%
+
+
+ reciprocal
+ 48
+ 24
+ 50.0%
+
+
+ reduce_l1
+ 138
+ 63
+ 45.7%
+
+
+ reduce_l2
+ 135
+ 63
+ 46.7%
+
+
+ reduce_log_sum
+ 123
+ 57
+ 46.3%
+
+
+ reduce_log_sum_exp
+ 135
+ 63
+ 46.7%
+
+
+ reduce_max
+ 117
+ 54
+ 46.2%
+
+
+ reduce_mean
+ 135
+ 63
+ 46.7%
+
+
+ reduce_min
+ 117
+ 54
+ 46.2%
+
+
+ reduce_product
+ 117
+ 54
+ 46.2%
+
+
+ reduce_sum
+ 135
+ 63
+ 46.7%
+
+
+ reduce_sum_square
+ 138
+ 63
+ 45.7%
+
+
+ relu
+ 51
+ 24
+ 47.1%
+
+
+ resample2d
+ 45
+ 6
+ 13.3%
+
+
+ reshape
+ 198
+ 93
+ 47.0%
+
+
+ reverse
+ 30
+ 18
+ 60.0%
+
+
+ round_even
+ 36
+ 18
+ 50.0%
+
+
+ scalars
+ 48
+ 6
+ 12.5%
+
+
+ scatterElements
+ 30
+ 6
+ 20.0%
+
+
+ scatterND
+ 18
+ 6
+ 33.3%
+
+
+ shared_arraybuffer_constant
+ 15
+ 6
+ 40.0%
+
+
+ sigmoid
+ 48
+ 24
+ 50.0%
+
+
+ sign
+ 21
+ 18
+ 85.7%
+
+
+ sin
+ 48
+ 24
+ 50.0%
+
+
+ slice
+ 60
+ 27
+ 45.0%
+
+
+ softmax
+ 33
+ 21
+ 63.6%
+
+
+ softplus
+ 48
+ 24
+ 50.0%
+
+
+ softsign
+ 60
+ 27
+ 45.0%
+
+
+ split
+ 3
+ 0
+ 0.0%
+
+
+ sqrt
+ 48
+ 24
+ 50.0%
+
+
+ sub
+ 72
+ 36
+ 50.0%
+
+
+ subgraph
+ 306
+ 174
+ 56.9%
+
+
+ tan
+ 48
+ 24
+ 50.0%
+
+
+ tanh
+ 42
+ 24
+ 57.1%
+
+
+ tensor
+ 12
+ 0
+ 0.0%
+
+
+ tile
+ 24
+ 12
+ 50.0%
+
+
+ transpose
+ 3
+ 0
+ 0.0%
+
+
+ triangular
+ 102
+ 39
+ 38.2%
+
+
+ where
+ 108
+ 6
+ 5.6%
+
+
+
+
+
+
+ Validation Tests
+
+ Total: 3732 | Passes: 2004 |
+ Rate: 53.7%
+
+
+
+
+ Test
+ Total
+ Passes
+ Pass Rate
+
+
+
+
+ argMinMax
+ 54
+ 30
+ 55.6%
+
+
+ batchNormalization
+ 72
+ 72
+ 100.0%
+
+
+ build-more-than-once
+ 66
+ 60
+ 90.9%
+
+
+ cast
+ 12
+ 9
+ 75.0%
+
+
+ clamp
+ 33
+ 15
+ 45.5%
+
+
+ concat
+ 45
+ 24
+ 53.3%
+
+
+ constant-changed-buffer
+ 36
+ 24
+ 66.7%
+
+
+ constant
+ 276
+ 126
+ 45.7%
+
+
+ conv2d
+ 165
+ 60
+ 36.4%
+
+
+ convTranspose2d
+ 162
+ 48
+ 29.6%
+
+
+ createContext
+ 72
+ 60
+ 83.3%
+
+
+ cumulativeSum
+ 30
+ 24
+ 80.0%
+
+
+ dequantizeLinear
+ 51
+ 27
+ 52.9%
+
+
+ destroyContext
+ 78
+ 54
+ 69.2%
+
+
+ destroyGraph
+ 30
+ 24
+ 80.0%
+
+
+ elementwise-binary
+ 252
+ 147
+ 58.3%
+
+
+ elementwise-logical
+ 189
+ 135
+ 71.4%
+
+
+ elementwise-unary
+ 141
+ 51
+ 36.2%
+
+
+ elu
+ 24
+ 18
+ 75.0%
+
+
+ expand
+ 39
+ 24
+ 61.5%
+
+
+ gather
+ 39
+ 24
+ 61.5%
+
+
+ gatherElements
+ 33
+ 18
+ 54.5%
+
+
+ gatherND
+ 30
+ 15
+ 50.0%
+
+
+ gelu
+ 15
+ 9
+ 60.0%
+
+
+ gemm
+ 63
+ 30
+ 47.6%
+
+
+ gru
+ 78
+ 24
+ 30.8%
+
+
+ gruCell
+ 93
+ 24
+ 25.8%
+
+
+ hardSigmoid
+ 24
+ 18
+ 75.0%
+
+
+ hardSwish
+ 15
+ 9
+ 60.0%
+
+
+ input
+ 66
+ 54
+ 81.8%
+
+
+ instanceNormalization
+ 60
+ 30
+ 50.0%
+
+
+ invalid-rank
+ 24
+ 18
+ 75.0%
+
+
+ layerNormalization
+ 66
+ 39
+ 59.1%
+
+
+ leakyRelu
+ 24
+ 18
+ 75.0%
+
+
+ linear
+ 24
+ 18
+ 75.0%
+
+
+ lstm
+ 78
+ 30
+ 38.5%
+
+
+ lstmCell
+ 117
+ 30
+ 25.6%
+
+
+ matmul
+ 48
+ 27
+ 56.2%
+
+
+ opSupportLimits
+ 18
+ 6
+ 33.3%
+
+
+ pad
+ 39
+ 15
+ 38.5%
+
+
+ pooling-and-reduction-keep-dims
+ 30
+ 24
+ 80.0%
+
+
+ pooling
+ 126
+ 69
+ 54.8%
+
+
+ prelu
+ 33
+ 12
+ 36.4%
+
+
+ quantizeLinear
+ 48
+ 27
+ 56.2%
+
+
+ reduction
+ 186
+ 102
+ 54.8%
+
+
+ relu
+ 15
+ 9
+ 60.0%
+
+
+ resample2d
+ 87
+ 36
+ 41.4%
+
+
+ reshape
+ 36
+ 24
+ 66.7%
+
+
+ reverse
+ 21
+ 15
+ 71.4%
+
+
+ scatterElements
+ 48
+ 24
+ 50.0%
+
+
+ scatterND
+ 33
+ 15
+ 45.5%
+
+
+ sigmoid
+ 15
+ 9
+ 60.0%
+
+
+ slice
+ 39
+ 15
+ 38.5%
+
+
+ softmax
+ 24
+ 15
+ 62.5%
+
+
+ softplus
+ 15
+ 9
+ 60.0%
+
+
+ softsign
+ 15
+ 9
+ 60.0%
+
+
+ split
+ 36
+ 15
+ 41.7%
+
+
+ tanh
+ 15
+ 9
+ 60.0%
+
+
+ tile
+ 30
+ 21
+ 70.0%
+
+
+ transpose
+ 27
+ 18
+ 66.7%
+
+
+ triangular
+ 12
+ 9
+ 75.0%
+
+
+ unprintableNames
+ 18
+ 6
+ 33.3%
+
+
+ where
+ 42
+ 24
+ 57.1%
+
+
+
+
+