[][src]Crate nobs_vkpipes

nobs-vkpipes

Compiles shaders from glsl and generates rust code from spv.

This crate provides builder pattern implementations for vulkan pipeline creation and descriptor set updating.

Example

This is a simple example that sets up a compute pipeline.

All the magic happens in vk::pipes::pipeline! macro! We define the pipeline with several comma separated fields, paths are always specified relative to the compilied crate's cargo.toml:

See the reexported macros pipeline and shader for a list of configurable options.

This example deliberately fails to compile
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();

Re-exports

pub use nobs_vkpipes_macro::pipeline;
pub use nobs_vkpipes_macro::shader;
pub use pipeline::builder::compute::Compute as ComputeBuilder;
pub use pipeline::builder::graphics::blend::AttachmentBuilder as BlendAttachment;
pub use pipeline::builder::graphics::blend::Builder as Blend;
pub use pipeline::builder::graphics::depth_stencil::Builder as DepthStencil;
pub use pipeline::builder::graphics::dynamic::Builder as Dynamic;
pub use pipeline::builder::graphics::input_assembly::Builder as InputAssembly;
pub use pipeline::builder::graphics::multisample::Builder as Multisample;
pub use pipeline::builder::graphics::raster::Builder as Raster;
pub use pipeline::builder::graphics::tesselation::Builder as Tesselation;
pub use pipeline::builder::graphics::vertex_input::Builder as VertexInput;
pub use pipeline::builder::graphics::viewport::Builder as Viewport;
pub use pipeline::builder::graphics::Graphics as GraphicsBuilder;
pub use descriptor::pool::Pool as DescriptorPool;

Modules

build

For usage in build.rs to automatically detect changes in glsl/spv files and force the recompilation of the rust source that references the shader.

descriptor
pipeline