3

我有一个计算着色器:

#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;
}

我使用glslangValidatorLunarG SDK 1.0.65.0 编译它并使用它检查它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

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

4

2 回答 2

1

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

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

于 2017-11-18T11:37:33.750 回答
0

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

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

SPIR-V 是一种中间语言,可能会抛出不正确的指令计数,因为验证层需要一些由 SPIR-V 规范指定的类似汇编的指令(您尚未从文件中完全加载这些指令)。

于 2019-12-19T10:17:52.267 回答