use crate::app::budget::{MemoryBudget, ThreadBudget};
use crate::app::mem_drift::MemoryDrift;
use crate::ecs::{ActiveRenderBackend, World};
use crate::gfx::backend::{GpuProfile, RenderBackend};
use crate::gfx::streaming_system::{StreamingPressure, StreamingState, StreamingStats};
pub fn renders(world: &World) -> bool {
world
.query::<crate::components::GraphicsConfig>()
.next()
.is_some()
|| world.systems().iter().any(|s| {
s.downcast_ref::<crate::gfx::graphics_system::GraphicsSystem>()
.is_some()
})
}
pub fn streaming_stats(world: &World) -> Option<StreamingStats> {
world
.resource::<StreamingState>()
.map(|s| s.streaming_stats())
}
pub fn streaming_pressure(world: &World) -> Option<StreamingPressure> {
world.resource::<StreamingPressure>().copied()
}
pub fn memory_drift(world: &World) -> Option<MemoryDrift> {
world.resource::<MemoryDrift>().copied()
}
pub fn gpu_profile(world: &World) -> Option<GpuProfile> {
world.resource::<GpuProfile>().copied()
}
pub fn thread_budget(world: &World) -> Option<ThreadBudget> {
world.resource::<ThreadBudget>().copied()
}
pub fn memory_budget(world: &World) -> Option<MemoryBudget> {
world.resource::<MemoryBudget>().copied()
}
pub fn take_render_backend(world: &mut World) -> Option<Box<dyn RenderBackend>> {
world
.resource_mut::<ActiveRenderBackend>()
.and_then(|slot| slot.0.take())
}
pub fn systems_and_render_backend(
world: &mut World,
) -> (
&mut [crate::ecs::BuiltSystem],
Option<&mut (dyn RenderBackend + 'static)>,
) {
let (systems, resources) = world.systems_and_resources();
let backend = resources
.get_mut::<ActiveRenderBackend>()
.and_then(|slot| slot.0.as_deref_mut());
(systems, backend)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn graphics_config_makes_world_render() {
let mut world = World::new();
assert!(!renders(&world));
world.add_component(crate::components::GraphicsConfig::default());
assert!(renders(&world));
}
#[test]
fn streaming_readouts_are_absent_before_graphics_init() {
let world = World::new();
assert!(streaming_stats(&world).is_none());
assert!(streaming_pressure(&world).is_none());
}
#[test]
fn render_backend_accessors_without_a_backend() {
let mut world = World::new();
assert!(take_render_backend(&mut world).is_none());
let (systems, backend) = systems_and_render_backend(&mut world);
assert!(systems.is_empty());
assert!(backend.is_none());
}
}