pub struct ResourceArena<T> { /* private fields */ }Expand description
Bounded resource ownership. GPU users must remove only after last submission completes. This arena does not infer GPU completion or provide a submission timeline.
Implementations§
Source§impl<T> ResourceArena<T>
impl<T> ResourceArena<T>
Sourcepub fn new(limits: RenderLimits) -> Result<Self, RenderError>
pub fn new(limits: RenderLimits) -> Result<Self, RenderError>
Create a validated empty arena without preallocating payload storage.
Examples found in repository?
More examples
examples/scene_admission.rs (line 44)
43fn main() -> Result<()> {
44 let mut assets = ResourceArena::new(RenderLimits::default())?;
45 let binding = RenderBinding {
46 mesh: assets.insert((), 1)?,
47 material: assets.insert((), 1)?,
48 tint: [1.; 4],
49 animation: 0,
50 morph: 0,
51 };
52 eprintln!("CPU admission only; target={}/{}; 1 warmup + 5 samples per size; release build required; allocation/drop excluded; reuse=despawn all + spawn all", std::env::consts::OS, std::env::consts::ARCH);
53 println!("entities,initial_median_ns,initial_min_ns,initial_max_ns,reuse_median_ns,reuse_min_ns,reuse_max_ns,reservation_bytes");
54 for count in [1024, 8192, 32768] {
55 black_box(sample(count, binding)?);
56 let mut initial = [0; 5];
57 let mut reuse = [0; 5];
58 let mut bytes = 0;
59 for i in 0..5 {
60 let result = sample(count, binding)?;
61 (initial[i], reuse[i], bytes) = result;
62 }
63 initial.sort_unstable();
64 reuse.sort_unstable();
65 println!(
66 "{count},{},{},{},{},{},{},{bytes}",
67 initial[2], initial[0], initial[4], reuse[2], reuse[0], reuse[4]
68 );
69 }
70 Ok(())
71}examples/scene.rs (line 17)
15fn main() -> Result<(), Box<dyn std::error::Error>> {
16 // Opaque asset identities only; this example qualifies CPU scene ownership, not drawing.
17 let mut assets = ResourceArena::new(RenderLimits::default())?;
18 let binding = RenderBinding {
19 mesh: assets.insert((), 1)?,
20 material: assets.insert((), 1)?,
21 tint: [1.0; 4],
22 animation: 0,
23 morph: 0,
24 };
25 let mut world = SceneWorld::new(SceneLimits {
26 max_entities: 64,
27 max_snapshot_instances: 64,
28 ..Default::default()
29 })?;
30 let mut first = None;
31 for i in 0..64 {
32 let id = world.spawn(
33 Transform::default().with_position([i as f32, 0.0, 0.0])?,
34 binding,
35 Some(Velocity::new([1.0, 0.0, 0.0])?),
36 )?;
37 first = first.or(Some(id));
38 }
39 let before = world.snapshot()?;
40 world.step_velocity(0.016)?;
41 let after = world.snapshot()?;
42 assert_eq!(before.instances()[0].transform.position()[0], 0.0);
43 assert_eq!(after.instances()[0].transform.position()[0], 0.016);
44 let mut commands = SceneCommands::new(8)?;
45 if let Some(first) = first {
46 commands.push(SceneCommand::SetVelocity(first, None))?;
47 }
48 for outcome in commands.apply(&mut world)? {
49 outcome?;
50 }
51 println!(
52 "entities={} owned_snapshots=2 moving_rows={}",
53 world.len(),
54 world.moving_columns().entities.len()
55 );
56 Ok(())
57}Sourcepub fn insert(
&mut self,
value: T,
bytes: u64,
) -> Result<ResourceId, RenderError>
pub fn insert( &mut self, value: T, bytes: u64, ) -> Result<ResourceId, RenderError>
Admit a resource with its accounted bytes; rejects before arena mutation.
Examples found in repository?
More examples
examples/scene_admission.rs (line 46)
43fn main() -> Result<()> {
44 let mut assets = ResourceArena::new(RenderLimits::default())?;
45 let binding = RenderBinding {
46 mesh: assets.insert((), 1)?,
47 material: assets.insert((), 1)?,
48 tint: [1.; 4],
49 animation: 0,
50 morph: 0,
51 };
52 eprintln!("CPU admission only; target={}/{}; 1 warmup + 5 samples per size; release build required; allocation/drop excluded; reuse=despawn all + spawn all", std::env::consts::OS, std::env::consts::ARCH);
53 println!("entities,initial_median_ns,initial_min_ns,initial_max_ns,reuse_median_ns,reuse_min_ns,reuse_max_ns,reservation_bytes");
54 for count in [1024, 8192, 32768] {
55 black_box(sample(count, binding)?);
56 let mut initial = [0; 5];
57 let mut reuse = [0; 5];
58 let mut bytes = 0;
59 for i in 0..5 {
60 let result = sample(count, binding)?;
61 (initial[i], reuse[i], bytes) = result;
62 }
63 initial.sort_unstable();
64 reuse.sort_unstable();
65 println!(
66 "{count},{},{},{},{},{},{},{bytes}",
67 initial[2], initial[0], initial[4], reuse[2], reuse[0], reuse[4]
68 );
69 }
70 Ok(())
71}examples/scene.rs (line 19)
15fn main() -> Result<(), Box<dyn std::error::Error>> {
16 // Opaque asset identities only; this example qualifies CPU scene ownership, not drawing.
17 let mut assets = ResourceArena::new(RenderLimits::default())?;
18 let binding = RenderBinding {
19 mesh: assets.insert((), 1)?,
20 material: assets.insert((), 1)?,
21 tint: [1.0; 4],
22 animation: 0,
23 morph: 0,
24 };
25 let mut world = SceneWorld::new(SceneLimits {
26 max_entities: 64,
27 max_snapshot_instances: 64,
28 ..Default::default()
29 })?;
30 let mut first = None;
31 for i in 0..64 {
32 let id = world.spawn(
33 Transform::default().with_position([i as f32, 0.0, 0.0])?,
34 binding,
35 Some(Velocity::new([1.0, 0.0, 0.0])?),
36 )?;
37 first = first.or(Some(id));
38 }
39 let before = world.snapshot()?;
40 world.step_velocity(0.016)?;
41 let after = world.snapshot()?;
42 assert_eq!(before.instances()[0].transform.position()[0], 0.0);
43 assert_eq!(after.instances()[0].transform.position()[0], 0.016);
44 let mut commands = SceneCommands::new(8)?;
45 if let Some(first) = first {
46 commands.push(SceneCommand::SetVelocity(first, None))?;
47 }
48 for outcome in commands.apply(&mut world)? {
49 outcome?;
50 }
51 println!(
52 "entities={} owned_snapshots=2 moving_rows={}",
53 world.len(),
54 world.moving_columns().entities.len()
55 );
56 Ok(())
57}Sourcepub fn get(&self, id: ResourceId) -> Result<&T, RenderError>
pub fn get(&self, id: ResourceId) -> Result<&T, RenderError>
Resolve only a live handle from this arena.
Sourcepub fn remove(&mut self, id: ResourceId) -> Result<T, RenderError>
pub fn remove(&mut self, id: ResourceId) -> Result<T, RenderError>
Remove a resource. Caller must first prove GPU completion for GPU-owned values.
Sourcepub fn managed_bytes(&self) -> u64
pub fn managed_bytes(&self) -> u64
Current accounted live bytes; not total driver allocation.
Auto Trait Implementations§
impl<T> Freeze for ResourceArena<T>
impl<T> RefUnwindSafe for ResourceArena<T>where
Vec<Slot<T>>: RefUnwindSafe,
impl<T> Send for ResourceArena<T>
impl<T> Sync for ResourceArena<T>
impl<T> Unpin for ResourceArena<T>
impl<T> UnsafeUnpin for ResourceArena<T>where
Vec<Slot<T>>: UnsafeUnpin,
impl<T> UnwindSafe for ResourceArena<T>where
Vec<Slot<T>>: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more