1 个不稳定版本

使用旧Rust 2015

0.0.0 2018年1月26日

#26 in #gfx-hal

MIT/Apache

6KB

注意

本项目已停止开发,推荐使用 rendy.

gfx-memory - 为gfx-hal提供图形内存管理。

Build Status Docs Crates.io

此crate提供管理由 gfx-hal 提供的GPU内存的工具。

主要工具是 MemoryAllocator trait,它可以用来分配内存的 Block。最显著的 MemoryAllocator 实现是 SmartAllocator,它可以直接使用。本crate中的所有其他分配器都在 SmartAllocator 中内部使用,但也对外暴露,供希望创建自定义实现且 SmartAllocator 满足不了其需求的用户使用。

还提供了一个 Factory,它封装了本crate中的分配逻辑,包括在 Device(如 BufferImage)上创建内存资源。对于大多数用例,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 实例来分配和释放块。

违反这些规则可能会导致未定义的行为。

许可证

根据您的选择,许可如下

贡献

我们是一个欢迎任何人贡献的社区项目。如果您有兴趣帮忙,您可以通过GitHub或通过 gitter 与我们联系。

除非您明确声明,否则根据Apache-2.0许可证定义的您有意提交以包含在工作中的任何贡献,都将双重许可,如上所述,不附加任何额外条款或条件。

无运行时依赖