{"record":{"id":"cad7c95b9b1467c6","repo":"GraphiteEditor/Graphite","slug":"failed-to-create-wgpuexecutor","errorCode":null,"errorMessage":"Failed to create WgpuExecutor","messagePattern":"Failed to create WgpuExecutor","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"desktop/src/render/state.rs","lineNumber":164,"sourceCode":"\t\t\t\ttopology: wgpu::PrimitiveTopology::TriangleList,\n\t\t\t\tstrip_index_format: None,\n\t\t\t\tfront_face: wgpu::FrontFace::Ccw,\n\t\t\t\tcull_mode: Some(wgpu::Face::Back),\n\t\t\t\tpolygon_mode: wgpu::PolygonMode::Fill,\n\t\t\t\tunclipped_depth: false,\n\t\t\t\tconservative: false,\n\t\t\t},\n\t\t\tdepth_stencil: None,\n\t\t\tmultisample: wgpu::MultisampleState {\n\t\t\t\tcount: 1,\n\t\t\t\tmask: !0,\n\t\t\t\talpha_to_coverage_enabled: false,\n\t\t\t},\n\t\t\tmultiview_mask: None,\n\t\t\tcache: None,\n\t\t});\n\n\t\tlet executor = WgpuExecutor::with_context(context).expect(\"Failed to create WgpuExecutor\");\n\n\t\tSelf {\n\t\t\tsurface,\n\t\t\texecutor,\n\t\t\tconfig,\n\t\t\trender_pipeline,\n\t\t\ttransparent_texture,\n\t\t\tsampler,\n\t\t\tdesired_width: size.width,\n\t\t\tdesired_height: size.height,\n\t\t\tviewport_scale: [1., 1.],\n\t\t\tviewport_offset: [0., 0.],\n\t\t\tviewport_texture: None,\n\t\t\toverlays_texture: None,\n\t\t\tui_texture: None,\n\t\t\tbind_group: None,\n\t\t\toverlays_scene: None,\n\t\t\tsurface_outdated: true,","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/GraphiteEditor/Graphite/blob/c507b356453361e31638b8bff8f6d46b6da2961e/desktop/src/render/state.rs#L146-L182","documentation":"Panic when WgpuExecutor::with_context returns None. Looking at the implementation, the only fallible step is creating the Vello Renderer (it maps the error to 'Failed to create Vello renderer') plus the texture cache and shader runtime setup. Vello's Renderer::new fails when the device does not meet the required limits for its compute-based rendering pipelines (e.g., storage buffer/textures counts on weak or software adapters) or when the device is lost/out of memory.","triggerScenarios":"Creating the window render state on a software adapter (llvmpipe) or GL/ANGLE-backed device whose limits fall short of Vello's requirements; a device lost between context creation and executor creation; GPU memory exhausted by other applications.","commonSituations":"Running on virtualized/software GPUs in CI or VMs; older integrated GPUs with outdated drivers; selecting a non-default adapter via GRAPHITE_WGPU_ADAPTER that happens to be a software adapter; long sessions where another app consumed VRAM.","solutions":["Select a hardware adapter explicitly via GRAPHITE_WGPU_ADAPTER using the printed adapter list, avoiding software/llvmpipe entries","Update GPU and Vulkan drivers so the device reports Vello's required limits","Close other GPU-heavy applications to free VRAM and retry","In VMs/CI, enable GPU passthrough or hardware acceleration instead of software rendering"],"exampleFix":"// before\nlet executor = WgpuExecutor::with_context(context).expect(\"Failed to create WgpuExecutor\");\n\n// after\nlet executor = WgpuExecutor::with_context(context)\n\t.unwrap_or_else(|| panic!(\"Failed to create WgpuExecutor (Vello renderer unsupported on adapter: {:?})\", context.adapter.get_info()));","handlingStrategy":"try-catch","validationCode":"// Check the chosen adapter meets Vello's needs before constructing the executor\nlet info = context.adapter.get_info();\nif info.software {\n\ttracing::warn!(\"software adapter selected; Vello rendering may be unsupported\");\n}","typeGuard":null,"tryCatchPattern":"let Some(executor) = WgpuExecutor::with_context(context.clone()) else {\n\teprintln!(\"Failed to create WgpuExecutor on adapter {:?}; select another with GRAPHITE_WGPU_ADAPTER\", context.adapter.get_info());\n\tstd::process::exit(1);\n};","preventionTips":["Prefer hardware adapters; filter software/llvmpipe adapters when more than one is available","Keep GPU drivers updated so device limits satisfy Vello's renderer requirements","Surface the adapter info in the failure message to make mis-selection obvious"],"tags":["rust","wgpu","vello","gpu-limits","rendering"],"backgroundTag":"gpu-device-limits-insufficient","analyzedSha":"c507b356453361e31638b8bff8f6d46b6da2961e","analyzedAt":"2026-08-16T21:57:18.596Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}