#bind-group #wgpu #memory #bve #buffer-belt

wgpu-conveyor

为wgpu提供缓冲带抽象,支持UMA优化、自动调整大小和绑定组缓存。

2个不稳定版本

0.2.0 2021年2月2日
0.1.0 2020年8月24日

#383渲染

MIT OR Apache-2.0 OR Zlib

30KB
521

wgpu-conveyor

GitHub Workflow Status Crates.io Documentation License

支持UMA优化、自动调整大小和绑定组缓存的wgpu缓冲带抽象。

示例

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

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

let device_type = adapter.get_info().device_type;

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

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

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

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

// Use buffer in bind group
let mut bind_group_cache = BindGroupCache::new();
let bind_group_key = bind_group_cache.create_bind_group(&buffer, true, |raw_buf| {
    device.create_bind_group(&BindGroupDescriptor {
        label: None,
        layout: &bind_group_layout,
        entries: &[BindGroupEntry {
            binding: 0,
            resource: raw_buf.inner.as_entire_binding()
        }]
    })
});

// Use bind group
renderpass.set_bind_group(0, bind_group_cache.get(&bind_group_key).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.47

许可证:MIT OR Apache-2.0 OR Zlib

依赖项

~3.5–9MB
~165K SLoC