首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SPIR-V着色器在运行时导致验证错误

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

Stack Overflow用户
提问于 2017-11-17 20:54:18
回答 2查看 1.8K关注 0票数 3

我有一个电脑着色器:

代码语言:javascript
复制
#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

当我执行下列任何一项操作时,验证错误就会消失:

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-18 11:37:33

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

另外,您可以静态加载着色器(通过#include)作为一个C++内联文件。您可以通过glslc -mfmt=cglslangValidator -V -x --vn variable_name创建这样的文件。

票数 1
EN

Stack Overflow用户

发布于 2019-12-19 10:17:52

假设您的GLSL->Spir编译器没有抛出错误,请确保符合以下清单:

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

SPIR-V是一种中间语言,可能会抛出不正确的指令计数,因为验证层需要SPIR-V规范指定的许多类似程序集的指令(您还没有从文件中完全加载这些指令)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47359106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档