首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Lua转换为spir-v是可能的吗?

将Lua转换为spir-v是可能的吗?
EN

Stack Overflow用户
提问于 2017-03-07 02:41:29
回答 2查看 395关注 0票数 0

我想用Lua编写着色器代码,但需要使用spir-v。我还没有遇到针对它的非glsl编译器。这有可能做到吗?

EN

回答 2

Stack Overflow用户

发布于 2017-03-07 02:45:04

这当然是可能的(制作一个从Lua到SPIR-V的转换器),但这需要大量的工作(当然需要几年的时间,如果您希望生成的SPIR-V代码高效的话)。您需要编写一个Lua to SPIR-V编译器。

如果您想走这条路,请阅读几本关于编译的书籍,从Dragon Book开始。当然,optimization (在您的Lua V编译器中)非常重要

您已将您的问题标记为C++。如果您想了解有关C++ -V的一些信息,请考虑使用OpenACC

我的建议是保持合理:如果您想为GPGPU编写代码,请使用专用的低级GPGPU语言,如OpenCL (或CUDA)。你可能只需要用这种(OpenCL或CUDA)语言编写简短的例程(compute kernels) (以及更多的胶水代码,例如,为了能够在Lua程序中使用它们,甚至在C++或C程序中使用它们)。

票数 4
EN

Stack Overflow用户

发布于 2017-03-07 04:49:36

Lua作为一种高级脚本语言,具有SPIR-V作为低级着色语言的许多功能,或者1)根本不能处理,2)只能低效处理,或者3)不能透明地处理(即:调用着色器操作的代码需要做不同的事情)。

例如,Lua使用词法作用域使函数成为第一类对象。这在SPIR-V中可能是可能的,但它需要内存分配。而SPIR-V不能做到这一点;它只能处理外部系统提供的内存对象。因此,这意味着调用着色器操作的代码需要为着色器进程提供某种存储。这在多大程度上取决于脚本的作用。

此外,SPIR-V没有字符串的概念,但Lua中的几乎所有东西都依赖于字符串。所以你得用整块布做线。并且由于它不能分配内存,外部系统将再次被要求为字符串提供存储。

Lua表的实现成本也非常高。它们不仅需要动态分配,还需要大量的间接内存访问。访问具有运行时字符串值的表将损害着色器性能。由于Vulkan风格的SPIR-V需要逻辑寻址,因此实现表将不需要实际的指针。所以你必须使用某种带索引的数组。

哦,Lua没有SPIR-V和着色器使用的任何数据结构或语法。SPIR-V需要通过定义良好的接口与外部世界通信,该接口由类型化和修饰的变量声明组成。Lua没有办法显式地定义变量的类型,更不用说修饰它们了,所以你必须发明这样的语法。

Lua (5.3之前的版本)也缺乏浮点型和整型之间的正式区分概念。此决定对于SPIR-V非常重要,因为它有助于定义着色器舞台和外部世界之间的界面。

哦,SPIR-V完全禁止递归。因此,即使您成功地完成了上述所有工作,也无法保证所有Lua着色器都可以作为SPIR-V着色器工作。

有可能吗?可能吧。这是否合理呢?不是的。

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

https://stackoverflow.com/questions/42633171

复制
相关文章

相似问题

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