问题标签 [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.
opengl - 如何使用 OpenGL ARB_gl_spirv 扩展?
我想将我的 GLSL 着色器编译为 SPIR-V 二进制文件,并在我的 OpenGL 项目中使用它。
我发现glslang
,使用我可以将 glsl 着色器编译为 spir-v。但是我还没有找到任何关于如何在我的 C++ 项目中使用它的教程。如何加载这些二进制文件并从中创建着色器程序?
optimization - 是否应该优化生成的 SPIR-V 代码?
我目前正在考虑将我的一些代码从 OpenGL/GLSL 移植到 Vulkan/SPIR-V,其中部分代码在运行时生成 GLSL,因此我将不得不生成 SPIR-V。我想知道的是我应该如何与生成的 SPIR-V 中的优化相关联。
特别是,我真的找不到任何关于我应该对驱动程序的编译器有什么样的期望的信息。我是否应该期望它自己进行积极的优化,从而尝试保持 SPIR-V 代码的清洁并在其中尽可能多地保留“原始意图”以供编译器查看?或者我应该期望它进行相当简单的代码生成,并在生成 SPIR-V 时尝试进行尽可能积极的优化?
仅针对特定示例,在生成 SPIR-V 时我应该做哪些事情?
- 消除冗余存储然后加载局部变量?
- 循环展开或剥离/函数内联?
- 恒定传播/公共子表达式消除?
- 尽可能保持 SSA 形式,而不是加载和存储到局部变量?
我非常天真的期望是编译器将希望调整其优化传递以适应硬件的细节,因此我应该尝试保持我的 SPIR-V 代码干净和高级,其中诸如循环展开之类的事情会破坏信息和阻止驱动程序自行决定展开,但我真的只是在猜测,没有任何真实信息。
vulkan - SPIR-V 中哪些类型不允许作为类型别名?
具有相同操作数参数化的非结构类型(标量、向量、数组等)不能是类型别名。对于非结构,两个 type
<id>
匹配 if-and-only-if 类型匹配。
这到底是什么意思?
使用 glslang 编译此着色器会导致
这里%uint = OpTypeInt 32 0
用了几次,%_ptr_Function_uint
也用了两次。
这条规则甚至适用于什么地方?
c++ - glslang 无法解析内置函数
这是我的代码:
你可以在我的Github repos上获得完整的源代码和项目。
我通过链接来自 Vulkan 1.0.54.0 的 glslang 相关库来构建此代码。而且我不知道为什么会收到以下错误消息:
内置插件的来源发布在gist上。
我尝试了两个测试用例。都可以通过官方工具(glslangValidator)成功解析编译成SPIRV。但在案例 2 中,我的工具在解析阶段失败。
情况1
案例2
有没有人知道我做错了什么?
我曾经遇到过这个问题,然后通过重置项目(删除,克隆,再次构建)解决了它,但不知道为什么。现在,我又遇到了这个问题。但是,这次重置项目并没有帮助。
c++ - 是否允许使用 VkBool32 作为推送常量?
我正在尝试在我的 C++ 代码中创建一个 VkBool32:
并通过推送常量将其推送到 GLSL:
它由统一存储类中的 bool 接收:
第一个测试似乎有效并且具有预期的行为。但这是否为 Vulkan 规范所允许?
hlsl - 修改 HLSL 着色器以在 Vulkan 中工作,我是否必须分离纹理/采样器?
我正在修改 D3D12 中使用的 HLSL 着色器以编译为 SPIR-V,因为我想在 Vulkan 中使用相同的着色器代码。这是着色器:
如果我在索引 1 处设置的描述符具有类型,我是否可以对纹理和采样器使用相同的绑定,VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
或者我必须使用两个绑定槽,一个用于纹理,一个用于采样器?我问是因为我的管道创建失败并出现错误
Vulkan警告:[ParameterValidation],代码:9:vkCreateGraphicsPipelines:返回VK_ERROR_INITIALIZATION_FAILED,表示对象初始化失败
如果使用此着色器而不是编译成 SPIR-V 的 GLSL 着色器。我的 GLSL 着色器使用这样的纹理:
glsl - SPIR-V 需要 Vulkan 1.0.51.1 + 中的用户输入/输出位置
我在我的计算机上安装了最新的 Vulkan SDK,但是每当我想通过 glslValidator.exe 为我的着色器生成 SPIR-V 文件时,它都会失败并返回以下错误
我发现自更新 1.0.51.1 以来,有一些更改可能会导致我的旧着色器失败
在 GL_KHR_vulkan_glsl 中需要用户输入/输出位置(内部问题 783)。
解决此问题的正确/新方法是什么?
顶点着色器
vulkan - 如何在 GLSL 中为 Vulkan 处理 FLT_MAX
我有一个算法,我尝试在 GLSL 中为 Vulkan 实现。该算法使用FLT_MAX
.
现在我可以将其定义为任意高浮点值,但我真的会对如何在 GLSL 运行时实际处理该值感兴趣。
assembly - 在设备上实施 OpenCL 需要采取哪些步骤?
假设我有一个设备,虽然它有能力支持,但目前不支持 OpenCL。我有 ISA、硬件设计文档和许多其他文档。我的设备所在的系统目前有 C 和 C++ 编译器,并且支持许多 linux 发行版。
现在我想为我的设备添加 OpenCL(假设是最新版本,2.2)支持。为了支持我的设备,我实际上需要做什么?我在他们的网站上看到了 SPIR-V 的文档,即:SPIR-V 注册表页面、opencl 扩展指令集概述、普通 spir-V 概述。
现在假设我实现了一个 SPIR-V-to-my-device-ISA 编译器,我现在支持 OpenCL 2.2 吗?我看到另一个 OpenCL 注册表,但我没有看到“如果您实现这些功能,编写执行此操作的代码等。您现在已经在您的系统上实现了 OpenCL 2.2 规范”。
为了为我的设备实施 OpenCL,我需要采取哪些实际步骤?
vulkan - SPIR-V 着色器在运行时导致验证错误
我有一个计算着色器:
我使用glslangValidator
LunarG SDK 1.0.65.0 编译它并使用它检查它spirv-val
,它没有返回任何内容。我shaderInt64
在创建VkDevice
. 使用加载此着色器时vkCreateShaderModule
出现此验证错误:
SPIR-V module not valid: Invalid instruction word count: 0
当我执行以下任何操作时,验证错误就会消失:
- 删除 64 位扩展并将所有类型更改为
int
- 删除其中一个
Foo
或Bar
缓冲区 - 删除任一变量
main
- 消除
layout(local_size_x_id = 0) in
我的问题是,这是编译器或验证层中的错误,还是我错误地使用了这些功能之一?