我有一个电脑着色器:
#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;
}我用glslangValidator从LunarG SDK1.0.65.0编译了它,并使用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我的问题是,这是编译器或验证层中的一个bug,还是我错误地使用了这些特性之一?
发布于 2017-11-18 11:37:33
如果您在运行时从文件中加载SPIR-V,则必须以二进制模式打开该文件(例如,std::ifstream::binary中的C++)。否则,您的二进制文件在加载时可能会发生更改(例如,运行时通常尝试根据运行的平台切换换行符)。
另外,您可以静态加载着色器(通过#include)作为一个C++内联文件。您可以通过glslc -mfmt=c或glslangValidator -V -x --vn variable_name创建这样的文件。
发布于 2019-12-19 10:17:52
假设您的GLSL->Spir编译器没有抛出错误,请确保符合以下清单:
SPIR-V是一种中间语言,可能会抛出不正确的指令计数,因为验证层需要SPIR-V规范指定的许多类似程序集的指令(您还没有从文件中完全加载这些指令)。
https://stackoverflow.com/questions/47359106
复制相似问题