wgpu-conveyor

GitHub Workflow Status Crates.io Documentation License

Buffer belt abstraction for wgpu supporting UMA optimization, automatic resizing, and a bind group cache.

Example

```rust use wgpu_conveyor::{AutomatedBuffer, AutomatedBufferManager, UploadStyle, BindGroupCache}; use wgpu::*;

// Create wgpu instance, adapter, device, queue, and bindgrouplayout.

let devicetype = adapter.getinfo().device_type;

// Create a single buffer manager. let mut manager = AutomatedBufferManager::new(UploadStyle::fromdevicetype(&device_type));

// Create a buffer from that manager let mut buffer = manager.createnewbuffer(&device, 128, BufferUsage::UNIFORM, Some("label"));

///////////////////////////////////// // -- Below happens every frame -- // /////////////////////////////////////

// Write to that buffer let mut commandencoder = device.createcommandencoder(&CommandEncoderDescriptor::default()); buffer.writetobuffer( &device, &mut commandencoder, 128, |buffer: &mut [u8]| { for (idx, byte) in buffer.iter_mut().enumerate() { *byte = idx as u8; } } );

// Use buffer in bind group let mut bindgroupcache = BindGroupCache::new(); let bindgroupkey = bindgroupcache.createbindgroup(&buffer, true, |rawbuf| { device.createbindgroup(&BindGroupDescriptor { label: None, layout: &bindgrouplayout, entries: &[BindGroupEntry { binding: 0, resource: BindingResource::Buffer(rawbuf.inner.slice(..)) }] }) });

// Use bind group renderpass.setbindgroup(0, bindgroupcache.get(&bindgroupkey).unwrap(), &[]);

// Submit copies queue.submit(Some(command_encoder.finish()));

// Pump buffers let futures = manager.pump();

// Run futures async for fut in futures { spawn(fut); }

// Loop back to beginning of frame ```

MSRV

Rust 1.41

License: MIT OR Apache-2.0 OR Zlib