pub struct UnifiedBudgetManager {
cpu_usage: usize,
gpu_usage: usize,
cpu_budget: usize,
gpu_budget: usize,
combined_budget: usize,
frame_cpu_usage: usize,
frame_gpu_usage: usize,
}
impl UnifiedBudgetManager {
pub fn new() -> Self {
Self {
cpu_usage: 0,
gpu_usage: 0,
cpu_budget: 512 * 1024 * 1024, gpu_budget: 1024 * 1024 * 1024, combined_budget: 1536 * 1024 * 1024, frame_cpu_usage: 0,
frame_gpu_usage: 0,
}
}
pub fn with_limits(cpu_budget: usize, gpu_budget: usize) -> Self {
let combined_budget = cpu_budget + gpu_budget;
Self {
cpu_usage: 0,
gpu_usage: 0,
cpu_budget,
gpu_budget,
combined_budget,
frame_cpu_usage: 0,
frame_gpu_usage: 0,
}
}
pub fn check_cpu_budget(&self, size: usize) -> bool {
self.cpu_usage + size <= self.cpu_budget &&
self.cpu_usage + self.gpu_usage + size <= self.combined_budget
}
pub fn check_gpu_budget(&self, size: usize) -> bool {
self.gpu_usage + size <= self.gpu_budget &&
self.cpu_usage + self.gpu_usage + size <= self.combined_budget
}
pub fn check_combined_budget(&self, size: usize) -> bool {
self.cpu_usage + self.gpu_usage + size <= self.combined_budget
}
pub fn add_cpu_usage(&mut self, size: usize) {
self.cpu_usage += size;
self.frame_cpu_usage += size;
}
pub fn add_gpu_usage(&mut self, size: usize) {
self.gpu_usage += size;
self.frame_gpu_usage += size;
}
pub fn remove_cpu_usage(&mut self, size: usize) {
self.cpu_usage = self.cpu_usage.saturating_sub(size);
}
pub fn remove_gpu_usage(&mut self, size: usize) {
self.gpu_usage = self.gpu_usage.saturating_sub(size);
}
pub fn cpu_usage(&self) -> usize {
self.cpu_usage
}
pub fn gpu_usage(&self) -> usize {
self.gpu_usage
}
pub fn cpu_budget(&self) -> usize {
self.cpu_budget
}
pub fn gpu_budget(&self) -> usize {
self.gpu_budget
}
pub fn combined_budget(&self) -> usize {
self.combined_budget
}
pub fn cpu_utilization(&self) -> f32 {
self.cpu_usage as f32 / self.cpu_budget as f32
}
pub fn gpu_utilization(&self) -> f32 {
self.gpu_usage as f32 / self.gpu_budget as f32
}
pub fn combined_utilization(&self) -> f32 {
(self.cpu_usage + self.gpu_usage) as f32 / self.combined_budget as f32
}
pub fn reset_frame_usage(&mut self) {
self.frame_cpu_usage = 0;
self.frame_gpu_usage = 0;
}
pub fn frame_cpu_usage(&self) -> usize {
self.frame_cpu_usage
}
pub fn frame_gpu_usage(&self) -> usize {
self.frame_gpu_usage
}
}
impl Default for UnifiedBudgetManager {
fn default() -> Self {
Self::new()
}
}