1 个不稳定版本
使用旧Rust 2015
0.0.0 | 2018年1月26日 |
---|
#26 in #gfx-hal
6KB
注意
本项目已停止开发,推荐使用 rendy.
gfx-memory - 为gfx-hal提供图形内存管理。
此crate提供管理由 gfx-hal
提供的GPU内存的工具。
主要工具是 MemoryAllocator
trait,它可以用来分配内存的 Block
。最显著的 MemoryAllocator
实现是 SmartAllocator
,它可以直接使用。本crate中的所有其他分配器都在 SmartAllocator
中内部使用,但也对外暴露,供希望创建自定义实现且 SmartAllocator
满足不了其需求的用户使用。
还提供了一个 Factory
,它封装了本crate中的分配逻辑,包括在 Device
(如 Buffer
或 Image
)上创建内存资源。对于大多数用例,Factory
提供了管理基于内存资源在 gfx_hal::Device
上的所有所需功能。
示例
使用 SmartAllocator
创建顶点 Buffer
的简单示例
extern crate gfx_hal;
extern crate gfx_memory;
use std::error::Error;
use gfx_hal::{Backend, Device};
use gfx_hal::buffer::Usage;
use gfx_hal::memory::Properties;
use gfx_memory::{MemoryAllocator, SmartAllocator, Type, Block};
type SmartBlock<B> = <SmartAllocator<B> as MemoryAllocator<B>>::Block;
fn make_vertex_buffer<B: Backend>(
device: &B::Device,
allocator: &mut SmartAllocator<B>,
size: u64,
) -> Result<(SmartBlock<B>, B::Buffer), Box<Error>> {
// Create unbounded buffer object. It has no memory assigned.
let mut buf = unsafe { device.create_buffer(size, Usage::VERTEX).map_err(Box::new)? };
// Get memory requirements for the buffer.
let reqs = unsafe { device.get_buffer_requirements(&buf) };
// Allocate block of device-local memory that satisfy requirements for buffer.
let block = unsafe {
allocator
.alloc(device, (Type::General, Properties::DEVICE_LOCAL), reqs)
.map_err(Box::new)?
};
// Bind memory block to the buffer.
Ok(unsafe { device
.bind_buffer_memory(block.memory(), block.range().start, &mut buf)
.map(|buffer| (block, buffer))
.map_err(Box::new)? })
}
此crate是中级别的,它要求用户遵循一些简单的规则
- 当要释放内存块时,必须将其返回到分配它们的分配器。
- 必须使用相同的
Device
实例来分配和释放块。
违反这些规则可能会导致未定义的行为。
许可证
根据您的选择,许可如下
- Apache许可证第2版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
贡献
我们是一个欢迎任何人贡献的社区项目。如果您有兴趣帮忙,您可以通过GitHub或通过 gitter
与我们联系。
除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在工作中的任何贡献,都将双重许可,如上所述,不附加任何额外条款或条件。