CN111488155A - 着色语言翻译方法 - Google Patents
着色语言翻译方法 Download PDFInfo
- Publication number
- CN111488155A CN111488155A CN202010539681.4A CN202010539681A CN111488155A CN 111488155 A CN111488155 A CN 111488155A CN 202010539681 A CN202010539681 A CN 202010539681A CN 111488155 A CN111488155 A CN 111488155A
- Authority
- CN
- China
- Prior art keywords
- function
- variable
- information
- type
- code file
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/005—General purpose rendering architectures
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- Computer Graphics (AREA)
- Software Systems (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本申请实施例提供一种着色语言翻译方法。在着色语言翻译方法中,获取原着色语言的代码文件的抽象语法树,对抽象语法树中的节点的关键字进行分析,可获取原着色语言的代码文件包含的着色语言信息。结合设定的信息映射规则,可对该着色语言信息进行翻译,得到另一种着色语言的代码文件。在这个过程中,基于抽象语法树进行节点分析,保留了原着色语言的代码文件原有的语法结构。与此同时,基于节点的关键字进行分析,实现了不同类型的信息之间的对应翻译,有利于提升翻译结果的可读性;除此之外,信息映射规则可根据实际需求进行更新,提升了语言翻译方法的可拓展性,方便快速地支持新的着色语言语法。
Description
技术领域
本申请涉及数据处理技术领域,尤其涉及一种着色语言翻译方法。
背景技术
着色语言(Shading Language),是一类专门用于为着色器进行编程的着色语言。目前,由微软开发并拥有的一种高阶着色器语言(High Level Shader Language,HLSL)较受业界欢迎。但是,HLSL只能工作在Windows(微软开发的一种操作系统)平台上,进而导致运行有其他操作系统的目标平台存在使用受限的问题。
现有技术中,存在一种通过反汇编操作将HLSL的代码翻译为目标平台可使用的代码的方式。但是,反汇编操作翻译得到的代码具有可读性较差的缺陷,不利于在目标平台上进行优化和调试。因此,有待提出一种新的解决方案。
发明内容
本申请实施例提供一种着色语言翻译方法,用以提升代码翻译结果的可读性。
本申请实施例提供一种着色语言翻译方法,包括:对第一着色语言对应的第一代码文件进行语法分析,得到所述第一代码文件的抽象语法树;对所述抽象语法树中的多个节点的关键字进行分析,以获取所述第一代码文件的着色语言信息;根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译,得到第二着色语言对应的第二代码文件;其中,所述信息映射规则根据所述第一着色语言和所述第二着色语言的语法规则确定。
本申请实施例中,获取原着色语言的代码文件的抽象语法树,对抽象语法树中的节点的关键字进行分析,可获取原着色语言的代码文件包含的着色语言信息。结合设定的信息映射规则,可对该着色语言信息进行翻译,得到另一种着色语言的代码文件。在这个过程中,基于抽象语法树进行节点分析,保留了原着色语言的代码文件原有的语法结构。与此同时,基于节点的关键字进行分析,实现了不同类型的信息之间的对应翻译,有利于提升翻译结果的可读性;除此之外,信息映射规则可根据实际需求进行更新,提升了语言翻译方法的可拓展性,方便快速地支持新的着色语言语法。
附图说明
此处所说明的附图用来提供对本申请的进一步理解,构成本申请的一部分,本申请的示意性实施例及其说明用于解释本申请,并不构成对本申请的不当限定。在附图中:
图1为本申请一示例性实施例提供的着色语言翻译方法的流程示意图;
图2为本申请另一示例性实施例提供的着色语言翻译方法的流程示意图;
图3为本申请一示例性实施例提供的电子设备的结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
针对现有的着色语言翻译方法无法翻译得到可读性较高的翻译结果的技术问题,在本申请一些实施例中,提供了一种解决方案,以下结合附图,详细说明本申请各实施例提供的技术方案。
图1为本申请一示例性实施例提供的着色语言翻译方法的流程示意图,如图1所示,该方法包括:
步骤101、对第一着色语言对应的第一代码文件进行语法分析,得到所述第一代码文件的抽象语法树。
步骤102、对所述抽象语法树中的多个节点的关键字进行分析,以获取所述第一代码文件的着色语言信息。
步骤103、根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译,得到第二着色语言对应的第二代码文件;其中,所述信息映射规则根据所述第一着色语言和所述第二着色语言的语法规则确定。
其中,抽象语法树(Abstract Syntax Tree,AST)是源代码语法结构的一种抽象表示。它以树状结构表现源代码的语法结构,树状结构上的一个节点表示源代码中的一种结构。
其中,节点的关键字,可以是节点对应的变量的关键字。该关键字可以是节点对应的代码中的变量名称,或者变量包含的字符串,本实施例不做限制。
其中,获取第一代码文件的抽象语法树的操作,可基于语法树生成器实现,本实施例不做限制。例如,第一代码文件实现为HLSL着色语言的source.hlsl文件时,可采用HlslParser开源软件提取source.hlsl的抽象语法树,得到source_AST。
其中,所述映射规则,包括:所述第一着色语言和所述第二着色语言之间的变量映射规则;和/或,所述第一着色语言和所述第二着色语言之间的函数映射规则。
其中,所述变量映射规则和所述函数映射规则根据所述第一着色语言和所述第二着色语言的语法规则确定。变量映射规则,用于对第一代码文件的着色语言信息涉及到的变量进行翻译,以将第一代码文件中的变量翻译为符合第二着色语言的语法的变量。函数映射规则,用于对第一代码文件的着色语言信息包含的函数进行翻译,以将第一代码文件中的函数翻译为符合第二着色语言的语法的函数。
其中,第一着色语言适用于第一平台,第二着色语言适用于第二平台,第一平台和第二平台可以是搭载不同操作系统的平台。基于本实施例,可将适用于第一平台的着色语言翻译成适用于第二平台的着色语言,以便于实现着色语言的跨平台灵活使用。
在本实施例中,基于抽象语法树进行节点分析,保留了原着色语言的代码文件原有的语法结构。与此同时,基于节点的关键字进行分析,实现了不同类型的信息之间的对应翻译,有利于提升翻译结果的可读性;除此之外,信息映射规则可根据实际需求进行更新,提升了语言翻译方法的可拓展性,方便快速地支持新的着色语言语法。
通常,翻译工具内部对部分字进行了定义,这部分字被称为保留关键字(reserved word)。保留关键字不可作为变量名或过程名使用,因此,为避免使用保留关键字,可对第一代码文件进行预处理,以下将进行示例性说明。
在一些可选的实施例中,可从所述第一代码文件中,确定待处理的变量,该待处理的变量的名称包含与翻译工具中的保留关键字相同的字符串。接下来,可对所述待处理的变量的名称进行修改,以避免在翻译过程中出现保留关键字。
可选地,所述待处理的变量,包括:名称为Buffer的全局传参变量、名称包含字符串Texture的变量以及名称包含字符串Buffer的变量中的至少一种。可选地,对所述待处理的变量的名称进行修改时,可将所述第一代码文件中的全局传参变量的名称Buffer设置为Cbuffer;将所述第一代码文件中变量的名称中的Texture,设置为texture;或者,将所述第一代码文件中变量的名称中的Buffer,设置为buffer。
前述实施例的步骤103记载了对该抽象语法树中的多个节点的关键字进行分析,以获取该第一代码文件的着色语言信息的方案,在一些可选的实施例中,第一代码文件的着色语言信息,包括:该第一代码文件中的全局传参变量结构体的信息、该第一代码文件中的资源的信息、该第一代码文件中的结构体的信息以及该第一代码文件中的函数的信息中的至少一种。
以下将以该多个节点中的任一节点为例,对分析节点的关键字的过程进行示例性说明。
需要说明的是,下述各实施例中涉及到的Shader,指的是保存有着色语言的代码文件,例如,HLSL文件、GLSL的文件或者SPIR-V文件,后续不再一一进行解释。
在一些可选的实施例中,针对该多个节点中的任一节点,根据该节点的类型关键字,确定该节点对应的关键变量;接着,对该节点对应的关键变量进行解析,得到该节点对应的着色语言信息。遍历抽象语法树之后,可获取到多个节点各自对应的着色语言信息,接着,可根据该多个节点各自对应的着色语言信息,获取该第一代码文件的着色语言信息。
对于节点而言,基于节点的类型关键字可以确定节点的基本类型,节点的基本类型用于描述节点存储的着色语言信息。
可选地,节点的类型关键字,可包括:全局传参变量结构体、类定义、结构体定义、变量、函数定义、函数声明、采样器以及函数调用类型中的至少一种。
以第一代码文件实现为HLSL的代码文件为例,HLSL的代码文件中,节点的类型关键字以及对应的着色器功能可如以下表1所示:
其中,节点对应的关键变量,指的是存储有节点的着色语言信息的变量,对这些关键变量进行分析,可获取节点存储的着色语言信息。其中,节点的类型关键字不同时,节点的关键变量也不同。
例如,当节点存储的是资源信息时,节点的关键变量可以是寄存器分配变量(RegisterAllocationOptData变量),该寄存器分配变量包含有资源的寄存器信息。
例如,当节点的类型为函数定义(FunctionDefinition)或函数声明(FunctionDeclaration)时,节点的关键变量可以包括:函数类型(FunctionType)变量、函数参数变量(FunctionParamsOptData)和代码块变量(Block)。其中,FunctionType变量存有函数的返回类型的信息,FunctionParamsOptData存有函数的参数信息,Block内包含函数内部的所有语句。
例如,当节点的基本类型为函数调用(FunctionCall)时,节点将具有实参变量(ArgumentList),该实参变量包含了函数调用时传入的参数。
又例如,当节点的基本类型为结构体(Struct)时,节点将具有类成员声明变量(ClassMemberDeclarations),此变量包含了结构体内的成员变量信息。
基于上述,可根据节点的类型关键字,确定节点的关键变量,并对节点的关键变量进行分析,以得到该节点对应的着色语言信息。
可选地,若该节点的类型关键字为全局传参变量结构体,则对该节点的子节点的类型变量和名称变量进行解析,得到该全局传参变量结构体包含的全局传参变量的类型和名称;该将该全局传参变量结构体包含的全局传参变量的类型和名称保存在变量字典中。
继续以HLSL代码文件为例,当抽象语法树中,某一高级节点的基本类型为“CBuffer”时,可对该节点的所有子节点进行解析。其中,每个子结点可解析出一个全局传参变量的信息。针对每个子节点,通过解析该子节点的类型变量(Type变量)和名称变量(Name变量),得到该子节点对应的全局传参变量的名称和类型。接着,将全局传参变量结构体中的所有全局传参变量的信息保存到一个全局的变量字典中。可选地,该全局变量字典可被记为GVariableDictionary。
可选地,若该节点的类型关键字包含表示资源的字符串,则解析该节点的名称变量和寄存器分配变量,以获取该资源的名称和寄存器地址;将该资源的名称和寄存器地址,对应保存在资源字典中。
可选地,该资源包括:纹理资源、缓冲器资源以及寄存器资源中的至少一中。以下将分别结合上述多种资源进行说明。
可选地,若该节点的类型变量的值包含表示纹理资源的字符串,则获取该节点的名称变量的值,作为该纹理资源的名称;接着,解析该节点的寄存器分配变量,以获取该纹理资源的寄存器地址;接着,将该纹理资源的名称和寄存器地址对应保存在纹理字典中。
继续以HLSL代码文件为例,当语法树节点的Type变量值为包含字符串“Texture”时,则可记录此节点的Name变量值为该节点对应的纹理资源的名称,同时解析此节点的RegisterAllocationOptData变量,获取寄存器地址。接着,将纹理资源和对应的寄存器地址保存到一个全局的纹理资源字典中,记为GTexutreDictionary。
可选地,若该节点的类型变量的值包含表示缓冲器资源的字符串,则获取该节点的名称变量的值,作为该缓冲器资源的名称;接着,解析该节点的寄存器分配变量,以获取该缓冲器资源的寄存器地址;接着,将该缓冲器资源的名称和寄存器地址对应保存在缓冲器字典中。
继续以HLSL代码文件为例,当语法树节点的Type变量值为包含字符串“Buffer”时,则可记录此节点的Name变量值为Buffer资源的名称,同时解析此节点的RegisterAllocationOptData变量,以获取该Buffer资源对应的寄存器地址。接着,将Buffer资源及其对应的寄存器地址保存到一个全局的寄存器资源字典中,记为GBufferDictionary。
可选地,若该节点的类型为采样器,则获取该节点的名称变量的值,作为采样器的名称;接着,解析该节点的寄存器分配变量,以获取该采样器的寄存器地址;接着,将该采样器的名称和寄存器地址对应保存在采样器资源字典中。
继续以HLSL代码文件为例,当语法树高级节点的基本类型为“SamplerState”时,可记录此节点的Name变量值为采样器资源的名称,同时解析此节点的RegisterAllocationOptData变量,获取该采样器资源的寄存器地址。接着,将采样器资源及其寄存器地址记录到一个全局的采样器资源字典中,记为GSamplerDictionary。
应当理解,执行上述实施方式时,可遍历抽象语法树,以获取第一代码文件中的所有的纹理资源、所有的缓冲器资源以及所有的采样器资源的信息。其中,第一代码中所有的纹理资源的信息可被保存在GtexutreDictionary中,所有的缓冲器资源可被保存在GbufferDictionary中,所有的采样器资源可被保存在GsamplerDictionary中,不再赘述。
可选地,若该节点的类型关键字为函数定义或函数声明,则解析该节点的函数类型变量和名称变量,以获取该第一函数的返回类型和函数名,并将该第一函数的形参变量的类型和名称写入该第一函数的信息。
其中,函数类型变量,即该节点的Type变量,名称变量,即该节点的Name变量。
继续以HLSL代码文件为例,在这种实施方式中,可将所有函数信息记录到一个全局的字典中,记为GFunctionDictionary。当抽象语法树中,节点的基本类型为“FunctionDefinition”或“FunctionDeclaration”时,可记此节点为Fnode,记此节点对应的函数为函数F0。接着,从FNode的FunctionType变量中获取函数F0的返回类型,从Name变量中获取函数F0的函数名。
进一步可选地,可解析该节点的函数参数变量的子节点的类型变量和名称变量,以获取该第一函数的形参变量的类型和名称。
其中,函数参数变量,可以为节点对应的FunctionParamsOptData变量。函数参数变量的每个子结点表示一个形参变量,因此,可通过分析函数参数变量的每个子节点的类型变量和名称变量,获取第一函数的每个形参变量的类型和名称。
可选地,若该第一函数的形参变量中,包括具有out或者inout属性的形参变量,则在该第一函数的信息中,记录该具有out或者inout属性的形参变量。
承接上述HLSL的例子,可分析FNode的FunctionParamsOptData变量的子节点。FunctionParamsOptData变量的每个子结点表示一个形参变量,可根据每个子节点的Type和Name变量,获取每个形参变量的类型和名称。其中,若某个或者多个形参变量的类型有out或者inout修饰,则可在函数F0的信息中额外记录这些变量信息。
进一步可选地,可获取该节点的代码块变量的任一子节点对应的子树;若该子树中的第一节点的类型为函数调用,则解析该第一节点的名称变量和实参变量,得到该第一节点对应的函数名以及传参信息;接着,在该函数字典中,查询与该第一节点对应的函数名和传参信息对应的目标函数,作为该第一函数的调用函数。其中,代码块变量,可以为节点对应的Block变量。针对代码块变量的任一子节点,可获取以该子节点的为根节点的子树,作为该子节点对应的子树。
其中,实参变量,可以是第一节点的ArgumentList变量。其中,该第一节点,指的是子树中的任意一个类型为函数调用的节点。
继续承接上述HLSL的例子,可分析FNode的Block变量,Block变量的每个子节点代表函数实现的每条语句。记Block的某个(任意一个)子节点为FNode_B_C,并从抽象语法树中,获取以FNode_B_C为根节点的子树,并对该子树进行分析。当子树中有某个节点基本类型为“FunctionCall”时,可根据节点的Name变量值获取一函数名,从节点的ArgumentList变量解析出形参信息。其中,ArgumentList的每个子节点表示一个函数传参。接着,根据解析得到的函数名和传参信息,去GFunctionDictionary查找。若查找到对应的函数,记此函数为F1,则将F1加入到函数F0函数的调用函数名单中。
可选地,在上述实施例的基础上,基于该子树,还可进一步获取第一函数使用的资源的信息。以下将进行示例性说明。
实施方式D:可选地,若该子树中的第二节点使用了第一全局资源,则将该第一全局资源的信息写入该第一函数的信息中;该第一全局资源包括纹理资源、缓冲器资源以及采样器资源中的至少一种。
继续承接上述HLSL的例子,可继续对以FNode_B_C为根节点的子树进行分析,当发现子树中某个节点使用了某个全局资源时,将此全局资源的信息记录到函数F0的信息中。其中,若函数F0使用了多种全局资源,例如Buffer,Texture和采样器资源,则可分别对Buffer,Texture和采样器资源进行记录。
实施方式E:可选地,若该子树中的第三节点使用了第一全局传参变量,则将该第一全局传参变量的信息写入该第一函数的信息中。
应当理解,在本文中,采用“第一”、“第二”、“第三”等词汇对需要描述的对象进行限定,仅用于方便描述和区分名称相同或者相似的对象,并不对上述对象的时间顺序、位置顺序或者等级构成任何限制,后续不再一一解释。
继续承接上述HLSL的例子,可继续对以FNode_B_C为根节点的子树进行分析,当发现子树中某个节点使用了全局传参变量时,则在函数F0的信息里记录此全局传参变量信息。
基于上述各实施例,可获取到节点对应的第一函数的着色信息,接着,可将第一函数的信息保存在函数字典中。
其中,在记录第一函数的信息时,用于记录参数变量的变量信息中,定义了如表2所示的主要成员变量:
在记录第一函数的信息时,函数信息中,定义了如表3所示的主要成员变量:
在一些可选的实施例中,根据抽象语法树,获取第一代码文件中的所有函数,并将所有函数逇信息记录在函数字典之后,可进一步对函数字典中的函数进行筛选,以确定第一代码运行时实际使用的函数,进而降低后续的函数翻译操作的工作量。
可选地,从该函数字典中确定入口函数;从该入口函数开始,采用深度优先搜索的方式,搜索该入口函数调用的每个函数;将搜索到的该入口函数调用的函数,记录到目标函数集合中。
继续以HLSL代码文件为例,可遍历前述实施例生成的GFunctionDictionary,当发现某个函数的名称为“main”时,确定此函数即为入口函数,记为MainFunc。接着,从入口函数开始,使用深度优先搜索的方式,搜索其调用的每个函数。将搜索到的函数记录到一个全局的词典中,记为GusedFunction。GusedFunction词典中的函数,表示当前着色器中实际用到的函数集合。进而,可在后续的函数翻译过程中去除没有调用的函数,降低翻译的计算量,精简翻译结果。
可选地,若该节点的类型关键字为结构体定义,则解析该节点的名称变量和类成员声明变量的子节点,以获取该节点对应的第一结构体的名称和该第一结构体包含的类成员的信息;将该第一结构体的名称和该第一结构体包含的类成员的信息保存在全局链表中。
可选地,为进一步获取第一结构体的类型,可遍历该函数字典,以从该函数字典中确定入口函数;若该第一结构体与该入口函数的返回类型适配,则确定该第一结构体为输出类型的结构体;若该第一结构体与该入口函数的形参变量的类型适配,则确定该第一结构体为输入类型的结构体。
继续以HLSL代码文件为例,当抽象语法树中的节点的基本类型为“Struct”时,可记录该节点的Name变量值为该节点对应的结构体的名称。其中,该节点的ClassMemberDeclarations变量的每个子节点表示一个结构体成员,因此,可解析ClassMemberDeclarations变量的每个子节点,以获取待结构体的所有结构体成员信息。接着,可将所有结构体成员信息保存在该结构体中。其中,获取到第一代码中的所有结构体的信息后,可将所有结构体的信息保存在一个全局链表中,记为GStructList。
接着,可遍历前述实施例生成的GFunctionDictionary,当发现某个函数的名称为“main”时,此函数即为入口函数,记为MainFunc。接着,在GStrcutList中寻找与MainFunc的返回类型对应的结构体,若找到,则记该找到的结构体为输出类型的结构体。同时,在GStrcutList中寻找与MainFunc的形参类型对应的结构体,若找到,则记录该找到的为输入类型的结构体。
基于上述各实施例提供的节点分析方法,可遍历第一代码文件的抽象语法树,得到每个节点的着色语言信息。接着,根据多个节点的着色语言信息,可得到第一代码文件的着色语言信息。根据前述实施例的记载,第一代码的着色语言信息可包括:资源字典包含的资源的信息、变量字典包含的全局传参变量的信息、全局链表包含的结构体的信息以及目标函数集合包含的函数的信息。
接下来,可基于设定的信息映射规则,对第一代码文件的着色语言信息进行翻译,以得到第二代码文件。其中,第二代码文件与第二着色语言的语法适配。
其中,设定的信息映射规则,可包括:变量映射规则以及函数映射规则中的至少一种。其中,变量映射规则和函数映射规则,可根据第二着色语言的语法要求进行预先定义,本实施例不做限制。
值得说明的是,在本实施例中,信息映射规则可根据需求进行更新,例如,可灵活添加词与词、结构与结构之间的映射关系,可拓展性强,方便快速地支持新的着色语言语法。
其中,第二着色语言,可以是Metal着色语言,或者GLSL着色语言。
其中,Metal是一个兼顾图形与计算功能的,面向底层、低开销的硬件加速应用程序接口,可应用在IOS 8.0版本之后的系统上。GLSL着色语言是OpenGL使用的着色语言,是一个以C语言为基础的高阶着色语言。
相应的,第一平台,可以实现为搭载有Windows操作系统(一种微软公司开发的操作系统)的平台,第二平台可以实现为搭载有IOS(iPhone Operation System,苹果公司开发的操作系统)操作系统的平台或者搭载有Android(谷歌公司开发的操作系统)操作系统的平台。
以下将首先以第二着色语言实现为Metal着色语言为例进行示例性说明。
第一着色语言实现为HLSL、第二着色语言实现为Metal着色语言时,变量映射规则可如以下的HLSL到Metal的变量关键字映射表所示,函数映射规则可如以下的HLSL到Metal的函数映射表所示。
其中,HLSL到Metal的变量关键字映射表如以下表4所示:
其中,HLSL到Metal的函数关键字映射关系如以下表5所示:
首先,可对前述实施例分析得到的变量字典进行翻译。可选地,可将该变量字典中的全局传参变量,映射为第一目标结构体的成员变量。也就是说,第一目标结构体第一代码文件中的所有全局传参变量,均作为该第一目标结构体的成员变量。
继续承接前述HLSL的例子,可采用一个结构体组织GVariableDictionary中的全局传参变量,每个全局传参变量都作为此结构体的成员变量。在本实施例中,该结构体可命名为Uniform。一个典型的翻译样例可如下表6所示:
接下来,可对前述实施例分析得到的全局链表中的结构体进行翻译。以下将以全局链表中的第一结构体为例,对翻译第一代码文件中的结构体的实施方式进行示例性说明。
可选地,首先,可从前述实施例生成的该全局链表中,获取该第一结构体。接着,可根据变量映射规则,对该第一结构体中的变量进行翻译,以将该第一结构体映射为符合第二着色语言的语法的第二结构体。
以HLSL翻译为Metal为例,对全局链表中的所有结构体信息进行翻译时,可根据表4所示变量关键字映射关系,将每个结构体中的变量的类型从HLSL语法映射到Metal语法。
可选地,若所述第一结构体为顶点着色器的输入类型的结构体,则设置映射得到的所述第二结构体中的变量的属性编号与所述第一结构体中的变量的属性编号一致。
继续以HLSL翻译为Metal为例,可根据解析HLSL得到的输入、输出类型,生成Metal的输入类型,并用结构体组织数据。
对于顶点着色Shader的输入类型,翻译后结构体内每个变量的attribute编号(属性编号)要与原HLSL中ATTRIBUTE编号(属性编号)保持一致。一种典型的翻译样例可如以下表7所示:
对于片元着色Shader的输入类型,与顶点着色Shader的输出类型处理方式相同。
可选地,若所述第一结构体为顶点着色器的输出类型的结构体或者片元着色器Shader的输入类型的结构体,则将所述第一结构体中的属性为SV_POSITION的变量映射为所述第二结构体中的变量后,为映射得到的变量添加[[position]]标识。
继续以HLSL翻译为Metal为例,对于顶点着色Shader的输出类型,将HLSL中属性为SV_POSITION的变量翻译成Metal对应的变量后,为翻译得到的变量添加 [[position]]标识。除上述列举的变量之外, HLSL中的其他变量无需再翻译其属性信息。一种典型的翻译样例可如以下表8所示:
可选地,若所述第一结构体为片元着色器的输出类型的结构体,则将所述第一结构体中的属性为SV_Target的变量映射为所述第二结构体中的变量后,为映射得到的变量添加[[color]]标识,且同步所述属性为SV_Target的变量的编号。
继续以HLSL翻译为Metal为例,对于片元着色Shader的输出类型,将HLSL中属性为SV_Target的变量翻译成Metal对应的变量后,为翻译得到的变量添加color标识,且翻译前后的变量的编号保持一致。一种典型的翻译样例可如以下表9所示:
接下来,可对前述分析得到的目标函数集合中的函数进行翻译。以下将继续以目标函数集合中的第一函数为例,对第一代码文件中的函数的翻译操作进行示例性说明。
可选地,从该目标函数集合中获取该第一函数;根据该第一函数的信息以及函数映射规则,对该第一函数进行翻译,以将该第一函数映射为符合该第二着色语言的语法的第二函数。
其中,函数映射规则,可根据可第二着色语言的语法要求进行预先定义,本实施例不做限制。
可选地,根据该第一函数的信息以及函数映射规则,对该第一函数进行翻译时:若该第一函数不为入口函数,则在该第二函数的返回类型之前添加inline关键字。
可选地,若该第一函数的信息中记录有具有out或者inout属性的形参变量,则在该第二函数中生成第三结构体;根据该具有out或者inout属性的形参变量的传参顺序,在该第三结构体中依次定义至少一个形参变量;其中,该至少一个形参变量的类型与该具有out或者inout属性的形参变量的类型相同,且该至少一个形参变量的名称设有输出参数前缀。其中,第三结构体的名称,根据第一函数的函数名和形参的类型确定。
可选地,还可从该第一函数的信息中确定该第一函数的返回类型;若该第一函数的返回类型不为空,则在该第三结构体内定义返回参数变量;该返回参数变量与该第一函数的返回类型相同。
可选地,根据该第一函数的信息以及函数映射规则,对该第一函数进行翻译时,若根据该第一函数的信息确定该第一函数使用了该第一全局传参变量,则在生成该第二函数的形参信息时,将该第一目标结构体作为该第二函数的第一个形参。其中,第一目标结构体为,对变量字典中的全局传参变量进行映射得到的,第一目标结构体中的成员变量可包括变量字典中的所有全局传参变量。
若根据该第一函数的信息确定该第一函数使用了该第一全局资源,则在生成该第二函数的形参信息时,将该第一全局资源的信息放置在除该第一目标结构体之外的其他形参之前。
其中,该第一全局资源在该第二函数的形参中的顺序为:缓冲器资源、纹理资源、采样器资源;
其中,该第一全局资源中的任一种全局资源内部的资源,依据资源对应的寄存器的大小进行排序。
可选地,根据该第一函数的信息以及函数映射规则,对该第一函数进行翻译时:若该第一函数为入口函数,则在该入口函数的形参变量中,声明该第一目标结构体、该资源字典中的缓冲器资源、该资源字典中的纹理资源以及该资源字典中的采样器资源;
其中,在该第一目标结构体和该缓冲器资源之后添加缓冲器标记,在该纹理资源之后添加纹理标记,在该采样器资源之后添加采样器标记。
可选地,在该第一函数的形参变量中,采用stage关键字标记输入类型的形参;
可选地,若该第一函数与顶点着色器对应,则在该第一函数的返回类型前添加表示顶点(vertex)的关键字。
可选地,若该第一函数与片元着色器对应,则在该第一函数的返回类型前添加表示片元(fragment)的关键字。
继续以HLSL翻译为Metal为例,对上述记载的函数翻译过程进行进一步说明。在翻译函数时只翻译GUsedFunction中记录的函数。除Shader入口函数以外,Metal的所有函数要在函数返回类型前添加inline关键字。Metal函数定义方式与HLSL定义大致相同,在使用上与HLSL的不同之处主要有以下不同:
一、Metal的函数形参不支持out、inout关键字。在翻译使用到out、inout属性形参的HLSL函数时,在生成Metal函数定义之前首先生成一个结构体,结构体的名称根据函数名和函数形参的类型来决定。接着,可依据使用out、inout属性形参的传参顺序,在该结构体内依次定义与形参类型相同的变量,名称的前缀为outParam。若函数的返回类型不为空,则还需在结构体内定义与返回类型相同类型的变量,名称为returnParam。在生成函数返回语句时,返回此结构体变量,变量中包含了要返回的out/inout形参值以及函数本身的返回值。一种典型的翻译样例可如以下表10所示:
在其他函数调用此函数时,使用逗号表达式进行处理,在调用处返回结构体值,并将结构体中的变量依据形参顺序对函数形参依次赋值,若有returnParam参数,则以returnParam作为结尾。一种典型的翻译样例如以下表11所示:
二、Metal的函数不能像HLSL那样直接获取全局传参变量,而是需要将全局传参变量从其父函数传入。因此,在生成函数的形参信息时,若函数中使用了全局传参变量,则将全局传参变量结构体加入并置于函数第一个形参的位置。在函数内部使用全局传参变量时,要通过全局传参变量结构体形参来进行访问。也就是说,在调用此函数时,需要将Uniform变量名加入并置于第一个传参的位置。一种典型的翻译样例可如以下表12所示:
三、Metal的函数不能像HLSL那样直接获取资源变量,而是需要将资源变量从其父函数作为参数传入。因此,在生成函数的形参信息时,若函数中使用了资源信息,则将使用的所有资源信息加入形参,并放置在除全局传参变量结构体外的所有形参之前。若有多种资源,则加入顺序为:首先加入Buffer资源参数,随后加入Textue资源参数,最后加入Sampler资源参数,其中,每种参数的内部顺序依据寄存器值从小到大进行排列。所有资源都已在预处理时存到了函数的信息内,因此,资源类型名在翻译时可通过变量映射表进行映射。在调用此函数时,可根据函数的信息中记录使用的全局资源信息,在函数传参中的对应位置加入资源名称。一种典型的翻译样例可如以下表13所示:
接着,可将HLSL中的入口函数翻译成符合Metal语法的入口函数。
Metal的入口函数需要在形参中列出所有的资源信息和全局传参变量结构体,其中,Texture、Buffer和Sampler资源可从GTextureDictionary、GBufferDictionary和GSamplerDictionary中获取,全局传参变量结构体为之前定义的Uniform结构体。
其中,Uniform结构体和Buffer资源在形参中声明时要在其后添加[[buffer(n)]],n为寄存器值。Texture资源在形参中声明时要在其后添加[[texture(n)]],n为寄存器值。Sampler资源在形参中声明时要在其后添加[[sampler(n)]],n为寄存器值。
同时, Shader采用stage关键字标记Shader输入的形参。对于顶点着色Shader,在函数返回类型前添加添加vertex关键字;对于片元着色Shader,在返回类型前添加添加fragment关键字。
一个片元着色翻译的例子如以下表14所示:
基于上述各实施例,可将解析HLSL对应的代码文件得到的节点的着色语言信息进行翻译,得到Metal着色语言对应的代码文件。即,如图2所示,将HLSL Shader文件翻译为MetalShader文件。进而,可在IOS平台上实现对着色器进行编程,以便于开发可供iPhone、iPad和iPod Touch等设备使用的3D图形程序。
接下来,将以第二着色语言实现为GLSL着色语言为例进行示例性说明。
第一着色语言实现为HLSL、第二着色语言实现为GLSL着色语言时,变量映射规则可如以下的HLSL到GLSL的变量关键字映射表所示,函数映射规则可如以下的HLSL到GLSL的函数映射表所示。
其中,HLSL到GLSL的变量关键字映射表如以下表15所示:
其中,HLSL到GLSL的函数关键字映射关系如以下表16所示:
首先,可对前述实施例分析得到的变量字典进行翻译。可选地,可将该变量字典中的全局传参变量,映射为第二目标结构体的成员变量。也就是说,第一代码文件中的所有全局传参变量,均作为该第二目标结构体的成员变量。
继续承接前述HLSL的例子,可采用一个结构体组织GVariableDictionary中的全局传参变量,每个全局传参变量都作为此结构体的成员变量。在本实施例中,该结构体采用uniform进行修饰,并可命名为cb。
可选地,在声明第二目标结构体的同时,可定义统一变量块(Uniform BufferObject,UBO),并将该第二目标结构体存储在该统一变量块中;遍历该抽象语法树,若遍历到的当前节点的名称与该统一变量块中存储的任一全局传参变量的名称相同,则在该当前节点的名称之前添加该统一变量块的名称标识。
其中,统一变量块,用于存储着色语言中uniform类型变量的缓冲区对象,使用UBO可以让uniform变量在不同的着色语言程序中实现共用,也可以在着色语言程序中实现uniform类型变量的设置与更新。
例如,以HLSL翻译为GLSL为例,在声明名称为cb的结构体的同时,可定义一个名为ubo的cb变量。接着,在GLSL的着色语言信息中,通过名称为ubo的变量访问全局传参变量。当在遍历抽象语法树时,若当前节点的名称为某个全局传参变量的名称,则在将该当前节点翻译成GLSL时,可在该节点名称前添加文本“ubo.”。
一种典型的翻译样例可如下表17所示:
接下来,可对变量字典中的全局传参变量结构体进行翻译。GLSL的全局传参变量结构体需要用layout设置set修饰符和binding修饰符。基于此,可选地,可从预先生成的该变量字典中获取该全局传参变量结构体;接着,采用layout设置该全局传参变量结构体的set修饰符和binding修饰符。其中,binding值与其在HLSL资源中对应的register(寄存器)值保持一致。其中,set修饰符的值可设为0,set修饰符用于后续的Vulkan(一种应用程序接口)翻译使用。
接下来,可对资源字典中的资源进行翻译。
可选地,可从该资源字典中获取任意一种待翻译的资源;接着,采用layout设置该待翻译的资源的binding修饰符,并在该待翻译的资源的变量类型前添加uniform关键字;其中,该binding修饰符的值根据该待翻译的资源的寄存器的值确定。其中,除上述修饰符之外,对该待翻译的资源的变量类型进行翻译时,可结合变量关键字映射表,对该资源的类型变量进行映射,得到该资源翻译后的类型变量,不再一一赘述。
以HLSL翻译为GLSL为例,可从GTextureDictionary中获取Texture资源的信息。针对每个Texture资源,在将其翻译成GLSL中的对应资源时,可用layout设置binding修饰符,binding值为HLSL中对应资源的register值。翻译后的资源的变量类型根据变量关键字映射表来确定,并在翻译得到的变量类型前添加uniform关键字。
其中,可从GBufferDictionary中获取Buffer资源的信息。针对每个Buffer资源,在将其翻译成GLSL中对应的资源时,可采用layout设置binding修饰符,binding值可根据HLSL中对应资源的register值得到。翻译后的资源的变量类型根据变量关键字映射表来确定,并在翻译得到的变量类型前添加uniform关键字。其中,Sampler资源无需进行翻译。
一种典型的资源翻译结果,可如以下表18所示:
接下来,可对前述实施例分析得到的全局链表中得到结构体进行翻译。
以全局链表中的第一结构体为例,可根据变量映射规则,对第一结构体中的变量进行翻译,以将第一结构体映射为符合第二着色语言的语法的第二结构体。其中,可将第一结构体对应的输入类型以及输出类型,分别翻译为第二结构体的输入变量以及输出变量。也就是说,将HLSL中的结构体翻译成GLSL中的结构体时,由于GLSL的结构体定义与HLSL的结构体定义一致,因此,可从全局链表GStrcutList中获取所有结构体的信息,根据变量关键字映射表,将结构体中变量的类型从HLSL语法映射到GLSL定义即可实现结构体的翻译操作。在翻译的过程中,可根据解析HLSL得到的输入、输出类型生成GLSL的输入、输出变量。
其中,GLSL每个输出、输出变量都需要在Shader中进行全局定义。因此,在翻译HLSL的结构体到GLSL时,若发现当前结构体类型是Shader的输入、输出类型,则不再在GLSL中定义此结构体,而是将此结构体的名称宏定义为float类型,方便后续的翻译。此外,可将结构体中的一部分非特殊的成员变量定义为GLSL的Shader的全局传参变量,其中,变量类型的翻译通过变量关键字映射表处理。
结构体的另一部分特殊的成员变量,可根据如下方式进行处理:
若该第一结构体为顶点着色器的输入类型的结构体,则对该第二结构体中的输入变量采用layout关键字定义location修饰符,并在声明该第二结构体中的输入变量时,在该第二结构体中输入变量的类型前添加in关键字; 其中,该location修饰符的值与该第一结构体中的变量的属性编号一致。 也就是说,对于顶点着色Shader的输入类型,翻译后的每个输入变量可用layout关键字定义location修饰符,location值与HLSL中对应变量的ATTRIBUTE编号保持一致。同时,对每个GLSL的输入变量进行声明时,需要在输入变量的类型前添加in关键字,表示此变量是输入变量。在Shader的入口函数中翻译输入类型时,可从入口函数的形参中找到Shader输入类型,并记录下此类型对应的变量名,记为input。在翻译Shader的入口函数时,将所有“input.变量名”的结构替换成对应的GLSL全局传参变量名。
其中,若该第一结构体为顶点着色器的输出类型的结构体,则在翻译该第一结构体时,采用保留关键字gl_Positon代替属性为SV_POSITION的变量;以及,在声明该第二结构体中的输入变量时,在该第二结构体中的输入变量的类型之前添加out关键字。也就是说,对于顶点着色Shader的输出类型,可将带有SV_POSITION属性的HLSL输出变量在GLSL中用保留关键字gl_Positon代替,并在GLSL在Shader入口函数中,直接对gl_Positon进行赋值,无需额外声明。
对于HLSL中的其他输出变量,在GLSL的Shader中采用layout关键字定义location属性值。同时,在声明每个GLSL的输出变量时,可在输出变量的类型前添加out关键字,表示此变量是输出变量。在Shader的入口函数中翻译输出类型时,可从入口函数的语句中找到Shader输出类型定义的变量,记录下此变量名为output。在翻译Shader的入口函数时,处理“output.变量名”的结构。若变量名在输出类型的结构体中对应的变量有SV_Position属性,则用gl_Position替换“output.变量名”,否则用GLSL对应的全局输出变量名替换“output.变量名”。由于用宏定义处理的HLSL的Shader输出类型,所以不用再翻译入口函数中的Shader输出类型定义,这样,可在不影响Shader的功能的情况下,简化翻译流程。
对顶点着色Shader的输入、输出类型的翻译样例可如以下表格19所示:
其中,若该第一结构体为片元着色器的输入类型的结构体,则对该第一结构体中具有SV_POSITION属性的变量进行翻译时,在layout中设置origin_upper_left修饰符,并在该具有SV_POSITION属性的变量的变量类型之前添加in关键字,并设置变量名为gl_FragCoord。也就是说,对于片元着色Shader的输入类型,对HLSL中的带有SV_POSITION属性变量进行翻译时,可在layout中设置origin_upper_left修饰符,同时在该变量类型前添加in关键字,并将该变量名设为gl_FragCoord。
对于HLSL输入类型的其他成员变量,翻译方式与顶点着色Shader的输出类型相似,区别点在于:在翻译得到的变量前添加in关键字,而不是添加out关键字。
在Shader入口函数中翻译输入类型时,可从入口函数的形参中找到Shader输入类型,并记录下此类型对应的变量名,记为input。在翻译Shader入口函数时,处理“input.变量名”的结构。若变量名在输入类型的结构体中对应的变量有SV_POSITION属性,则采用gl_FragCoord替换“output.变量名”,否则采用GLSL对应的全局输入变量名替换“input.变量名”。
其中,若该第一结构体为片元着色器的输出类型的结构体,则对翻译得到的该第二结构体中的输出变量采用layout关键字设置location修饰符,其中该location修饰符的值与该第一结构体中对应的变量的SV_Target属性编号一致,且在该第二结构体中的输出变量的类型之前添加out关键字。也就是说,对于片元着色Shader的输出类型,翻译成GLSL的输出变量时,可采用layout设置location修饰符,location值与HLSL中对应的变量的SV_Target属性编号保持一致,同时要在变量类型前添加out关键字。
在Shader入口函数中翻译输出类型时,从入口函数的语句中找到Shader输出类型定义的变量,记录下此变量名为output。在翻译Shader入口函数时,将HLSL中所有的“output.变量名”的结构替换成对应的GLSL全局传参变量名。
对片元着色Shader的输入、输出类型的翻译样例可如以下表20所示:
接下来,可对目标函数集合中的函数进行翻译。
除入口函数外,GLSL的函数定义方式与HLSL的函数的定义方式大致相同,在使用上的区别主要体现在读取资源方面。GLSL的Texture和Buffer的资源读取函数与HLSL在结构上不同。继续以目标函数集合中的第一函数为例,若第一函数为资源读取函数,则将第一函数翻译成符合第二着色语言的语法规则的第二函数时,在翻译得到的第二函数中,将被读取的资源的类型、被读取的资源的位置以及其他参数写在第二函数的函数体中。以下将进行示例性说明。
对于纹理资源,HLSL使用的读取函数结构如下:
“纹理资源. 读取函数(采样器,读取位置,其他参数)”
而GLSL使用的读取函数结构如下:
“读取函数(纹理资源,读取位置,其他参数)”
对于Buffer资源,HLSL使用的读取函数结构如下:
“Buffer资源.读取函数(读取位置,其他参数)”
GLSL使用的读取函数结构如下:
“读取函数(Buffer资源,读取位置,其他参数)”
前述实施例获取到的资源字典中,包含Shader中所有的资源信息,包括资源变量类型和变量名。在翻译Shader中的函数调用语句时,若HLSL中函数调用者的名称为某个全局资源名,且调用函数为HLSL的内置的资源读取函数时,即可判断当前语句为资源读取语句。在将其翻译为GLSL时,不再向GLSL的Shader中打印此函数在资源读取函数之前的资源变量文本,并将资源变量设为读取函数的第一个参数。对于纹理资源,在翻译时可省略HLSL中资源读取函数的采样器参数。读取函数名称可根据函数关键字映射表进行翻译。
一种典型的对资源读取的翻译样例可如下表21所示:
在翻译Shader入口函数时,GLSL的入口函数返回值为void,且没有形参列表。一个片元着色翻译的例子如下表22所示:
基于上述实施例,可将HLSL Shader文件翻译为GLSL Shader文件。其中,GLSL Shader文件跟HLSL Shader文件在单词上具有一一对应的效果,可读性高,方便后续在目标平台的优化和调错。
接下来,可使用Khronos提供的glslang工具,将第翻译得到的GLSL Shader文件翻译成SPIR-V文件,如图2所示。其中,SPIR-V,是一种现代二进制低级中间表示语言,用于Vulkan、OpenCL、OpenGL 等许多API(Application Programming Interface,应用程序编程接口)。其中,Vulkan,是一个低开销、跨平台的二维、三维图形与计算的应用程序接口,与OpenGL类似,Vulkan针对全平台即时3D图形程序而设计。
需要说明的是,上述实施例所提供方法的各步骤的执行主体均可以是同一设备,或者,该方法也由不同设备作为执行主体。比如,步骤201至步骤204的执行主体可以为设备A;又比如,步骤201和202的执行主体可以为设备A,步骤203的执行主体可以为设备B;等等。
另外,在上述实施例及附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如201、202等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
图3是本申请一示例性实施例提供的电子设备的结构示意图,如图3所示,该电子设备包括:存储器301以及处理器302。
存储器301,用于存储计算机程序,并可被配置为存储其它各种数据以支持在电子设备上的操作。这些数据的示例包括用于在电子设备上操作的任何应用程序或方法的指令,联系人数据,电话簿数据,消息,图片,视频等。
其中,存储器301可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(SRAM),电可擦除可编程只读存储器(EEPROM),可擦除可编程只读存储器(EPROM),可编程只读存储器(PROM),只读存储器(ROM),磁存储器,快闪存储器,磁盘或光盘。
处理器302,与存储器301耦合,用于执行存储器301中的计算机程序,以用于:对第一着色语言对应的第一代码文件进行语法分析,得到所述第一代码文件的抽象语法树;对所述抽象语法树中的多个节点的关键字进行分析,以获取所述第一代码文件的着色语言信息;根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译,得到第二着色语言对应的第二代码文件;其中,所述信息映射规则根据所述第一着色语言和所述第二着色语言的语法规则确定。
进一步可选地,所述映射规则,包括以下至少一种:所述第一着色语言和所述第二着色语言之间的变量映射规则;所述第一着色语言和所述第二着色语言之间的函数映射规则。
进一步可选地,处理器302还用于:从所述第一代码文件中,确定待处理的变量,所述待处理的变量的名称包含与翻译工具中的保留关键字相同的字符串;对所述待处理的变量的名称进行修改,以避免在所述第二代码文件中使用保留关键字作为变量名。
进一步可选地,所述待处理的变量,包括:名称为Buffer的全局传参变量、名称包含字符串Texture的变量以及名称包含字符串Buffer的变量中的至少一种。
进一步可选地,所述第一代码文件的着色语言信息,包括:所述第一代码文件中的全局传参变量的信息、所述第一代码文件中的资源的信息、所述第一代码文件中的结构体的信息以及所述第一代码文件中的函数的信息中的至少一种。
进一步可选地,处理器302在对所述抽象语法树中的多个节点的关键字进行分析,以获取所述第一代码文件的着色语言信息时,具体用于:针对所述多个节点中的任一节点,根据所述节点的类型关键字,确定所述节点对应的关键变量;对所述节点对应的关键变量进行解析,得到所述节点对应的着色语言信息;根据所述多个节点各自对应的着色语言信息,获取所述第一代码文件的着色语言信息。
进一步可选地,处理器302在对所述节点对应的关键变量进行分析,得到所述节点对应的着色语言信息时,具体用于:若所述节点的类型关键字为全局传参变量结构体,则对所述节点的子节点的类型变量和名称变量进行解析,得到所述全局传参变量结构体包含的全局传参变量的类型和名称;将所述全局传参变量结构体包含的全局传参变量的类型和名称保存在变量字典中。
进一步可选地,处理器302在对所述节点对应的关键变量进行分析,得到所述节点对应的着色语言信息时,具体用于:若所述节点的类型关键字包含表示资源的字符串,则解析所述节点的名称变量和寄存器分配变量,以获取所述资源的名称和寄存器地址;将所述资源的名称和寄存器地址,对应保存在资源字典中。
进一步可选地,所述资源包括:纹理资源、缓冲器资源以及寄存器资源中的至少一中。
进一步可选地,处理器302在对所述节点对应的关键变量进行分析,得到所述节点对应的着色语言信息时,具体用于:若所述节点的类型关键字为函数定义或函数声明,则解析所述节点的函数类型变量和名称变量,以获取所述节点对应的第一函数的返回类型和函数名;将所述第一函数的返回类型和函数名作为所述第一函数的信息,并将所述第一函数的信息保存在函数字典中。
进一步可选地,处理器302还用于:解析所述节点的函数参数变量的子节点的类型变量和名称变量,以获取所述第一函数的形参变量的类型和名称,并将所述第一函数的形参变量的类型和名称写入所述第一函数的信息;若所述第一函数的形参变量中,包括具有out或者inout属性的形参变量,则在所述第一函数的信息中,记录所述具有out或者inout属性的形参变量。
进一步可选地,处理器302还用于:获取所述节点的代码块变量的任一子节点对应的子树;若所述子树中的第一节点的类型为函数调用,则解析所述第一节点的名称变量和实参变量,得到所述第一节点对应的函数名以及传参信息;在所述函数字典中,查询与所述第一节点对应的函数名和传参信息对应的目标函数,作为所述第一函数的调用函数,并将所述调用函数写入所述第一函数的信息中。
进一步可选地,处理器302还用于:若所述子树中的第二节点使用了第一全局资源,则将所述第一全局资源的信息写入所述第一函数的信息中;所述第一全局资源包括纹理资源、缓冲器资源以及采样器资源中的至少一种;若所述子树中的第三节点使用了第一全局传参变量,则将所述第一全局传参变量的信息写入所述第一函数的信息中。
进一步可选地,处理器302还用于:从所述函数字典中确定入口函数;从所述入口函数开始,采用深度优先搜索的方式,搜索所述入口函数调用的每个函数;将搜索到的所述入口函数调用的函数,记录到目标函数集合中。
进一步可选地,处理器302在对所述多个节点各自的关键变量进行解析,以获取所述第一代码文件的着色语言信息时,具体用于:若所述节点的类型关键字为结构体定义,则解析所述节点的名称变量和类成员声明变量的子节点,以获取所述节点对应的第一结构体的名称和所述第一结构体包含的类成员的信息;将所述第一结构体的名称和所述第一结构体包含的类成员的信息保存在全局链表中。
进一步可选地,处理器302还用于:遍历所述函数字典,以从所述函数字典中确定入口函数;若所述第一结构体与所述入口函数的返回类型适配,则确定所述第一结构体为输出类型的结构体;若所述第一结构体与所述入口函数的形参变量的类型适配,则确定所述第一结构体为输入类型的结构体。
进一步可选地,处理器302在根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译时,具体用于:从所述全局链表中获取所述第一结构体;根据变量映射规则,对所述第一结构体中的变量进行翻译,以将所述第一结构体映射为符合第二着色语言的语法的第二结构体。
进一步可选地,处理器302在根据变量映射规则,对所述第一结构体中的变量进行翻译时,具体用于:若所述第一结构体为顶点着色器的输入类型的结构体,则设置映射得到的所述第二结构体中的变量的属性编号与所述第一结构体中的变量的属性编号一致;若所述第一结构体为顶点着色器的输出类型的结构体或者为片元着色器的输入类型的结构体,则将所述第一结构体中的属性为SV_POSITION的变量映射为所述第二结构体中的变量后,为映射得到的变量添加[[position]]标识;若所述第一结构体为片元着色器的输出类型的结构体,则将所述第一结构体中的属性为SV_Target的变量映射为所述第二结构体中的变量后,为映射得到的变量添加[[color]]标识,且同步所述属性为SV_Target的变量的编号。
进一步可选地,处理器302在根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译时,具体用于:将所述变量字典中的全局传参变量,映射为第一目标结构体的成员变量。
进一步可选地,处理器302在根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译时,具体用于:从所述目标函数集合中获取所述第一函数;根据所述变量映射规则和/或所述函数映射规则,对所述第一函数进行翻译,以将所述第一函数映射为符合所述第二着色语言的语法的第二函数。
进一步可选地,处理器302在根据所述第一函数的信息以及函数映射规则,对所述第一函数进行翻译时,具体用于:若所述第一函数不为入口函数,则在所述第二函数的返回类型之前添加inline关键字。
进一步可选地,处理器302在根据所述第一函数的信息以及函数映射规则,对所述第一函数进行翻译时,具体用于:若所述第一函数的信息中记录有具有out或者inout属性的形参变量,则在所述第二函数中生成第三结构体;根据所述具有out或者inout属性的形参变量的传参顺序,在所述第三结构体中依次定义至少一个形参变量;其中,所述至少一个形参变量的类型与所述具有out或者inout属性的形参变量的类型相同,且所述至少一个形参变量的名称设有输出参数前缀。
进一步可选地,处理器302还用于:从所述第一函数的信息中确定所述第一函数的返回类型;若所述第一函数的返回类型不为空,则在所述第三结构体内定义返回参数变量;所述返回参数变量与所述第一函数的返回类型相同。
进一步可选地,处理器302在根据所述第一函数的信息以及函数映射规则,对所述第一函数进行翻译时,具体用于:若根据所述第一函数的信息确定所述第一函数使用了所述第一全局传参变量,则在生成所述第二函数的形参信息时,将所述第一目标结构体作为所述第二函数的第一个形参;若根据所述第一函数的信息确定所述第一函数使用了所述第一全局资源,则在生成所述第二函数的形参信息时,将所述第一全局资源的信息放置在除所述第一目标结构体之外的其他形参之前。
进一步可选地,所述第一全局资源在所述第二函数的形参中的顺序为:缓冲器资源、纹理资源、采样器资源;其中,所述第一全局资源中的任一种全局资源内部的资源,依据资源对应的寄存器的大小进行排序。
进一步可选地,处理器302在根据所述第一函数的信息以及函数映射规则,对所述第一函数进行翻译时,具体用于:若所述第一函数为入口函数,则在所述入口函数的形参变量中,声明所述第一目标结构体、所述资源字典中的缓冲器资源、所述资源字典中的纹理资源以及所述资源字典中的采样器资源;其中,在所述第一目标结构体和所述缓冲器资源之后添加缓冲器标记,在所述纹理资源之后添加纹理标记,在所述采样器资源之后添加采样器标记。
进一步可选地,处理器302还用于执行以下至少一种操作:在所述第一函数的形参变量中,采用stage关键字标记输入类型的形参;若所述第一函数与顶点着色器对应,则在所述第一函数的返回类型前添加表示顶点的关键字;若所述第一函数与片元着色器对应,则在所述第一函数的返回类型前添加表示片元的关键字。
进一步可选地,所述第一代码文件为HLSL着色语言的代码文件;所述第二代码文件为Metal着色语言对应的代码文件。
进一步可选地,处理器302在根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译时,具体用于:将所述变量字典中的全局传参变量,映射为第二目标结构体的成员变量;定义统一变量块,并将所述第二目标结构体存储在所述统一变量块中;遍历所述抽象语法树,若遍历到的当前节点的名称与所述统一变量块中存储的任一全局传参变量的名称相同,则在所述当前节点的名称之前添加所述统一变量块的名称标识。
进一步可选地,处理器302还用于:从所述变量字典中获取所述全局传参变量结构体;采用layout设置所述全局传参变量结构体的set修饰符和binding修饰符。
进一步可选地,处理器302在根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译时,具体用于:从所述资源字典中获取任意一种待翻译的资源;采用layout设置所述待翻译的资源的binding修饰符,并在所述待翻译的资源的变量类型前添加uniform关键字;其中,所述binding修饰符的值根据所述待翻译的资源的寄存器的值确定。
进一步可选地,处理器302在对所述第一代码文件的着色语言信息进行翻译时,具体用于:从所述全局链表中获取所述第一结构体;根据变量映射规则,对所述第一结构体中的变量进行翻译,以将所述第一结构体映射为符合第二着色语言的语法的第二结构体;将所述第一结构体对应的输入类型以及输出类型,分别翻译为所述第二结构体的输入变量以及输出变量;若所述第一结构体为顶点着色器的输入类型的结构体,则对所述第二结构体中的输入变量采用layout关键字定义location修饰符,并在声明所述第二结构体中的输入变量时,在所述第二结构体中输入变量的类型前添加in关键字; 其中,所述location修饰符的值与所述第一结构体中的变量的属性编号一致;若所述第一结构体为顶点着色器的输出类型的结构体,则在翻译所述第一结构体时,采用保留关键字gl_Positon代替属性为SV_POSITION的变量;以及,在声明所述第二结构体中的输入变量时,在所述第二结构体中的输入变量的类型之前添加out关键字;若所述第一结构体为片元着色器的输入类型的结构体,则对所述第一结构体中具有SV_POSITION属性的变量进行翻译时,在layout中设置origin_upper_left修饰符,并在所述具有SV_POSITION属性的变量的变量类型之前添加in关键字,并设置变量名为gl_FragCoord;若所述第一结构体为片元着色器的输出类型的结构体,则对翻译得到的所述第二结构体中的输出变量采用layout关键字设置location修饰符,其中所述location修饰符的值与所述第一结构体中对应的变量的SV_Target属性编号一致,且在所述第二结构体中的输出变量的类型之前添加out关键字。
进一步可选地,处理器302在根据所述第一函数的信息以及函数映射规则,对所述第一函数进行翻译时,可执行以下至少一种操作:从所述目标函数集合中获取所述第一函数;根据所述变量映射规则和/或所述函数映射规则,对所述第一函数的信息进行翻译,以将所述第一函数映射为符合所述第二着色语言的语法的第二函数;若所述第一函数为资源读取函数,则在翻译得到的所述第二函数中,将被读取的资源的类型、被读取的资源的位置以及其他参数写在所述第二函数的函数体中;若所述第一函数为入口函数,则将所述第一函数映射得到的所述第二函数的返回值设为void。
进一步可选地,处理器302还用于:所述第一代码文件为HLSL着色语言的代码文件;所述第二代码文件为GLSL着色语言对应的代码文件。
进一步,如图3所示,该电子设备还包括:通信组件303、显示器304、电源组件305、音频组件306等其它组件。图3中仅示意性给出部分组件,并不意味着电子设备只包括图3所示组件。
其中,通信组件303被配置为便于通信组件所在设备和其他设备之间有线或无线方式的通信。通信组件所在设备可以接入基于通信标准的无线网络,如WiFi,2G、3G、4G或5G,或它们的组合。在一个示例性实施例中,通信组件经由广播信道接收来自外部广播管理系统的广播信号或广播相关信息。在一个示例性实施例中,通信组件可基于近场通信(NFC)技术、射频识别(RFID)技术、红外数据协会(IrDA)技术、超宽带(UWB)技术、蓝牙(BT)技术和其他技术来实现。
其中,显示组件304包括屏幕,其屏幕可以包括液晶显示器(LCD)和触摸面板(TP)。如果屏幕包括触摸面板,屏幕可以被实现为触摸屏,以接收来自用户的输入信号。触摸面板包括一个或多个触摸传感器以感测触摸、滑动和触摸面板上的手势。所述触摸传感器可以不仅感测触摸或滑动动作的边界,而且还检测与所述触摸或滑动操作相关的持续时间和压力。
其中,电源组件305,为电源组件所在设备的各种组件提供电力。电源组件可以包括电源管理系统,一个或多个电源,及其他与为电源组件所在设备生成、管理和分配电力相关联的组件。
本实施例,基于抽象语法树进行节点分析,保留了原着色语言的代码文件原有的语法结构。与此同时,基于节点的关键字进行分析,实现了不同类型的信息之间的对应翻译,有利于提升翻译结果的可读性;除此之外,信息映射规则可根据实际需求进行更新,提升了语言翻译方法的可拓展性,方便快速地支持新的着色语言语法。
相应地,本申请实施例还提供一种存储有计算机程序的计算机可读存储介质,计算机程序被执行时能够实现上述方法实施例中可由电子设备执行的各步骤。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
在一个典型的配置中,计算设备包括一个或多个处理器 (CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器 (RAM) 和/或非易失性内存等形式,如只读存储器 (ROM) 或闪存(flash RAM)。内存是计算机可读介质的示例。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存 (PRAM)、静态随机存取存储器 (SRAM)、动态随机存取存储器 (DRAM)、其他类型的随机存取存储器 (RAM)、只读存储器 (ROM)、电可擦除可编程只读存储器 (EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘 (DVD) 或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体 (transitory media),如调制的数据信号和载波。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。
Claims (22)
1.一种着色语言翻译方法,其特征在于,包括:
对第一平台的第一着色语言对应的第一代码文件进行语法分析以得到所述第一代码文件的抽象语法树;
对所述抽象语法树中的多个节点的类型关键字进行分析以确定所述多个节点各自对应的关键变量,并利用所述关键变量,获取所述第一代码文件的着色语言信息;
根据所述第一着色语言和第二平台的第二着色语言之间的变量映射规则和/或所述第一着色语言和所述第二着色语言之间的函数映射规则,对所述第一代码文件的着色语言信息进行翻译,以得到所述第二着色语言对应的第二代码文件;
其中,所述变量映射规则和所述函数映射规则根据所述第一着色语言和所述第二着色语言的语法规则确定。
2.根据权利要求1所述的方法,其特征在于,还包括:
从所述第一代码文件中确定待处理的变量,所述待处理的变量的名称包含与所述翻译工具中的保留关键字相同的字符串;
对所述待处理的变量的名称进行修改。
3.根据权利要求1所述的方法,其特征在于,所述第一代码文件的着色语言信息,包括:
所述第一代码文件中的全局传参变量的信息、所述第一代码文件中的资源的信息、所述第一代码文件中的结构体的信息以及所述第一代码文件中的函数的信息中的至少一种。
4.根据权利要求3所述的方法,其特征在于,利用所述关键变量,获取所述第一代码文件的着色语言信息,包括:
针对所述多个节点中的任一节点,若所述节点的类型关键字为全局传参变量结构体,则对所述节点的子节点的类型变量和名称变量进行解析,得到所述全局传参变量结构体包含的全局传参变量的类型和名称;
将所述全局传参变量结构体包含的全局传参变量的类型和名称保存在变量字典中。
5.根据权利要求4所述的方法,其特征在于,利用所述关键变量,获取所述第一代码文件的着色语言信息,包括:
若所述节点的类型关键字包含表示资源的字符串,则解析所述节点的名称变量和寄存器分配变量,以获取所述资源的名称和寄存器地址;
将所述资源的名称和寄存器地址,对应保存在资源字典中;
其中,所述资源包括:纹理资源、缓冲器资源以及寄存器资源中的至少一中。
6.根据权利要求5所述的方法,其特征在于,利用所述关键变量,获取所述第一代码文件的着色语言信息,包括:
若所述节点的类型关键字为函数定义或函数声明,则解析所述节点的函数类型变量和名称变量,以获取所述节点对应的第一函数的返回类型和函数名;
将所述第一函数的返回类型和函数名作为所述第一函数的信息,并将所述第一函数的信息保存在函数字典中。
7.根据权利要求6所述的方法,其特征在于,还包括:
解析所述节点的函数参数变量的子节点的类型变量和名称变量,以获取所述第一函数的形参变量的类型和名称,并将所述第一函数的形参变量的类型和名称写入所述第一函数的信息;
若所述第一函数的形参变量中,包括具有out或者inout属性的形参变量,则在所述第一函数的信息中,记录所述具有out或者inout属性的形参变量。
8.根据权利要求7所述的方法,其特征在于,还包括:
获取所述节点的代码块变量的任一子节点对应的子树;
若所述子树中的第一节点的类型为函数调用,则解析所述第一节点的名称变量和实参变量,得到所述第一节点对应的函数名以及传参信息;
在所述函数字典中,查询与所述第一节点对应的函数名和传参信息对应的目标函数,作为所述第一函数的调用函数,并将所述调用函数写入所述第一函数的信息中。
9.根据权利要求8所述的方法,其特征在于,还包括:
若所述子树中的第二节点使用了第一全局资源,则将所述第一全局资源的信息写入所述第一函数的信息中;所述第一全局资源包括纹理资源、缓冲器资源以及采样器资源中的至少一种;
若所述子树中的第三节点使用了第一全局传参变量,则将所述第一全局传参变量的信息写入所述第一函数的信息中。
10.根据权利要求9所述的方法,其特征在于,还包括:
从所述函数字典中确定入口函数;
从所述入口函数开始,采用深度优先搜索的方式,搜索所述入口函数调用的每个函数;
将搜索到的所述入口函数调用的函数,记录到目标函数集合中。
11.根据权利要求10所述的方法,其特征在于,利用所述关键变量,获取所述第一代码文件的着色语言信息,包括:
若所述节点的类型关键字为结构体定义,则解析所述节点的名称变量和类成员声明变量的子节点,以获取所述节点对应的第一结构体的名称和所述第一结构体包含的类成员的信息;
将所述第一结构体的名称和所述第一结构体包含的类成员的信息保存在全局链表中。
12.根据权利要求11所述的方法,其特征在于,还包括:
遍历所述函数字典,以从所述函数字典中确定入口函数;
若所述第一结构体与所述入口函数的返回类型适配,则确定所述第一结构体为输出类型的结构体;
若所述第一结构体与所述入口函数的形参变量的类型适配,则确定所述第一结构体为输入类型的结构体。
13.根据权利要求12所述的方法,其特征在于,根据设定的信息映射规则,对所述第一代码文件的着色语言信息进行翻译,包括:
从所述全局链表中获取所述第一结构体;
根据所述变量映射规则,对所述第一结构体中的变量进行翻译,以将所述第一结构体映射为符合第二着色语言的语法的第二结构体;
若所述第一结构体为顶点着色器的输入类型的结构体,则设置映射得到的所述第二结构体中的变量的属性编号与所述第一结构体中的变量的属性编号一致;
若所述第一结构体为顶点着色器的输出类型的结构体或者为片元着色器的输入类型的结构体,则将所述第一结构体中的属性为SV_POSITION的变量映射为所述第二结构体中的变量后,为映射得到的变量添加[[position]]标识;
若所述第一结构体为片元着色器的输出类型的结构体,则将所述第一结构体中的属性为SV_Target的变量映射为所述第二结构体中的变量后,为映射得到的变量添加[[color]]标识,且同步所述属性为SV_Target的变量的编号。
14.根据权利要求12所述的方法,其特征在于对所述第一代码文件的着色语言信息进行翻译,包括:
将所述变量字典中的全局传参变量,映射为第一目标结构体的成员变量。
15.根据权利要求14所述的方法,其特征在于,对所述第一代码文件的着色语言信息进行翻译,包括:
从所述目标函数集合中获取所述第一函数;
根据所述变量映射规则和/或所述函数映射规则,对所述第一函数进行翻译,以将所述第一函数映射为符合所述第二着色语言的语法的第二函数;
若所述第一函数不为入口函数,则在所述第二函数的返回类型之前添加inline关键字;
若所述第一函数的信息中记录有具有out或者inout属性的形参变量,则在所述第二函数中生成第三结构体;根据所述具有out或者inout属性的形参变量的传参顺序,在所述第三结构体中依次定义至少一个形参变量;其中,所述至少一个形参变量的类型与所述具有out或者inout属性的形参变量的类型相同,且所述至少一个形参变量的名称设有输出参数前缀;
若根据所述第一函数的信息确定所述第一函数的返回类型不为空,则在所述第三结构体内定义返回参数变量;所述返回参数变量与所述第一函数的返回类型相同;
若根据所述第一函数的信息确定所述第一函数使用了所述第一全局传参变量,则在生成所述第二函数的形参信息时,将所述第一目标结构体作为所述第二函数的第一个形参;
若根据所述第一函数的信息确定所述第一函数使用了所述第一全局资源,则在生成所述第二函数的形参信息时,将所述第一全局资源的信息放置在除所述第一目标结构体之外的其他形参之前;
若所述第一函数为入口函数,则在所述入口函数的形参变量中,声明所述第一目标结构体、所述资源字典中的缓冲器资源、所述资源字典中的纹理资源以及所述资源字典中的采样器资源;其中,在所述第一目标结构体和所述缓冲器资源之后添加缓冲器标记,在所述纹理资源之后添加纹理标记,在所述采样器资源之后添加采样器标记;
在所述第一函数的形参变量中,采用stage关键字标记输入类型的形参;
若所述第一函数与顶点着色器对应,则在所述第一函数的返回类型前添加表示顶点的关键字;
若所述第一函数与片元着色器对应,则在所述第一函数的返回类型前添加表示片元的关键字。
16.根据权利要求13-15任一项所述的方法,其特征在于,所述第一代码文件为HLSL着色语言的代码文件;所述第二代码文件为Metal着色语言对应的代码文件。
17.根据权利要求12所述的方法,其特征在于,对所述第一代码文件的着色语言信息进行翻译,包括:
将所述变量字典中的全局传参变量,映射为第二目标结构体的成员变量;
定义统一变量块,并将所述第二目标结构体存储在所述统一变量块中;
遍历所述抽象语法树,若遍历到的当前节点的名称与所述统一变量块中存储的任一全局传参变量的名称相同,则在所述当前节点的名称之前添加所述统一变量块的名称标识。
18.根据权利要求12所述的方法,其特征在于,还包括:
从所述变量字典中获取所述全局传参变量结构体;
采用layout设置所述全局传参变量结构体的set修饰符和binding修饰符。
19.根据权利要求12所述的方法,其特征在于,对所述第一代码文件的着色语言信息进行翻译,包括:
从所述资源字典中获取任意一种待翻译的资源;
采用layout设置所述待翻译的资源的binding修饰符,并在所述待翻译的资源的变量类型前添加uniform关键字;
其中,所述binding修饰符的值根据所述待翻译的资源的寄存器的值确定。
20.根据权利要求12所述的方法,其特征在于,对所述第一代码文件的着色语言信息进行翻译,包括:
从所述全局链表中获取所述第一结构体;
根据变量映射规则,对所述第一结构体中的变量进行翻译,以将所述第一结构体映射为符合第二着色语言的语法的第二结构体;
将所述第一结构体对应的输入类型以及输出类型,分别翻译为所述第二结构体的输入变量以及输出变量;
若所述第一结构体为顶点着色器的输入类型的结构体,则对所述第二结构体中的输入变量采用layout关键字定义location修饰符,并在声明所述第二结构体中的输入变量时,在所述第二结构体中输入变量的类型前添加in关键字; 其中,所述location修饰符的值与所述第一结构体中的变量的属性编号一致;
若所述第一结构体为顶点着色器的输出类型的结构体,则在翻译所述第一结构体时,采用保留关键字gl_Positon代替属性为SV_POSITION的变量;以及,在声明所述第二结构体中的输入变量时,在所述第二结构体中的输入变量的类型之前添加out关键字;
若所述第一结构体为片元着色器的输入类型的结构体,则对所述第一结构体中具有SV_POSITION属性的变量进行翻译时,在layout中设置origin_upper_left修饰符,并在所述具有SV_POSITION属性的变量的变量类型之前添加in关键字,并设置变量名为gl_FragCoord;
若所述第一结构体为片元着色器的输出类型的结构体,则对翻译得到的所述第二结构体中的输出变量采用layout关键字设置location修饰符,其中所述location修饰符的值与所述第一结构体中对应的变量的SV_Target属性编号一致,且在所述第二结构体中的输出变量的类型之前添加out关键字。
21.根据权利要求20所述的方法,其特征在于,根据所述第一函数的信息以及函数映射规则,对所述第一函数进行翻译,包括执行以下至少一种操作:
从所述目标函数集合中获取所述第一函数;
根据所述变量映射规则和/或所述函数映射规则,对所述第一函数的信息进行翻译,以将所述第一函数映射为符合所述第二着色语言的语法的第二函数;
若所述第一函数为资源读取函数,则在翻译得到的所述第二函数中,将被读取的资源的类型、被读取的资源的位置以及其他参数写在所述第二函数的函数体中;
若所述第一函数为入口函数,则将所述第一函数映射得到的所述第二函数的返回值设为void。
22.根据权利要求17-21任一项所述的方法,其特征在于,所述第一代码文件为HLSL着色语言的代码文件;所述第二代码文件为GLSL着色语言对应的代码文件。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010539681.4A CN111488155B (zh) | 2020-06-15 | 2020-06-15 | 着色语言翻译方法 |
PCT/CN2020/112548 WO2021253641A1 (zh) | 2020-06-15 | 2020-08-31 | 着色语言翻译方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010539681.4A CN111488155B (zh) | 2020-06-15 | 2020-06-15 | 着色语言翻译方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111488155A true CN111488155A (zh) | 2020-08-04 |
CN111488155B CN111488155B (zh) | 2020-09-22 |
Family
ID=71813475
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010539681.4A Active CN111488155B (zh) | 2020-06-15 | 2020-06-15 | 着色语言翻译方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN111488155B (zh) |
WO (1) | WO2021253641A1 (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112258411A (zh) * | 2020-10-22 | 2021-01-22 | 浙江大学 | 基于定义域和值域的函数近似的着色器自动滤波方法、装置和系统 |
WO2021253641A1 (zh) * | 2020-06-15 | 2021-12-23 | 完美世界(北京)软件科技发展有限公司 | 着色语言翻译方法 |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN117270962B (zh) * | 2023-11-22 | 2024-02-09 | 北京渲光科技有限公司 | 一种处理着色语言的方法、装置、存储介质及电子设备 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN105009082A (zh) * | 2013-03-06 | 2015-10-28 | 高通股份有限公司 | 减少过多的编译时间 |
US20160357532A1 (en) * | 2015-06-07 | 2016-12-08 | Apple Inc. | Graphics Engine And Environment For Encapsulating Graphics Libraries and Hardware |
CN106415496A (zh) * | 2014-05-30 | 2017-02-15 | 苹果公司 | 统一中间表示 |
CN110147235A (zh) * | 2019-03-29 | 2019-08-20 | 中国科学院信息工程研究所 | 一种源代码与二进制代码间的语义比对方法和装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8189004B2 (en) * | 2007-11-09 | 2012-05-29 | Lucasfilm Entertainment Company Ltd. | Translating Renderman shading language code |
CN111091612B (zh) * | 2019-10-09 | 2023-06-02 | 武汉凌久微电子有限公司 | 一种抽象目标码架构的着色语言机器码生成方法及装置 |
CN111488155B (zh) * | 2020-06-15 | 2020-09-22 | 完美世界(北京)软件科技发展有限公司 | 着色语言翻译方法 |
-
2020
- 2020-06-15 CN CN202010539681.4A patent/CN111488155B/zh active Active
- 2020-08-31 WO PCT/CN2020/112548 patent/WO2021253641A1/zh active Application Filing
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN105009082A (zh) * | 2013-03-06 | 2015-10-28 | 高通股份有限公司 | 减少过多的编译时间 |
CN106415496A (zh) * | 2014-05-30 | 2017-02-15 | 苹果公司 | 统一中间表示 |
US20160357532A1 (en) * | 2015-06-07 | 2016-12-08 | Apple Inc. | Graphics Engine And Environment For Encapsulating Graphics Libraries and Hardware |
CN107771319A (zh) * | 2015-06-07 | 2018-03-06 | 苹果公司 | 封装图形库和硬件的图形引擎和环境 |
CN110147235A (zh) * | 2019-03-29 | 2019-08-20 | 中国科学院信息工程研究所 | 一种源代码与二进制代码间的语义比对方法和装置 |
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021253641A1 (zh) * | 2020-06-15 | 2021-12-23 | 完美世界(北京)软件科技发展有限公司 | 着色语言翻译方法 |
CN112258411A (zh) * | 2020-10-22 | 2021-01-22 | 浙江大学 | 基于定义域和值域的函数近似的着色器自动滤波方法、装置和系统 |
CN112258411B (zh) * | 2020-10-22 | 2021-07-13 | 浙江大学 | 基于定义域和值域的函数近似的着色器自动滤波方法、装置和系统 |
Also Published As
Publication number | Publication date |
---|---|
WO2021253641A1 (zh) | 2021-12-23 |
CN111488155B (zh) | 2020-09-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111488155B (zh) | 着色语言翻译方法 | |
US20070033520A1 (en) | System and method for web page localization | |
CN110502227B (zh) | 代码补全的方法及装置、存储介质、电子设备 | |
CN109491658A (zh) | 计算机可执行代码数据的生成方法及装置 | |
CN111176650B (zh) | 解析器生成方法、检索方法、服务器及存储介质 | |
CN113010169A (zh) | 用于将ui图转换成代码文件的方法和装置 | |
CN115202626A (zh) | 一种支持多技术栈组件的低代码前端开发方法 | |
CN110727482A (zh) | 一种界面的更新方法和装置 | |
CN113051002A (zh) | 数据编辑方法、设备及存储介质 | |
CN111125216A (zh) | 数据导入Phoenix的方法及装置 | |
CN113821496B (zh) | 数据库迁移方法、系统、设备及计算机可读存储介质 | |
CN114064601B (zh) | 存储过程转换方法、装置、设备和存储介质 | |
CN112445492B (zh) | 一种基于antlr4的源码翻译方法 | |
CN107577476A (zh) | 一种基于模块划分的安卓系统源码差异性分析方法、服务器及介质 | |
CN113779311A (zh) | 一种数据处理的方法、装置和存储介质 | |
CN111443979B (zh) | 文档处理方法、装置、计算机设备及存储介质 | |
CN115618887B (zh) | 动态长文本国际化方法、装置、设备及存储介质 | |
CN116756196B (zh) | 一种快速编辑Makefile文件的方法和插件 | |
CN114896273B (zh) | 一种兼容存储过程的sql语句配置方法、设备及存储介质 | |
CN116521169A (zh) | 代码处理方法、设备、存储介质及程序产品 | |
CN114385664A (zh) | 一种单体项目微服务的拆分方法、系统、装置及存储介质 | |
CN114168189A (zh) | 一种Vue项目代码的翻译方法、设备及介质 | |
CN117669509A (zh) | 一种报告生成方法、装置及设备 | |
CN117472381A (zh) | 应用的代码处理方法、装置、设备及存储介质 | |
CN116755700A (zh) | 一种数据收集方法、装置及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
EE01 | Entry into force of recordation of patent licensing contract | ||
EE01 | Entry into force of recordation of patent licensing contract |
Application publication date: 20200804 Assignee: Beijing Xuanguang Technology Co.,Ltd. Assignor: Perfect world (Beijing) software technology development Co.,Ltd. Contract record no.: X2022990000254 Denomination of invention: Coloring language translation method Granted publication date: 20200922 License type: Exclusive License Record date: 20220610 |