@@ -123,16 +123,24 @@ impl GpuContext { |
| 123 | 123 | window: u32, |
| 124 | 124 | width: u32, |
| 125 | 125 | height: u32, |
| 126 | + renderer: &crate::config::Renderer, |
| 126 | 127 | ) -> Result<Self, GpuError> { |
| 127 | 128 | // Open Xlib display for wgpu |
| 128 | 129 | let xlib_display = XlibDisplay::open()?; |
| 129 | 130 | let display = xlib_display.display_ptr(); |
| 130 | 131 | let screen = xlib_display.default_screen(); |
| 131 | 132 | |
| 132 | | - // Try Vulkan first (higher texture limits), fall back to GL |
| 133 | | - // GL has a 2048 texture limit on some systems which breaks full-screen windows |
| 133 | + use crate::config::Renderer; |
| 134 | + let (backends, force_fallback) = match renderer { |
| 135 | + Renderer::Vulkan => (wgpu::Backends::VULKAN, false), |
| 136 | + Renderer::Gl => (wgpu::Backends::GL, false), |
| 137 | + Renderer::Software => (wgpu::Backends::VULKAN | wgpu::Backends::GL, true), |
| 138 | + Renderer::Auto => (wgpu::Backends::VULKAN | wgpu::Backends::GL, false), |
| 139 | + }; |
| 140 | + tracing::info!("Renderer config: {:?} (backends: {:?}, fallback: {})", renderer, backends, force_fallback); |
| 141 | + |
| 134 | 142 | let instance = wgpu::Instance::new(&wgpu::InstanceDescriptor { |
| 135 | | - backends: wgpu::Backends::VULKAN | wgpu::Backends::GL, |
| 143 | + backends, |
| 136 | 144 | ..Default::default() |
| 137 | 145 | }); |
| 138 | 146 | |
@@ -144,7 +152,7 @@ impl GpuContext { |
| 144 | 152 | .request_adapter(&wgpu::RequestAdapterOptions { |
| 145 | 153 | power_preference: wgpu::PowerPreference::LowPower, |
| 146 | 154 | compatible_surface: Some(&surface), |
| 147 | | - force_fallback_adapter: false, |
| 155 | + force_fallback_adapter: force_fallback, |
| 148 | 156 | }) |
| 149 | 157 | .await |
| 150 | 158 | .ok_or(GpuError::NoAdapter)?; |