use super::BackendType;
#[cfg(feature = "parallel")]
use crate::render::ParallelRenderer;
#[derive(Clone, Debug)]
pub struct RenderPipeline {
#[cfg(feature = "parallel")]
pub(crate) parallel_renderer: ParallelRenderer,
pub(crate) pooled_renderer: Option<crate::render::PooledRenderer>,
pub(crate) enable_pooled_rendering: bool,
pub(crate) backend: Option<BackendType>,
pub(crate) auto_optimized: bool,
#[cfg(feature = "gpu")]
pub(crate) enable_gpu: bool,
}
impl Default for RenderPipeline {
fn default() -> Self {
Self::new()
}
}
impl RenderPipeline {
pub fn new() -> Self {
Self {
#[cfg(feature = "parallel")]
parallel_renderer: ParallelRenderer::new(),
pooled_renderer: None,
enable_pooled_rendering: false,
backend: None,
auto_optimized: false,
#[cfg(feature = "gpu")]
enable_gpu: false,
}
}
pub fn set_backend(&mut self, backend: BackendType) {
self.backend = Some(backend);
}
pub fn backend(&self) -> Option<BackendType> {
self.backend
}
pub fn set_pooled_rendering(&mut self, enabled: bool) {
self.enable_pooled_rendering = enabled;
}
pub fn pooled_rendering_enabled(&self) -> bool {
self.enable_pooled_rendering
}
pub fn set_auto_optimized(&mut self, optimized: bool) {
self.auto_optimized = optimized;
}
pub fn is_auto_optimized(&self) -> bool {
self.auto_optimized
}
#[cfg(feature = "gpu")]
pub fn set_gpu_enabled(&mut self, enabled: bool) {
self.enable_gpu = enabled;
}
#[cfg(feature = "gpu")]
pub fn gpu_enabled(&self) -> bool {
self.enable_gpu
}
#[cfg(feature = "parallel")]
pub fn parallel_renderer(&self) -> &ParallelRenderer {
&self.parallel_renderer
}
#[cfg(feature = "parallel")]
pub fn parallel_renderer_mut(&mut self) -> &mut ParallelRenderer {
&mut self.parallel_renderer
}
pub fn set_pooled_renderer(&mut self, renderer: Option<crate::render::PooledRenderer>) {
self.pooled_renderer = renderer;
}
pub fn pooled_renderer(&self) -> Option<&crate::render::PooledRenderer> {
self.pooled_renderer.as_ref()
}
pub fn pooled_renderer_mut(&mut self) -> Option<&mut crate::render::PooledRenderer> {
self.pooled_renderer.as_mut()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_render_pipeline() {
let pipeline = RenderPipeline::new();
assert!(pipeline.backend().is_none());
assert!(!pipeline.pooled_rendering_enabled());
assert!(!pipeline.is_auto_optimized());
}
#[test]
fn test_backend_selection() {
let mut pipeline = RenderPipeline::new();
pipeline.set_backend(BackendType::Skia);
assert_eq!(pipeline.backend(), Some(BackendType::Skia));
}
#[test]
fn test_pooled_rendering() {
let mut pipeline = RenderPipeline::new();
assert!(!pipeline.pooled_rendering_enabled());
pipeline.set_pooled_rendering(true);
assert!(pipeline.pooled_rendering_enabled());
pipeline.set_pooled_rendering(false);
assert!(!pipeline.pooled_rendering_enabled());
}
#[test]
fn test_auto_optimization() {
let mut pipeline = RenderPipeline::new();
assert!(!pipeline.is_auto_optimized());
pipeline.set_auto_optimized(true);
assert!(pipeline.is_auto_optimized());
}
}