我有一个计算着色器:
#version 450
#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_gpu_shader_int64 : enable
layout(local_size_x_id = 0) in;
layout(set = 0, binding = 0) buffer Foo {
u64vec2[256] scratchpad;
} foo;
layout(set = 0, binding = 1) uniform Bar {
u64vec2 a;
u64vec2 b;
} bar;
void main() {
int foobar = 0;
int baz = 0;
}
我使用来自LunarG SDK 1.0.65.0的glslangValidator
进行了编译,并使用spirv-val
进行了检查,但没有返回任何内容。我在创建shaderInt64
时启用了VkDevice
。使用vkCreateShaderModule
加载此着色器时,我收到此验证错误:
SPIR-V module not valid: Invalid instruction word count: 0
当我执行以下任何操作时,验证错误消失:
int
Foo
或Bar
个缓冲区main
layout(local_size_x_id = 0) in
我的问题是,这是编译器或验证层中的错误,还是我错误地使用了其中一个功能?
答案 0 :(得分:0)
如果您在运行时从文件加载SPIR-V,则必须以二进制模式打开文件(例如,在C ++中为std::ifstream::binary
)。否则,您的二进制文件可能会在加载时被更改(即通常运行时尝试根据其运行的平台切换换行符)。
或者,您可以静态加载着色器(通过#include
)作为C ++内联文件。您可以按glslc -mfmt=c
或glslangValidator -V -x --vn variable_name
创建此类文件。
答案 1 :(得分:0)
假设您的GLSL-> Spir-V编译器未抛出任何错误,请确保满足以下清单:
SPIR-V是一种中间语言,并且可能会抛出错误的指令数,因为验证层期望SPIR-V规范指定了许多类似汇编的指令(您尚未从文件中完全加载该指令)