wgpu 22 → 29, glyphon 0.6 → 0.11: requestDevice-Shim entfällt

glyphon 0.11 ist die neueste zu wgpu 29 passende Version (wgpu 30 existiert
bereits, glyphon pinnt aber ^29). Das 22er-Limit maxInterStageShaderComponents
wird von 29 nicht mehr in requiredLimits gesendet — src/engine/requestDeviceShim.ts
komplett entfernt, beide Hook-Importstellen (useWasmPlanRenderer, useWasm3dRenderer)
angepasst. pollster 0.3→0.4, naga 22→29 mitgezogen. Alle Draw-/Text-Pfade
(draw_sequence, glyphon ColorMode::Web, widthScreen-Polylinien, Headless/Golden)
unverändert funktionsfähig.

Verifiziert: cargo check nativ (render2d/render3d/src-tauri) grün, cargo test
render2d 17/17 + Golden bit-exakt, render3d 29/29, wasm32 --features web für
beide grün, npx tsc -b + npm run build grün.
This commit is contained in:
2026-07-03 18:17:41 +02:00
parent 9371b65b3b
commit 8a79f6cbaa
17 changed files with 1794 additions and 1124 deletions
+18 -16
View File
@@ -87,7 +87,7 @@ impl HeadlessRenderer {
pub fn new() -> Result<Self, String> {
let instance = wgpu::Instance::new(wgpu::InstanceDescriptor {
backends: wgpu::Backends::VULKAN,
..Default::default()
..wgpu::InstanceDescriptor::new_without_display_handle()
});
let adapter = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::HighPerformance,
@@ -95,16 +95,15 @@ impl HeadlessRenderer {
// Kein Fenster -> keine kompatible Surface noetig.
compatible_surface: None,
}))
.ok_or_else(|| "kein Vulkan-Adapter fuer Headless-Rendering gefunden".to_string())?;
let (device, queue) = pollster::block_on(adapter.request_device(
&wgpu::DeviceDescriptor {
label: Some("headless.device"),
required_features: wgpu::Features::empty(),
required_limits: wgpu::Limits::default(),
memory_hints: wgpu::MemoryHints::Performance,
},
None,
))
.map_err(|e| format!("kein Vulkan-Adapter fuer Headless-Rendering gefunden: {e}"))?;
let (device, queue) = pollster::block_on(adapter.request_device(&wgpu::DeviceDescriptor {
label: Some("headless.device"),
required_features: wgpu::Features::empty(),
required_limits: wgpu::Limits::default(),
experimental_features: wgpu::ExperimentalFeatures::disabled(),
memory_hints: wgpu::MemoryHints::Performance,
trace: wgpu::Trace::Off,
}))
.map_err(|e| format!("Headless-Device anfordern fehlgeschlagen: {e}"))?;
let renderer = Renderer::new(&device, COLOR_FORMAT);
@@ -178,15 +177,15 @@ impl HeadlessRenderer {
label: Some("headless.copy"),
});
encoder.copy_texture_to_buffer(
wgpu::ImageCopyTexture {
wgpu::TexelCopyTextureInfo {
texture,
mip_level: 0,
origin: wgpu::Origin3d::ZERO,
aspect: wgpu::TextureAspect::All,
},
wgpu::ImageCopyBuffer {
wgpu::TexelCopyBufferInfo {
buffer: &output_buffer,
layout: wgpu::ImageDataLayout {
layout: wgpu::TexelCopyBufferLayout {
offset: 0,
bytes_per_row: Some(padded_bytes_per_row),
rows_per_image: Some(height),
@@ -206,8 +205,11 @@ impl HeadlessRenderer {
let _ = tx.send(res);
});
// Vulkan hat keine Event-Loop wie ein Fenster -> Poll blockierend, bis
// die Map-Callback feuert (kein busy-loop noetig, `Maintain::Wait` wartet).
self.device.poll(wgpu::Maintain::Wait);
// die Map-Callback feuert (kein busy-loop noetig, `PollType::Wait` wartet
// ohne Timeout auf die juengste Submission).
self.device
.poll(wgpu::PollType::wait_indefinitely())
.expect("Device-Poll fehlgeschlagen");
rx.recv()
.expect("Map-Callback nie aufgerufen")
.expect("Buffer-Mapping fehlgeschlagen");