From 58ffea3cff807463621fd39d95dadd59da8fbfdb Mon Sep 17 00:00:00 2001 From: GF Date: Sun, 18 Oct 2026 23:22:02 -0400 Subject: [PATCH 1/2] Prepare JXR 0.3.1 patch release Bump jxr-native, jxr-metal, jxr, jxr-image, and jxr-mpsgraph to 0.3.1 and move their exact internal pins with them. jxr-math 0.1.1, jxr-core 0.3.0, and jxr-cuda 0.3.0 are unchanged and keep their published versions. The release notes cover the CPU entropy and coefficient storage work, the Metal and MPSGraph batch changes, the new automatic Metal threshold, and the added diagnostics and worker-pool APIs. --- Cargo.lock | 10 ++++----- README.md | 6 ++--- crates/jxr-image/Cargo.toml | 4 ++-- crates/jxr-metal/Cargo.toml | 2 +- crates/jxr-mpsgraph/Cargo.toml | 6 ++--- crates/jxr-native/Cargo.toml | 2 +- crates/jxr-test-support/Cargo.toml | 4 ++-- crates/jxr/Cargo.toml | 6 ++--- crates/jxr/fuzz/Cargo.lock | 4 ++-- docs/releasing.md | 35 ++++++++++++++++++++++++++++++ 10 files changed, 57 insertions(+), 22 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f27dd3f..355fbdf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -146,7 +146,7 @@ dependencies = [ [[package]] name = "jxr" -version = "0.3.0" +version = "0.3.1" dependencies = [ "jxr-core", "jxr-cuda", @@ -175,7 +175,7 @@ dependencies = [ [[package]] name = "jxr-image" -version = "0.3.0" +version = "0.3.1" dependencies = [ "image", "jxr", @@ -188,7 +188,7 @@ version = "0.1.1" [[package]] name = "jxr-metal" -version = "0.3.0" +version = "0.3.1" dependencies = [ "j2k-core", "j2k-metal-support", @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "jxr-mpsgraph" -version = "0.3.0" +version = "0.3.1" dependencies = [ "j2k-metal-support", "j2k-mpsgraph-support", @@ -220,7 +220,7 @@ dependencies = [ [[package]] name = "jxr-native" -version = "0.3.0" +version = "0.3.1" dependencies = [ "fearless_simd", "jxr-core", diff --git a/README.md b/README.md index 532fe4c..569aa83 100644 --- a/README.md +++ b/README.md @@ -19,8 +19,8 @@ pixel-to-codestream encoding is not implemented. cargo add jxr ``` -Requires **Rust 1.99.0 or newer**. The current release is **0.3.0**; see the -[release notes](docs/releasing.md#030-release-line) for migration details. +Requires **Rust 1.99.0 or newer**. The current release is **0.3.1**; see the +[release notes](docs/releasing.md#031-patch-release) for migration details. ## What it does @@ -247,7 +247,7 @@ transforms. It preserves explicit alpha and output-format semantics, and rejects unsupported combinations instead of approximating another format. **API status.** JXR is under active development on the `0.x` release line. -Version 0.3.0 uses exact J2K 0.12.0 dependencies; applications using the shared +The 0.3 line uses exact J2K 0.12.0 dependencies; applications using the shared J2K types must update those dependencies together. Check the release notes before upgrading. diff --git a/crates/jxr-image/Cargo.toml b/crates/jxr-image/Cargo.toml index cdcf8bb..ec040d6 100644 --- a/crates/jxr-image/Cargo.toml +++ b/crates/jxr-image/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "jxr-image" description = "Lossless ownership adapter from JPEG XR decode results to image::DynamicImage" -version = "0.3.0" +version = "0.3.1" edition.workspace = true rust-version.workspace = true license.workspace = true @@ -13,7 +13,7 @@ readme = "README.md" [dependencies] image.workspace = true -jxr = { path = "../jxr", version = "=0.3.0" } +jxr = { path = "../jxr", version = "=0.3.1" } thiserror.workspace = true [lints] diff --git a/crates/jxr-metal/Cargo.toml b/crates/jxr-metal/Cargo.toml index e15d388..bd0e9db 100644 --- a/crates/jxr-metal/Cargo.toml +++ b/crates/jxr-metal/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "jxr-metal" description = "Metal execution boundary for the JXR decoder" -version = "0.3.0" +version = "0.3.1" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/jxr-mpsgraph/Cargo.toml b/crates/jxr-mpsgraph/Cargo.toml index feb7fd3..5809d26 100644 --- a/crates/jxr-mpsgraph/Cargo.toml +++ b/crates/jxr-mpsgraph/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "jxr-mpsgraph" description = "Direct MPSGraph tensor adapter for Metal-resident JPEG XR batches" -version = "0.3.0" +version = "0.3.1" edition.workspace = true rust-version.workspace = true license.workspace = true @@ -13,9 +13,9 @@ readme = "README.md" [dependencies] j2k-metal-support.workspace = true -jxr = { path = "../jxr", version = "=0.3.0", features = ["metal"] } +jxr = { path = "../jxr", version = "=0.3.1", features = ["metal"] } jxr-core = { path = "../jxr-core", version = "=0.3.0" } -jxr-metal = { path = "../jxr-metal", version = "=0.3.0" } +jxr-metal = { path = "../jxr-metal", version = "=0.3.1" } thiserror.workspace = true [target.'cfg(all(target_arch = "aarch64", target_os = "macos"))'.dependencies] diff --git a/crates/jxr-native/Cargo.toml b/crates/jxr-native/Cargo.toml index 0e483b2..9f8c942 100644 --- a/crates/jxr-native/Cargo.toml +++ b/crates/jxr-native/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "jxr-native" description = "Safe Rust JPEG XR parser, CPU decoder, and Annex-A writer" -version = "0.3.0" +version = "0.3.1" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/crates/jxr-test-support/Cargo.toml b/crates/jxr-test-support/Cargo.toml index ea0394e..c1d328b 100644 --- a/crates/jxr-test-support/Cargo.toml +++ b/crates/jxr-test-support/Cargo.toml @@ -14,8 +14,8 @@ metal = ["jxr/metal"] cuda = ["jxr/cuda"] [dependencies] -jxr = { path = "../jxr", version = "=0.3.0" } -jxr-native = { path = "../jxr-native", version = "=0.3.0" } +jxr = { path = "../jxr", version = "=0.3.1" } +jxr-native = { path = "../jxr-native", version = "=0.3.1" } rayon.workspace = true thiserror.workspace = true diff --git a/crates/jxr/Cargo.toml b/crates/jxr/Cargo.toml index 3e24dfc..02425ac 100644 --- a/crates/jxr/Cargo.toml +++ b/crates/jxr/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "jxr" description = "JPEG XR decoder and Annex-A writer with optional Metal and CUDA reconstruction" -version = "0.3.0" +version = "0.3.1" edition.workspace = true rust-version.workspace = true license.workspace = true @@ -19,8 +19,8 @@ cuda = ["dep:jxr-cuda"] [dependencies] jxr-core = { path = "../jxr-core", version = "=0.3.0" } -jxr-native = { path = "../jxr-native", version = "=0.3.0" } -jxr-metal = { path = "../jxr-metal", version = "=0.3.0", optional = true } +jxr-native = { path = "../jxr-native", version = "=0.3.1" } +jxr-metal = { path = "../jxr-metal", version = "=0.3.1", optional = true } jxr-cuda = { path = "../jxr-cuda", version = "=0.3.0", optional = true } rayon.workspace = true thiserror.workspace = true diff --git a/crates/jxr/fuzz/Cargo.lock b/crates/jxr/fuzz/Cargo.lock index f1ee6b9..e1ccbc5 100644 --- a/crates/jxr/fuzz/Cargo.lock +++ b/crates/jxr/fuzz/Cargo.lock @@ -110,7 +110,7 @@ dependencies = [ [[package]] name = "jxr" -version = "0.3.0" +version = "0.3.1" dependencies = [ "jxr-core", "jxr-cuda", @@ -151,7 +151,7 @@ version = "0.1.1" [[package]] name = "jxr-native" -version = "0.3.0" +version = "0.3.1" dependencies = [ "fearless_simd", "jxr-core", diff --git a/docs/releasing.md b/docs/releasing.md index 313e511..4644ce9 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -130,3 +130,38 @@ passed for the tagged source. CPU, Annex-A writer, Metal, and CUDA reference comparisons each passed 517 in-scope cases, with 179 declared scope exclusions and no failures. The reports and hardware benchmark results are attached to the [0.3.0 release](https://github.com/frames-sg/jxr/releases/tag/v0.3.0). + +## 0.3.1 patch release + +This patch release makes decoding faster without changing decoded output or +the existing decode contracts. CPU entropy decoding caches packet bits, decodes +run prefixes and per-symbol codes inline, and places coefficients directly in +their adaptive scan. Spatial tiles decode straight into the coefficient arena +or caller-owned Metal staging instead of being copied after the tile decode. +CPU inverse transforms, overlap filters, and common integer output packing use +four-lane and row-parallel paths with checked scalar fallbacks. + +Metal specializes output stores, batches overlap dispatches, reuses +coefficient staging across submissions, and overlaps `MetalBatchDecoder` +preparation with GPU reconstruction. Automatic Metal routing now promotes at +2^21 reconstructed coefficients instead of 16,384, so `Auto` decodes smaller +images on the CPU; explicit Metal requests are unchanged. MPSGraph batch +preparation runs on the decoder's worker pool and decodes entropy directly into +Metal staging, so prepared groups run without a coefficient upload. A staging +allocation failure now fails `prepare` rather than a later run. + +Additions are `MetalDecoderSession::stage_diagnostics` with +`MetalStageDiagnostics`, the `staging` field of the non-exhaustive +`MetalBufferPoolsDiagnostics`, and `CpuBatchDecoder::install`. Per-change +measurements are in pull requests #12 through #19. + +Publish the changed packages and their exact-version dependents in this order: + +1. `jxr-native` 0.3.1 +2. `jxr-metal` 0.3.1 +3. `jxr` 0.3.1 +4. `jxr-image` 0.3.1 +5. `jxr-mpsgraph` 0.3.1 + +`jxr-math` 0.1.1, `jxr-core` 0.3.0, and `jxr-cuda` 0.3.0 are unchanged and stay +at their published versions. `jxr-image` changes only its exact `jxr` pin. From 866b80914ab5babd106588ff4a28060d530ffa52 Mon Sep 17 00:00:00 2001 From: GF Date: Sun, 18 Oct 2026 23:23:22 -0400 Subject: [PATCH 2/2] Publish jxr-mpsgraph as 0.4.0 MpsGraphPreparedGroup and MpsGraphPreparedBatch now hold staged Metal plans, so they no longer implement UnwindSafe or RefUnwindSafe. cargo-semver-checks reports that as a breaking change against 0.3.0, so the adapter takes a new minor version on the 0.x line. Its other public API is unchanged. --- Cargo.lock | 2 +- crates/jxr-mpsgraph/Cargo.toml | 2 +- docs/releasing.md | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 355fbdf..4a69f79 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -202,7 +202,7 @@ dependencies = [ [[package]] name = "jxr-mpsgraph" -version = "0.3.1" +version = "0.4.0" dependencies = [ "j2k-metal-support", "j2k-mpsgraph-support", diff --git a/crates/jxr-mpsgraph/Cargo.toml b/crates/jxr-mpsgraph/Cargo.toml index 5809d26..b85e5d4 100644 --- a/crates/jxr-mpsgraph/Cargo.toml +++ b/crates/jxr-mpsgraph/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "jxr-mpsgraph" description = "Direct MPSGraph tensor adapter for Metal-resident JPEG XR batches" -version = "0.3.1" +version = "0.4.0" edition.workspace = true rust-version.workspace = true license.workspace = true diff --git a/docs/releasing.md b/docs/releasing.md index 4644ce9..5470d10 100644 --- a/docs/releasing.md +++ b/docs/releasing.md @@ -161,7 +161,10 @@ Publish the changed packages and their exact-version dependents in this order: 2. `jxr-metal` 0.3.1 3. `jxr` 0.3.1 4. `jxr-image` 0.3.1 -5. `jxr-mpsgraph` 0.3.1 +5. `jxr-mpsgraph` 0.4.0 `jxr-math` 0.1.1, `jxr-core` 0.3.0, and `jxr-cuda` 0.3.0 are unchanged and stay at their published versions. `jxr-image` changes only its exact `jxr` pin. +`jxr-mpsgraph` moves to 0.4.0 because `MpsGraphPreparedGroup` and +`MpsGraphPreparedBatch` now hold staged Metal plans and are no longer +`UnwindSafe` or `RefUnwindSafe`; its other public API is unchanged.