SPIR-V 着色器在运行时导致验证错误
SPIR-V shader causing validation errors at runtime
我有一个计算着色器:
#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
检查了它,但没有返回任何结果。我在创建 VkDevice
时启用了 shaderInt64
。使用 vkCreateShaderModule
加载此着色器时出现此验证错误:
SPIR-V module not valid: Invalid instruction word count: 0
当我执行以下任一操作时,验证错误消失:
- 删除 64 位扩展并将所有类型更改为
int
- 删除
Foo
或 Bar
缓冲区
- 删除
main
中的任一变量
- 删除
layout(local_size_x_id = 0) in
我的问题是,这是编译器或验证层中的错误,还是我错误地使用了这些功能之一?
如果您在运行时从文件加载 SPIR-V,则必须以二进制模式打开文件(例如 C++ 中的 std::ifstream::binary
)。否则您的二进制文件在加载时可能会发生变化(即通常运行时会尝试根据其运行的平台切换换行符)。
或者,您可以将着色器静态加载(通过 #include
)作为 C++ 内联文件。您可以通过 glslc -mfmt=c
或 glslangValidator -V -x --vn variable_name
.
创建此类文件
假设您的 GLSL->Spir-V 编译器没有抛出任何错误,请确保满足此清单:
- 您正在以二进制模式打开文件
- 您正在从文件中读取正确的字节数
SPIR-V 是一种中间语言,可能会抛出不正确的指令计数,因为验证层需要一些 SPIR-V 规范指定的类似汇编的指令(您尚未从文件)。
我有一个计算着色器:
#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
检查了它,但没有返回任何结果。我在创建 VkDevice
时启用了 shaderInt64
。使用 vkCreateShaderModule
加载此着色器时出现此验证错误:
SPIR-V module not valid: Invalid instruction word count: 0
当我执行以下任一操作时,验证错误消失:
- 删除 64 位扩展并将所有类型更改为
int
- 删除
Foo
或Bar
缓冲区 - 删除
main
中的任一变量
- 删除
layout(local_size_x_id = 0) in
我的问题是,这是编译器或验证层中的错误,还是我错误地使用了这些功能之一?
如果您在运行时从文件加载 SPIR-V,则必须以二进制模式打开文件(例如 C++ 中的 std::ifstream::binary
)。否则您的二进制文件在加载时可能会发生变化(即通常运行时会尝试根据其运行的平台切换换行符)。
或者,您可以将着色器静态加载(通过 #include
)作为 C++ 内联文件。您可以通过 glslc -mfmt=c
或 glslangValidator -V -x --vn variable_name
.
假设您的 GLSL->Spir-V 编译器没有抛出任何错误,请确保满足此清单:
- 您正在以二进制模式打开文件
- 您正在从文件中读取正确的字节数
SPIR-V 是一种中间语言,可能会抛出不正确的指令计数,因为验证层需要一些 SPIR-V 规范指定的类似汇编的指令(您尚未从文件)。