Push 常量
Push Constants
称为推送常量,Vulkan 规范是这么定义Push Constants
的:
提示
可通过 API 写入,用于在着色器中访问的一小组值。推送常量允许应用程序无需创建缓冲区或修改\绑定描述符集,而直接设置着色器中使用的值。
如何使用推送常量
着色器代码
从着色器的角度 来看,推送常量类似于 uniform 缓冲区。规范提供了 Vulkan 和 SPIR-V 之间的 push constant 接口信息。
一个简单的 GLSL 片段着色器示例:
layout(push_constant, std430) uniform pc {
vec4 data;
};
layout(location = 0) out vec4 outColor;
void main() {
outColor = data;
}
对应的 SPIR-V:
OpMemberDecorate %pc 0 Offset 0
OpDecorate %pc Block
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%pc = OpTypeStruct %v4float
%pc_ptr = OpTypePointer PushConstant %pc
%pc_var = OpVariable %pc_ptr PushConstant
%pc_v4float_ptr = OpTypePointer PushConstant %v4float
%access_chain = OpAccessChain %pc_v4float_ptr %pc_var %int_0
Vulkan 规范将它定义为一个带有Block
修饰的OpTypeStruct
类型。
管线布局
调用vkCreatePipelineLayout
时,需要在 VkPipelineLayoutCreateInfo 中设置推送常量范围。
以上一个着色器的为例:
VkPushConstantRange range = {};
range.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
range.offset = 0;
range.size = 16; // %v4float (vec4) is defined as 16 bytes
VkPipelineLayoutCreateInfo create_info = {};
create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
create_info.pNext = NULL;
create_info.flags = 0;
create_info.setLayoutCount = 0;
create_info.pushConstantRangeCount = 1;
create_info.pPushConstantRanges = ⦥
VkPipelineLayout pipeline_layout;
vkCreatePipelineLayout(device, &create_info, NULL, &pipeline_layout);