Push Constants
Command buffers may update a very small data cache which shaders may read during execution using push constants.
The Vulkan minimum is 128 bytes, but many devices expose a larger limit.
Check PhysicalDeviceLimits::max_push_constants_size
and keep the payload small.
API docs: ComputeCommandRef::push_constants,
GraphicCommandRef::push_constants,
RayTraceCommandRef::push_constants.
// render_mesh.glsl
#version 460 core
layout(push_constant) uniform PushConstants {
layout(offset = 0) uint mesh_index;
};
...
#![allow(unused)]
fn main() {
let info = ComputePipelineInfo::default();
let code = include_bytes!("render_mesh.spv");
let shader = Shader::new_compute(code.as_slice());
let pipeline = ComputePipeline::create(device, info, shader)?;
let mut graph = Graph::default();
let data = 42u32.to_ne_bytes();
graph
.begin_cmd()
.bind_pipeline(&pipeline)
.record_cmd(move |cmd| {
cmd
.push_constants(0, &data)
.dispatch(1, 1, 1);
});
}
Tip
A crate such as
bytemuckis helpful for converting Rust structures to bytes suitable for push constant usage. See the example code for more.