Skip to content
Open
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
33 changes: 11 additions & 22 deletions Cargo.lock

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

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ lto = "thin"
codegen-units = 1

[patch.crates-io]
# Shared OCLP Metal compatibility backport; see docs/oclp-wgpu-fork.md.
wgpu = { git = "https://github.com/ITJamie/wgpu-fork", rev = "21c08e23135ba27ed1c6b68177ecc20c0d076dd9" }
hayro-syntax = { git = "https://github.com/storytold/craft-libs", rev = "a0916808f7d78bed8c7b90cdf937176015454a7f" }
hayro-interpret = { git = "https://github.com/storytold/craft-libs", rev = "a0916808f7d78bed8c7b90cdf937176015454a7f" }
hayro-jbig2 = { git = "https://github.com/storytold/craft-libs", rev = "a0916808f7d78bed8c7b90cdf937176015454a7f" }
Expand Down
5 changes: 4 additions & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# VectorCraft Roadmap

> **Last updated:** 2026-10-26 · **Change:** minor (shared OCLP wgpu compatibility proposal; scores and estimates unchanged).

- PDF.R1: editable PDF import uses the shared reader, scans page content in windows, and rejects known incomplete input before returning a document.
- PDF.W1: PDF export and print composition use the shared optional writer for configuration, metadata, font preparation and guarded finalization; drawing and output policy remain app-owned.

Expand Down Expand Up @@ -54,7 +56,7 @@ everything is measured from our code against Illustrator's public documentation.
| Features (depth) | 75% | 220–360 | [target-app-parity.md](docs/target-app-parity.md) |
| UI/UX fidelity | 55% | 70–110 | [ui-parity.md](docs/ui-parity.md) |
| File formats | 75% | 15–30 | [file-format-parity.md](docs/file-format-parity.md) |
| Hardware (GPU, pen, touch, displays) | 35% | 25–45 | [hardware-parity.md](docs/hardware-parity.md) |
| Hardware (GPU, pen, touch, displays) | 35% | 25–45 | [hardware-parity.md](docs/hardware-parity.md); [OCLP proposal](docs/oclp-wgpu-fork.md) |
| Localization (12 key languages) | 74% (measured) | 50–85 | [localization-parity.md](docs/localization-parity.md) |
| Performance | ~60% | 15–25 | [gaps.md › G15](docs/gaps.md#g15-performance-budgets-and-a-gpu-renderer) |
| Stability | ~60% | 30–50 | [gaps.md › G10](docs/gaps.md#g10-launch-and-stability-on-real-machines) |
Expand Down Expand Up @@ -198,6 +200,7 @@ The full pre-standard record of what landed is kept in [docs/roadmap.md](docs/ro

| Date | Change | Summary |
|---|---|---|
| 2026-10-26 | minor | Propose the shared OCLP wgpu backport with internal validation preserved; qualification and known compiler-probe delay documented; scores and estimates unchanged. |
| 2026-10-23 | minor | Progress log row for Pathfinder › Trap; Live vector effects hours 6–10 → 4–8; headline numbers unchanged. |
| 2026-10-23 | minor | Progress log row for OpenType SVG colour fonts; headline numbers unchanged. |
| 2026-10-23 | minor | Progress log row for COLR colour fonts; headline numbers unchanged. |
Expand Down
22 changes: 22 additions & 0 deletions apps/vectorcraft/src/gpu.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,11 @@ use std::time::{Duration, Instant};
use eframe::egui_wgpu::NativeAdapterSelectorMethod;
use eframe::wgpu::{self, Backend, Backends, DeviceType, PowerPreference};

pub fn configure_instance(descriptor: &mut wgpu::InstanceDescriptor, backends: Backends, compiler: wgpu::Dx12Compiler) {
descriptor.backends = backends;
descriptor.backend_options.dx12.shader_compiler = compiler;
}

/// The adapters a restart leaves out, those the window failed on, as comma-separated [`key`]s
/// (`Vulkan:1002:164e`, `Metal:Intel Iris Pro Graphics`). Set by the app itself when it starts
/// again.
Expand Down Expand Up @@ -881,6 +886,23 @@ fn restart(skip: &str) -> std::io::Result<()> {
mod tests {
use super::*;

#[test]
fn instance_configuration_preserves_validation_flags() {
use eframe::wgpu::{Dx12Compiler, InstanceDescriptor, InstanceFlags, MetalShadingLanguageVersion as Msl};
for flags in [InstanceFlags::VALIDATION_INDIRECT_CALL, InstanceFlags::empty(), InstanceFlags::default()] {
let mut descriptor = InstanceDescriptor::new_without_display_handle();
descriptor.flags = flags;
descriptor.backend_options.metal.msl_version = Some(Msl::Version3_1);
descriptor.backend_options.metal.max_msl_version = Some(Msl::Version3_0);
super::configure_instance(&mut descriptor, super::Backends::METAL, Dx12Compiler::Fxc);
assert_eq!(descriptor.flags, flags);
assert_eq!(descriptor.backend_options.metal.msl_version, Some(Msl::Version3_1));
assert_eq!(descriptor.backend_options.metal.max_msl_version, Some(Msl::Version3_0));
assert_eq!(descriptor.backends, super::Backends::METAL);
assert!(matches!(descriptor.backend_options.dx12.shader_compiler, Dx12Compiler::Fxc));
}
}

fn gpu(name: &str, backend: Backend, device_type: DeviceType) -> Candidate {
Candidate { key: format!("{backend:?}:{name}"), name: name.into(), backend, device_type, pci: (0, 0), presents: true }
}
Expand Down
16 changes: 4 additions & 12 deletions apps/vectorcraft/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1000,18 +1000,10 @@ fn main() -> std::process::ExitCode {
// Only adapters that can show the window, in the order `gpu` gives (#306, #502).
if let eframe::egui_wgpu::WgpuSetup::CreateNew(create) = &mut options.wgpu_options.wgpu_setup {
create.native_adapter_selector = Some(gpu::selector(power, displays, compositor, left_out.adapters.clone(), startup.clone()));
// Nothing draws or dispatches indirectly, so wgpu's check of indirect arguments only
// costs a compute shader at start-up, one some drivers can't compile (OCLP-patched
// Metal on an Iris Pro, #651). `WGPU_VALIDATION_INDIRECT_CALL=1` turns it back on.
create.instance_descriptor.flags =
(eframe::wgpu::InstanceFlags::from_build_config() - eframe::wgpu::InstanceFlags::VALIDATION_INDIRECT_CALL).with_env();
create.instance_descriptor.backends =
left_out.backends(gpu::backends(create.instance_descriptor.backends, std::env::var_os("WGPU_BACKEND").is_some()));
// DX12 shaders compile with FXC, part of Windows: wgpu's default loads whichever
// dxcompiler.dll the search path finds, and one without its dxil.dll fails every shader,
// losing the device before the first frame (#1194). `WGPU_DX12_COMPILER` picks another.
create.instance_descriptor.backend_options.dx12.shader_compiler =
eframe::wgpu::Dx12Compiler::from_env().unwrap_or(eframe::wgpu::Dx12Compiler::Fxc);
let backends = left_out.backends(gpu::backends(create.instance_descriptor.backends, std::env::var_os("WGPU_BACKEND").is_some()));
// Keep FXC as the default on Windows (#1194), unless explicitly overridden.
let compiler = eframe::wgpu::Dx12Compiler::from_env().unwrap_or(eframe::wgpu::Dx12Compiler::Fxc);
gpu::configure_instance(&mut create.instance_descriptor, backends, compiler);
// The window's surface may be as large as the adapter allows, not eframe's fixed
// 8192 px: a window stretched over several monitors, or grown by a display scale
// change, otherwise fails to configure its surface and the app closes (#1459).
Expand Down
3 changes: 3 additions & 0 deletions contributors/people.toml
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,6 @@ sync_github_name = false
real_name = "Andrés Ortega Montoya"
display_name = "Andrés Ortega Montoya"
sync_github_name = false

[people.ITJamie]
sync_github_name = true
2 changes: 1 addition & 1 deletion docs/development.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ The canvas is rasterized on the CPU (`vectorcraft-render`, vello_cpu); the GPU (
- `WGPU_POWER_PREF`: `low`, `high` or `none` (the system's order).
- `WGPU_ADAPTER_NAME`: part of an adapter's name, any case (`WGPU_ADAPTER_NAME=nvidia`, `=radv`, `=intel`); the names are in the log.
- `WGPU_BACKEND`: the backends to use, such as `vulkan`, `dx12`, `metal` or `gl`.
- `WGPU_VALIDATION_INDIRECT_CALL=1`: turns wgpu's check of indirect draw arguments back on. VectorCraft draws nothing indirectly and turns it off, since the compute shader it needs fails to compile on some drivers (#651).
- `WGPU_VALIDATION_INDIRECT_CALL`: explicitly enables (`1`) or disables (`0`) wgpu's internal indirect-call validation. The shared [OCLP wgpu proposal](oclp-wgpu-fork.md) preserves the instance's configured flags instead of disabling this check at startup.
- On Linux with Mesa, `MESA_VK_DEVICE_SELECT=10de:2f04!` (vendor:device as `vulkaninfo --summary` or `lspci -nn` show it) leaves only that GPU to Vulkan, and `DRI_PRIME=1` picks the other GPU.
- Help › About and the control channel's `ui.inspect` (`graphicsAdapter`) show the adapter in use, and the app logs it at startup.

Expand Down
5 changes: 5 additions & 0 deletions docs/gaps.md

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions docs/hardware-parity.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Hardware parity

> **Last updated:** 2026-10-26 · **Change:** minor (shared OCLP wgpu compatibility proposal; scores and estimates unchanged).

> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-24 · **Change:** minor (pen pressure and the pen's eraser end on macOS, read from AppKit's tablet events, #852, not yet tried on a Mac; previously: patch: web pen buttons/modifiers preserved, touch-only input left to eframe, session-only palm rejection; tool cursors painted into the window on Wayland, #1652, not run on Linux; borderless title-bar window on Windows, #1758, awaiting confirmation; a window surface larger than 8192 px keeps working, #1459 in part; Linux Display Server preference opens the window through XWayland, #1151) · **Target:** Adobe Illustrator 2026 (30.x)

What hardware Illustrator uses, per platform, against VectorCraft. Illustrator's side is from its public
Expand All @@ -9,6 +11,8 @@ documentation (GPU Performance, touch workspace, pen pressure pages); ours from

## Summary

The [OCLP wgpu proposal](oclp-wgpu-fork.md) records the pinned compatibility fork, hardware evidence and remaining compiler-probe delay. It does not change hardware parity scores.

**~35% (estimated), 25–45 h.** VectorCraft rasterizes the canvas on the CPU (multithreaded `vello_cpu`) and uses
the GPU only to composite, so any GPU that can show a window works, at the cost of GPU-accelerated preview
on huge documents. VectorCraft reads pen pressure on Windows, on the web, on macOS, and on Linux under X11 and XWayland, and it
Expand Down Expand Up @@ -36,6 +40,7 @@ reads the pen's eraser end on Windows, on macOS and on Linux under X11 and XWayl

| Date | Change | Summary |
|---|---|---|
| 2026-10-26 | minor | Propose the shared OCLP wgpu backport with internal validation preserved; qualification and known compiler-probe delay documented; scores and estimates unchanged. |
| 2026-10-24 | minor | macOS: an AppKit local event monitor reads each mouse and tablet event's pen pressure and the pen's end before the window gets it and writes them into the canvas's pen feed (#852): each pointer move of a stroke keeps its own pressure, mouse event coalescing is off, and the eraser end selects the Eraser tool. The mapping is unit-tested on every platform and the macOS code type-checks for `aarch64-apple-darwin`; not yet tried on a Mac with a tablet, so the score is unchanged (estimated) |
| 2026-10-15 | patch | Web review: preserve pen buttons and modifiers; leave fingers to eframe before the first pen contact; remove persistent pen policy. Canvas regression tests cover intermediate moves and long-touch cancellation on native and web input. Physical-device QA pending. |
| 2026-10-14 | minor | Tool cursors are painted into the window on Wayland (#1652; not run on Linux, #1645 stays open until confirmed); On Windows the custom title bar's window stays truly borderless, so the pointer lines up with what is drawn on systems where the hidden caption offset it (#1791, #1758; awaiting the reporter's confirmation); neither is confirmed on the hardware that reported it, so nothing is marked done |
Expand Down
Loading