Files
DarkRoom/third_party
dtourolle dc9da52651 Let a wgpu-hal caller choose the Vulkan swapchain's preTransform
wgpu-hal creates every swapchain with `preTransform = IDENTITY` (#3345).
On a tablet whose panel is mounted landscape, a portrait window then
hands Android an unrotated buffer: SurfaceFlinger falls back to rotating
it on the GPU (composition CLIENT), and on this device those frames tear.
That is why Android draws with Skia over OpenGL today, and why the
develop view pays a readback (TD-1).

The field cannot just be set to `currentTransform` inside wgpu. It is a
promise that the image is already drawn rotated and sized in the panel's
orientation, and only the renderer above wgpu can keep it. So the patch
is the smallest thing that lets that renderer ask:
`vulkan::Surface::current_transform` reads the surface's transform, and
`set_pre_transform` makes the next swapchain use it. The default stays
IDENTITY, so desktop and any caller that does not opt in behave exactly
as upstream.
2026-09-25 04:18:39 -04:00
..

Patched upstream crates

Each directory here is a crate exactly as crates.io publishes it, at the version Cargo.lock resolves, with a local patch on top. The root Cargo.toml routes the dependency here through [patch.crates-io]; the directory is excluded from the workspace, so cargo test --workspace, clippy and fmt leave it alone.

The first commit that adds a directory is the pristine copy (from ~/.cargo/registry/src/*/<crate>-<version>, minus .cargo-ok and the crate's own Cargo.lock). Every later commit touching it is ours, so git log -p -- third_party/<dir> is the patch and nothing else.

Carrying a patch forward

When Slint or wgpu is bumped, the version here stops matching and cargo warns that the patch is unused — the build then silently goes back to the unpatched crate. So a bump is:

  1. Copy the new version in beside the old one, as its own commit.
  2. Re-apply the diff from git log -p on the old directory.
  3. Point [patch.crates-io] at the new directory and delete the old one.
  4. Re-check on the device (below) — both patches are behaviour that only a rotated Android display exercises.

Drop a patch entirely once upstream has the fix; each section says what upstream change would make it unnecessary.

wgpu-hal 29.0.4 — Vulkan pre-rotation on Android

Upstream creates every Vulkan swapchain with preTransform = IDENTITY (src/vulkan/swapchain/native.rs, gfx-rs/wgpu#3345). On Android, a window whose orientation differs from the panel's is then rotated by the compositor on the GPU (composition=CLIENT), and on this tablet in portrait those frames tear.

The patch adds two methods to wgpu_hal::vulkan::Surface:

  • current_transform(&Adapter) — the surface's currentTransform.
  • set_pre_transform(transform) — the preTransform for the next swapchain. Opt-in: nothing calls it but the Skia patch below, and the default is still IDENTITY, so desktop and every other caller behave exactly as upstream.

Setting it is a promise that the caller draws rotated into a swapchain sized in the panel's orientation; wgpu itself rotates nothing.

Unnecessary once wgpu exposes pre-rotation itself (#3345).

i-slint-renderer-skia 1.17.1 — rotate the canvas to match

(patch lands in a later commit)