问题标签 [spir-v]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
hlsl - 升级到 LunarG SDK 1.0.68.0 后 InterlockedMax 出现 SPIR-V 错误
我的计算着色器(用 HLSL 编写)编译并使用早期的 SDK 1.0.65.0。我更新到 1.0.68.0 并重新编译它,现在调用时出现此错误vkCreateShaderModule
:
Vulkan 错误:[SC],代码:5:SPIR-V 模块无效:AtomicSMax:预期结果类型为 int 标量类型
我验证了错误来自我的着色器中的这个函数:
我用这个命令编译着色器:
如果我不使用这些Interlocked*
方法,错误就会消失。我也尝试使用int
s 而不是uint
s 但问题仍然存在。我做错了什么或者这可能是一个代码生成错误?
glsl - 查询 SPIR-V 着色器中是否存在 GLSL 扩展
在常规 GLSL 中,我可以执行以下操作来有条件地启用 GLSL 扩展:
我的问题是,如何使用 glslang 库在 SPIR-V 中实现相同的目标?我假设我需要编译同一个着色器的多个版本来实现这一点?或者有没有办法在不为两个版本生成两个二进制文件的情况下,以扩展的存在为条件对 SPIR-V 进行条件化?
struct - 尝试使用统一结构作为函数参数时出现 SPIR-V 编译器错误
上面的 GLSL 代码会导致以下 SPIR-V 编译器错误:
该错误来自main中的get_value函数调用。每当我尝试将结构实例作为函数参数传递时,如果该实例是统一的一部分(在本例中为 u_test),就会发生错误。如果该结构不是制服的一部分,则可以正常编译。
为什么这是一个问题,我能做些什么来解决它?
floating-point - 如何使用 Vulkan 在现代 GLSL 中获得 16 位浮点数?
似乎在某个时间点,Nvidia 有一个扩展允许OpenGL 1.1的半浮点值,但显然从那时起*世界一半已在某个时候被现代 GLSL 规范回收。
今天我可以在 CUDA 中使用 16 位浮点值没问题,NVIDIA 支持 16 位浮点数的硬件应该没有问题,而且它们似乎在 HLSL 中支持它们,甚至在 HLSL 交叉编译中支持它们似乎是矛盾的SPIR-V 而 GLSL 不适用于 Nvidia。似乎 SPIR-V 具有支持 16 位浮点所需的所有原语,无论使用主扩展(KHR),因此似乎没有理由禁止我使用它们。
我不确定为什么,尽管有 Nvidia 卡,但我不能利用 16 位浮点运算,而且如果我想利用它,显然被迫使用 AMD或完全切换 API。肯定有某种方法可以为两者实际使用真正的 16 位浮点值吗?
我不是在询问主机到设备分配的缓冲区(IE 顶点缓冲区)。是的,您可以将它们分配为带有 KHR 扩展的 16 位浮点数,并且没有太大问题,但在实际着色器中,使用 16 位浮点数,而不是强制转换为 32 位浮点数的 16 位浮点数是我担心的。
bytecode - 为什么 SPIR-V 使用“4 字节”代码或“字代码”?
据我了解,根据 SPIR-V 1.3 规范,所有指令均以 4 字节字分段。这与传统的字节码 IR 语言(如 Python 字节码和 Java 的 JVM 字节码)不同,如果我正确地理解字面意义上的将操作分割为单个字节的话。我什至听过人们不经意地谈论这特别是一件好事(“文字代码”),但从未详细说明原因。为什么 Khronos 集团决定沿着这条路线进行其 SPIR-V 定义,而不是使用单字节格式或其他任意大小?
gpgpu - 如何在 Linux 中获取已安装的 Vulkan API 版本?
2018-03-07,新版API(Vulkan 1.1)发布。
我想知道:
- 哪个控制台命令可以显示当前安装的 API 版本。
- 如何以编程方式确定 C# 语言中的相同事物。
glsl - Vulkan SSBO 顶点着色器的 vertexPipelineStoresAndAtomics 警告
我想vec3
在我的顶点着色器中使用一个数组。我建立
我的 GLSL 中的布局并将glslc
其转移到我的 SPIR-V 中,它有它的NonWriteable
操作码。我做了所有 CPU 方面的工作,使用描述符集和所有设置它。数据似乎正确通过,但我通过验证层收到此警告
然后对其进行更多研究,我意识到这vertexPipelineStoresAndAtomics
只是供非计算着色器写入,但我只读取数据,所以不确定它为什么对我大喊大叫。此外,它似乎仍在工作,所以这是一个假阴性错误还是我做错了什么?
opengl - 在 OpenGL 中加载 SPIR-V 失败
我正在使用带有 NVIDIA 驱动程序 384.111 的 Ubuntu 16.4,我遇到了与此类似的问题。
我以与链接讨论中所述相同的方式将最小的 GLSL 顶点着色器(一个输入和一个空的主函数)编译到 SPIR-V。当我加载并专门化它时,专门化不成功,信息日志只包含随机数据。
我决定发布这个问题,因为链接评论中引用的讨论不再存在并且已经超过一年了。我在此处或 NVIDIA 开发论坛上找不到任何其他关于此问题的参考资料。
是否有任何错误可以合法地产生损坏的信息日志,或者这是驱动程序错误?不知何故,这个问题似乎不太可能已经存在一年多而没有人讨论过。
我的 GLSL 着色器如下所示:
我使用以下命令将代码编译为 SPIR-V:
./glslangValidator -G quad.vert -o quad.vert.spv
以下代码加载着色器:
vulkan - What are the alignment rules for a dynamic arrays in SPIR-V with std430?
The spec says
[140] An array has a base alignment equal to the base alignment of its element type, rounded up to a multiple of 16. .... [430] except for array and structure base alignment which do not need to be rounded up to a multiple of 16.
I assume the size for a static array is trivially size_of(elem_type) * length
but what about a dynamic array?
There are no pointers in the logical mode, does that mean the size of a dynamic array is 0?
I don't know which offsets I should apply to the following struct
Or in SPIR-V notation
Can this be done, or do the same rules of GLSL apply here where you are only allowed to have exactly one dynamic array inside a buffer block, and it has to be the last one?