1 个不稳定版本
0.1.0 | 2019 年 2 月 24 日 |
---|
#892 在 图形 API 中
在 2 个 crate 中使用 (通过 nobs-vulkanism-headless)
1MB
16K SLoC
nobs-vkpipes
从 glsl 编译着色器,并从 spv 生成 Rust 代码。
特性
- 计算和图形管道生成的构建器模式
- 描述符集定义,便于访问描述符写入和更新
- 代码生成宏,将管道和描述符定义与 spv 着色器代码编译成一个 Rust 模块。允许一行代码创建管道和描述符集分配。
文档
在 docs.rs 上找到该库的完整文档。
设置
遵循 shaderc-rs 的设置说明。
在此之后,您就可以使用 nobs-vkpipes 了!
贡献
欢迎贡献力量!
lib.rs
:
nobs-vkpipes
从 glsl 编译着色器,并从 spv 生成 Rust 代码。
该 crate 为 Vulkan 管道创建和描述符集更新提供了构建器模式实现。
示例
这是一个设置计算管道的简单示例。
所有魔法都在 vk::pipes::pipeline!
宏中发生!我们使用几个逗号分隔的字段定义管道,路径始终相对于编译 crate 的 cargo.toml 指定。
请参阅重导出的宏 pipeline 和 shader 的可配置选项列表。
extern crate nobs_vulkanism as vk;
// IMPORTANT import these two crates with their original name
// (e.g. not extern crate nobs_vk as vk)
// Otherwise the code generation will genertate code
// that does not find symbols defined there
// You can still use this...
// declare the module that will contain our pipeline
mod make_sequence {
vk::pipes::pipeline!{
dset_name[0] = "Dset",
stage = {
ty = "comp",
glsl = "
#version 450
#extension GL_ARB_separate_shader_objects : enable
const uint GROUP_SIZE = 512;
layout(binding = 0) uniform ub {
uint num_elems;
uint i_first;
uint i_step;
};
layout(binding = 1) buffer b_out {
uint bout[];
};
layout(local_size_x = GROUP_SIZE) in;
void main() {
// copy input values for group in shared memory
uint gid = gl_GlobalInvocationID.x;
if (gid < num_elems) {
bout[gid] = i_first + gid * i_step;
}
}
",
}
}
// The code generation will not create types for e.g. the uniform buffer
// If we want this, we need to do it our selves
pub struct ub {
pub num_elems: u32,
pub i_first: u32,
pub i_step: u32,
}
}
// create an instance of the pipeline
// uses the nobs_vk::DeviceExtensions to build the pipeline
let p = make_sequence::build(device.handle).new().unwrap();
// update the descriptor set
make_sequence::dset::write(device.handle, ds)
.ub(|b| b.buffer(buf_ub))
.b_out(|b| b.buffer(buf_out))
.update();
依赖关系
~105–385KB