{"record":{"id":"cbf7951208d97086","repo":"a-b-street/abstreet","slug":"error-building-program","errorCode":null,"errorMessage":"error building program: {:?}","messagePattern":"error building program: (.+?)","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"widgetry/src/backend_glow_native.rs","lineNumber":54,"sourceCode":"    let program = unsafe {\n        build_program(\n            &gl,\n            include_str!(\"../shaders/vertex_140.glsl\"),\n            include_str!(\"../shaders/fragment_140.glsl\"),\n        )\n        .or_else(|err| {\n            warn!(\n                \"unable to build program with default shaderrs, falling back to v300. error: {:?}\",\n                err\n            );\n            build_program(\n                &gl,\n                include_str!(\"../shaders/vertex_300.glsl\"),\n                include_str!(\"../shaders/fragment_300.glsl\"),\n            )\n        })\n        .unwrap_or_else(|err| {\n            panic!(\"error building program: {:?}\", err);\n        })\n    };\n\n    (\n        PrerenderInnards::new(gl, true, program, Some(WindowAdapter(windowed_context))),\n        event_loop,\n    )\n}\n\npub struct WindowAdapter(glutin::WindowedContext<glutin::PossiblyCurrent>);\n\nimpl WindowAdapter {\n    pub fn window(&self) -> &winit::window::Window {\n        self.0.window()\n    }\n\n    pub fn window_resized(&self, new_size: ScreenDims, scale_factor: f64) {\n        let physical_size = winit::dpi::LogicalSize::from(new_size).to_physical(scale_factor);","sourceCodeStart":36,"sourceCodeEnd":72,"githubUrl":"https://github.com/a-b-street/abstreet/blob/0964f29315820c91b171b585eb51e300164e9197/widgetry/src/backend_glow_native.rs#L36-L72","documentation":"During Prerender setup, the app compiles its embedded GLSL 300 shaders into a GPU program via glow. If program creation/linking fails, it panics with the glow error — the driver rejected the shaders, indicating an OpenGL/driver capability problem.","triggerScenarios":"Building the program from vertex_300.glsl/fragment_300.glsl fails because the created context doesn't actually support GLSL #version 300 es / OpenGL 3.x features used by the shaders.","commonSituations":"Software/old Mesa drivers with incomplete GLSL 300 support; buggy GPU drivers that fail to link valid shaders; running on hardware below the required OpenGL version after the context check passed loosely.","solutions":["Update the graphics driver to one with solid OpenGL 3.x/GLSL 300 support","Force up-to-date Mesa or vendor drivers (not legacy software renderers)","Try LIBGL_ALWAYS_SOFTWARE=1 with a recent Mesa to rule out driver bugs","Compare shader source (shaders/vertex_300.glsl, fragment_300.glsl) against the driver's supported GLSL version"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"// verify the context actually exposes GLSL 300 support before compiling\nlet ver = unsafe { gl.get_parameter_string(glow::SHADING_LANGUAGE_VERSION) };\neprintln!(\"GLSL version: {}\", ver);","typeGuard":null,"tryCatchPattern":"match Program::new(...) {\n    Ok(p) => p,\n    Err(e) => { eprintln!(\"shader link failed: {:?}; update drivers or use software rendering\", e); std::process::exit(1); }\n}","preventionTips":["Keep GPU drivers updated; prefer vendor or recent Mesa drivers","Log SHADING_LANGUAGE_VERSION at startup to catch capability gaps early","Test on minimal/CI GPUs before releases","Fallback to software rendering when linking fails"],"tags":["opengl","glsl","shaders","glow","driver"],"backgroundTag":"module-init-failed","analyzedSha":"0964f29315820c91b171b585eb51e300164e9197","analyzedAt":"2026-09-13T18:02:03.421Z","contentChangedAt":"2026-09-13T18:02:03.421Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}