Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 12 additions & 7 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.12.0] "Refraction" - 2026-07-12

Eighth release of the RustyNES-parity roadmap: a third post-filter, and a shader-source crate
extraction that sets up the mobile track.

### Added

- **A third presentation post-filter, `PostFilter::Xbrz`** (`v1.12.0 "Refraction"`): a
single-pass, context-aware corner-rounding blend — an xBRZ-style *approximation* of the
algorithm's corner rule (not a literal multi-pass xBRZ port). It blends the same 2x2 corner
`PostFilter::Hqx` does, but reads a wider 4x4 neighborhood and only commits to the full
diagonal pull when the outward context agrees the edge is a genuine corner, not isolated-pixel
noise. One strength slider (`config.video.xbrz_strength`, default `0.6`), selectable from
Settings → Video and the View → Post-filter submenu, same as `Crt`/`Hqx`.
- **A third presentation post-filter, `PostFilter::Xbrz`**: a single-pass, context-aware
corner-rounding blend — an xBRZ-style *approximation* of the algorithm's corner rule (not a
literal multi-pass xBRZ port). It blends the same 2x2 corner `PostFilter::Hqx` does, but reads
a wider 4x4 neighborhood and only commits to the full diagonal pull when the outward context
agrees the edge is a genuine corner, not isolated-pixel noise. One strength slider
(`config.video.xbrz_strength`, default `0.6`), selectable from Settings → Video and the View →
Post-filter submenu, same as `Crt`/`Hqx`.
- **New `rustysnes-gfx-shaders` crate**: the `BLIT_WGSL`/`CRT_WGSL`/`HQX_WGSL` shader sources
moved out of `rustysnes-frontend::gfx`, byte-identical, alongside the new `XBRZ_WGSL` — so the
planned `rustysnes-mobile` bridge (`v1.14.0 "Foundry"`) can reuse the exact shader strings
Expand Down
26 changes: 13 additions & 13 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ members = [
]

[workspace.package]
version = "1.11.0"
version = "1.12.0"
edition = "2024"
rust-version = "1.96"
license = "MIT OR Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-apu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-apu"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cart/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-cart"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cheevos/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-cheevos"
description = "Native-only RetroAchievements (rcheevos) FFI wrapper for RustySNES"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-core"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-cpu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-cpu"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-frontend/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-frontend"
description = "RustySNES: cross-platform SNES emulator binary (winit + wgpu + cpal + egui)"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-gfx-shaders/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-gfx-shaders"
description = "RustySNES: shared WGSL presentation-shader sources (blit + post-filters)"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-netplay/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-netplay"
description = "RustySNES: GGPO-style rollback netplay (UDP native, WebRTC browser)"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-ppu/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-ppu"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-savestate/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-savestate"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-script/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[package]
name = "rustysnes-script"
description = "RustySNES: sandboxed Lua 5.4 scripting (memory read/write + a per-frame callback)"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
2 changes: 1 addition & 1 deletion crates/rustysnes-test-harness/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rustysnes-test-harness"
version = "1.11.0"
version = "1.12.0"
edition.workspace = true
rust-version.workspace = true
license.workspace = true
Expand Down
15 changes: 9 additions & 6 deletions docs/STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,24 @@
This file is authoritative for per-suite pass counts, the board / coprocessor matrix, and
version policy. Everything else defers to it.

**Current release:** `v1.11.0 "Podium"` (`v0.1.0 "Foundation"`,
**Current release:** `v1.12.0 "Refraction"` (`v0.1.0 "Foundation"`,
`v0.2.0 "Persistence"`, `v0.3.0 "Continuum"`, `v0.4.0 "Completion"`, `v0.5.0 "Fidelity"`,
`v0.6.0 "Shippable"`, `v0.7.0 "Resolution"`, `v0.8.0 "Community"`, `v0.9.0 "Threshold"`,
`v1.0.0 "Zenith"`, `v1.0.1 "Aftertouch"`, `v1.1.0 "Latchkey"`, `v1.2.0 "Phosphor"`,
`v1.3.0 "Palimpsest"`, and `v1.4.0 "Convergence"` precede it; see `to-dos/VERSION-PLAN.md` for the
full ladder). **`v1.5.0`-`v1.11.0`** are the opening rungs of the RustyNES-parity ladder — a CI
full ladder). **`v1.5.0`-`v1.12.0`** are the opening rungs of the RustyNES-parity ladder — a CI
safety net (`v1.5.0 "Bedrock"`), a MkDocs documentation site + PWA + accuracy ledger
(`v1.6.0 "Lighthouse"`), the debugger extracted into its own module plus a hex Memory panel
(`v1.7.0 "Telemetry"`, `v1.7.1` patch), a Memory Compare panel + in-app Docs panel
(`v1.8.0 "Tracepoint"`), widening `rustysnes-script`'s `emu.read` to the full 24-bit bus
(`v1.9.0 "Marionette"`), wiring HD-pack compositing into the `emu-thread` build for the first
time (`v1.10.0 "Atelier"`), and fixing RetroAchievements to actually load a game for the first
time (`v1.11.0 "Podium"`) — all frontend/tooling/CI work with **zero change** to the accuracy
dashboard, per-suite pass counts, or coprocessor tier matrix below, which stayed byte-identical
throughout; see `CHANGELOG.md` for full per-release detail. `v1.0.0` closes the production-cut
time (`v1.10.0 "Atelier"`), fixing RetroAchievements to actually load a game for the first
time (`v1.11.0 "Podium"`), and adding a third presentation post-filter (`PostFilter::Xbrz`) plus
extracting the WGSL shader sources into a new `rustysnes-gfx-shaders` crate for reuse by the
planned mobile bridge (`v1.12.0 "Refraction"`) — all frontend/tooling/CI work with **zero
change** to the accuracy dashboard, per-suite pass counts, or coprocessor tier matrix below,
which stayed byte-identical throughout; see `CHANGELOG.md` for full per-release detail. `v1.0.0`
closes the production-cut
gate: `Board: Send` (unblocking `emu-thread` to compile/test/lint clean for the first time, though
it stays off-by-default pending full feature parity — see `docs/frontend.md`), the five
desktop-UX-shell-maturity items (thumbnail Save States manager, key-rebind grid, themes, speed
Expand Down
8 changes: 6 additions & 2 deletions to-dos/ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -332,8 +332,12 @@ under `v1.0.0`) and the netplay save-state-cost pre-work.
**RELEASED 2026-07-12** — no code path ever called `RaClient::begin_load_game`, so achievements
could never actually trigger despite login/`do_frame`/toast plumbing all being wired up; the
originally-planned hardcore mode/leaderboard/rich-presence UI was meaningless without this
prerequisite fix landing first, so it's deferred to a later rung instead), a deeper shader/NTSC
ladder (`v1.12.0`), accessibility/theming + save-state polish (`v1.13.0`), then a
prerequisite fix landing first, so it's deferred to a later rung instead), a third post-filter
plus a shader-crate extraction (`v1.12.0 "Refraction"`, **RELEASED 2026-07-12** —
`PostFilter::Xbrz`, an xBRZ-style context-gated corner blend, and the new `rustysnes-gfx-shaders`
crate housing `BLIT_WGSL`/`CRT_WGSL`/`HQX_WGSL`/`XBRZ_WGSL` for reuse by the mobile track;
`.slangp`/`.cgp` import and a composite/RF post-pass remain deferred, unrevisited from `v1.2.0`'s
original scope call), accessibility/theming + save-state polish (`v1.13.0`), then a
full mobile track — Android + iOS apps plus dormant monetization scaffolding
(`v1.14.0`-`v1.18.0`) — and a PGO/BOLT pipeline last (`v1.19.0`). Tracked in lockstep against
RustyNES's own continuing development via `to-dos/LOCKSTEP-CHECKLIST.md`, not a frozen
Expand Down
22 changes: 16 additions & 6 deletions to-dos/VERSION-PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -1120,12 +1120,22 @@ so the fix is observably verifiable end-to-end, not just type-checked.
after the ROM-change wiring already ran once at startup). The common path (launch, log in, then
open a ROM via the File menu) is unaffected. See `cheevos.rs`'s module doc.

### `v1.12.0 "Refraction"` — shader/NTSC ladder depth

New `rustysnes-gfx-shaders` crate (extracts `gfx.rs`'s inline WGSL byte-identically — later reused
as-is by the mobile track, `v1.14.0`); xBRZ upscaling; `.slangp`/`.cgp` shader-preset import; one
optional composite/RF post-pass, explicitly scoped as *not* a port of RustyNES's NES-specific
dot-crawl ladder (SNES has no equivalent dot-clock-subsampling artifact to exploit).
### `v1.12.0 "Refraction"` — shader/NTSC ladder depth — **RELEASED 2026-07-12**

Delivered: a third `PostFilter::Xbrz` variant (a single-pass, context-aware corner-rounding
blend — an xBRZ-*style* approximation of the algorithm's corner rule, gating `Hqx`'s 2x2 corner
blend by a wider 4x4-neighborhood confidence check, not a literal multi-pass xBRZ port); the new
`rustysnes-gfx-shaders` crate (extracts `gfx.rs`'s inline WGSL byte-identically, verified via a
script diff against the pre-extraction source — later reused as-is by the mobile track,
`v1.14.0`).

**Deferred** (unrevisited from `v1.2.0`'s original scope call, not a new finding this release):
RetroArch `.slangp`/`.cgp` shader-preset import, and the optional composite/RF post-pass
explicitly scoped as *not* a port of RustyNES's NES-specific dot-crawl ladder (SNES has no
equivalent dot-clock-subsampling artifact to exploit). A real xBRZ implementation (the literal
multi-pass algorithm, not this release's single-pass GPU approximation) was considered and
deferred — the single-pass shader approximation was judged the honestly-testable, right-sized
scope for a presentation-only, non-accuracy-critical feature.

### `v1.13.0 "Vantage"` — accessibility/theming + save-state polish

Expand Down
Loading