SPIR-V着色器在运行时导致验证错误

时间:2017-11-17 20:54:19

标签: vulkan 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进行了检查,但没有返回任何内容。我在创建shaderInt64时启用了VkDevice。使用vkCreateShaderModule加载此着色器时,我收到此验证错误:

SPIR-V module not valid: Invalid instruction word count: 0

当我执行以下任何操作时,验证错误消失:

  • 删除64位扩展名并将所有类型更改为int
  • 删除FooBar个缓冲区
  • 删除main
  • 中的任何变量
  • 删除layout(local_size_x_id = 0) in

我的问题是,这是编译器或验证层中的错误,还是我错误地使用了其中一个功能?

2 个答案:

答案 0 :(得分:0)

如果您在运行时从文件加载SPIR-V,则必须以二进制模式打开文件(例如,在C ++中为std::ifstream::binary)。否则,您的二进制文件可能会在加载时被更改(即通常运行时尝试根据其运行的平台切换换行符)。

或者,您可以静态加载着色器(通过#include)作为C ++内联文件。您可以按glslc -mfmt=cglslangValidator -V -x --vn variable_name创建此类文件。

答案 1 :(得分:0)

假设您的GLSL-> Spir-V编译器未抛出任何错误,请确保满足以下清单:

  1. 您正在以二进制模式打开文件
  2. 您正在从文件中读取正确的字节数

SPIR-V是一种中间语言,并且可能会抛出错误的指令数,因为验证层期望SPIR-V规范指定了许多类似汇编的指令(您尚未从文件中完全加载该指令)