CN114077433A - 一种跨平台模块化的着色器语言通用集成方法 - Google Patents

一种跨平台模块化的着色器语言通用集成方法 Download PDF

Info

Publication number
CN114077433A
CN114077433A CN202111371752.5A CN202111371752A CN114077433A CN 114077433 A CN114077433 A CN 114077433A CN 202111371752 A CN202111371752 A CN 202111371752A CN 114077433 A CN114077433 A CN 114077433A
Authority
CN
China
Prior art keywords
shader
macro definition
platform
file
parser
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
Application number
CN202111371752.5A
Other languages
English (en)
Other versions
CN114077433B (zh
Inventor
刘歆宁
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Dalian Neusoft University of Information
Original Assignee
Dalian Neusoft University of Information
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Dalian Neusoft University of Information filed Critical Dalian Neusoft University of Information
Priority to CN202111371752.5A priority Critical patent/CN114077433B/zh
Publication of CN114077433A publication Critical patent/CN114077433A/zh
Application granted granted Critical
Publication of CN114077433B publication Critical patent/CN114077433B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/427Parsing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects

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

本发明公开了一种跨平台模块化的着色器语言通用集成方法,包括,定义宏定义解析文件的格式与语法,创建宏定义解析文件;创建语法解析器Shader‑X,使用Shader‑X解析器预编译着色器文件;解析宏定义解析文件,生成宏定义结果集合,根据宏定义结果集合生成宏定义结果有序列表;分别计算宏定义结果有序列表的哈希值,分别根据宏定义结果生成宏定义结果所对应平台的着色器文件,通过Shader‑X解析器将着色器文件预编译为二进制文件,并通过宏定义结果的哈希值以及平台对二进制文件进行标记;渲染程序根据宏定义结果有序列表的哈希值以及平台,定位二进制文件并执行。实现同一着色器代码可在不同平台使用,无需在线编译,支持模块化编程方案,提高着色器编程效率。

Description

一种跨平台模块化的着色器语言通用集成方法
技术领域
本发明涉及图像渲染技术领域,尤其涉及一种跨平台模块化的着色器语言通用集成方法。
背景技术
图像渲染是将三维的光能传递处理转换为一个二维图像的过程。场景和实体用三维形式表示,更接近于现实世界,便于操纵和变换,而图形的显示设备大多是二维的光栅化显示器和点阵化打印机。从三维实体场景的表示N维光栅和点阵化的表示就是图像渲染——即光栅化。光栅显示器可以看作是一个像素矩阵,在光栅显示器上显示的任何一个图形,实际上都是一些具有一种或多种颜色和灰度象素的集合。
着色器语言Shader Language目前主要有3种语言:基于OpenGL的OpenGL ShadingLanguage,简称GLSL;基于DirectX的High Level Shading Language,简称HLSL;还有Metal语言,具体如下:
OpenGL(全写Open Graphics Library)是一个定义了跨编程语言、跨平台的编程接口规格的专业图形程序接口。它用于三维图像(二维亦可),是一个功能强大,调用方便的底层图形库。
DirectX(Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM。被广泛适用于Microsoft Windows、Microsoft XBOX、MicrosoftXBOX 360和Microsoft XBOX ONE电子游戏开发,并且只能支持这些平台。
Metal提供对图形处理器(GPU)的接近直接访问,能最大程度地发挥iOS、macOS和Apple tvOS app中的图形和计算潜能。Metal构建于易用的低开销架构之上,而且提供预编译的GPU着色器和精细的资源控制,并支持多线程处理。目前,在图像渲染API中,不同平台分别对应了不同的着色器语言(Shader Language),这些着色语言不兼容,如:Windows平台使用DirectX,其他平台基本都是基于OpenGL,移动端平台出于性能考虑使用GLSL的一个子集——GLES,除此之外,Metal及Vulkan等API也应运而生。如此众多的图形API接口都提供了各自的着色器语言,在进行跨平台开发时,同一个功能需要针对多个平台编写多份着色器程序,使得编程效率低下。
为了解决跨平台的渲染问题,目前比较主流的的解决方案为编写GLSL程序,再利用glslang编译器将GLSL编译成一种“中间表示语言”SPIR-V,再利用SPIRV-Cross反编译为各个平台的可使用的Shader,如GLSL/HLSL/MSL等。此方案利用SPIR-V作为中间语言编写一份着色器程序,以实现跨平台。
现有技术存在以下缺陷:第一,将GLSL编译成SPIR-V有使用限制,即在实际的使用过程中,着色器需要根据宏定义设置参数,那么着色器程序只能根据传入的宏定义在线编译生成SPIR-V,然后再反编译为各个平台对应的Shader,这就需要有在线编译和反编译两个步骤,这使得整个渲染过程非常耗时,在渲染引擎中经常是无法直接使用的。第二,着色器不支持如C/C++这种高级语言的模块引入语法,这就导致在编写着色器时,底层共通的代码段不得不分布在各个着色器中,导致程序规模扩大时,难以维护。无法做到模块通用性。
发明内容
本发明提供一种跨平台模块化的着色器语言通用集成方法,以克服上述技术问题。
一种跨平台模块化的着色器语言通用集成方法,其特征在于,包括以下步骤,
步骤一,定义宏定义解析文件的格式与语法,创建宏定义解析文件;
步骤二,创建语法解析器Shader-X,使用Shader-X解析器预编译着色器文件,所述Shader-X解析器包括着色器语法以及预编译指令;
步骤三,解析宏定义解析文件,生成宏定义结果集合,根据宏定义结果集合生成宏定义结果有序列表;
步骤四,分别计算宏定义结果有序列表的哈希值,分别根据宏定义结果生成宏定义结果所对应平台的着色器文件,通过Shader-X解析器将着色器文件预编译为二进制文件,并通过宏定义结果有序列表的哈希值以及平台对二进制文件进行标记;
所述根据宏定义结果生成宏定义结果所对应平台的着色器文件是指首先通过GLSLang编译器将GLSL程序编译成SPIR-V文件,然后通过SPIRV-Cross生成平台所对应的着色器文件,
所述平台包括且不限于Windows平台、iOS平台、macOS平台;
步骤五,渲染程序根据宏定义结果的哈希值以及平台,定位二进制文件并执行,所述定位二进制文件是根据宏定义结果有序列表的哈希值以及平台匹配相应的二进制文件。
优选地,所述通过Shader-X解析器将着色器文件预编译为二进制文件还包括根据预编译指令进行模块引入和模块引入重复性检查,所述预编译指令包括模块引入的指令以及模块引入重复性检查的指令,所述模块引入是指通过模块引入的指令#include调用具有特定功能的模块,所述模块引入重复性检查是指通过模块引入重复性检查的指令#pragmaonce检查所引入模块是否重复引用。
本发明提供一种跨平台模块化的着色器语言通用集成方法,具有以下效果,
第一,建立宏定义预编译解析方案,并结合哈希值生成技术,实现同一套着色器代码可在不同平台使用,无需在线编译,即达到跨平台的目的,又提高了渲染性能,还使得渲染程序更加灵活。
第二,创建语法解析器Shader-X以支持模块化的编程方案,提高着色器编程效率
第三,模拟C++的预编译方式,并应用在着色器的语法解析上,让着色器可以支持更高级的语法。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明方法流程图。
具体实施方式
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为本发明方法流程图,如图1所示,本实施例的方法可以包括:
一种跨平台模块化的着色器语言通用集成方法,实现实时跨平台模块化的着色器语言通用集成方案,以宏定义预编译的方式结合自定义模块化的语法解析器,形成性能更加优越、设计更加灵活的着色器语言通用集成方案,包括以下步骤,
步骤一,定义宏定义解析文件的格式与语法,创建宏定义解析文件;
创建宏定义解析文件,例如创建一个ShaderLists.txt文件,文件中记录需要进行转换的Shader文件路径、支持的宏Macro以及宏定义的值Macro Value,具体格式如下所示:
Figure BDA0003362501680000041
其中“*”后是需要使用的编译文件,“>”所在行列出的是支持的Macro,其后的每一个新行对应了不同的宏定义版本,可以定义多组以支持不同的平台。
在进行解析时,只解析支持的宏,遇到声明的宏定义不在支持列表中,不进行解析。
以MAX_NUM_LIGHTS 5,CHROMAKEY为例,通过“,”分割成两个宏定义,其预编译后对应的代码如下所示:
#define MAX_NUM_LIGHTS 5
#define CHROMAKEY
步骤二,创建语法解析器Shader-X,使用Shader-X解析器预编译着色器文件,所述Shader-X解析器包括着色器语法以及预编译指令;
创建语法解析器Shader-X,是在原有Shader语法基础上,添加新的语法解析器Shader-X,它在原有的Shader语法基础上,仿照C++添加了自定义预编译指令“#include”和“#pragma once”,其中“#include”表示引用其它模块文件,“#prgama once”表示如果遇到重复的模块引用,只展开一次。
步骤三,解析宏定义解析文件,生成宏定义结果集合,根据宏定义结果集合生成宏定义结果有序列表;
本实施例根据宏定义,将每组宏定义结果生成宏定义结果有序列表,再通过遍历此列表利用MetroHash生成64bit哈希值,保证每一组宏定义即使顺序不一致也都能对应唯一的哈希值,可以在文件名上可以进行区分,具有不同宏定义的GLSL文件经过预编译和反编译,将生成带有哈希值的程序文件,
例如:“MAX_NUM_LIGHTS 5,CHROMAKEY”的这组宏定义,通过哈希算法转化为哈希值为5d3887577ec22ee2,在通过SPIRV-Cross生成不同平台版本的着色器文件时,分别针对不同平台,在着色器文件命名时先加上各个平台的简称,如:gles\glsl\hlsl\msl等,同时每个平台对应一个顶点和边的着色器文件,最后就形成了如表(1)所示的文件名列表:
表1着色器文件名列表
Figure BDA0003362501680000051
同时,本实施例也支持没有宏定义的方式,如下所示:
gles.textured.vert/gles.textured.frag
步骤四,分别计算宏定义结果有序列表的哈希值,分别根据宏定义结果生成宏定义结果所对应平台的着色器文件,通过Shader-X解析器将着色器文件预编译为二进制文件,并通过宏定义结果有序列表的哈希值以及平台对二进制文件进行标记;
所述根据宏定义结果生成宏定义结果所对应平台的着色器文件是指首先通过GLSLang编译器将GLSL程序编译成SPIR-V文件,然后通过SPIRV-Cross生成平台所对应的着色器文件,
所述平台包括且不限于Windows平台、iOS平台、macOS平台;
将解析出的多组宏定义结果传入编译器,使其分别编译成不同版本的SPIR-V文件,如表(1)中的示例所示:共定义了3组宏定义版本,需要编译成3组SPIR-V对应文件,然后通过SPIRV-Cross生成不同平台版本的着色器文件。这3组着色器文件必须可以区分开,否则实际使用时,不同的平台无法针对不同的宏定义进行选择。
步骤五,渲染程序根据宏定义结果的哈希值以及平台,定位二进制文件并执行,所述定位二进制文件是根据宏定义结果有序列表的哈希值以及平台匹配相应的二进制文件。
将文件编译成不同平台的二进制文件供渲染程序使用,渲染程序根据程序中的宏定义生成相应的哈希值,此哈希值与预编译时采用哈希算法生成的文件名中哈希值一致,结合对应平台,可以直接定位相应的文件并执行,并且无需在线编译,提高了性能。其中,为保证每一组宏定义对应的哈希值一致,需要预先将每一组宏定义按照一定顺序进行排序,再将其转换为哈希值。
进一步地,可将上述执行过程编写成脚本,即可进行批量处理,提高预编译效率,如下所示。
Figure BDA0003362501680000061
通过Shader-X解析器将着色器文件预编译为二进制文件还包括根据预编译指令进行模块引入和模块引入重复性检查,所述预编译指令包括模块引入的指令以及模块引入重复性检查的指令,所述模块引入是指通过模块引入的指令#include调用具有特定功能的模块,所述模块引入重复性检查是指通过模块引入重复性检查的指令#pragma once检查所引入模块是否重复引用。
利用ShaderX语法解析器对Shader文件进行预编译,遇到#include和#pragmaonce这两条指令,则将模块内容在当前文件展开,如果遇到#pragma once,则检查模块重复引用,防止编译错误。此模块化的方案使得shader支持了高级语言才有的模块引入和重复性检查功能,提高了Shader的模块化,以例子进一步说明,编写了一个模块化文件blending_func.frag,如下所示:
Figure BDA0003362501680000071
Figure BDA0003362501680000081
这个模块文件需要在多个Shader中使用,传统的方式必须在需要此代码在每个文件中都进行添加,不利于模块化和代码维护。使用本方案自定义的ShaderX预编译器先进行解析,那么引用模块的文件可写成如下形式:
#include"blending_func.frag"
void main()
{
}
在开发渲染框架时,通常会内置一些通用模块,可让开发者更容易的进行开发,对于这种内置模块,本方案定义了一套新的协议,根据模块功能的不同定义不同的协议,比如对于引擎部分,定义engine://module1.frag,对于SDK部分,定义sdk://module1.frag。在解析#include模块时,首先检查协议格式,如果满足"(.*://)"这样的正则表达式,就引用内置模块,根据协议去查找对应的模块,否则就引用的自定义模块。
整体有的有益效果:本发明提供一种跨平台模块化的着色器语言通用集成方法,具有以下效果,
第一,建立宏定义预编译解析方案,并结合哈希值生成技术,实现同一套着色器代码可在不同平台使用,无需在线编译,即达到跨平台的目的,又提高了渲染性能,还使得渲染程序更加灵活。
第二,创建语法解析器Shader-X以支持模块化的编程方案,提高着色器编程效率
第三,模拟C++的预编译方式,并应用在着色器的语法解析上,让着色器可以支持更高级的语法。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

Claims (2)

1.一种跨平台模块化的着色器语言通用集成方法,其特征在于,包括以下步骤,
步骤一,定义宏定义解析文件的格式与语法,创建宏定义解析文件;
步骤二,创建语法解析器Shader-X,使用Shader-X解析器预编译着色器文件,所述Shader-X解析器包括着色器语法以及预编译指令;
步骤三,解析宏定义解析文件,生成宏定义结果集合,根据宏定义结果集合生成宏定义结果有序列表;
步骤四,分别计算宏定义结果有序列表的哈希值,分别根据宏定义结果生成宏定义结果所对应平台的着色器文件,通过Shader-X解析器将着色器文件预编译为二进制文件,并通过宏定义结果有序列表的哈希值以及平台对二进制文件进行标记;
所述根据宏定义结果生成宏定义结果所对应平台的着色器文件是指首先通过GLSLang编译器将GLSL程序编译成SPIR-V文件,然后通过SPIRV-Cross生成平台所对应的着色器文件,
所述平台包括且不限于Windows平台、iOS平台、macOS平台;
步骤五,渲染程序根据宏定义结果的哈希值以及平台,定位二进制文件并执行,所述定位二进制文件是根据宏定义结果有序列表的哈希值以及平台匹配相应的二进制文件。
2.根据权利要求1所述的一种跨平台模块化的着色器语言通用集成方法,其特征在于,所述通过Shader-X解析器将着色器文件预编译为二进制文件还包括根据预编译指令进行模块引入和模块引入重复性检查,所述预编译指令包括模块引入的指令以及模块引入重复性检查的指令,所述模块引入是指通过模块引入的指令#include调用具有特定功能的模块,所述模块引入重复性检查是指通过模块引入重复性检查的指令#pragma once检查所引入模块是否重复引用。
CN202111371752.5A 2021-11-18 2021-11-18 一种跨平台模块化的着色器语言通用集成方法 Active CN114077433B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111371752.5A CN114077433B (zh) 2021-11-18 2021-11-18 一种跨平台模块化的着色器语言通用集成方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111371752.5A CN114077433B (zh) 2021-11-18 2021-11-18 一种跨平台模块化的着色器语言通用集成方法

Publications (2)

Publication Number Publication Date
CN114077433A true CN114077433A (zh) 2022-02-22
CN114077433B CN114077433B (zh) 2024-05-03

Family

ID=80283972

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111371752.5A Active CN114077433B (zh) 2021-11-18 2021-11-18 一种跨平台模块化的着色器语言通用集成方法

Country Status (1)

Country Link
CN (1) CN114077433B (zh)

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20130063757A (ko) * 2011-12-07 2013-06-17 한국과학기술연구원 중간 언어 변환 방법과 그를 위한 시스템 및 컴퓨터로 읽을 수 있는 기록매체
US8854368B1 (en) * 2011-04-05 2014-10-07 Google Inc. Point sprite rendering in a cross platform environment
CN105446704A (zh) * 2014-06-10 2016-03-30 北京畅游天下网络技术有限公司 一种着色器的解析方法和装置
CN106445625A (zh) * 2016-09-23 2017-02-22 网易(杭州)网络有限公司 一种待编译代码的预处理方法及装置
CN108874396A (zh) * 2018-05-31 2018-11-23 苏州蜗牛数字科技股份有限公司 基于hlsl的多平台多目标语言的交叉编译器及编译方法
CN110517343A (zh) * 2019-08-11 2019-11-29 西藏宁算科技集团有限公司 一种基于OpenGL着色语言的程序式纹理的优化方法和系统
CN110865815A (zh) * 2019-11-12 2020-03-06 广州泳泳信息科技有限公司 一种shader语言多平台编译发布系统及方法
CN112612459A (zh) * 2020-12-28 2021-04-06 广州引力波信息科技有限公司 一种跨平台着色器语言配置方法

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8854368B1 (en) * 2011-04-05 2014-10-07 Google Inc. Point sprite rendering in a cross platform environment
KR20130063757A (ko) * 2011-12-07 2013-06-17 한국과학기술연구원 중간 언어 변환 방법과 그를 위한 시스템 및 컴퓨터로 읽을 수 있는 기록매체
CN105446704A (zh) * 2014-06-10 2016-03-30 北京畅游天下网络技术有限公司 一种着色器的解析方法和装置
CN106445625A (zh) * 2016-09-23 2017-02-22 网易(杭州)网络有限公司 一种待编译代码的预处理方法及装置
CN108874396A (zh) * 2018-05-31 2018-11-23 苏州蜗牛数字科技股份有限公司 基于hlsl的多平台多目标语言的交叉编译器及编译方法
CN110517343A (zh) * 2019-08-11 2019-11-29 西藏宁算科技集团有限公司 一种基于OpenGL着色语言的程序式纹理的优化方法和系统
CN110865815A (zh) * 2019-11-12 2020-03-06 广州泳泳信息科技有限公司 一种shader语言多平台编译发布系统及方法
CN112612459A (zh) * 2020-12-28 2021-04-06 广州引力波信息科技有限公司 一种跨平台着色器语言配置方法

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
张忆楠;严正;姚莉;: "实时渲染引擎架构", 中兴通讯技术, no. 03, 18 April 2013 (2013-04-18) *
陈月华;郑春辉;韩纪庆;: "实时渲染应用程序中着色器的管理和控制", 哈尔滨工业大学学报, no. 03, 15 March 2009 (2009-03-15) *

Also Published As

Publication number Publication date
CN114077433B (zh) 2024-05-03

Similar Documents

Publication Publication Date Title
CN100507852C (zh) 用于优化流处理程序的方法、装置和系统
KR100742419B1 (ko) 애셋을 렌더링하는 쉐이더 구동 컴파일을 실행하는 시스템들 및 방법들
US9495722B2 (en) Developer controlled layout
JPH08202545A (ja) ターゲット言語コードを生成するためのオブジェクト指向システム及びその方法
CN107038060B (zh) 一种页面着色器代码调试方法、装置
US7463259B1 (en) Subshader mechanism for programming language
US20140359585A1 (en) Method and device for compiling a source program
US20060174233A1 (en) Method and system for assessing performance of a video interface using randomized parameters
US20030122872A1 (en) Graphics computer programming language for the creation of interactive virtual world
WO2023016480A1 (zh) 一种硬件内存序架构下的代码处理方法及相应装置
US7852341B1 (en) Method and system for patching instructions in a shader for a 3-D graphics pipeline
CN113031932A (zh) 项目开发方法、装置、电子设备及存储介质
Kosarevsky et al. 3D Graphics Rendering Cookbook: A comprehensive guide to exploring rendering algorithms in modern OpenGL and Vulkan
US20190171466A1 (en) Method and system for multiple embedded device links in a host executable
CN114077433B (zh) 一种跨平台模块化的着色器语言通用集成方法
CN116863052A (zh) 基于分布式操作系统绘制地图的方法及装置
CN114359454A (zh) 一种图形绘制设备、方法及装置
CN115454438A (zh) 基于对照表的hlsl着色器源码转换为glsl着色器源码的方法
CN114943795A (zh) 模型的渲染方法、装置、电子设备及存储介质
Joshi et al. Graphics programming for the web
Montag et al. Bringing together dynamic geometry software and the graphics processing unit
Malle et al. The need for speed of ai applications: Performance comparison of native vs. browser-based algorithm implementations
CN117632215A (zh) 基于ipc技术既有软件新增并行引擎的升级方法
US20230306670A1 (en) Game Engine-Based Shading Data Processing Method And Apparatus, And Electronic Device
CN115631087A (zh) 基于国产SW处理器的Blender移植方法

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