Seregon/StratoSDK

StratoSDK is a framework with a declarative approach similar to Flutter/React, written and designed entirely for Rust.

Rust/27.3 KB/No license
crates/strato-ui-renderer/src/platform/mac/rendering/wgpu/renderer_manager.rs
StratoSDK / crates / strato-ui-renderer / src / platform / mac / rendering / wgpu / renderer_manager.rs
1use crate::rendering::wgpu::{Renderer, Resources};
2use crate::rendering::GlyphConfig;
3use pathfinder_geometry::vector::Vector2F;
4use std::collections::HashMap;
5use std::hash::{DefaultHasher, Hash, Hasher};
6use wgpu::Device;
7 
8pub struct RendererManager {
9 renderers: HashMap<DeviceID, Renderer>,
10}
11 
12#[derive(Copy, Clone, Hash, Eq, PartialEq)]
13struct DeviceID(u64);
14 
15impl From<&Device> for DeviceID {
16 fn from(value: &Device) -> Self {
17 let mut s = DefaultHasher::new();
18 value.hash(&mut s);
19 DeviceID(s.finish())
20 }
21}
22 
23impl RendererManager {
24 pub fn new() -> Self {
25 Self {
26 renderers: Default::default(),
27 }
28 }
29 
30 /// Returns a [`Renderer`] identified by the device contained in [`Resources`].
31 pub fn renderer_for_resources(
32 &mut self,
33 resources: &Resources,
34 _window_size: Vector2F,
35 ) -> &mut Renderer {
36 use std::collections::hash_map::Entry::*;
37 match self.renderers.entry((&resources.device).into()) {
38 Occupied(entry) => entry.into_mut(),
39 Vacant(entry) => entry.insert(Renderer::new(resources, GlyphConfig::default())),
40 }
41 }
42}
43