134 lines
5.1 KiB
Markdown
134 lines
5.1 KiB
Markdown
# Troubleshooting
|
|
|
|
## 1. `cargo build` fails with "no matching package"
|
|
|
|
**Symptom:** Build fails with `could not find package` for wgpu or winit.
|
|
|
|
**Cause:** Version typo in `Cargo.toml`. wgpu and winit have specific major versions.
|
|
|
|
**Fix:** Verify your dependency versions:
|
|
```toml
|
|
wgpu = "29"
|
|
winit = "0.30"
|
|
tokio = { version = "1", features = ["rt", "macros"] }
|
|
bytemuck = { version = "1", features = ["derive"] }
|
|
log = "0.4"
|
|
simple_logger = "5"
|
|
```
|
|
|
|
## 2. Window opens but shows black screen
|
|
|
|
**Symptom:** Window appears but is entirely black. No triangle visible.
|
|
|
|
**Cause:** One (or more) of several common rendering misconfigurations:
|
|
- Pipeline not set: `pass.set_pipeline()` not called
|
|
- Vertex buffer not bound: `pass.set_vertex_buffer()` not called
|
|
- Draw call wrong: `draw()` arguments incorrect (must be `draw(0..3, 0..1)` — two ranges)
|
|
- Triangle wound clockwise: `FrontFace::Ccw` requires counter-clockwise vertex order
|
|
- Format mismatch: `ColorTargetState::format` must match `SurfaceConfiguration::format`
|
|
- Present omitted: `surface_texture.present()` must be called to show rendered frame
|
|
|
|
**Fix:** Check each item above. Verify the pipeline is set, buffer is bound, draw uses two `Range<u32>` arguments, vertices are CCW, formats match, and `present()` is called.
|
|
|
|
## 3. Washed-out or wrong colors
|
|
|
|
**Symptom:** Triangle renders but colors look dull or incorrect.
|
|
|
|
**Cause:** `SurfaceConfiguration::view_formats` missing `add_srgb_suffix()`. Without sRGB gamma correction, colors appear washed out.
|
|
|
|
**Fix:** Ensure `view_formats` includes the sRGB variant:
|
|
```rust
|
|
view_formats: vec![format.add_srgb_suffix()],
|
|
```
|
|
|
|
## 4. Panic: "No adapter found"
|
|
|
|
**Symptom:** Program crashes immediately with `No GPU adapter found`.
|
|
|
|
**Cause:** No Vulkan driver installed. wgpu on Linux requires Vulkan.
|
|
|
|
**Fix:**
|
|
```bash
|
|
sudo apt install libvulkan1 mesa-vulkan-drivers
|
|
vulkaninfo # verify installation
|
|
```
|
|
|
|
## 5. Panic: "Surface lost"
|
|
|
|
**Symptom:** Program crashes with a surface lost error during rendering.
|
|
|
|
**Cause:** Display server restarted or GPU context was reset. The [Surface](concepts/GLOSSARY.md#Surface) is permanently invalidated.
|
|
|
|
**Fix:** In the tutorial, this means the window needs to be reopened. In production code, handle the `Lost` variant of `CurrentSurfaceTexture` by recreating the surface via `Instance::create_surface()`.
|
|
|
|
## 6. Wayland surface crashes or doesn't render
|
|
|
|
**Symptom:** Program crashes or shows blank window on Wayland.
|
|
|
|
**Cause:** winit's Wayland backend may have compatibility issues with certain compositors.
|
|
|
|
**Fix:** Force X11 backend:
|
|
```bash
|
|
WINIT_UNIX_BACKEND=x11 cargo run
|
|
```
|
|
|
|
## 7. Window won't close
|
|
|
|
**Symptom:** Clicking the X button or pressing Escape doesn't close the window.
|
|
|
|
**Cause:** `ApplicationHandler::exiting()` not implemented, or `event_loop_ctl.exit()` not called.
|
|
|
|
**Fix:** Ensure `exiting()` (note: NOT `closing()`) is implemented:
|
|
```rust
|
|
fn exiting(&mut self, event_loop_ctl: &ActiveEventLoop) {
|
|
event_loop_ctl.exit();
|
|
}
|
|
```
|
|
|
|
## 8. CPU at 100%
|
|
|
|
**Symptom:** One CPU core at 100% usage.
|
|
|
|
**Cause:** `ControlFlow::Poll` drives `RedrawRequested` events continuously. Every frame renders and queues another redraw. This is the expected behavior for a `ControlFlow::Poll` render loop.
|
|
|
|
**Fix:** No fix needed — this is expected for a continuous redraw demo. For production, switch to `ControlFlow::Wait` and call `request_redraw()` only when state changes.
|
|
|
|
## 9. Shader compilation or pipeline creation error
|
|
|
|
**Symptom:** Program panics during `create_render_pipeline` with a shader validation error.
|
|
|
|
**Cause:** `@location` numbers in WGSL don't match `shader_location` numbers in Rust's `VertexAttribute`, or `@builtin(position)` is missing from vertex shader output.
|
|
|
|
**Fix:** Check the log output for validation messages. Verify:
|
|
- WGSL `@location(0)` matches Rust `shader_location: 0`
|
|
- WGSL `@location(1)` matches Rust `shader_location: 1`
|
|
- Vertex shader outputs `@builtin(position) clip_position: vec4<f32>`
|
|
|
|
## 10. Triangle shows one solid color instead of gradient
|
|
|
|
**Symptom:** Triangle renders but is a single uniform color instead of smoothly blending.
|
|
|
|
**Cause:** Fragment shader returns a constant color instead of passing through `input.vertex_color`. The [rasterizer](concepts/GLOSSARY.md#Rasterizer) interpolates vertex colors automatically, but only if the fragment shader uses them.
|
|
|
|
**Fix:** Ensure fragment shader returns the interpolated vertex color:
|
|
```wgsl
|
|
@fragment
|
|
fn fs_main(input: VertexOutput) -> @location(0) vec4<f32> {
|
|
return vec4<f32>(input.vertex_color, 1.0);
|
|
}
|
|
```
|
|
|
|
Not this (which returns a solid color):
|
|
```wgsl
|
|
return vec4<f32>(1.0, 1.0, 1.0, 1.0); // wrong: solid white
|
|
```
|
|
|
|
## Additional Resources
|
|
|
|
- [Glossary](concepts/GLOSSARY.md) — Every term defined
|
|
- [Graphics Pipeline](concepts/graphics-pipeline.md) — Pipeline stage overview
|
|
- [Coordinate Systems](concepts/coordinate-systems.md) — NDC and transformation spaces
|
|
- [Shader Basics](concepts/shader-basics.md) — WGSL and shader concepts
|
|
- [wgpu documentation](https://docs.rs/wgpu/29.0.0/) — Official wgpu 29 API docs
|
|
- [wgpu repository](https://github.com/gfx-rs/wgpu) — Examples and issue tracker
|