What is a “Push-Constant” in vulkan?

Push constants is a way to quickly provide a small amount of uniform data to shaders. It should be much quicker than UBOs but a huge limitation is the size of data – spec requires 128 bytes to be available for a push constant range. Hardware vendors may support more, but compared to other means it is still very little (for example 256 bytes).

Because push constants are much quicker than other descriptors (resources through which we provide data to shaders), they are convenient to use for data that changes between draw calls, like for example transformation matrices.

From the shader perspective, they are declared through layout( push_constant ) qualifier and a block of uniform data. For example:

layout( push_constant ) uniform ColorBlock {
  vec4 Color;
} PushConstant;

From the application perspective, if shaders want to use push constants, they must be specified during pipeline layout creation. Then the vkCmdPushConstants() command must be recorded into a command buffer. This function takes, among others, a pointer to a memory from which data to a push constant range should be copied.

Different shader stages of a given pipeline can use the same push constant block (similarly to UBOs) or smaller parts of the whole range. But, what is important, each shader stage can use only one push constant block. It can contain multiple members, though. Another important thing is that the total data size (across all shader stages which use push constants) must fit into the size constraint. So the constraint is not per stage but per whole range.

There is an example in the Vulkan Cookbook’s repository showing a simple push constant usage scenario. Sascha Willems’s Vulkan examples also contain a sample showing how to use push constants.

Leave a Comment