use serde::{Deserialize, Serialize};
use crate::backend::RenderBackend;
#[derive(Debug, Clone, Copy)]
pub struct PerfDefaults {
pub fps_limit: u32,
pub msaa_samples: u8,
}
pub fn detect_backend(info: &wgpu::AdapterInfo) -> RenderBackend {
match info.device_type {
wgpu::DeviceType::DiscreteGpu => RenderBackend::VelloGpu,
wgpu::DeviceType::IntegratedGpu => RenderBackend::VelloGpu,
wgpu::DeviceType::VirtualGpu => RenderBackend::VelloCpu,
wgpu::DeviceType::Cpu => RenderBackend::TinySkia,
_ => RenderBackend::VelloGpu,
}
}
pub fn default_perf(backend: RenderBackend) -> PerfDefaults {
let (fps_limit, msaa_samples) = match backend {
RenderBackend::VelloGpu => (120u32, 8u8),
RenderBackend::VelloCpu => (30, 0),
RenderBackend::TinySkia => (90, 8),
RenderBackend::InstancedWgpu => (90, 8),
RenderBackend::VelloHybrid => (90, 8),
};
PerfDefaults { fps_limit, msaa_samples }
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RecommendedBackend {
VelloGpu,
VelloCpu,
TinySkia,
}
#[derive(Debug, Clone)]
pub struct GpuInfo {
pub name: String,
pub driver: String,
pub device_type: wgpu::DeviceType,
pub recommended: RecommendedBackend,
pub backend: RenderBackend,
}
pub fn detect(info: &wgpu::AdapterInfo) -> GpuInfo {
let backend = detect_backend(info);
let recommended = match info.device_type {
wgpu::DeviceType::DiscreteGpu => RecommendedBackend::VelloGpu,
wgpu::DeviceType::IntegratedGpu => RecommendedBackend::VelloGpu,
wgpu::DeviceType::VirtualGpu => RecommendedBackend::VelloCpu,
wgpu::DeviceType::Cpu => RecommendedBackend::TinySkia,
_ => RecommendedBackend::VelloGpu,
};
GpuInfo {
name: info.name.clone(),
driver: info.driver.clone(),
device_type: info.device_type,
recommended,
backend,
}
}