#descriptor-set #vulkan #graphics #graphics-pipeline #gpu #ffi #rendering

nobs-vkpipes

作为 nobs-vk 的扩展,提供着色器编译、Vulkan 管道组合和描述符集更新功能

1 个不稳定版本

0.1.0 2019 年 2 月 24 日

#892图形 API


2 个 crate 中使用 (通过 nobs-vulkanism-headless)

MIT 许可证

1MB
16K SLoC

nobs-vkpipes

从 glsl 编译着色器,并从 spv 生成 Rust 代码。

特性

  1. 计算和图形管道生成的构建器模式
  2. 描述符集定义,便于访问描述符写入和更新
  3. 代码生成宏,将管道和描述符定义与 spv 着色器代码编译成一个 Rust 模块。允许一行代码创建管道和描述符集分配。

文档

docs.rs 上找到该库的完整文档。

设置

遵循 shaderc-rs 的设置说明。

在此之后,您就可以使用 nobs-vkpipes 了!

贡献

欢迎贡献力量!


lib.rs:

nobs-vkpipes

从 glsl 编译着色器,并从 spv 生成 Rust 代码。

该 crate 为 Vulkan 管道创建和描述符集更新提供了构建器模式实现。

示例

这是一个设置计算管道的简单示例。

所有魔法都在 vk::pipes::pipeline! 宏中发生!我们使用几个逗号分隔的字段定义管道,路径始终相对于编译 crate 的 cargo.toml 指定。

请参阅重导出的宏 pipelineshader 的可配置选项列表。

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