我有一个带有以下推送常数块的几何着色器:
layout(push_constant) uniform Instance {
mat4 VP;
vec3 posCam;
float radius;
float curvature;
} u_instance;
推送常量在管道布局中定义如下:
uint32_t offset = 0;
uint32_t size = 21 *sizeof(float);
vk::PushConstantRange range {vk::ShaderStageFlagBits::eGeometry,offset,size};
但是,Vulkan验证层会引发以下错误:
Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_GEOMETRY_BIT
“无法访问”在这里是什么意思?为什么不能访问它们?如果我将推送常数移到另一个阶段(例如片段或顶点着色器),则不会发生任何错误。
此外,我仅在Nvidia GeForce GTX 650 Ti上遇到此错误。我也在AMD卡上尝试过,效果很好。
几何着色器的推送常数是否存在某种限制?我已经检查了Nvidia GPU的限制,最大推送常量的总大小为256个字节,并且支持几何着色器。我在Vulkan规范中也找不到任何内容。
最佳答案
您能否再添加一些代码(或将其上传到某处)?我刚刚在GTX 980上使用推送常量块对它进行了测试,并从源代码编译了验证层,但未收到任何验证警告。
此外,我仅在Nvidia GeForce GTX 650 Ti上遇到此错误。我也在AMD卡上尝试过,效果很好。
这很奇怪,因为验证消息不是由驱动程序生成的,因此实现之间不应有差异(除非这是与设备限制有关的验证)。
几何着色器的推送常数是否存在某种限制?我已经检查了Nvidia GPU的限制,最大推送常量的总大小为256个字节,并且支持几何着色器。我在Vulkan规范中也找不到任何内容。
没有特定于几何着色器的推动常数限制。如果超出推送常量大小限制,则验证层将引发错误。
我认为std430打包规则(或Vulkan规范的14.5.4。偏移和步幅分配)可能会使大小混乱。例如。 vec3将被布置为vec4(所以可能是22 * sizeof(float)?-对不起,我对此并不完全有信心)。
不知道在这里打包是否会成为问题,但是基本上这应该在没有验证层消息的情况下也可以工作。如果跨步是一个问题,那么从偏移量0开始,验证层仍然不会触发任何操作。