首页> 中国专利> 用于统一应用编程接口和模型的系统和方法

用于统一应用编程接口和模型的系统和方法

摘要

本发明公开了用于统一编程接口和语言的系统、计算机可读介质和方法。在一个实施方案中,所述统一编程接口和语言辅助程序开发者写入多线程程序,所述多线程程序可在GPU上执行图形和数据并行计算处理两者。相同的GPU编程语言模型可用来描述图形着色器和计算内核两者,并且相同的数据结构和资源可用于图形和计算操作两者。开发者可高效地使用多线程来并行创建并提交命令缓冲区。

著录项

  • 公开/公告号CN106462393A

    专利类型发明专利

  • 公开/公告日2017-02-22

    原文格式PDF

  • 申请/专利权人 苹果公司;

    申请/专利号CN201580028375.1

  • 发明设计人 R·W·施雷耶尔;K·C·德凯;A·K·坎;

    申请日2015-04-30

  • 分类号G06F9/30(20060101);G06F9/52(20060101);G06T1/20(20060101);

  • 代理机构中国国际贸易促进委员会专利商标事务所;

  • 代理人李晓芳

  • 地址 美国加利福尼亚

  • 入库时间 2023-06-19 01:44:06

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2019-06-18

    授权

    授权

  • 2017-03-22

    实质审查的生效 IPC(主分类):G06F9/30 申请日:20150430

    实质审查的生效

  • 2017-02-22

    公开

    公开

说明书

版权声明

本专利文档的公开内容的一部分包含受(版权或光罩作品)保护的材料。由于本专利文档或本专利公开内容出现在专利与商标局专利文件或记录中,因此(版权或光罩作品)所有者不反对任何人对本专利文档或本专利公开内容进行复制,但会以其他方式保留任何形式的所有(版权或光罩作品)权利。

背景技术

本公开整体涉及计算机编程领域。更具体地讲,但以非限制的方式,本公开涉及一种用于对内核进行编程以在图形处理器单元上执行的编程接口和语言。

图形处理器单元(GPU)对于处理数据并行图形任务来说已经变得越来越重要。开发者也已经认识到非图形数据并行任务可通过GPU利用其大规模并行能力来处理。供应商和标准化组织已经创建了使图形数据并行任务更易于编程的应用编程接口(API)。类似地,供应商和标准化组织已经创建了使非图形数据并行任务更易于编程的不同API。然而,这些高级别API已经导致了性能下降,以及由于需要针对每种类型的任务使用不同的API而使组合图形和计算数据并行任务变得不太方便。

发明内容

在一个实施方案中,提供了一种非暂态计算机可读介质,该非暂态计算机可读介质包括存储在其上以支持图形处理单元(GPU)的图形和数据并行计算工作量两者的指令。存储在计算机可读介质上的指令在被执行时可使得一个或多个处理器创建命令缓冲区,其中命令缓冲区包含已编码命令,并且已编码命令表示GPU可执行并且在提交命令缓冲区用于执行之前被存储在命令缓冲区中的原生命令格式。指令在被执行时还可使得一个或多个处理器将一个或多个命令缓冲区附加到命令队列并且将命令缓冲区提交给GPU用于执行。在一个实施方案中,执行命令缓冲区的顺序由命令队列中的一个或多个命令缓冲区的顺序确定。

在另一个实施方案中,提供了一种装置,该装置包括:包括CPU和GPU的处理设备;存储器;以及嵌入在处理设备中的处理器,该处理器被配置为执行存储在存储器中的程序代码。程序代码可被配置为将命令缓冲区创建为单次使用对象,该命令缓冲区包含已编码命令,其中该已编码命令表示GPU可执行并且在提交命令缓冲区用于执行之前被存储在命令缓冲区中的原生命令格式。程序代码还可被配置为将一个或多个命令缓冲区附加到命令队列,并且将命令缓冲区提交给GPU用于执行。在一个实施方案中,执行命令缓冲区的顺序由命令队列中的一个或多个命令缓冲区的顺序确定。

在另一个实施方案中,提供了一种用于支持GPU的图形和数据并行计算工作量两者的方法。该方法包括将命令缓冲区创建为单次使用对象,该命令缓冲区包含已编码命令,其中该已编码命令表示GPU可执行并且在提交命令缓冲区用于执行之前被存储在命令缓冲区中的原生命令格式。该方法还可包括将一个或多个命令缓冲区附加到命令队列,以及将命令缓冲区提交给GPU用于执行。执行命令缓冲区的顺序可由命令队列中的一个或多个命令缓冲区的顺序确定。

附图说明

图1是示出了根据一个实施方案的程序的编译、链接和执行的框图。

图2是示出了根据一个实施方案用于在图形处理器单元上执行程序的计算机系统的框图。

图3是示出了根据一个实施方案用于编译和链接程序的计算机系统的框图。

图4是示出了根据一个实施方案的网络化系统的框图。

图5A-5D是示出了根据一个实施方案的命令模型对象之间的关系的框图。

图6是示出了根据一个实施方案的命令提交模型的组织的框图。

图7是示出了根据一个实施方案的多线程命令模型的组织的框图。

具体实施方式

图形处理器单元(GPU)是被设计成快速操纵并改变存储器以在帧缓冲区中加速创建旨在输出到显示器的图像的专用电子电路。GPU高效地操纵计算机图形并且具有高度并行结构,该高度并行结构使得GPU比其中大的数据块的处理是并行进行的通用计算机处理器(CPU)更高效。除了用于图形处理之外,GPU还用于非图形并行处理,有时称为“计算处理”。

下文更详细描述的实施方案允许软件开发者使用统一编程接口和语言来准备应用程序,该统一编程接口和语言被设计成协助开发者写入可在GPU上执行图形和数据并行计算(非图形)处理两者的高效多线程程序。开发者能够更加高效地整合图形和计算任务并且不需要学习和使用多个单独或冗余框架也不需要按命令应当被执行的顺序来编码命令。

在一个实施方案中,相同的GPU编程语言模型可用于描述图形着色器和计算内核两者,这是因为相同的数据结构和资源可用于图形和计算操作两者。开发者可高效地使用多线程来并行创建并提交命令缓冲区。

在以下描述中,出于说明目的,陈述大量特定细节以便提供对本发明的透彻理解。然而,本领域中的技术人员应当明白可在不具有这些特定细节的情况下实践本发明。在其他情况下,以框图形式示出结构和设备以避免使本发明模糊。对无下标或后缀的数字的引用被理解为引用与所引用的数字相对应的下标和后缀的所有实例。此外,本公开中所使用的语言已主要被选择用于可读性和指导性目的,并且可能没有被选择为划定或限定本发明的主题,从而诉诸于所必需的权利要求以确定此类发明主题。说明书中对“一个实施方案”或对“实施方案”的引用意指结合该实施方案描述的特定特征、结构或特性包括在本发明的至少一个实施方案中,并且对“一个实施方案”或“实施方案”的多次引用不应当被理解为一定都指同一实施方案。

如本文所用,术语“计算机系统”可指代单台计算机或一起工作来执行被描述为在计算机系统上执行或由计算机系统执行的功能的多台计算机。类似地,机器可读介质可指代单个物理介质或可一起包含存储在其上的指定信息的多个介质。处理器可指代在单个芯片上或多个处理芯片上实施的单个处理元件或多个处理元件。

应当理解,在任何实际具体实施的开发中(如在任何开发项目中那样),必须要作出许多决策以实现开发者的特定目标(如,符合与系统和商务相关的约束条件),并且这些目标可在不同具体实施之间变化。还应当理解,此类开发努力可能是复杂且耗时的,但是尽管如此仍将是受益于本公开的普通技术人员在设计并实施应用编程接口中的一项常规任务。

现在转到图1,以框图形式示出了根据一个实施方案的开发者计算机系统100和目标计算机系统105。开发者可在统一编程接口110中创建并提交源代码,该源代码可为GPU专用编程语言。统一编程接口110可提供单个框架供开发者将其GPU程序代码写在上面。一旦代码被写入,其便可被引导到编译器115,该编译器可为用于GPU专用编程语言的编译器,并且可解析源代码并产生独立于机器的与编程语言无关的表示。然后可将结果从开发者计算机系统100分配到应用程序120。应用程序120可包含与设备无关形式的着色器代码(除了其他一切之外,该应用程序还包含:CPU代码、文本、其他资源等)。

应用程序120可以任何期望方式传送给目标机器105,该期望方式包括经由网络的电子输送和机器可读介质的物理输送。这一般涉及应用程序120到服务器(图1中未示出)的传送,目标系统105可从该服务器获得应用程序120。应用程序120可捆绑有其他数据,诸如运行时库、安装程序等,该其他数据可用于将应用程序120安装在目标系统105上。在一些情形下,应用程序120可被提供为更大软件包的一部分。

在启动应用程序120之后,由应用程序执行的一个动作可以为创建一批管道对象155,该管道对象可包括状态信息125、片段着色器130和顶点着色器135,该应用程序可由嵌入式GPU编译器145编译,该嵌入式GPU编译器将由编译器115提供的表示编译成用于GPU 150的原生二进制代码。编译的原生代码可被缓存在高速缓存140中或存储在目标系统105中的其他地方以在随后重新创建相同管道的情况下,诸如在应用程序的将来启动期间,提高性能。最后,GPU 150可执行原生二进制代码,从而执行图形和计算内核用于数据并行操作。

现在参考图2,框图示出了根据一个实施方案的计算机系统200,该计算机系统可用作开发者系统100。虽然图2示出了计算机系统的各种部件,但是其并不旨在表示使这些部件互连的任何特定构造或方式,因为此类细节与本公开并无密切关系。网络计算机和具有更少部件或可能更多部件的其他数据处理系统(例如,手持式计算机、个人数字助理(PDA)、蜂窝电话、娱乐系统、消费电子设备、平板电脑等)也可用于实施一个或多个实施方案。

如图2所示,形式为数据处理系统的计算机系统200包括:总线222,该总线耦接到一个或多个微处理器216,该微处理器可以为CPU和/或GPU;存储器212,该存储器可包括易失性读/写随机存取存储器(RAM)和只读存储器(ROM)中的一者或两者;以及非易失性存储设备214。一个或多个微处理器216可从存储器212和存储设备214检索指令并且使用高速缓存218执行指令以执行上述操作。链路222将这些不同部件互连在一起并且还将这些部件216、218、212和214互连到显示控制器206和显示设备220以及外围设备诸如输入/输出(I/O)设备204,该外围设备可为鼠标、键盘、触摸屏、调制解调器、网络接口、打印机和本领域中众所周知的其他设备。通常,输入/输出设备204通过输入/输出控制器202耦接到系统。在易失性RAM包括在存储器212中的情况下,RAM通常被实施为动态RAM(DRAM),其持续地需要电力以便刷新或维持存储器中的数据。显示控制器206和显示设备220可任选地包括用于处理显示数据的一个或多个GPU。

存储设备214通常为硬磁盘驱动器、光驱、非易失性固态存储器设备或即使在电力从系统移除后仍维持数据(例如,大量数据)的其他类型的存储器系统。尽管图2示出了存储设备214是直接耦接到数据处理系统中的其余部件的本地设备,但是实施方案可利用远离系统的非易失性存储器,诸如网络存储设备,其通过网络接口210耦接到数据处理系统,该网络接口可为有线或无线网络接口。链路222可包括通过如本领域中众所周知的各种桥接器、控制器和/或适配器彼此连接的一个或多个链路。尽管为了清楚起见图2仅示出了每种类型的单个元件,但是可根据需要使用各种元件类型中的任何类型或全部类型的多个元件。

现在参考图3,框图示出了根据一个实施方案的计算系统300,该计算系统可用作目标计算系统150。虽然图3示出了计算机系统的各种部件,但是其并不旨在表示使这些部件互连的任何特定构造或方式,因为此类细节与本公开并无密切关系。网络计算机和具有更少部件或可能更多部件的其他数据处理系统(例如,手持式计算机、个人数字助理(PDA)、蜂窝电话、娱乐系统、消费电子设备、平板电脑等)也可用于实施一个或多个实施方案。

计算系统300包括CPU 310和GPU 330。在图3所示的实施方案中,CPU 310和GPU 330包括在单独的集成电路(IC)或封装上。然而,在其他实施方案中,CPU 310和GPU 330或其总体功能可包括在单个IC或封装中。

此外,计算系统300还包括系统存储器340,该系统存储器可由CPU 310和GPU 330存取。在各种实施方案中,计算系统300可包括超级计算机、台式计算机、膝上型计算机、视频游戏机、嵌入式设备、手持式设备(例如,移动电话、智能电话、MP3播放器、相机、GPS设备或其他移动设备)、或包括或被配置为包括GPU的任何其他设备。虽然图3中未示出,但是计算系统300还可包括计算系统的常规元件,包括用于显示计算系统300的内容(例如,图形、视频等)的显示设备(例如,阴极射线管、液晶显示器、等离子体显示器等),以及输入设备(例如,键盘、触摸板、鼠标等)、存储设备(例如,硬盘、光盘等)和通信设备(例如,网络接口)。可根据需要包括任何其他元件。虽然被示为由共同通信链路350耦接,但是也可根据需要采用多个链路350,其中CPU 310和GPU 330连接到单独但互连的链路350。

GPU 330通过执行某些特殊功能诸如图形处理任务和数据并行通用计算任务来协助CPU 310,通常比CPU 310可在软件中执行这些功能的速度要快。

GPU 330经由链路350与CPU 310和系统存储器340耦接。链路350可为用在计算机系统中的任何类型的总线或通信结构,包括外围部件接口(PCI)总线、加速图形端口(AGP)总线、PCI快速(PCIE)总线或另一类型的链路,包括非总线链路。如果采用多个链路350,那么它们可以是不同类型的。

除了系统存储器340之外,计算系统300还可包括本地存储器320,该本地存储器耦接到GPU 330以及链路350。本地存储器320可用于GPU 330以提供对某些数据(诸如频繁使用的数据)的存取,其存取速度比数据存储在系统存储器340的情况下可能的存取速度要快。本地存储器360可用于CPU 310以提供对数据诸如存储在本地存储器360中的二进制数的存取。

虽然图3中示出了单个CPU 310和GPU 330,但是实施方案可根据需要采用任何数目的CPU 310和GPU 330。在采用多个CPU 310或GPU 330的情况下,CPU 310和GPU 330中的每一者可为不同类型和架构。可根据需要在不同GPU 330上执行应用程序120的各部分。此外,计算机系统300可采用一个或多个专用协处理器设备(图3中未示出),诸如加密协处理器,其可根据需要使用链路350或其他链路耦接到CPU 310或GPU 330中的一个或多个。

现在转到图4,框图示出了互连的可编程设备400的网络,包括服务器430和相关联的数据存储器440,以及台式计算机410、膝上型电脑412、平板电脑414和移动电话416。这些可编程设备中的任一者可为图1的开发者系统100或目标系统105。互连可编程设备的网络420可为任何类型的网络,有线或无线、局域或广域、公共或私人的,其使用任何期望的网络通信协议来将数据从一个系统输送到另一系统。虽然被示为单个网络420,但是可使用任何数目的互连网络来连接可采用不同网络技术的各种可编程设备。在一个示例中,台式工作站410可为图1的开发者系统100,其将应用程序120分配给服务器430,该服务器继而可将应用程序120分配给多个设备412、414和416,其中每个设备可采用不同的GPU以及其他不同部件。

我们现在回到统一编程接口、编程语言和语言模型。下文针对编程语言示出的特定语法是一个示例且仅以举例说明的方式给出,并且可以根据需要使用不同的语法。编程语言用语言模型编译,该语言模型允许开发者使用低级别数据结构来在GPU的内核上对图形和计算(非图形)数据并行任务两者进行编程,而无需担心将最终执行程序的特定GPU。下文对编程语言和语言模型的描述归Apple Inc.版权所有(2014年)。此文件描述用于根据一个实施方案的统一图形和计算语言的语言模型。使用该语言,图形和计算程序两者均可用单种统一语言编写,这允许两者之间更紧密的整合。

参考图5A,框图示出了用在统一编程接口的编程语言和命令模型中的一些基本对象以及它们之间的关系。纹理对象510(例如,编程语言中的纹理)可表示用纹理图像的指定像素格式来组织的对GPU存储器的分配。例如,纹理对象可表示针对一维(1D)、二维(2D)或3维(3D)纹理图像、1D或2D纹理图像阵列或立方图纹理图像而组织的GPU存储器。资源协议512(例如,资源)可表示GPU存储器的通用分配。可通过调用特定方法在统一编程接口中创建纹理510。

如图5A所示,纹理协议510可与资源协议512相符。纹理描述符对象506和采样器对象508可用在纹理对象510的构建中。

纹理描述符对象506可包括描述纹理属性的可变对象。该属性可包括尺寸(例如,宽度、高度和深度)、像素格式以及是否使用mipmap。像素格式可指定纹理像素在内部如何存储其颜色、深度或模板数据。一般来讲,可存在三种像素格式:普通的、填充的和压缩的。GPU可读取全部格式,除非被标注为限于特定特征级别。一般来讲,GPU也可渲染到大多数颜色格式。

图5B提供了详细的框图,该框图示出了统一编程模型和语言中的各种对象和分类之间的关系。缓冲区选项对象502可用于构建缓冲区504并且纹理描述符对象506可用于构建纹理510。缓冲区504和纹理510然后可用作用于构建帧缓冲区附件532的输入,该帧缓冲区附件自身可用于构建帧缓冲区536。在一个实施方案中,为了构建帧缓冲区536,可首先构建两个纹理对象510,然后它们可用于构建两个帧缓冲区附件532(即,颜色附件和深度附件)。帧缓冲区附件532可使用纹理对象510来表示作为指定类型的片段数据(诸如颜色缓冲区、深度缓冲区或模板缓冲区)的目的地的像素的阵列。对于片段操作诸如混合,帧缓冲区附件存储器可用作源和目的地两者。帧缓冲区附件532可充当绑定到单个帧缓冲区对象536的对象。

在一个实施方案中,为了构建新的自动释放的帧缓冲区附件对象532(例如,FramebufferAttachment),可使用可采用纹理对象510作为输入值的各种FramebufferAttachment方法。一般来讲,每个渲染命令(例如,RenderCommand)可具有可在RenderCommand被初始化时进行设置的一组配置/状态,并且之后可能不可改变。这个对象可以是“RenderPassDescriptor。在RenderPassDescriptor上,用户可能需要设置哪些纹理将用作目标颜色/深度/模板纹理以及每个纹理的加载动作/存储动作。

用于构建帧缓冲区附件532的方法也可接收各种属性作为输入值。这些属性包括加载动作514、存储动作516和清除值518。加载动作514和存储动作516可为帧缓冲区附件属性,这些属性指定分别在指定的帧缓冲区附件532的渲染命令编码器的命令处理开始或结束时执行的动作。例如,加载动作可在渲染命令开始时加载纹理的现有内容,因此进一步渲染可混合现有内容。在合并GPU上,可对GPU中的小存储器进行全部渲染,其中由于该存储器通常可小于目标纹理,所以整个帧缓冲区被划分成区块以使其变得合适。可依次渲染每个区块。加载和存储动作可在每个区块的渲染开始时确定GPU是否以及如何将数据从纹理复制到该区块存储器,以及类似地,在区块渲染完成时确定数据是否以及如何被复制回存储器。加载动作属性514包括将相同值写到指定帧缓冲区附件532中的每个像素的动作的属性(例如,LoadActionClear)、将数据写到该附件的动作的属性(例如,LoadActionLoad)以及指定没有任何内容应被复制的属性(例如,LoadActionDontCare)。存储动作属性516可包括写入单个片段值的动作的属性(例如,StoreActionStore)、使用片段内的若干样本点来确定写入内容的动作的属性(例如,StoreActionMultisampleResolve)以及指定没有任何内容应被复制的属性(例如,StoreActionDontCare)。

清除值属性518一般取决于纹理的像素格式,像素格式可确定如何使用帧缓冲区附件532。如果清除值属性518发信号通知加载动作是清除,那么RenderPassDescriptor还定义哪个值是纹理将要清除的。

在帧缓冲区附件532已经构建了之后,其可用于构建渲染通道描述符对象534,该渲染通道描述符对象可为描述帧缓冲区状态的可变描述符对象。渲染通道描述符对象534可由必须跨整个渲染通道保持恒定的任何状态组成,包括帧缓冲区附件以及硬件可宣称哪个存储器可用于跟踪传统的遮挡查询数据(即,绘制的像素的数目)的能见度计数器缓冲区。

一旦被构建,则渲染通道描述符534便可继而用于创建渲染命令编码器544。在渲染命令编码器544已经创建之后,其可将纹理对象510、缓冲区对象504、采样器对象508、深度模板状态对象538以及管道状态对象542用作输入以配置将被绘制到其中的内容并且创建可在目的地处渲染的渲染命令。渲染通道描述符可被配置为渲染命令开头的部分。然后,应用程序可附加一系列SetPipelineState、SetInexpensiveState和绘制命令来宣称将被绘制到帧缓冲区中的对象集合。换句话说,对于每个渲染通道描述符和/或渲染命令,可能发布了一个或多个输入对象和绘制命令,然后渲染命令可由应用程序结束来告知图形系统将不再附加命令。

如上文所论述,采样器对象508可为使用将采样器描述符对象520用作输入值的方法所构建的不可变对象。深度模板状态对象538可为可用于构建渲染命令编码器对象544的不可变对象。深度模板状态对象538自身可使用深度模板状态描述符对象530构建,该深度模板状态描述符对象可为包含深度和/或模板状态的设置的可变状态对象。例如,深度模板状态描述符对象530可包括用于设置深度的深度值、用于指定面向前后的基元的单独模板状态的模板后面状态和模板前面状态属性、以及用于指定如何执行深度测试的深度比较函数属性。例如,使深度比较函数属性的值处在其默认值可指示深度测试总是通过,这可意指传入的片段仍然是替代指定位置处的数据的候选者。如果片段的深度值没有通过深度测试,那么可丢弃传入的片段。自定义深度模板状态描述符对象530自身的构建可能需要创建可为可变状态对象的模板状态对象522。其他图形状态也可以为管道的一部分。一般来讲,状态对象可以为可提前建立、不可变且频繁使用或重复使用的对象。描述符对象在另一方面可为暂时用于收集各种配置选项的对象,这些选项一旦被完全配置,便可用于建立其他内容。

管道状态542可为包含已编译的图形渲染状态诸如光栅化(包括多重采样)、能见度和混合状态的对象。管道状态542也可包含可编程状态,诸如将在GPU上执行的两个图形着色器函数。这些着色器函数中的一个着色器函数可用于顶点操作并且一个着色器函数可用于片段操作。管道状态对象542中的状态一般可在运行时间被汇编和编译。管道状态对象542可使用管道状态描述符对象540构建,该管道状态描述符对象可为可变描述符对象和用于图形渲染状态的容器。一般来讲,为了构建管道状态对象542,可首先构建管道状态描述符对象540然后可根据需要设置其值。例如,光栅化启用属性(布尔类型)可被设置为否,使得在光栅化之前丢掉全部基元并且不处理任何片段。禁用光栅化可用于从仅顶点变换获得反馈。可被设置的其他可能的值包括帮助指定顶点和片段着色器的顶点和片段函数属性,以及指定指定的帧缓冲区附件的混合状态的混合状态的值。如果帧缓冲区附件532支持多重采样,那么每个片段可创建多个样本,并且可对以下管道状态属性进行设置以确定覆盖范围:每个片段的样本数目的sampleCount属性;用于指定位掩码的sampleMask属性,该位掩码最初用由光栅化程序产生的覆盖掩码进行逐位AND运算(默认地,sampleMask位掩码通常可以都一样,所以用该位掩码进行的逐位AND运算不改变任何值);用于指定α通道片段输出是否可用作覆盖掩码的alphaToCoverageEnabled属性;用于设置α通道片段值的alphaToOneEnabled属性;以及指定用于产生覆盖掩码的值(介于0.0和1.0之间,包括0.0和1.0在内)的sampleCoverage属性,该覆盖掩码然后可用由光栅化程序产生的覆盖值进行逐位AND运算。

管道状态描述符对象540自身可使用包括函数对象524、混合状态526和像素格式528的一个或多个对象构建。函数对象524可表示对在GPU上运行的单个函数的处理并且可通过由输入值串编译源代码而创建。函数对象524一般只涉及图形应用程序上而非计算应用程序上的状态值。混合状态526可为包含用于混合的值的可变对象。混合可为片段操作,其使用高度可配置的混合函数来将传入的片段的颜色数据(源)与帧缓冲区(目的地)中的值混合。混合函数可确定源和目的地片段值如何与混合因子组合。定义混合状态的一些属性可包括用于启用混合的混合启用属性(布尔值);用于指定限制哪些颜色位被混合的位掩码的writeMask属性;用于为RGB和α片段数据指定混合函数的rgbBlendFunciton和alphaBlendFunction属性;以及用于指定源和目的地混合因子的sourceRGBBlendFactor、sourceAlphaBlendFactor、destinationRGBBlendFactor和destinationAlphaBlendFactor属性。

像素格式对象528可指定各个像素(例如,纹理像素)在纹理对象中的组织。例如,像素格式对象528可包括指定纹理像素在内部如何存储其颜色、深度或模板数据的属性。具体地讲,在合并GPU的背景下,编译器可能需要了解区块存储器如何被格式化。例如,如果存在一种颜色纹理,那么编译器可能需要了解要存储什么格式的数据到区块存储器中(例如,最终渲染目的地将是8位还是32位颜色?RGB还是RGBA?)。因此,管道包括帧缓冲区像素格式以允许编译器产生该代码。然后,一旦区块中的所有对象被渲染,渲染通道描述符的存储动作便可确定该数据是否以及如何被复制到目标纹理中。

因此,总之,为了构建并初始化渲染命令编码器对象544,在一个实施方案中,可首先构建一个或多个帧缓冲区附件532,其中每个帧缓冲区附件可包含用于渲染命令的目的地(例如,颜色缓冲区、深度缓冲区或模板缓冲区)的状态。接着,可构建包含帧缓冲区状态(包括其相关联的附件)的可变渲染通道对象534。在创建了渲染通道描述符534之后,渲染命令编码器对象544可通过调用命令缓冲区方法(例如,renderCommandEncoderWithFramebuffer)而构建,其中渲染通道描述符534作为输入值对象。

一般来讲,可在启动应用程序时,通过首先创建可变描述符对象、管道状态描述符540,以及为管道状态描述符对象540设置渲染至纹理化操作的期望图形渲染状态,而构建管道状态对象542来表示编译的管道状态,诸如着色器、光栅化(包括多重采样)、能见度和混合状态。在已经创建管道状态对象542之后,可调用渲染命令编码器方法(例如,setPipelineState)以使管道状态对象542与渲染命令编码器544相关联。

参考图5C,示出了框图,该框图示出了各种对象和计算命令编码器之间的关系。为了执行数据并行计算,可能需要创建计算命令编码器对象546(例如,ComputeCommandEncoder)用于数据并行操作。计算命令编码器对象546可为用于数据并行计算处理状态以及用于将该状态转化成可在GPU上执行的命令的代码的容器。为了构建计算命令编码器对象546,可首先创建计算管道状态548。计算管道548可为包含来自函数对象524的编译代码的计算内核。函数对象524可表示用GPU着色语言写入的计算函数。在被创建之后,计算管道对象548可被指定用于计算命令编码器546。计算管道对象548可用作对渲染管道状态的模拟并且其可在应用程序启动时间由计算管道描述符创建,然后被重复使用或从计算命令编码器引用。

可指定资源诸如缓冲区对象504、纹理对象510和采样器对象508,这些资源包含待处理并且由计算管道对象548返回的数据,并且可设置那些资源的绑定点。计算管道对象548可被设置并且被排成队列以运行指定次数。一般来讲,排成队列的内核可并行运行并且每当GPU可用时便启动。如果内核之间存在依赖性,那么可调用方法(例如,enqueueBarrier)来确保在启动依赖性内核之前完成一个或多个内核。enqueueBarrier方法也可为存储器屏障,所以在屏障之前发布的所有写入对于屏障之后发生的所有加载都是可见的。在没有这类屏障的情况下,对同时执行的内核之间的存储器相关性可能不存在任何保证。

一般来讲,在给定时刻,计算命令编码器对象546可与许多资源对象(例如,缓冲区、常量缓冲区、纹理和采样器)相关联并且仅与一个计算管道状态548相关联。如之前所论述,缓冲区选项502可用于构建缓冲区504,纹理描述符506可用于创建纹理510,并且采样器描述符520可用于产生采样器508。

参考图5D,示出了框图,该框图示出了各种对象和位块传输命令编码器之间的关系。位块传输编码器对象550(例如,BlitCommandEncoder)可提供用于在资源诸如缓冲区和纹理之间复制数据的方法。数据复制操作对于图像处理和纹理效果(诸如模糊或反射)来说可能是必要的。它们也可用于存取离屏渲染的图像数据。位块传输命令编码器对象550也可提供用于用纯色填充纹理并且产生纹理图的方法。为了执行此类操作,可使用命令缓冲区方法(例如,blitCommandEncoder)构建位块传输命令编码器对象550。在被构建之后,位块传输命令编码器对象550然后可调用其方法以将数据复制命令编码到命令缓冲区上。如图5D所示,位块传输命令编码器对象550可将缓冲区对象504和纹理对象510用作输入以执行其操作。

参考图6,框图示出了在一个实施方案中命令模型在统一编程接口中的组织。命令模型可包括各种对象,其中一些对象可为暂态的,而另一些可为非暂态的。如图所示,在CPU线程600中,可将各种框架命令提交给以下不同命令编码器中的每个命令编码器:渲染命令编码器544、计算命令编码器546和位块传输命令编码器550。如上文所论述,命令编码器可为供对象写入命令的共同接口。一般来讲,命令编码器可通过将命令和状态从编程语言框架转化成GPU 530可执行的原生命令格式来处理命令。可预期命令编码器为短暂的、单次使用的低开销对象。命令编码器对象方法可为命令缓冲区602准备已编码命令。尽管命令编码器处于活动中,但是其可能具有专有权来为其命令缓冲区编码命令。一旦编码完成,便可调用方法将编码器与其命令缓冲区断开连接。为了写入另外的命令,可构建新的命令编码器或与先前编码器相同的编码器。

如图6所示,不同命令缓冲区可被同时建立,而不论用来建立命令缓冲区的命令编码器的类型如何。如上文所论述,渲染命令编码器544可使用来自缓冲区504、纹理510、采样器508、深度模板状态538和管道状态542的值以产生图形渲染命令。计算命令编码器546继而可使用来自内核548、缓冲区504、采样器508和纹理510的值来产生数据并行计算命令。位块传输命令编码器550可利用缓冲区504和纹理510来产生数据复制命令。

在将命令转化成原生命令格式并因此产生可由GPU执行的命令之后,每个命令编码器可将已转化的命令附加到命令缓冲区602中。这可通过调用命令编码器方法将命令交托给命令缓冲区602来完成。命令缓冲区602(例如,CommandBuffer)可为将命令编码到其中的单次使用对象,该命令可被提交一次以便执行。单个命令缓冲区可包含图形、计算和位块传输命令的组合。因此,命令缓冲区602可为用于将由设备执行的该系列已编码命令的容器。一般来讲,在任何给定时间,仅一个命令编码器可将命令编码到特定命令缓冲区中。在交托命令编码器之后,可释放命令编码器自身。然后可创建另一命令编码器,其中新的命令编码器可对命令缓冲区进行单独存取。

在将命令附加在命令缓冲区602中后,命令便可被传输到命令队列604。对于每个应用程序,可能存在至少一个命令队列604,该命令队列可持续应用程序的寿命。每个命令队列604可包含一连串队列的命令缓冲区602,这些命令缓冲区以指定顺序发送到设备或GPU 606用于执行。一般来讲,命令缓冲区602以它们加至命令队列604的顺序执行。

GPU 606可为适用于处理所提交的命令的单个GPU。在已经安排了命令执行之后,命令缓冲区602在其所有依赖性已经被解决并且其已经被发送到硬件用于执行之后可认为被安排。

单线程应用程序(诸如图6所示的应用程序)通常每个帧编码一个命令缓冲区并且在编码完成时调用命令缓冲区交托方法以将命令交托给命令队列。单线程应用程序可依赖于在交托之前暗指的队列调用。然而,在一些场景中,命令缓冲区可被排成队列,但是由于它们依赖于尚未准备好或尚不可用的其他资源(例如,依赖于渲染操作的完成的位块传输操作)而不可提交。

多线程应用程序一般每个CPU线程创建命令缓冲区并以GPU将执行的顺序调用每个命令缓冲区上的排队方法。随后当每个命令缓冲区完成编码时,应用程序可调用交托方法。在这样的场景中,应用程序可确定已排成队列的缓冲区何时具有必要的资源来变成适于执行。

如之前所论述,一般来讲,仅一个CPU线程可不时存取命令缓冲区。然而,多线程应用程序可以每个命令缓冲区使用一个线程来并行构建多个命令缓冲区。图7示出了具有三个线程的多线程应用程序的示例。如图所示,线程702、704和706中的每个线程分别具有其自身的命令缓冲区708、710和712。对于每个线程,一次一个命令编码器可对其相关联的命令缓冲区进行存取。当命令编码器对象调用其交托方法时,先前指定的命令可被附加到命令缓冲区,命令编码器对象自身可被释放,并且新的命令编码器对象现在可将命令附加到命令缓冲区。命令缓冲区708、710和712可由GPU 716按它们交托给命令队列714的顺序执行。

在一些场景中,可能需要将单个渲染通道分裂成多个工作单元以被并行编码,假定跨多个线程,诸如线程702、704和706。每个线程能够有可能在不同处理器核心上独立地并行执行。然而,当依赖性被引入任务中时(例如,必须在继续之前完成的中间结果),线程需要同步机制。在一个实施方案中,统一编程接口通过包括允许单个渲染至纹理操作跨多个线程高效地分裂的协议(例如,ParallelRenderPassEncoder)而提供这样的机制。那些线程中的每个线程能够使用独立的渲染命令编码器来为相同的命令缓冲区来编码渲染命令c并且共享相同的帧缓冲区目的地。在所有编码线程已经结束之后,可交托同步协议(ParallelRenderPassEncoder)。来自不同渲染命令编码器的命令然后可束缚在一起,保留它们的原始编码线程构建排序,而不管不同的编码线程执行它们的交托的顺序如何。此实施可以高效的方式作为一个组一起执行所有的渲染命令。具体地讲,该实施可仅执行帧缓冲区的加载和存储动作一次,而无中间保存或恢复操作发生。

统一编程语言管理中的多种方法具有多个工作单元。这些方法可包括renderCommandEncoder方法,该方法构建在命令缓冲区上编码图形渲染命令的渲染命令编码器对象,其中每个命令编码器可被指定给其自身的线程。该方法还包括交托方法,该交托方法实现所有命令在命令缓冲区中的执行,这些命令由ParallelRenderPassEncoder构建的渲染命令编码器编码并附加。一般来讲,所有此类渲染命令编码器对象将在ParallelRenderPassEncoder调用其交托方法之前调用它们的交托方法。否则,错误可能发生。

应当理解,以上描述旨在是示例性的而非限制性的。例如,上述实施方案可彼此结合使用。本领域的技术人员在阅读了以上描述内容之后将理解许多其他实施方案。因此,应当参考所附权利要求以及与此权利要求被授权的等同形式的完整范围来确定本发明的范围。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号