Glsl 几何体着色器中的推动常量限制?

Glsl 几何体着色器中的推动常量限制?,glsl,shader,geometry-shader,vulkan,Glsl,Shader,Geometry Shader,Vulkan,我有一个几何体着色器,具有以下推常量块: 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:

我有一个几何体着色器,具有以下推常量块:

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规范中也找不到任何东西。

我认为std430包装规则(或Vulkan规范的14.5.4偏移量和跨距分配)可能会弄乱尺寸。例如,vec3将被布置为vec4(因此可能
22*sizeof(float)
?-很抱歉,我自己对此不太自信)

如果您想调查自己(我发现生成该报告的行),层代码是打开的:

更新: 我不认为我在上面。1.0.17 SDK
glslagvalidator
提供给我的84字节(21*float;成员偏移量分别为0、64、76和80)。整个区块被填充到16倍于我(整个区块大小为96B)


此外,该消息与提供的stage enum关联(它将其与着色器模块的stage进行比较)。很奇怪,错误消息在不同的实现中会有所不同。。。(确保您已经更新了SDK和驱动程序,并且怀疑
vkcpp
包装器或发布的任何代码)并检查
pStages[n]。stage
所用
vkgraphicsipelinecreateinfo
的成员和PushRange stage值(该层比较)
是否可以添加更多代码(或者上传到某个地方)?我只是在GTX980上用你的push常量块测试了这个,验证层是从源代码编译的,没有得到任何验证警告

此外,我只在Nvidia GeForce GTX 650 Ti上遇到这个错误。我也在AMD卡上试过,效果很好

这很奇怪,因为验证消息不是由驱动程序生成的,因此在不同的实现之间不应该有所不同(除非是与设备限制相关的验证)

几何体着色器的推送常量是否有某种限制?我已经检查了Nvidia GPU的限制,最大推送常量大小为256字节,并且支持几何体着色器。我在Vulkan规范中也找不到任何限制

几何体着色器没有特定的推送常量限制。如果超过推送常量大小限制,验证层将抛出错误

我认为std430包装规则(或Vulkan规范的14.5.4偏移量和跨距分配)可能会弄乱尺寸。例如,vec3将被布置为vec4(因此可能是22*sizeof(float)?-对不起,我自己对此没有信心)

不确定这里的打包是否会有问题,但基本上,如果没有验证层消息,这应该可以工作。如果步幅会有问题,那么如果从偏移量0开始,验证层仍然不会触发任何事件