CN110663064A - 用于矢量图形和图像处理的并行化流水线 - Google Patents
用于矢量图形和图像处理的并行化流水线 Download PDFInfo
- Publication number
- CN110663064A CN110663064A CN201880032433.1A CN201880032433A CN110663064A CN 110663064 A CN110663064 A CN 110663064A CN 201880032433 A CN201880032433 A CN 201880032433A CN 110663064 A CN110663064 A CN 110663064A
- Authority
- CN
- China
- Prior art keywords
- path
- data
- vector
- raster
- node
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/20—Processor architectures; Processor configuration, e.g. pipelining
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T11/00—2D [Two Dimensional] image generation
- G06T11/40—Filling a planar surface by adding surface attributes, e.g. colour or texture
Landscapes
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Image Generation (AREA)
Abstract
本技术涉及在数据并行计算设备上并行光栅化并且合成矢量图形。例如,可以将所述矢量图形的矢量数据加载到由所述一个或多个并行处理器可访问的本地存储器中。所述矢量数据可以包括由所述矢量图形的一个或多个路径分段组成的一个或多个路径。所述一个或多个并行处理器可以将所述一个或多个路径分段光栅化成相应的光栅并且基于所述相应的光栅的像素坐标来将所述光栅中的每一个指派到组中。每个组可以具有关联的键并且每个组内的所述光栅表示同一矢量图形的一部分。所述光栅可以根据它们相应的像素坐标被放置在子像素上并且由所述一个或多个并行处理器渲染到显示器上。
Description
背景技术
本申请要求2017年5月18日提交的美国临时申请No.62/508,096的提交日的权益,其公开内容特此通过引用并入本文。
处理并显示矢量图形(诸如膝上型电脑的显示器上的web页面的类型或智能电话的触摸屏上的地图)要求大量的处理资源。随着显示器的数目和大小继续增长,矢量图形的更快更高效的处理变得必要。然而,使利用当前的矢量图形处理技术的处理性能上的进步下降威胁到减少矢量图形的使用。
处理矢量图形数据的许多方法在有或没有来自图形处理单元(GPU)的协助的情况下都依靠计算设备的中央处理单元(CPU)。数十年来,矢量图形处理一直被视为与像GPU一样的数据并行计算设备不兼容。因此,大多数矢量图形处理技术未能利用GPU的能力来并行处理数据。
当前的矢量图形处理技术往往集中于使用并行处理来加速完整矢量图形处理流水线的仅一小部分,同时剩余部分继续用标量CPU算法来处理。虽然已通过并行执行矢量图形处理流水线的一部分实现了相对于GPU的可用计算能力的适度加速,但是GPU的大部分计算能力未被利用。附加地,由于对标量CPU和GPU两者的持续利用,在当前的矢量图形技术中普遍存在能量效率低下。此外,大多数这些矢量图形技术因不精确的反混叠而牺牲视觉质量。
发明内容
本公开内的实施例一般地涉及在计算机系统上处理矢量图形。一个方面包括一种用于在数据并行计算设备上并行光栅化并且合成矢量图形的方法。所述方法包括:由一个或多个并行处理器将所述矢量图形的矢量数据加载到由所述一个或多个并行处理器可访问的本地存储器中,其中,所述矢量数据包括由所述矢量图形的一个或多个路径分段组成的一个或多个路径;由所述一个或多个并行处理器将所述一个或多个路径分段光栅化成相应的光栅;由所述一个或多个并行处理器基于所述相应的光栅的像素坐标来将所述光栅中的每一个指派到组中,其中,每个组具有关联的键并且每个组内的所述光栅表示同一矢量图形的一部分;由所述一个或多个并行处理器根据所述光栅的相应的像素坐标来将所述光栅放置到子像素上;以及由所述一个或多个并行处理器将所述光栅渲染到显示器上。
在一些示例中,加载所述矢量数据是响应于所述一个或多个并行处理器接收到识别所述矢量数据在主机存储器中的位置的一个或多个拉出命令而发生的。
在一些示例中,加载所述矢量数据还包括同时地为所述矢量数据中的所述一个或多个路径中的每一个构建路径数据结构。
在一些示例中,每个路径数据结构包括作为到包括块的链表数据结构的根节点的相应的路径头,每个相应的路径头包含关于在拉出命令期间计算出的总路径的描述性信息。
在一些示例中,对于每个路径头,关于所述总路径的所述描述性信息包括下列中(i)路径所要求的块的总数、(ii)有多少条线和曲线在所述路径中、(iii)所述总路径的2D边界以及(iv)指示第一路径节点在所述链表数据结构中的位置的头节点中的一个或多个。
在一些示例中,每个路径头与路径节点相关联。
在一些示例中,每个路径节点包括:分段计数块,其存储所述相应的路径节点内的分段的总数;以及下一个节点块,其存储所述下一个路径节点在所述链表中的位置。
在一些示例中,每个路径节点包括存储索引的路径分段块,所述索引指向与所述一个或多个路径分段相关联的数据的块。
在一些示例中,所述路径分段块包括类型块,所述类型块定义组成通过所述路径节点所表示的所述路径的所述路径分段的几何形状,其中,所述几何形状可以是曲线或线分段。
在一些示例中,所述光栅化包括将路径分段转换成图块(tile)追踪子像素(TTS),以及将所述TTS包装成图块追踪子像素块(TTSB)。
另一方面包括一种存储指令的非暂时性计算机可读介质,所述指令在由一个或多个并行处理器执行时使所述一个或多个并行处理器执行以下步骤:将矢量图形的矢量数据加载到由所述一个或多个并行处理器可访问的本地存储器中,其中,所述矢量数据包括由所述矢量图形的一个或多个路径分段组成的一个或多个路径;将所述一个或多个路径分段光栅化成相应的光栅;基于所述相应的光栅的像素坐标来将所述光栅中的每一个指派到组中,其中,每个组具有关联的键并且每个组内的所述光栅表示同一矢量图形的一部分;根据所述光栅的相应的像素坐标来将所述光栅放置到子像素上;以及将所述光栅渲染到显示器上。
另一方面包括一种用于并行光栅化并且合成矢量图形的系统,所述系统包括:一个或多个数据并行计算设备;以及存储指令的存储器,所述指令能够由所述一个或多个数据并行计算设备执行,其中,所述指令包括:将矢量图形的矢量数据加载到由所述一个或多个并行处理器可访问的本地存储器中,其中,所述矢量数据包括由所述矢量图形的一个或多个路径分段组成的一个或多个路径;将所述一个或多个路径分段光栅化成相应的光栅;基于所述相应的光栅的像素坐标来将所述光栅中的每一个指派到组中,其中,每个组具有关联的键并且每个组内的所述光栅表示同一矢量图形的一部分;根据所述光栅的相应的像素坐标来将所述光栅放置到子像素上;以及将所述光栅渲染到显示器上。
附图说明
本技术被作为示例而不作为限制图示在附图的图中,在附图中相似的附图标记指代类似的元素,包括:
图1是依照本公开的各方面的示例系统的功能图。
图2是图1的示例系统的示意图。
图3A是依照本公开的各方面的单独的存储器架构的示例。
图3B是依照本公开的各方面的统一存储器架构的示例。
图4是依照本公开的各方面的拉出内核过程的框图。
图5是依照本公开的各方面的路径数据结构的示例。
图6是依照本公开的各方面的光栅化过程的框图。
图7是依照本公开的各方面的示例变换流程。
图8是依照本公开的各方面的示例光栅数据结构。
图9是示出依照本公开的各方面的TTS结构到并行处理设备的存储器的图块追踪子像素块结构中的放置的图示。
图10是示出依照本公开的各方面的X和Y裂片的创建的图示。
图11是依照本公开的各方面的放置确定的示例图示。
图12是依照本公开的各方面的TTS结构的图示。
图13是概述依照本公开的各方面的光栅的放置和分类的框图。
图14是概述依照实施例的光栅的渲染的框图。
图15是依照本公开的各方面的从左梯形到右梯形的转换的图示。
图16是依照本公开的各方面的双累加器的图示。
图17是依照本公开的各方面的单累加器的图示。
图18是依照本公开的各方面的流程图。
具体实施方式
概要
本技术涉及在计算机系统上光栅化、合成和以其它方式操纵(在本文中统称为“处理”)矢量图形。特别地,使用完全并行化处理流水线来在数据并行计算设备上执行矢量图形的处理。可以通过定制应用编程接口(API)来实现和控制并行化处理流水线,所述定制API给数据并行计算设备(诸如图形处理单元(GPU))提供对内核程序的访问。内核程序可以由数据并行计算设备执行以执行处理。在这方面,每个相应的内核可以构成并行化处理流水线的一部分,同时每个内核利用标准API和子API来执行矢量图形的所有处理。
并行化处理流水线的步骤可以包括以下步骤:拉出矢量路径;光栅化所拉出的数据;对光栅化的数据进行分类和分段;为经分类和分段的数据加前缀;放置加前缀的数据;以及将所放置的数据渲染到显示器上。这些步骤中的每一个均可以由一个或多个内核实现。矢量路径可以由表示相应的矢量图形的路径分段、未变换的边界、元数据和存储器占用空间的数据组成。
拉出矢量数据包括将级联矢量数据的块从主机存储器位置移动到由GPU分配和管理的高效可遍历的数据结构。例如,计算机系统中的处理器(诸如CPU)可以将包含在矢量数据中的顺序路径数据从主机存储器(诸如CPU可访问的存储器)转移到可由GPU可访问的存储器(诸如GPU的分立存储器)中。在这方面,可以取决于GPU的自然事务大小而将来自主机存储器的顺序路径数据重组成许多固定大小的块,使得可以更高效地利用使GPU与主机存储器位置分开的总线。
在一个示例中,通过CPU将拉出指令附加到GPU的命令缓冲区(GPU从中检索其指令)中,可以将矢量数据从主机存储器位置移动到GPU的分立存储器。拉出命令可以包含路径的主机ID、在当前拉出命令之前的完整路径节点的数目、进入CPU存储器分段区域的偏移以及节点应该拷贝的存储器分段区域的数目。在一些情况下,可以使用将路径数据(例如,线端点和曲线控制点的序列)从主机的存储器移动到可由GPU访问的存储器(诸如GPU的分立存储器)的其它技术。
拉出内核然后可由GPU启动,从而使GPU执行其命令缓冲区内的拉出命令。在这方面,在阈值数目的拉出命令被附加到GPU的命令缓冲区中时,在已经经过预定量的时间和/或GPU试图访问拉出内核内的子内核之后,GPU可以启动拉出内核。拉出内核可以使GPU执行拉出命令,所述拉出命令保留存储器块以将相应的路径节点存储在GPU的分立存储器中。随后,GPU可以将路径节点拷贝到数据结构中。
数据结构内的路径可以由GPU光栅化以创建光栅,所述光栅表示适合于渲染和其它后光栅化活动(诸如命中检测、剪裁和遮罩)的变换路径。在光栅化路径之前,GPU可以执行使GPU的存储器和路径为光栅化作准备的许多内核。在这方面,GPU可以执行拷贝变换内核,当GPU是分立的时,所述拷贝变换内核将转换矩阵拷贝到GPU的存储器中。GPU可以进一步执行分配光栅内核和扩展光栅内核。分配光栅内核可以使GPU为将由内核网格处理的光栅头分配存储器块。扩展光栅内核可以使CPU生成并更新光栅组群ID映射,所述光栅组群ID映射将光栅组群ID映射到全尺寸设备光栅ID。例如,光栅组群ID可以由15位或更多或更少位组成并且被映射到32位或更多或更少位的全尺寸设备光栅ID,但是其它位大小可以被用于光栅组群ID和设备光栅ID。
GPU然后可以启动将路径转换成像素的光栅化内核。在这方面,光栅化内核将路径的线和曲线拆分成子像素线分段。例如,光栅化内核可以加载属于同一光栅的一个或多个路径分段并且将经变换的线和曲线拆分成子像素线分段。然后可以将子像素线分段存储为图块追踪子像素(TTS)结构。
可以将每个TTS结构存储在与子像素位置相关联的活动图块容器内。活动图块容器的数目可以是有限的并且取决于GPU的处理和存储器能力。如果活动图块容器满了或者需要被刷新,则可以清除TTS结构。在这方面,GPU可以将活动图块容器内的TTS结构放置到存储在GPU的存储器中的图块追踪子像素块(TTSB)结构中,如图9中所示。可以创建记录光栅组群ID、图块坐标和TTSB的地址的图块追踪子像素键(TTSK)并将其附加到GPU的本地存储器中的队列。在TTSK队列变满或者由于属于不同图块容器的子像素线分段被处理而要求刷新时,可以成批附加TTSK到以后将被分类的范围。
可以对图块追踪子像素键进行分类和分段以使得能够基于路径相应的子键来并行渲染路径。在这方面,GPU可以执行TTSK分类和分段内核,所述TTSK分类和分段内核按其子键对TTSK进行分类并且按光栅组群ID子键对TTSK进行分组。例如,每个TTSK可以包括三个子键或更多或更少的子键,包括光栅组群ID、Y图块坐标和X图块坐标。可以根据子键对TTSK进行分类。在分类完成之后,可以按每个光栅组群ID、y图块线和x图块线对TTSK进行分组。
TTSK分类和分段内核可以将每个分类的TTSK与其前任相比较,并且如果一定数目的位不同,则经分类的TTSK的索引被附加到范围。在这方面,每个索引标记属于光栅组群ID的TTSK的序列的开头。TTSK分类和分段内核还可以计算将在后续前缀后处理阶段内使用多少个图块追踪前缀块(TTPB)、TTPK节点和TTSK节点,并且为计算出数目的TTPB、TTPK节点和TTSK节点预分配块。
由光栅化内核产生的TTSB块以及由TTSK分类和分段内核处理的TTSK可能要求附加后处理步骤。在这方面,GPU针对每个索引可以执行前缀内核,所述前缀内核顺序地加载索引内的TTSK并且将TTSK存储到经预分配的TTSK节点中。前缀内核可以在确定TTSK图块坐标改变时,将经累加的TTP值存储到经预分配的TTPB块中,构造TTPK键,并且将该TTPK键存储到经预分配的TTPK节点中。换句话说,可以对TTSK进行分类,并且在分类的最终遍中(或者经由专用分类内核),基于图块坐标(YX)和光栅组群ID中的变化次数(R)来计算各种统计和索引。在TTSK的跨度改变为新坐标(YX)时,可以计算TTPK键和TTPB块。
可以确定并使用每个光栅组群ID的TTPK的总数来生成指向这些TTPK的光栅结构。如果TTSK光栅ID改变,则前缀内核可以退出。
然后可以给TTSB块中的TTS指派到TTSK键的指针并且可以将TTS高度分散添加到1xH数组。在前缀阶段结束时,每个光栅具有以下关联的数据:a)包含指向包含TTS的TTSB的TTSK的TTSK节点的列表;b)包含指向包含TTP高度的TTPB的TTPK的TTPK节点的列表;c)TTSK的总计数;d)TTPK的总计数;e)具有子像素分辨率的紧密轴线对齐边界。此光栅结构允许GPU在单个拉出中抓取所有必要的数据,而不是一次一个从块数据池中抓取块。在一些实施例中,长路径可能要求通过光栅化、分类和分段及前缀内核处理多遍。
放置内核可以由GPU执行以指定光栅应该被子像素平移并然后渲染在由图块追踪构图键(TTCK)的数组组成的构图中的特定层上。可以将每个构图视为空间上分区的TTCK键的一个或多个容器。例如,放置内核可以使与GPU处理器相对应的执行组执行如图11中所示的放置确定。在这方面,每个执行组可以确定光栅的边界是在构图边界中还是外部。如果光栅的边界在构图外部则放置确定被取消。否则,对于TTSK节点中的所有TTSK,放置内核a)平移TTSK键;b)将TTSK键转换成TTCK键;c)将TTCK键附加到本地队列;并且d)如果本地队列满了或者需要被刷新则将它附加到构图的TTCK键范围。
类似地,对于TTPK节点层次中的所有TTPK键,放置内核使GPU:a)平移TTPK键;b)扩展TTPK键,因为它可能横跨多个图块;c)裁剪经扩展的图块范围;d)将每个TTPK键转换成TTCK键;e)将每个TTCK键附加到本地空间上合并的队列;并且f)如果本地空间上合并的队列满了或者需要被刷新,则将它附加到构图的一个或多个空间上合并的TTCK键范围。再次,因为每个TTCK的图块位置是已知的,所以可以将构图视为空间上分区的TTCK键的一个或多个容器。因此,可以减少表示图块在TTCK构图中的X和Y坐标所要求的位数。
TTCK分类和分段内核可以由GPU执行以按一组子键对TTCK进行分类。在这方面,TTCK分类阶段布置TTCK,使得属于同一图块的所有键是按照递增层次序。TTCK分段阶段发现用于图块的第一TTCK键的起始索引。例如,每个TTCK可以包括三个子键或更多或更少的子键,包括Y图块坐标、X图块坐标和层索引。可以从Y图块坐标开始、然后是X图块坐标并最后是层索引根据子键对TTCK进行分类。在分类完成之后,可以按每个图块坐标并以递增层顺序对TTCK进行分组。
TTCK分类和分段内核使GPU将每个分类的TTCK与其前任相比较。如果位数与经分类的索引的索引不同,则经分类的TTCK被附加到范围。每个索引可以标记属于位置(X,Y)处的图块的TTCK的序列的开头。
在对TTCK进行分类和分段之后,GPU然后可以渲染光栅。在这方面,GPU可以执行渲染内核,如图14中所示,所述渲染内核进而为TTCK键范围中的每个图块启动执行组。每个执行组的功能是为了将TTCK键解码成与相邻层混合的填充路径轮廓。在这方面,每个执行组处理像素的固定大小图块并且分配存储器的各种图块大小的块。当没有更多的键要处理或者图块被命令刷新时,经混合的像素被存储或者合成到目标表面上。
上述特征允许以完全并行化方式在数据并行计算设备上处理矢量图形。与由当前的CPU、GPU和混合矢量图形引擎提供的相比,这样的并行处理提供显著更快更高效的矢量图形处理。另外,通过完全在数据并行计算设备上处理矢量图形,系统的CPU可以自由地同时地执行其它处理任务。
示例系统
图1和图2示出可以在其中实现本文描述的特征的示例系统100。这不应该被认为是限制本公开的范围或本文描述的特征的有用性。在此示例中,系统100可以包括计算设备110、120、130和140以及存储系统150。每个计算设备可以包含一个或多个处理器112、存储器114以及通常存在于通用计算设备中的其它组件。计算设备110、120、130和140中的每一个的存储器114可以存储可由一个或多个处理器112访问的信息,包括可由一个或多个处理器112执行的指令116。
存储器可以存储可由一个或多个处理器检索、操纵或者存储的数据。存储器可以是能够存储可由处理器访问的信息的任何非暂时性类型,诸如硬盘驱动器、存储卡、ROM、RAM、DVD、CD-ROM、可写和只读存储器。数据元素(诸如指令116和数据118)可以被保持在存储器空间中。例如,图形处理单元具有若干存储器空间,包括:寄存器、常量、可索引共享本地存储器、全局设备存储器、本地存储器、堆栈存储器、参数存储器和纹理存储器。这些存储器空间中的每一个均可以具有不同的性质,包括不同的等待时间、大小、相对于当前处理元件的并发访问限制(若有的话,处理元件可访问此存储器空间)、定义是否可通过索引或句柄并出于什么目的访问数据的随机访问和可索引性、可写性、带宽和访问模式惩罚,诸如存储体冲突、合并、高速缓存未命中、分区驻留等。寄存器可以由多处理器中的处理器直接地访问。
指令116可以是要由一个或多个处理器直接地执行的任何指令集,诸如机器代码,或者可以是由一个或多个处理器间接地执行的任何指令集,诸如脚本。在那方面,可在本文中互换地使用术语“指令”、“内核”、“应用”、“步骤”和“程序”。可以用于由处理器直接处理的目标代码格式或者以任何其它计算设备语言存储指令,所述任何其它计算设备语言包括脚本或被按需解释或者提前编译的独立源代码模块的合集。在下面更详细地说明指令的功能、方法和例行程序。
数据118可以由一个或多个处理器112依照指令116来检索、存储和修改。例如,尽管本文描述的主题不受任何特定数据结构限制,但是数据可被存储在计算机寄存器中,作为具有许多不同的字段和记录的表存储在关系数据库中,或者存储在XML文档中。还可以诸如但不限于二进制值、ASCII或Unicode这样的任何计算设备可读格式格式化数据。此外,数据可包括足以识别相关信息的任何信息,诸如数字、描述性文本、专有代码、指针、对存储在诸如在其它网络位置处的其它存储器中的数据的引用或由函数使用来计算相关数据的信息。
一个或多个处理器112可以是任何常规的处理器,诸如市场上可买到的CPU。替换地,处理器可以是专用组件,诸如专用集成电路(“ASIC”)或其它基于硬件的处理器。
计算设备110、120和130中的一个或多个可以包括用于并行执行具体计算过程的专用硬件组件,所述具体计算过程诸如更快或更高效地光栅化、合成并以其它方式操纵矢量图形。例如,一个或多个图形处理单元113(“GPU”)可以是任何常规的图形处理单元,诸如由英特尔、AMD和NVIDIA生产的那些。附加地,一个或多个GPU可以是单指令多数据(SIMD)设备、单指令多线程设备(SIMT)。每个GPU113可以具有自然事务大小,诸如例如64、128或256字节或更多或更少的字节,其分别等于16、32或64个字。自然事务大小可以是GPU的架构宽度(即,在多处理器(诸如GPU 113)中,可以在单个周期内处理的字数)。
尽管图1在功能上将计算设备的处理器、存储器和其它元件图示为位于同一块内,但是处理器、计算机、计算设备或存储器可实际地包括可以或者可能未被存储在同一物理外壳内的多个处理器、计算机、计算设备或存储器。例如,存储器114可以是位于与计算设备110的外壳不同的外壳中的硬盘驱动器或其它存储介质。
对处理器、计算机、计算设备或存储器的引用将被理解成包括对可以或者可以不并行操作的处理器、计算机、计算设备或存储器的合集的引用。例如,计算设备110可以包括作为负载平衡服务器场、分布式系统等而操作的服务器计算设备。又另外,尽管在下面描述的一些功能被指示为在具有单个处理器的单个计算设备上进行,但是本文描述的主题的各个方面可由例如通过网络160传送信息的多个计算设备实现。
计算设备中的每一个均可位于网络160的不同节点处并且能够与网络160的其它节点直接地和间接地通信。尽管在图1和图2中描绘了仅几个计算设备110、120、130和140,但是应领会的是,典型系统可包括大量连接的计算设备,其中每个不同的计算设备位于网络160的不同节点处。本文描述的网络160和中间节点可使用各种协议和系统来互连,使得该网络可以是因特网、万维网、具体内部网、广域网或局域网的一部分。网络可利用标准通信协议,诸如以太网、WiFi和HTTP、一个或多个公司专有的协议以及上述各项的各种组合。尽管当如上面所指出的那样发送或者接收信息时获得某些优点,但是本文描述的主题的其它方面不限于信息的任何特定传输方式。
作为示例,计算设备110中的每一个均可以包括能够经由网络与存储系统150以及计算设备120、130和140进行通信的web服务器。例如,服务器计算设备110中的一个或多个可以使用网络160来向用户(诸如用户220、230或240)发送信息并且在显示器(诸如计算设备120、130或140的显示器122、132或142)上将信息呈现给用户。在这方面,计算设备120、130和140可以被认为是客户端计算设备,并且可以执行本文描述的特征中的全部或一些。
可以与具有如上所述的一个或多个处理器、存储器和指令的服务器计算设备110类似地配置客户端计算设备120、130和140中的每一个。每个客户端计算设备120或130可以是意在供用户220或230使用的个人计算设备,并且具有通常连同个人计算设备一起使用的所有组件,诸如中央处理单元(CPU)、存储数据和指令的存储器(例如,RAM和内部硬盘驱动器)、诸如显示器122、132或142这样的显示器(例如,具有屏幕的监视器、触摸屏、投影器、电视或可操作来显示信息的其它设备)以及用户输入设备124(例如,鼠标、键盘、触摸屏或麦克风)。客户端计算设备还可以包括用于记录视频流和/或捕获图像的相机、扬声器、网络接口设备以及用于将这些元件彼此连接的所有组件。
尽管客户端计算设备120、130和140可以各自包括全尺寸个人计算设备,但是它们可以替换地包括能够通过诸如因特网这样的网络与服务器(诸如服务器计算设备110)交换数据的移动计算设备。仅作为示例,客户端计算设备120可以是移动电话或诸如支持无线的PDA、平板PC或能够经由因特网获得信息的上网本这样的设备。在另一示例中,客户端计算设备130可以是平板或膝上型计算机。在附加示例中,客户端计算设备140可以是数码相机,诸如360度相机或数码单镜头反射相机。作为示例,用户可以使用小键盘、键区、麦克风、与相机一起使用视觉信号或者使用触摸屏来输入信息。
与存储器114一样,存储系统150可以是能够存储由服务器计算设备110可访问的信息的任何类型的计算机化存储装置,诸如硬盘驱动器、存储卡、ROM、RAM、DVD、CD-ROM、可写和只读存储器。此外,存储系统150可以包括分布式存储系统,其中数据被存储可以在物理上位于相同或不同的地理位置处的多个不同的存储设备上。存储系统150可以如图1中所示的那样经由网络160连接到计算设备并且/或者可以直接地连接到计算设备110、120、130和140(未示出)中的任一个。
CPU和GPU分别可以具有单独的或统一存储器架构,如图3A和图3B中所示。单独的存储器架构(也称为分立存储器系统)可以由具有它们自己的分立存储器的CPU 112和GPU113组成。为了在CPU和GPU存储器之间转移数据,可以利用诸如PCI Express 119这样的总线,如图3A中所示。在统一存储器设备中,CPU和GPU可以共享高速缓存并且跨越其处理元件提供存储器一致性。例如,如图3B中所示,CPU 112和GPU 113共享包括本地级高速缓存115和动态随机存取存储器117的存储器接口。
示例方法
首先转向拉出步骤,可以将级联矢量路径数据的块从主机存储器位置移动到由GPU分配和管理的高效可遍历的数据结构。例如,计算机系统中的处理器(诸如CPU 112)可以将矢量路径数据(包括顺序路径数据401)从主机存储器420转移到由GPU 113可访问的存储器,诸如GPU的分立存储器,如图4中所示。在这方面,可以取决于GPU的自然事务大小而将来自主机存储器420的顺序路径数据重组成许多固定大小的块,使得可以更高效地利用使GPU 113与主机存储器分开的总线。固定大小的块可以进一步取决于GPU的自然处理大小,诸如64、128或256个字节或更多或更少的字节,其分别等于16、32或64个字。如果CPU和GPU共享相同的存储器位置(诸如共享高速缓存),则可以绕过拉出步骤。
为了将矢量路径数据从主机存储器转移到GPU的分立存储器,CPU然后可以将拉出命令附加到GPU的命令缓冲区407,GPU 113从所述GPU的命令缓冲区407中检索其指令。每个拉出命令可以指向驻留在主机存储器中的总路径的一小部分。GPU可以并行执行所有拉出命令并且将数据从主机存储器拷贝到GPU的存储器。每个拉出命令可以包含路径的主机ID(即,可以找到矢量路径数据的位置)、在当前拉出命令之前的完整路径节点的数目、进入主机存储器分段区域的偏移以及节点应拷贝的存储器分段区域的数目。拉出命令可以由拉出内核403在阈值数目的拉出命令被附加到GPU的命令缓冲区时、在已经经过预定量的时间之后和/或当GPU试图访问拉出内核403内的子内核时执行。
在执行拉出命令的同时,GPU可以同时地为每个不同的矢量路径构建路径数据结构501,如图5中所示。在这方面,GPU通常未被设计有高效且高性能动态存储器分配器,因此GPU被编程来执行它自己的存储器分配。因此,并行化流水线中的路径数据结构501由存储器的固定大小的块构建,所述存储器的固定大小的块允许并行化流水线从数据块池405快速地获取并释放固定大小的块。GPU可以在GPU的数据块池405中保留存储器的足够块以存储路径数据结构501。通过同时地执行拉出命令并构建数据结构,可以产生显著的处理效率增益。
主机到设备映射505可以被存储在GPU的存储器内。主机到设备路径映射505可以存储设备路径ID 506,所述设备路径ID 506将路径的主机路径id 503在主机存储器420内的位置映射到对应的路径数据结构501的路径头507。
路径数据结构可以各自包括路径头507,所述路径头507是块的链表数据结构中的根节点。路径头块包含关于在拉出命令期间计算出的整个路径的描述性信息,诸如路径所要求的块的总数(即,总节点计数)、在路径中有多少条线和曲线(即,分段511)以及路径的2D边界(即,路径边界)。路径头507可以进一步包括头节点id,其指示第一路径节点在位于路径数据结构501中的路径节点509的链表中的位置。路径头507及其附连的路径节点509可以全部由从相同大小的块构建,但是不同的块大小是可能的。
如图5中进一步所示,每个路径节点可以包括指示相应的路径节点内的分段的总数的分段计数,以及下一个路径节点在链表中的位置的标识(即,“下一个节点id”)。对于路径数据结构中的最后路径节点,下一个节点id可以被留为空值,从而指示没有另外的路径节点在路径数据结构内。每个路径节点还可以包括路径分段块,所述路径分段块是指向描述组成由该路径节点表示的路径的路径分段的曲线和线几何形状的数据的块的索引。在这方面,分段块可以包括类型分段块,其描述通过坐标块指向的坐标是否表示线性的或曲线的一部分的路径分段,诸如三次或二次分段。线可以用两个二维坐标(诸如(x0,y0)→(x1,y1))来描述,然而曲线(诸如贝塞尔曲线)可以用三个或四个二维坐标来描述。
每个路径(包括组成整个路径的每个路径分段的路径坐标)可以像通过图4的路径409所示出的那样被存储在GPU的存储器中。可以从GPU的路径409中检索通过路径数据结构中的坐标块所指向的路径坐标。这样的路径数据结构可以允许使用基本操作(诸如32位字原子操作)来并行更新路径头507和每个路径节点509。
数据结构内的路径分段可以由GPU光栅化以创建光栅,所述光栅表示适合于渲染和其它后光栅化活动(诸如命中检测、剪裁和遮罩)的变换路径。在光栅化路径409之前,GPU可以执行附加内核,所述附加内核使GPU的存储器和路径为光栅化作准备,如图6中所示。例如,GPU 113可以从主机设备接收填充命令603。填充命令603可以是3元组或4元组或更多或更少元组,其提供执行路径分段的光栅化所需的信息。在这方面,元组可以包括指示路径的主机id、在构建中的光栅的主机id、光栅组群id(即,指示被一起处理的光栅的组)和/或到将在光栅化之前被应用于此路径的变换矩阵的指针(或索引)。填充命令603还可以包括到在光栅化之前或期间剪裁变换路径的“剪裁”区域的指针(或索引)。填充命令603可以分别由分配光栅内核605和扩展光栅内核607读取。如本文所描述的,分配光栅内核和扩展光栅内核可以将填充命令603转换成更细粒度的设备侧光栅化命令609。
GPU可以执行拷贝变换内核,当GPU具有与主机设备分开的存储器时,所述拷贝变换内核将一个或多个变换矩阵(即,变换601)从主机设备的存储器拷贝到GPU的存储器中。在这方面,在矢量路径被渲染之前,并行化处理流水线可以接收变换请求,诸如缩放、旋转、剪切和/或平移矢量路径的请求。所以到光栅化内核的每个命令指向与矢量路径相对应的数据结构和可以在光栅化之前被应用于数据结构的变换矩阵。
如图7中所示,可以并行变换与矢量路径相对应的数据结构。在这方面,可以对通过第一数据结构501中的每个路径节点的路径分段所指向的每个二维坐标执行矩阵乘法。矩阵乘法导致整个矢量路径取决于哪些变换矩阵被应用而被缩放、旋转、剪切和平移。经变换的矢量路径可以被存储在变换路径701中。每个更新的路径(包括组成路径701的整个路径的每个更新的路径分段的路径坐标)可以被存储在GPU的存储器中。例如,第一路径可以包含对应于矩形的四个线分段。四个线分段可以经历变换矩阵的将曲线应用于四个线分段中的每一个的矩阵乘法。由矩阵乘法产生的四个线分段可以被存储在变换路径中。
GPU可以进一步执行分配光栅内核和扩展光栅内核。分配光栅内核605可以使GPU为将由光栅化内核611处理的光栅头分配和保留数据块池405中的存储器块,如本文进一步描述的。
扩展光栅内核607可以使CPU生成并更新光栅组群ID映射,所述光栅组群ID映射将光栅组群ID映射到全尺寸设备光栅ID,如图8中所示。光栅组群ID映射805可以存储设备光栅ID(即,光栅组群ID 806),所述设备光栅ID将主机光栅id 803在主机存储器内的位置映射到对应的光栅数据结构801的光栅头807。光栅组群ID 806是求解如下问题的临时ID:64位或更多或更少位图块追踪子像素键(TTSK)结构不提供足够的空间来指向包含图块追踪子像素(TTS)、其图块坐标以及表示光栅头807的固定大小的块的固定大小的TTSB块。在这方面,由于GPU可以仅在任何一个时刻并行光栅化数千个路径,所以TTSK节点809不需要记录光栅头的25-32位或更多或更少位地址,而是相反TTSK节点仅需要将它本身与其组群中的其它光栅节点区分开。为了允许实现TTSK的快速分类,可以使它们保持小。一旦光栅后处理完成,就可以使用较小的光栅组群id作为索引来从表读回真实光栅id(即,主机光栅ID803)。
返回到图6,GPU可以基于从光栅化命令队列609接收到的指令来启动光栅化内核611。光栅化内核611可以将经变换的数据结构701中的变换路径分段转换成光栅。在这方面,光栅化内核可以将变换路径分段的线和曲线拆分成子像素线分段,所述子像素线分段定义变换路径分段在具有预定义宽度和高度的像素图块的边界内的位置。
子像素线分段可以被分离成图块并编码为图块相对图块追踪子像素(TTS)。可以在图块追踪子像素块(TTSB)结构中保持预定义数目的TTS,诸如16或32个。除了光栅组群ID和图块坐标之外,还可以生成可以指向相应的TTSB的TTSK键615,如图6中所示。TTSK还可以指示它包含的TTS属于哪一个图块。
如果变换路径分段是曲线,则可以在光栅化之前将它们展平成线分段。例如,如图9中所示,弯曲分段可以由处理器组中的一个或多个处理器并行细分并展平成线分段。如先前所讨论的,线可以用两个二维坐标(诸如(x0,y0)→(x1,y1))来描述,然而曲线(诸如贝塞尔曲线)可以用三个或四个二维坐标来描述。如果贝塞尔曲线是二次的,则它可以被度升高成三次的。线分段可以被表示为四坐标结构(例如,(x0,y0)→(x1,y1)),然后可以被放置在单个处理器内并保持在横跨处理器组的四个或更多或更少的寄存器的级别中。可以跨越处理器组内的两个相邻处理器拆分三次曲线。例如,可以将由表示三次曲线的x0-x3和y0-y3组成的八坐标结构定位在横跨处理器组901的四个寄存器的级别内,如图9中所示。从X轴线开始,四控制点三次曲线的每条轴线均可以位于组中的单个处理器上并保持在四个寄存器四元组中。例如,x0-x3可以被存储在第一处理器903的四个寄存器中并且y0-y3可以被存储在第二处理器905的四个寄存器中。每一分段可以用指示它是空白的、线还是三次“X”或“Y”分段的类型来标记。每个单轴线三次控制点可以被细分,从而导致八个控制点仍属于同一轴线。这八个控制点可以重用四个寄存器并且临时地使用处理器的四个以上寄存器。所有细分的分段都可以被合计并写入到本地存储器。
可以用处理器组的每个处理器来执行组范围内含前缀和。前缀和是用于高效地计算N个值的运行总数的公共数据并行算法,并且可以是内包的或排他的。在这方面,内含前缀表示包括元素它本身的所有先前元素的和总数。例如,[1,5,3,9]的内含前缀和将是[1,6,9,18],然而排他的仅对元素它本身之前的元素进行计数。为了计算组范围内含前缀和,每个处理器可以在分段已经为空白的情况下贡献零,在分段为线的情况下贡献一,而在分段为三次曲线的情况下贡献216。
可以将内含前缀和转换成排他前缀和,使得组中的每个处理器具有存储其分段的位置的索引。在这方面,当处理器正在保持线分段时,前缀和的低16位或更多或更少位可以是在共享本地存储器中附加分段的位置的偏移,而当处理器正在保持三次分段时,尽管可以使用其它位,但是前缀和的高16位或更多或更少位可以表示附加三次分段的位置的偏移。可以将这些分段附加到三次或线分段的现有队列。
如果存在任何三次分段,则将总数与有多少三次分段在寄存器的先前级别中可用相比较。如果存在大量三次分段则处理器组的操作级别增加。处理器组的操作级别是在细分过程中使用的寄存器的每个相应的行。如果存在不足则操作级别降低。否则,操作级别将保持不变。一旦新操作级别被确定,寄存器四元组就被加载有尽可能多的分段。接下来,共享本地存储器队列中的线分段的数目被合计。如果入队的线分段足够则它们被处理成子像素,如在本文中进一步描述的。三次曲线的转换可以继续直到没有三次曲线要细分为止。例如,如果GPU113具有16个字的自然事务大小,则每个多处理器可以加载最多十六个四坐标分段,其可以表示多达八个三次曲线。可以细分这8条三次曲线,从而产生十六条三次曲线。如果这些较小的三次曲线都未被确定为足够平以被认为是线分段,则较小的三次曲线中的八条可以被保存在寄存器中,然后对包含十六个四坐标分段的剩余八条三次曲线进行细分。如果细分的曲线比可被处理的更多,则在适当的位置然后我们需要增加操作级别(即,从级别0到级别1)。
在一些情况下,可以估计实现平坦度所必需的细分次数以减少处理。在这方面,可使用保守估计或乐观估计来计算细分次数。估计可以确定曲线应该被划分多少分段以便这些分段被认为是线分段。保守估计可以确保分段足够平以被认为是线分段。使用所估计的细分次数,进展组可协作地细分一个或多个三次分段并且既减少共享本地存储器事务又减少取决于估计器有多么保守而必需的寄存器级别的数目。
可以在若干完全并行化步骤中将线分段直接地转换为子像素。在这方面,组中的一个或多个处理器可以加载线分段。对于每个加载的线分段,可以用前缀和来计算X轴线上的X裂片的总数,其中裂片是轴线宽度小于或等于一个像素的线分段。基于前缀和,组中的一个或多个处理器可以从共享存储器中协作地加载X裂片并且针对该裂片计算(y0,y1)端点,以及如果需要,在共享存储器中更新分裂线分段的端点。对于处理器组,可以用另一前缀和来计算表示子像素的Y裂片的总数。例如,如图10中所示,可以将线分段1001-1004加载到处理器组中。然后可以将每个线分段1001-1004拆分成X裂片和Y裂片。例如,可以在X裂片1001a、1001b、1001c和1001d中拆分线分段1001,其中这些裂片中的每一个通过Y坐标交叉来定义。还可以将线分段1001拆分成通过X和Y坐标交叉所定义的Y裂片1001e、1001f、1001g、10001h和1001i,其中每个Y裂片表示一子像素。
处理器组可以继续转换线分段直到有足够的子像素合并成TTSB块为止。在这方面,基于前缀和,处理器组可如本文所描述的那样将多达处理器组大小的子像素协作地存储到共享本地存储器队列中以进行合并,并且在足够的子像素被排队时,将子像素合并成TTSB块。
可以将每个子像素线分段放置到TTSB块中。在这方面,基于前缀和,处理器组可将多达处理器组大小的子像素协作地存储到共享本地存储器队列以进行合并。例如,图11示出Y裂片1001e和1001f被放置到TTSB块1101中并且Y裂片1001g-1001i被放置到TTSB块1103中,其中线分段1001-1004的其它Y裂片取决于其图块位置而被放置在TTSB块1101-1107中的一个中。在一些情况下,图块坐标的哈希可以用于确定哪一个容器要用于图块。
在有足够的子像素来填充TTSB结构时,或者如果必须刷新图块容器,则可以将每个子像素线分段编码在图块追踪子像素(TTS)结构中。在这方面,可以有有限数目的容器可被处理器组利用,并且如果图块坐标哈希编索引正在针对不同图块累加子像素的容器,则可以刷新该图块并且可以将TTSK/RYX键创建为到已刷新的TTSB的指针。在图12中示出了用子像素分辨率的5位来表示示例正方形32×32(32位)像素图块的示例TTS,但是也可以使用矩形图块。TX 1201表示无符号min(x0,x1)图块子像素坐标,SX 1203表示具有范围[0,32]的从最小到最大x的无符号子像素跨度,TY 1205表示无符号min(y0,y1)图块子像素坐标,并且DY 1207表示有符号子像素增量(y1-y0)。DY中的增量的范围可以是[-32,32]但是可以不对水平线进行编码,所以[1,32]被映射为[0,31]并且可以被存储在6个位中。尽管子像素分辨率被示出为5个位并且图块大小被示出为32x32个像素,但是分辨率可以大于或小于5个位并且图块大小可以小于或大于32x32个像素。如果未请求光栅的子像素平移,则不需要能够导出线分段在X轴线上的原始方向并且SX值可以是标量。类似地,如果未请求光栅的像素平移则仅像素坐标、面积和DY需要被存储在TTSK中。
可以对图块追踪子像素键进行分类和分段以使得能够基于路径相应的子键来并行渲染路径。例如,返回参考图6,在产生TTSK 615时,分类和分段内核617可以由GPU执行以按光栅组群ID对TTSK进行分组,并且按其子键对TTSK进行分类。每个TTSK可以包括三个子键或更多或更少的子键,包括光栅组群ID、Y图块坐标和X图块坐标。可以根据子键对TTSK进行分类。在分类完成之后,可以按每个光栅组群ID、Y图块坐标和X图块坐标对TTSK进行分组。
TTSK分类和分段内核617可以将每个分类的TTSK与前任相比较并且如果一定数目的位不同,则经分类的TTSK的索引被附加到范围。在这方面,每个索引标记属于光栅组群ID的TTSK的序列的开头。分类和分段内核617步骤也可以确切地计算前缀后处理阶段将要求多少个TTPB块和TTPK节点。TTSK节点的数目只是TTSK键的数目的函数。可以在执行前缀内核之前从块池405中分配TTPB块、TTPK节点和TTSK节点的总数。
必须从每个TTSB的TTS值合成图块追踪前缀块(TTPB)以便渲染原始矢量路径。在这方面,由光栅化内核产生的TTSB以及由TTSK分类和分段内核处理的TTSK可能要求附加后处理步骤。再次参考图6,前缀内核621可以跨越所有图块的列并且针对从图块中的每一行(“扫描线”)从左向右扫描TTS值以累加每个TTS子像素线的有符号垂直分量。注意的是,子像素线具有“方向”。累加的垂直值的此单列是TTPB并且可以是16到32个有符号整数或更多或更少。数据的此列表示前一个图块对在其右边的图块的潜在贡献。
在示例中,试图被显示的矢量图形可以是字母“A”的大版本,使得它覆盖许多16x16像素图块,然后将在内上三角形中存在大量空白空间。空白空间中的图块不需要显示任何像素,但是三角形的右手侧的内边缘需要知道在所有路径左边绘制的所有路径(其可能是许多图块)的贡献。TTPB表示执行最终像素覆盖率计算所必需的“进位”值。通过使用TTPB和TTSB两者,每个图块可以完全隔离地执行其渲染。
对于每个索引,GPU可以执行前缀内核,所述前缀内核顺序地加载索引内的TTSK并且将TTSK存储到经预分配的TTSK节点中。前缀内核可以在确定TTSK图块坐标在加载顺序TTSK时改变时,将经累加的图块追踪前缀(TTP)值存储到经预分配的TTPB块中,构造TTPK键,并且将TTPK键存储到经预分配的TTPK节点中。如果TTSK光栅ID改变,则前缀内核可以退出。然后可以给TTSB块中的TTS指派到TTSK键的指针并且可以将TTS高度分散添加到1xH数组,其中H是列的数目。
在前缀阶段结束时,每个光栅623可以具有以下关联的数据:a)包含指向包含TTS的TTSB的TTSK的TTSK节点809的列表;b)包含指向包含TTP高度的TTPB的TTPK的TTPK节点811的列表;c)TTSK 813的总计数;d)TTPK 815的总计数;以及e)具有子像素分辨率的紧密轴线对齐边界,如图8的光栅数据结构中所示。在一些实施例中,长路径可能要求通过光栅化、分类和分段及前缀内核处理多遍。
在给数据加前缀时,放置内核可以由GPU执行以指定光栅应对被子像素平移并然后渲染在由图块追踪构图键(TTCK)的数组组成的构图中的特定层上。可以将每个构图视为空间上分区的TTCK键的一个或多个容器。例如,放置命令队列1301可以用使GPU执行放置内核1303的放置命令填充,如图13中所示。在这方面,放置内核1303可以使与GPU处理器相对应的执行组各自确定光栅623的边界是在构图边界中还是外部。如果光栅的边界是在构图外部则放置被取消。否则,对于TTSK节点中的所有TTSK,放置内核a)平移TTSK键;b)将TTSK键转换成TTCK键;c)将TTCK键附加到本地队列;并且d)如果本地队列满了或者需要被刷新,则将它附加到构图的TTCK键范围。
类似地,对于TTPK节点层次中的所有TTPK键,放置内核1303使GPU:a)平移TTPK键;b)扩展TTPK键,因为它可能横跨多个图块;c)裁剪经扩展的图块范围;d)将每个TTPK键转换成TTCK键;e)将每个TTCK键附加到本地空间上合并的队列;并且f)如果本地空间上合并的队列满了或者需要被刷新,则将它附加到构图的一个或多个空间上合并的TTCK键范围。再次,因为每个TTCK的图块位置是已知的,所以可以将构图视为空间上分区的TTCK键的一个或多个容器。因此,可以减少表示图块在TTCK构图中的X和Y坐标所要求的位数。
放置内核1303可以通过生成多达四倍多的TTCK键来重用光栅对象,所述TTCK键承载指示应该如何在图块内平移TTSB和TTPB字的图块分辨率平移偏移(dx,dy)。在这方面,在将TTS和TTP字分散到共享本地存储器累加器中之前,应用平移并且可以适当地裁剪值。在图块“左边”的TTP字可以被钳位并累加在列0中。如果光栅化路径的平移不是要求,则TTS和TTP字可预先计算它们在光栅化内核中的面积贡献,在本文中进一步讨论。
TTCK可以由第二分类和分段内核1307分类以在空间上分区的容器中对TTCK进行分类。在这方面,可以对TTCK进行分类,使得属于同一图块的TTCK是递增层次序。分类和分段内核可以进一步针对图块定位第一TTCK的起始索引。例如,可以将TTCK视为64位或更多或更少位无符号整数并且可以比较64位中的预定义数目的高位“T”。出于第二分类和分段内核1307的目的,整个构图可以具有单个容器,所以可能不需要分区。可以在“T”个位中找到三个子键或更多或更少的子键,包括Y图块坐标、X图块坐标和层索引。在分类完成时,可以按每个图块坐标并以递增层次序对TTCK进行分组。
TTCK分类和分段内核1303可以使GPU 113将每个分类的TTCK与其前任相比较。如果预定义数目的位与经分类的索引的索引不同,则经分类的TTCK被附加到范围。每个索引可以标记属于位置(X,Y)处的图块的TTCK的序列的开头。经分类的TTCK 1309可以被存储在数据块池405中。
因为每个TTCK键的图块位置是已知的,所以可以存在减轻TTCK分类阶段的分类复杂度的机会。在这方面,构图是TTCK键的数组并且可被视为空间上分区的TTCK键的一个或多个容器。构图的分区可以小至每个图块坐标一个容器。通过对构图空间上分区,可以减少表示图块在TTCK键中的X和Y坐标所要求的位数。
在对TTCK进行分类和分段时,可以渲染光栅。在这方面,渲染内核可以为TTCK键范围中的每个图块启动执行组。每个执行组的功能是为了将TTCK键解码成与相邻层混合的填充路径轮廓。在这方面,每个执行组处理像素的固定大小的图块并且分配存储器的各种图块大小的块。当没有更多的键要处理或者图块被命令刷新时,经混合的像素被存储或者合成到目标表面上。例如,如图14中所示,在GPU上执行的渲染内核1403可以接收TTCK 1309和样式信息1401。渲染内核可以将光栅623渲染到帧缓冲区1405中以供输出到显示器上。
对于加载到执行组的每个通用图块TTCK序列,渲染内核1403可以使执行组并行执行以下步骤:
1.加载序列中的第一TTCK键。
2.记录此键的(X,Y)位置和层索引。
3.清除图块高度和面积累加器。
4.将TTSB或TTPB块的字分散添加到适当的累加器。
5.加载下一个键。
6.如果下一个键具有相同的Y、X和层索引值则转到4。
7.否则,临时地保存此TTCK键。
8.加载与当前层相关联的组ID。
9.如果当前层的组ID与工作进行中的组ID匹配,则:
a.加载并执行与此层相关联的所有命令
b.所保存的TTCK键现在是当前的TTCK键
c.转到3。
10.如果当前层的组ID在当前组的层范围内,则:
a.我们知道当前层属于在层次中较深的组。
b.对于当前组ID与当前层的父组之间的所有组ID:
i.加载并执行与键入此组ID相关的所有命令
ii.更新当前深度、层范围和组ID。
c.加载并执行与此层相关联的所有命令
d.所保存的TTCK键现在是当前TTCK键
e.转到3。
11.否则,该层必须属于组层次中的表亲。
a.加载并执行与退出当前组ID相关联的所有命令
b.更新当前深度、层范围和组ID。
c.转到9.d
用于渲染光栅的上述步骤认识到线分段对多边形的总面积的有符号贡献为((x0+x1)*(y1-y0))/2,其也是左梯形的面积。另一简化可以包括忽略分母并且继续进行缩放了两倍的贡献(即,((x0+x1)*dy))。这些定向面积贡献可以被累加以产生多边形的缩放了两倍的有符号总面积。
多边形面积公式可用于计算扫描线上的每个像素的覆盖面积。在这方面,扫描线通常沿着递增x方向(即,从左向右)被处理,从而要求扫描线上的每个像素将任何累加的覆盖率从这些像素向其左边“进位”。此“进位”值可以等于在当前像素左边的所有dyi值的求和乘以沿着x轴线的子像素分辨率:
可以将左梯形面积结果转换为右梯形面积以便利用上述等式。为了将左梯形转换为右梯形,如图15中所示,可以通过从整个子像素宽度和高度1501中去除左梯形1503来找到右梯形1505。如果以递增x次数处理扫描线,则可以跳过从左梯形面积到右梯形面积的转换。
基于到右梯形面积的上述转换,像素的总分数覆盖率可以等于:
其可以被简化为以下等式:
可通过将子像素线分段分组成具有适合GPU 113的本机执行宽度的宽度的尺寸的公共图块来使子像素覆盖率面积计算并行化并变得适合于并行处理。为了计算图块中的每个像素的覆盖率,与图块相交的每个子像素线分段可计算其定向面积贡献并且将其定向面积贡献分散添加到驻留在GPU的存储器中的图块矩阵。这样的累加可以继续直到所有相交的子像素线分段已被分散添加为止。类似地,可用数据并行前缀和算法来计算在每个图块左边的图块的覆盖率贡献。此外,如果图块的高度与数据并行设备的本机执行宽度匹配,则可按仅受可用存储器带宽限制的吞吐量而执行前缀和。此外,给定所有光栅化子像素线分段轮廓和在左边的图块的“进位”覆盖率贡献,可在一遍中并用最小计算计算图块中的每个像素的覆盖率。
可以存在一个或多个可能的层、组进入和组退出命令。例如,这些命令可以包括层非零和奇偶覆盖率计算;层覆盖率累加、掩码处理、反转和初始化;层颜色实心填充和渐变填充;使用Porter-Duff混合规则的层间混合;组间混合操作;帧缓冲区写入或混合;执行组状态保存和恢复;外部操作的协调执行;用于早期退出的不透明测试。
为了将TTSB或TTPB块的字分散添加到适当的累加器,可以使用单或双累加器。首先转向双累加器,对于通过TTCK键指向并属于同一层的所有TTSB和TTPB块,可以将面积(其是右梯形)和dy值分散添加到共享本地存储器累加器中。例如,如图16中所示,可以将存储于在TTSB内找到的TTS 1601内的数据分散添加到包括面积累加器1607和dy累加器1605的两个存储器累加器中。可以将在TTBP内找到TTP 1603的数据分散添加到dy累加器1605中。然后可以使用以下双累加器等式来找到列j的像素覆盖率:
现在转向单累加器,对于通过TTCK键指向并属于同一层的所有TTSB和TTPB块,可以将右梯形面积和左梯形面积分散添加到单个共享本地存储器面积累加器。例如,如图17中所示,可以将存储于在TTSB内找到的TTS 1601和在TTBP内找到的TTP 1603内的数据分散添加到面积累加器1701。在这方面,可以将通过TTS所定义的右梯形面积1705和左梯形面积1703分散添加到面积累加器1701。可通过辨识在子像素线分段右边的像素来以将双累加器等式转换成等效的单累加器计算。一旦这个完成,就使用以下等式来计算列j的像素覆盖率:
后光栅化活动(诸如命中检测、剪裁和遮罩)可以使用并行流水线。并行流水线中使用的数据构图是已按照图块Y、图块X和层(YXL)次序分类的TTCK键的合集,其可以被用于除渲染以外的目的。例如,命中检测内核可以高效地并行查询数据构图以确定一个或多个用户输入点或区域是否与构图中的层上的任何填充路径相交。在这方面,命中检测内核返回具有将与这些输入点或区域相交的路径的图块和层的列表。所报告的层索引也可以用于确定包围该层的组ID的祖先路径。在示例中,包括完全透明的控制点的构图可用命中检测内核来测试,然后在存在相交的情况下改变样式并变得不透明以便简化要求用户输入和跟踪的图形应用的开发。
外部操作可以由渲染内核1403排程。在这方面,外部操作可以涉及多个图块并且直到所有潜在地涉及的图块都已暂停处理才能开始。这样的操作的示例可以包括用模糊、锐化、旋转或缩放内核来变换中间层;使用邻近像素颜色和覆盖率数据进行子像素抗混叠;对表面执行从一个区域到另一区域的位块传送;从一个表面到另一表面位块传送;从一个区域加载和处理并存储到另一区域;以及与外部流水线会合。
可以用放置到层上的光栅来定义必须在外部操作可开始之前暂停的图块。如果光栅化路径REGION 0与图块重叠,则该图块执行组将暂停渲染,保存图块的状态并且登记图块已在与此层相关联的协调外部操作描述符上暂停。由于描述符已经具有与REGION N光栅相交的图块的总计数,所以要登记其暂停的最后图块可发起外部操作的执行。
外部操作可以执行影响多个独立但可能重叠的区域的多个处理步骤。如果区域和处理步骤是独立的,则每个区域可用它自己的层和描述符来表示。当外部操作确定它完成时,可以将暂停图块释放回到渲染阶段。暂停图块最终可以被指派给执行组并且使其状态被恢复,并且可以重新开始处理。
整个并行流水线可以伪装为隐藏流水线的异步执行的立即模式API。在这方面,流水线中的API被设计为易于使用并且使得可通常在不阻塞的情况下调用路径和光栅API函数。API表示具有立即可使用但表示可能不可用的资源的主机侧引用的路径和光栅资源。
流水线中的API还可以支持回收与这些主机侧对路径和光栅的引用相关联的资源。如先前描述的,路径和光栅主机ID映射到设备侧ID并且设备侧路径和光栅数据结构由从GPU上的一个或多个固定大小的块池分配的块构成。释放内核可以遍历路径和光栅数据结构并且将每个块返回给数据块池。
图18的流程图1800是可以由诸如客户端计算设备120、130或140这样的一个或多个计算设备执行的上述各方面中的一些的示例流程图。应理解的是,本文讨论的步骤仅仅是示例;步骤可以以不同的次序发生,可以添加步骤,并且可以省略步骤。在此示例中,可以将矢量图形的矢量数据加载到可由一个或一个以上并行处理器访问的本地存储器中,如块1801中所示。矢量数据可以包括由矢量图形的一个或多个路径分段组成的一个或多个路径,如块1803中所示。一个或多个并行处理器可以将一个或多个路径分段光栅化成相应的光栅并且基于相应的光栅的像素坐标来将每个光栅指派到组中,其中每个组可以具有关联的键并且每个组内的光栅表示同一矢量图形的一部分,如块1805中所示。光栅可以根据它们相应的像素坐标被放置到子像素上并且由一个或多个并行处理器渲染到显示器上,如分别在方块1807和1809中所示。
大多数上述替代示例不是相互排斥的,而是可以被按照各种组合实现以实现独特的优点。因为可在不脱离由权利要求所限定的主题的情况下利用上面讨论的特征的这些及其它变化和组合,所以应该通过图示而不是通过限制由权利要求所限定的主题来进行实施例的上述描述。作为示例,不必以上述精确次序执行前面的操作。相反,可以不同的次序(诸如相反的或同时地)来处理各个步骤。除非另外陈述,否则还可省略步骤。此外,本文描述的示例的提供以及用短语表示为“诸如”、“包括”等的条款不应该被解释为将权利要求的主题限于具体示例;相反,这些示例旨在图示许多可能的实施例中的仅一个。另外,不同的附图中的相同的附图标记可识别相同或类似的元素。
Claims (20)
1.一种用于在数据并行计算设备上并行光栅化并且合成矢量图形的方法,所述方法包括:
由一个或多个并行处理器将所述矢量图形的矢量数据加载到由所述一个或多个并行处理器可访问的本地存储器中,其中,所述矢量数据包括由所述矢量图形的一个或多个路径分段组成的一个或多个路径;
由所述一个或多个并行处理器将所述一个或多个路径分段光栅化成相应的光栅;
由所述一个或多个并行处理器基于所述相应的光栅的像素坐标来将所述光栅中的每一个指派到组中,其中,每个组具有关联的键并且每个组内的所述光栅表示同一矢量图形的一部分;
由所述一个或多个并行处理器根据所述光栅的相应的像素坐标来将所述光栅放置到子像素上;以及
由所述一个或多个并行处理器将所述光栅渲染到显示器上。
2.根据权利要求1所述的方法,其中,加载所述矢量数据是响应于所述一个或多个并行处理器接收到识别所述矢量数据在主机存储器中的位置的一个或多个拉出命令而发生的。
3.根据权利要求1或2所述的方法,其中,加载所述矢量数据进一步包括同时地为所述矢量数据中的所述一个或多个路径中的每一个构建路径数据结构。
4.根据权利要求3所述的方法,其中,每个路径数据结构包括作为到包括块的链表数据结构的根节点的相应的路径头,每个相应的路径头包含关于在所述一个或多个拉出命令期间计算出的总路径的描述性信息。
5.根据权利要求4所述的方法,其中,对于每个路径头,关于所述总路径的所述描述性信息包括(i)路径所要求的块的总数、(ii)在所述路径中有多少条线和曲线、(iii)所述总路径的2D边界以及(iv)指示第一路径节点在所述链表数据结构中的位置的头节点中的一个或多个。
6.根据权利要求4所述的方法,其中,每个路径头与一个或多个路径节点相关联。
7.根据权利要求6所述的方法,其中,每个路径节点包括存储所述相应的路径节点内的分段的总数的分段计数块以及存储下一个路径节点在链表中的位置的下一个节点块。
8.根据权利要求4或5所述的方法,其中,每个路径节点包括存储索引的路径分段块,所述索引指向与所述一个或多个路径分段相关联的数据的块。
9.根据权利要求8所述的方法,其中,所述路径分段块包括类型块,所述类型块定义组成通过所述路径节点所表示的路径的所述路径分段的几何形状,其中,所述几何形状包括一条或多条曲线或线分段。
10.根据权利要求1至9中的一项所述的方法,其中,所述光栅化包括将路径分段转换成图块追踪子像素(TTS),以及将所述TTS包装成图块追踪子像素块(TTSB)。
11.一种存储指令的非暂时性计算机可读介质,所述指令在由一个或多个并行处理器执行时使所述一个或多个并行处理器执行以下步骤:
将矢量图形的矢量数据加载到由所述一个或多个并行处理器可访问的本地存储器中,其中,所述矢量数据包括由所述矢量图形的一个或多个路径分段组成的一个或多个路径;
将所述一个或多个路径分段光栅化成相应的光栅;
基于所述相应的光栅的像素坐标来将所述光栅中的每一个指派到组中,其中,每个组具有关联的键并且每个组内的所述光栅表示同一矢量图形的一部分;
根据所述光栅的相应的像素坐标来将所述光栅放置到子像素上;以及
将所述光栅渲染到显示器上。
12.根据权利要求11所述的非暂时性介质,其中,加载所述矢量数据是响应于所述一个或多个并行处理器接收到识别所述矢量数据在主机存储器中的位置的一个或多个拉出命令而发生的。
13.根据权利要求11或12所述的非暂时性介质,其中,加载所述矢量数据进一步包括同时地为所述矢量数据中的所述一个或多个路径中的每一个构建路径数据结构。
14.根据权利要求13所述的非暂时性介质,其中,每个路径数据结构包括作为到包括块的链表数据结构的根节点的相应的路径头,每个相应的路径头包含关于在所述一个或多个拉出命令期间计算出的总路径的描述性信息。
15.根据权利要求14所述的非暂时性介质,其中,对于每个路径头,关于所述总路径的所述描述性信息包括(i)路径所要求的块的总数、(ii)在所述路径中有多少条线和曲线、(iii)所述总路径的2D边界以及(iv)指示第一路径节点在所述链表数据结构中的位置的头节点中的一个或多个。
16.根据权利要求14或15所述的非暂时性介质,其中,每个路径头与一个或多个路径节点相关联。
17.根据权利要求16所述的非暂时性介质,其中,每个路径节点包括存储所述相应的路径节点内的分段的总数的分段计数块以及存储下一个路径节点在链表中的位置的下一个节点块。
18.根据权利要求14至15中的一项所述的非暂时性介质,其中,每个路径节点包括存储索引的路径分段块,所述索引指向与所述一个或多个路径分段相关联的数据的块。
19.根据权利要求18所述的非暂时性介质,其中,所述路径分段块包括类型块,所述类型块定义组成通过所述路径节点所表示的所述路径的所述路径分段的几何形状,其中,所述几何形状包括一条或多条曲线或线分段。
20.一种用于并行光栅化并且合成矢量图形的系统,所述系统包括:
一个或多个数据并行计算设备;以及
存储指令的存储器,所述指令能够由所述一个或多个数据并行计算设备执行,其中,所述指令包括:
将矢量图形的矢量数据加载到由所述一个或多个并行处理器可访问的本地存储器中,其中,所述矢量数据包括由所述矢量图形的一个或多个路径分段组成的一个或多个路径;
将所述一个或多个路径分段光栅化成相应的光栅;
基于所述相应的光栅的像素坐标来将所述光栅中的每一个指派到组中,其中,每个组具有关联的键并且每个组内的所述光栅表示同一矢量图形的一部分;
根据光栅的相应的像素坐标来将所述光栅放置到子像素上;以及
将所述光栅渲染到显示器上。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US201762508096P | 2017-05-18 | 2017-05-18 | |
US62/508,096 | 2017-05-18 | ||
PCT/US2018/022628 WO2018212826A1 (en) | 2017-05-18 | 2018-03-15 | A parallelized pipeline for vector graphics and image processing |
Publications (1)
Publication Number | Publication Date |
---|---|
CN110663064A true CN110663064A (zh) | 2020-01-07 |
Family
ID=61913534
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201880032433.1A Pending CN110663064A (zh) | 2017-05-18 | 2018-03-15 | 用于矢量图形和图像处理的并行化流水线 |
Country Status (4)
Country | Link |
---|---|
US (2) | US11557017B2 (zh) |
EP (1) | EP3625771A1 (zh) |
CN (1) | CN110663064A (zh) |
WO (1) | WO2018212826A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112328194A (zh) * | 2020-09-18 | 2021-02-05 | 广州中望龙腾软件股份有限公司 | 图纸并行显示方法、智能终端以及存储装置 |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP3625771A1 (en) * | 2017-05-18 | 2020-03-25 | Google LLC | A parallelized pipeline for vector graphics and image processing |
US11301776B2 (en) * | 2018-04-14 | 2022-04-12 | International Business Machines Corporation | Memory-based data selection scheme for machine learning training on limited memory resources |
CN110335190A (zh) * | 2019-06-20 | 2019-10-15 | 合肥芯碁微电子装备有限公司 | 基于cuda的直写式光刻机数据拓展方法 |
US11227359B2 (en) * | 2019-10-15 | 2022-01-18 | Adobe Inc. | User-defined image compositing on graphics processing units |
US11055810B1 (en) * | 2020-03-30 | 2021-07-06 | Adobe Inc. | Optimizing graphics geometry using similarity-based clustering |
US12093748B2 (en) * | 2020-09-25 | 2024-09-17 | Intel Corporation | Disaggregated computing for distributed confidential computing environment |
CN113052928B (zh) * | 2021-03-08 | 2024-07-19 | 贝壳找房(北京)科技有限公司 | 图像处理方法及图像处理系统 |
US11256720B1 (en) * | 2021-03-23 | 2022-02-22 | Efolder Inc. | Hierarchical data structure having tiered probabilistic membership query filters |
CN115482143B (zh) * | 2021-06-15 | 2023-12-19 | 荣耀终端有限公司 | 应用的图像数据调用方法、系统、电子设备及存储介质 |
WO2024136693A1 (ru) * | 2022-12-23 | 2024-06-27 | Общество с ограниченной ответственностью "ДубльГИС" | Способ и устройство для генерализации карты |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA1153470A (en) * | 1979-06-04 | 1983-09-06 | Jack R. Davis | Vector to raster processor |
US20160179574A1 (en) * | 2014-12-17 | 2016-06-23 | Nvidia Corporation | Work-efficient, load-balanced, merge-based parallelized consumption of sequences of sequences |
US20170032488A1 (en) * | 2015-07-30 | 2017-02-02 | Arm Limited | Graphics processing systems |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6456295B1 (en) * | 1999-12-21 | 2002-09-24 | Adobe Systems Incorporated | Method for simulating diffusion on a raster |
US7932914B1 (en) * | 2005-10-20 | 2011-04-26 | Nvidia Corporation | Storing high dynamic range data in a low dynamic range format |
EP3625771A1 (en) * | 2017-05-18 | 2020-03-25 | Google LLC | A parallelized pipeline for vector graphics and image processing |
-
2018
- 2018-03-15 EP EP18716707.7A patent/EP3625771A1/en active Pending
- 2018-03-15 CN CN201880032433.1A patent/CN110663064A/zh active Pending
- 2018-03-15 US US16/613,169 patent/US11557017B2/en active Active
- 2018-03-15 WO PCT/US2018/022628 patent/WO2018212826A1/en unknown
-
2022
- 2022-12-12 US US18/079,138 patent/US11983794B2/en active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA1153470A (en) * | 1979-06-04 | 1983-09-06 | Jack R. Davis | Vector to raster processor |
US20160179574A1 (en) * | 2014-12-17 | 2016-06-23 | Nvidia Corporation | Work-efficient, load-balanced, merge-based parallelized consumption of sequences of sequences |
US20170032488A1 (en) * | 2015-07-30 | 2017-02-02 | Arm Limited | Graphics processing systems |
Non-Patent Citations (1)
Title |
---|
YAFEI WANG等: "Parallel scanline algorithm for rapid rasterization of vector geographic data", 《COMPUTERS & GEOSCIENCES》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112328194A (zh) * | 2020-09-18 | 2021-02-05 | 广州中望龙腾软件股份有限公司 | 图纸并行显示方法、智能终端以及存储装置 |
Also Published As
Publication number | Publication date |
---|---|
US11983794B2 (en) | 2024-05-14 |
US11557017B2 (en) | 2023-01-17 |
US20200211148A1 (en) | 2020-07-02 |
EP3625771A1 (en) | 2020-03-25 |
WO2018212826A1 (en) | 2018-11-22 |
US20230113228A1 (en) | 2023-04-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11983794B2 (en) | Parallelized pipeline for vector graphics and image processing | |
US11127167B2 (en) | Efficient matrix format suitable for neural networks | |
US10482650B2 (en) | Methods, computer program and apparatus for an ordered traversal of a subset of nodes of a tree structure and for determining an occlusion of a point along a ray in a raytracing scene | |
US11790609B2 (en) | Reducing level of detail of a polygon mesh to decrease a complexity of rendered geometry within a scene | |
US9947084B2 (en) | Multiresolution consistent rasterization | |
CN105184837B (zh) | 一种矢量多边形栅格化的方法及系统 | |
US10614613B2 (en) | Reducing noise during rendering by performing parallel path space filtering utilizing hashing | |
US11651194B2 (en) | Layout parasitics and device parameter prediction using graph neural networks | |
US10424074B1 (en) | Method and apparatus for obtaining sampled positions of texturing operations | |
US10861230B2 (en) | System-generated stable barycentric coordinates and direct plane equation access | |
US11379420B2 (en) | Decompression techniques for processing compressed data suitable for artificial neural networks | |
US20200210805A1 (en) | Neural Network Generator | |
CN103886547A (zh) | 用于存储共享顶点的技术 | |
CN110084738B (zh) | 在扩展的图形处理管线中表示和处理几何形状的技术 | |
US11941743B2 (en) | Generation of sample points in rendering applications using elementary interval stratification | |
US11429534B2 (en) | Addressing cache slices in a last level cache | |
Doraiswamy et al. | Spade: Gpu-powered spatial database engine for commodity hardware | |
US20240013033A1 (en) | Large scale mask optimization with convolutional fourier neural operator and litho-guided self learning | |
Chang et al. | GPU-based parallel construction of compact visual hull meshes | |
Doraiswamy et al. | GPU-Powered Spatial Database Engine for Commodity Hardware: Extended Version | |
Lin et al. | SLFAG: Scan Line Fill Algorithm for PCB Image Rasterization Based on GPGPU | |
Landgraf | Constructing 3D Distance Fields on GPUs |
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 |