CN118052691A - 图形处理器 - Google Patents
图形处理器 Download PDFInfo
- Publication number
- CN118052691A CN118052691A CN202311525570.8A CN202311525570A CN118052691A CN 118052691 A CN118052691 A CN 118052691A CN 202311525570 A CN202311525570 A CN 202311525570A CN 118052691 A CN118052691 A CN 118052691A
- Authority
- CN
- China
- Prior art keywords
- primitive
- primitives
- depth
- channel operation
- fragment
- 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
- 239000012634 fragment Substances 0.000 claims abstract description 482
- 238000012545 processing Methods 0.000 claims abstract description 451
- 239000000872 buffer Substances 0.000 claims abstract description 345
- 238000009877 rendering Methods 0.000 claims abstract description 344
- 238000012360 testing method Methods 0.000 claims description 426
- 238000000034 method Methods 0.000 claims description 217
- 230000008569 process Effects 0.000 claims description 120
- 238000005070 sampling Methods 0.000 claims description 82
- 230000004044 response Effects 0.000 claims description 23
- 230000006870 function Effects 0.000 description 102
- 230000015654 memory Effects 0.000 description 31
- 230000006399 behavior Effects 0.000 description 28
- 230000000694 effects Effects 0.000 description 25
- 230000007246 mechanism Effects 0.000 description 20
- 238000005516 engineering process Methods 0.000 description 15
- 230000001960 triggered effect Effects 0.000 description 15
- 230000008859 change Effects 0.000 description 11
- 238000013459 approach Methods 0.000 description 10
- 230000008030 elimination Effects 0.000 description 9
- 238000003379 elimination reaction Methods 0.000 description 9
- 230000008901 benefit Effects 0.000 description 8
- 238000002156 mixing Methods 0.000 description 8
- 230000004048 modification Effects 0.000 description 7
- 238000012986 modification Methods 0.000 description 7
- 230000007704 transition Effects 0.000 description 7
- 238000010586 diagram Methods 0.000 description 6
- 238000004590 computer program Methods 0.000 description 5
- 238000005457 optimization Methods 0.000 description 5
- 230000003287 optical effect Effects 0.000 description 4
- 238000002360 preparation method Methods 0.000 description 4
- 238000004891 communication Methods 0.000 description 3
- 239000000203 mixture Substances 0.000 description 3
- 238000003860 storage Methods 0.000 description 3
- 230000000903 blocking effect Effects 0.000 description 2
- 238000004040 coloring Methods 0.000 description 2
- 238000010276 construction Methods 0.000 description 2
- 230000006872 improvement Effects 0.000 description 2
- 238000013507 mapping Methods 0.000 description 2
- 230000000135 prohibitive effect Effects 0.000 description 2
- 238000010926 purge Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000006243 chemical reaction Methods 0.000 description 1
- 230000001427 coherent effect Effects 0.000 description 1
- 230000003111 delayed effect Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
- 239000003973 paint Substances 0.000 description 1
- 238000012805 post-processing Methods 0.000 description 1
- 230000009467 reduction Effects 0.000 description 1
- 238000007670 refining Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
- 230000000007 visual effect Effects 0.000 description 1
Classifications
-
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/10—Geometric effects
- G06T15/40—Hidden part removal
Landscapes
- Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- Computer Graphics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Geometry (AREA)
- Image Generation (AREA)
Abstract
本发明涉及一种图形处理器。当执行基于图块的渲染时,执行第一预通道操作,在第一预通道操作中,处理图块的基元序列中的基元以确定所述基元序列的可见性信息,所述可见性信息可用于确定随后是否应针对渲染输出进一步处理所述基元序列中的基元的片段。此后,执行第二主通道操作,在第二主通道操作中,基于所确定的基元序列的可见性信息来控制在第一预通道操作期间被处理过的基元的片段的进一步处理,使得对于可见性信息表示不应针对渲染输出进一步处理所述片段的片段,省略第二主通道期间的一些或全部处理。可见性信息包括深度缓冲器。
Description
技术领域
本文描述的技术涉及计算机图形的处理,并且尤其涉及图形处理中的隐藏表面去除。
背景技术
许多数据处理系统包括图形处理器(图形处理单元(GPU))作为处理资源,其可操作以执行针对例如数据处理系统的主(例如主机)处理器(CPU)上执行的应用的处理任务。因此,可以通过向图形处理器提供要由图形处理器执行的命令(指令)流来使图形处理器执行针对应用的处理任务。例如,图形处理器的驱动器可准备包含要由图形处理器执行的命令(指令)的命令流,并且将命令流提供到图形处理器,然后图形处理器执行命令流中的命令(由命令指示的操作)。图形处理器还可以包括合适的命令流前端,其用于解析驱动器生成的命令并相应地针对图形处理器的各种功能单元调度处理任务。
因此,图形处理器可作为硬件加速器来提供,该硬件加速器可操作以根据来自主(例如,主机)处理器(CPU)的需求执行图形处理。图形处理器通常被配置为以更优化的方式(例如,相比于使用主(例如,主机)处理器(CPU)以使用通用计算来执行处理)来执行图形处理。
通常,首先通过将要渲染的图形处理(渲染)输出(诸如待显示的帧)划分为多个类似的几何形状的基本分量,以允许更容易地执行图形处理操作来执行图形处理。这些几何形状的基本分量通常可称为图形“基元”,并且这样的“基元”通常为简单多边形的形式,例如三角形、点、线等(或三角形、点、线的组)。
每个基元(例如,多边形)在此阶段由顶点集合限定并被表示为顶点集合。基元的每个顶点与表示顶点的数据集合(诸如位置、颜色、纹理和其他属性数据)相关联。然后,例如当光栅化和渲染顶点所涉及的基元时,使用该“顶点数据”,以便生成图形处理的期望渲染输出。
对于要由图形处理生成的给定输出(例如,待显示的帧),通常将存在针对所讨论的输出而定义的顶点集合。然后,针对输出的要处理的基元将被指示为包括正在生成的图形处理输出的顶点集合中的给定顶点。通常,总体输出(例如,要生成的帧)将被划分成更小的处理单位,称为“绘制调用”。每个绘制调用将具有针对其定义的相应顶点集合和使用那些顶点的相应基元。对于给定帧,可能存在例如几千个量级的绘制调用,以及数十万(或可能数百万)的基元。
一旦已经生成并定义了基元及其顶点,它们就可以由图形处理器处理,以便生成期望的图形处理输出(渲染目标),诸如供显示的帧。这基本上涉及确定与要处理的渲染输出区域相关联的采样位置阵列中的哪些采样位置被基元覆盖,然后确定每个采样位置应当具有的外观(例如,在其颜色方面等)以表示该采样位置处的基元。这些处理通常分别称为光栅化和渲染。(术语“光栅化”有时被用于意指基元转换到样本位置和渲染两者。然而,本文中“光栅化”将被用于指代将基元数据仅转换成采样位置地址)。
这些处理通常通过测试一个或多于一个的采样位置的集合来执行,然后针对被发现包括所讨论(正被测试)的基元内部(覆盖)的采样位置的每个采样位置集合生成通常被称为“片段”的离散图形实体,图形处理操作(诸如渲染)是在“片段”上执行的。因此,所覆盖的采样位置实际上被处理为片段,所述片段将用于在所讨论的采样位置处渲染基元。“片段”是通过渲染处理(渲染流水线)的图形实体。根据图形处理系统的配置方式,所生成并处理的每个片段可以例如表示单个采样位置或多个采样位置的集合。
因此,“片段”实际上是(与其相关联的)被内插到基元的给定输出空间采样位置或点的一组基元数据。它还可以包括在所讨论的采样位置(片段位置)处对基元进行着色所需的每基元和其他状态数据。每个图形片段通常可以具有与输出的“像素”(例如,输出帧)相同的大小和位置(因为当像素是最终显示中的奇异点时,图形处理器所操作(渲染)的“片段”与显示器的像素之间可以存在一对一映射)。然而,可能的情况是,片段与显示像素之间不存在一对一的对应关系,例如其中在显示最终图像之前对所渲染的图像执行特定形式的后处理(诸如下采样)。
还有一种情况是,由于在给定位置处的多个片段(例如,来自不同交叠基元)可能会相互影响(例如,由于透明度和/或混合),最终像素输出可能取决于该像素位置处的多个或所有片段。
相应地,采样位置与显示器的像素之间可以具有一对一的对应关系,但是更典型地,采样位置与显示像素之间可以不存在一对一的对应关系,因为可以对经渲染的样本值执行下采样以生成用于显示最终图像的输出像素值。类似地,在给定位置处的多个采样位置值(例如,来自不同交叠基元)相互影响的情况下(例如,由于透明度和/或混合),最终像素输出也将取决于该像素位置处的多个交叠采样值。
一种形式的图形处理使用所谓的“基于图块的”渲染。在基于图块的渲染中,二维渲染输出(即,渲染处理的输出,诸如要显示的输出帧)被渲染为多个更小面积的区域,通常被称为“渲染图块”。在这样的布置中,渲染输出通常(按面积)被划分成规则大小和形状的渲染图块(它们通常是矩形,例如方形)。(其它常用于“分块”和“基于图块的”渲染的术语包括“分组”(渲染的图块被称为“组块”)和“块状”渲染。为了方便,下文将使用术语“图块”和“分块”,但是应当理解,这些术语旨在涵盖其中渲染输出被渲染为多个更小面积区域的所有另选和等同术语和技术。
在基于图块的图形处理流水线中,正在生成的渲染输出的几何形状(基元)被拣选(sort)到具有渲染输出面积的区域中,以便允许识别针对渲染输出的给定区域需要处理的几何形状(基元)。该拣选允许识别针对渲染输出的给定区域需要处理的基元(以便例如避免不必要地渲染实际上不存在于该区域中的基元)。拣选处理产生要针对渲染输出的不同区域渲染的基元的列表(在本文中被称为“基元”列表,但是通常也被称为“多边形”或“图块”列表)。
一旦已经针对所有渲染输出区域准备了基元列表,就通过光栅化并渲染针对与渲染图块相对应的渲染输出的区域列出的基元来处理每个渲染图块。
因此,针对渲染输出的区域准备基元列表的处理基本上涉及确定针对给定渲染输出区域应当处理的基元。通常通过(以期望的准确度水平)确定与所讨论的渲染输出区域相交(即,至少部分地出现在渲染输出区域内)的基元,然后准备这些基元的列表以供图形处理系统将来使用来执行该处理。因此,对于每个待处理的基元,图形处理器读入相关联的顶点数据,至少将顶点位置转换到屏幕空间(顶点着色),然后使用针对每个基元的经着色顶点位置来确定基元至少部分地覆盖(并且因此应当渲染)渲染输出的区域。
这里应当注意,在基元落入多于一个的渲染输出区域的情况下(将经常是这种情况),其被包括在其所落入的每个区域的基元列表中。为其准备基元列表的渲染输出区域可以是单个渲染图块或多个渲染图块的组等。
实际上,每个渲染输出区域可以被视为具有箱(基元列表),被发现落在该区域内(即,相交)的任何基元被放置到箱中(并且实际上,以这种方式逐个区域地对基元进行拣选的处理通常被称为“分箱”)。
然后,以这种方式准备的基元列表可以例如被写出到存储器,并且一旦包括分块操作的第一处理通道(processing pass)完成,使得已经准备了所有基元列表(针对所有渲染输出区域的所有基元),然后基元列表可以由图形处理器例如在第二(推迟)处理通道中使用,以执行渲染图块的实际渲染,其中存储在基元列表中的信息被相应地使用,以在生成期望渲染输出时识别将针对每个渲染图块渲染的基元,例如以显示帧。
因此,用于使图形处理器执行基于图块的渲染的命令流可以包括使图形处理器准备所期望的基元列表的第一命令集合和随后使图形处理器对渲染图块进行渲染的第二命令集合。可以与任何期望的渲染输出区域有关地发出这些渲染命令。例如,在一些布置中,可以由驱动器为图形处理器准备与处理作业有关的命令,以渲染包括多个渲染图块的组的特定区域。然后,图形处理器的命令流前端可以将处理作业分解成用于渲染各个图块的相应处理任务,然后这些各个图块被相应地处理以执行渲染。在这方面,各种布置是可能的。
当前图形处理系统的一个缺点是,因为基元是按顺序地处理的,并且通常不是按完美的前后顺序处理的,所以在处理输出时,给定的采样位置(并且因此是片段和像素)可以被多次着色,例如以供显示。当第一个接收和渲染的基元随后被后面的基元覆盖时,就会发生这种情况,使得在所讨论的像素(和采样位置)处实际上看不到渲染的第一基元。以这种方式可以多次重写基元,这通常会导致对正被渲染的每个渲染输出(例如帧)执行多个最终冗余的渲染操作。这种现象通常被称为“过度绘制(overdraw)”。
执行此类最终冗余操作的结果包括降低的帧速率及增加的存储器带宽要求(例如,作为取回将被较晚基元重写的基元的数据的结果)。这两种情况都是不期望的,并且降低了图形处理系统的整体性能。随着渲染输出(诸如要渲染的帧)变得更大、更复杂(因为在潜在可见的视图中存在更多表面),并且随着可编程片段着色的使用增加(因为使用可编程片段着色对给定片段进行着色的成本相对更大),这些问题往往会加剧。为了改善图形处理性能(例如,在速度和/或带宽方面)和能量效率,因此期望尝试避免渲染任何这样的不可见片段。
“过度绘制”的问题可以通过发送按前后顺序渲染的基元而显著减少。然而,其他图形处理要求(诸如对诸如纹理之类的资源的相干访问的需要,以及对最小化每帧API调用数量的需要)通常强制要求对基元的其他拣选要求。此外,在仍然维持到图形处理单元的基元的足够吞吐量的同时,在渲染之前对基元的完全前后拣选可能是不实际的。这些和其它因素意味着,在实践中,针对给定渲染输出(例如,帧),基元的前后拣选通常是不可能的或不可取的。
因此,已经提出了许多隐藏表面去除技术来尝试减少在处理渲染输出(诸如供显示的帧)时执行的“过度绘制”的量(隐藏表面的冗余处理的量)(即,以避免渲染不可见基元和/或片段等)。因此,隐藏表面去除涉及识别场景内的那些几何形状将在最终渲染输出中实际可见的过程,以尝试避免不必要地处理不具有可见效果的片段。
例如,可以在发送基元和/或片段以供渲染之前执行某种形式的隐藏表面去除,以查看基元或片段等是否会被已经渲染的基元遮挡(在这种情况下,新片段和/或基元不需要被渲染)。这种隐藏表面去除可以包括例如早期的遮挡剔除,诸如早期Z(深度)和/或模版(stencil)、测试处理等。
这些布置通常尝试在较晚片段被发布到渲染流水线之前识别例如将被已经处理的基元遮挡的片段(并且因此不需要处理)。在这些布置中,将例如要处理的新片段的深度值与深度缓冲区中的该片段位置的当前深度值进行比较,以查看新片段是否被遮挡。这可以帮助避免发送被已经处理的基元遮挡的片段通过渲染流水线。
然而,这些“早期”(在渲染之前)隐藏表面去除技术仅考虑在例如新的基元或片段(被“早期”测试的基元或片段)正被测试时已经完成其处理(其已经被渲染)的片段。这是因为相关测试数据(诸如Z缓冲区)仅包含来自已经被处理的片段的数据。
另一种可能性是尝试杀死与发现在飞行中被较晚片段遮挡的片段相对应的线程,例如使用美国专利申请公开No.2019/0088009(Arm Limited)中描述的“forward pixelkill”操作。这种方法在大多数情况下通常效果良好。
然而,此类布置通常使用固定大小的缓冲区来存储“可剔除”片段,这意味着如果缓冲区已满,则可能失去剔除效率。此外,只有有限的窗口可以剔除片段。因此,该方法可能不太适合更大的、更复杂的场景,因为片段被剔除的机会更少。
因此,申请人相信,在图形处理系统中,仍然存在用于隐藏表面去除的改进技术的空间。
附图说明
现在将仅通过示例并参考附图来描述本文描述的技术的多个实施方式,其中:
图1示意性地示出了示例性图形处理系统;
图2示意性地示出了可以以本文描述的技术的方式操作的图形处理器;
图3例示了示例性的基于图块的渲染操作;
图4和图5示意性地例示了传统的基于图块的图形处理系统的操作;
图6示意性地例示了用于使图形处理器执行基于图块的渲染的命令流;
图7示意性地例示了根据实施方式的渲染操作,其中引入了新颖的“预通道(prepass)”操作,使得在两次处理通道中有效地渲染基元;
图8示意性地示出了根据第一示例的用于预通道操作的处理操作的序列;
图9示意性地示出了在图8所示的预通道操作之后要执行的对应的主通道(mainpass)操作的处理操作的序列;
图10示意性地示出了用于以故障安全方式处理基元的回退操作的处理操作的序列;
图11示意性地示出了根据第一示例操作的图形处理器的状态机;
图12示出了根据第一示例的基元分类处理;
图13示意性地示出了根据第二示例的包括深度测试消歧机制的预通道操作的处理操作的序列;
图14示意性地示出了根据第二示例的可以在预通道操作中执行的深度测试消歧机制的示例;
图15示意性地示出了在根据第二示例的图13所示的预通道操作之后要执行的对应的主通道操作的处理操作的序列;
图16示出了根据第二示例的第二主通道操作中的对应的深度测试消歧机制;
图17例示了根据第二示例的基元分类处理,其中具有排他性深度测试函数的基元不再被视为与“预通道”操作不兼容;
图18示意性地示出了根据第三示例的执行模版测试/更新的预通道操作的处理操作的序列;
图19示意性地示出了可以在根据第三示例的第二主通道操作期间执行的模版测试消歧机制;
图20示出了在根据第三示例的图18所示的预通道操作之后要执行的对应的主通道操作的处理操作序列;
图21例示了根据第三示例的基元分类处理,其中具有某些类型的模版的基元可以与“预通道”操作兼容;
图22示意性地示出了根据第四示例的预通道操作的处理操作的序列,其中在第一预通道操作期间执行片段着色器;
图23例示了根据第四示例的基元分类处理;
图24示意性地示出了根据另一布置的用于预通道操作的处理操作序列,在该布置中,以每样本基元标识信息集合(在下文中将被称为“HSRID”缓冲器)的形式生成可见性信息;
图25示意性地示出了可以如何在第一预通道操作期间填充这种HSR ID缓冲区;
图26示意性地示出了填充这种HSR ID缓冲区的示例;
图27示意性地示出了在图24中所示的预通道操作之后要执行的对应的主通道操作的处理操作的序列,其包括针对HSR ID缓冲区的可见性测试;
图28示意性地示出了在第二主通道操作期间如何针对HSR ID缓冲区执行这种可见性测试;
图29示意性地示出了根据实施方式的使用HSR ID缓冲区的示例基元分类处理;
图30示意性地示出了使用HSR ID缓冲区根据该示例操作的图形处理器的状态机;
图31示意性地示出了根据示例的示例基元分类处理,其中不写入到所有渲染目标的基元与预通道操作兼容,只要它们仅写入深度/模版值即可;
图32示出了图31所示的示例的对应的状态机的操作;
图33示意性地示出了根据另一示例的示例基元分类处理,其中标记为“透明”的基元可以通过仅通过第二主通道操作处理透明基元来处理;
图34示出了图33所示的示例的对应状态机的操作;
图35示意性地示出了根据又一示例的使用HSR ID缓冲区的对应的分类处理,其中执行分类以允许预通道操作处理不写入到所有渲染目标的一些基元;
图36示出了图35所示的示例的对应状态机的操作;
图37示意性地示出了这样的HSR ID缓冲区的“分层”布置,其中针对渲染输出的更大面积的“补丁”存储相应的最小基元识别符和最大基元识别符;
图38示意性地示出了在第一预通道操作期间的这样的分层HSR ID缓冲区的生成;
图39示出了在第二主通道操作期间的这样的分层HSR ID缓冲区的对应使用;
图40示意性地示出了用于在第一预通道操作结束时细化分层HSR ID缓冲区的最终确定(“烘焙”)处理;
图41示出了最终确定(“烘焙”)处理的其他细节;
图42例示了如何在第一预通道操作期间确定不可能进一步完善(refinement)HSRID缓冲区;
图43示意性地示出了用于在第一预通道操作结束时完善分层HSR ID缓冲区的改进的最终确定(“烘焙”)处理,其中跳过对可能进一步完善HSR ID缓冲区的补丁的迭代;
图44例示了在一些情况下如何简化HSR ID缓冲区的更新,以减少必须将相同HSRID重复写入到由补丁所涵盖的许多采样位置;
图45示意性地示出了根据示例的在第一预通道操作期间HSR ID缓冲区的更新,其中当发现可见基元完全覆盖渲染输出的补丁时,该补丁所涵盖的采样位置被清除;
图46示意性地示出了对应的第二主通道操作可以如何解释任何“清除”或零值,以便确保正确的渲染行为;
图47示意性地示出了其中至少一些顶点属性着色被推迟到图形处理器的渲染级的布置;
图48示意性地示出了确定在第一预通道操作期间是否需要顶点属性(变量(varyings))着色的驱动器操作;
图49示意性地示出了根据该示例的示出如何控制图形处理器的状态机;
图50示意性地示出了当第一预通道操作省略顶点属性(变量)着色时如何处理顶点数据的示例;
图51示意性地示出了当第一预通道操作省略顶点属性(变量)着色时如何处理顶点数据的另一示例;
图52示意性地示出了当第一预通道操作省略顶点属性(变量)着色时如何处理顶点数据的另一示例;
图53示出了在第一预通道操作结束时构建“基元剔除”数据结构的示例;
图54示意性地示出了使用所生成的“基元剔除”数据结构针对图53中所示示例的对应的第二主通道操作;
图55示意性地示出了根据该示例的图形处理器的状态图;
图56更详细地示出了根据示例的“基元剔除”数据结构的生成;
图57示意性地示出了图56所示的示例的对应状态机的操作;
图58示意性地示出了在第一预通道操作期间构建“基元剔除”数据结构的另一示例;
图59示意性地示出了根据该示例的图形处理器的状态图;
图60示意性地示出了根据另一示例的“基元剔除”数据结构的生成;
图61示意性地示出了图60所示的示例的对应状态机的操作;
图62示意性地示出了填充固定大小的“基元剔除”数据结构的一个示例;
图63和图64提供了例示如何根据图62的示例填充固定大小的“基元剔除”数据结构的工作示例;
图65示意性地示出了填充固定大小的“基元剔除”数据结构的另一示例;
图66和图67提供了例示如何根据图65的示例填充固定大小的“基元剔除”数据结构的工作示例;
图68示意性地示出了填充固定大小的“基元剔除”数据结构的又一示例;
图69提供了例示如何根据图68的示例填充固定大小的“基元剔除”数据结构的工作示例;
图70示意性地示出了可以如何以串行或背靠背的方式向图形处理流水线发布针对不同图块的相应处理任务(多个通道);
图71示意性地示出了如何交错针对不同图块的相应处理任务(通道),以便提高针对不同图块的处理任务(多个通道)的吞吐量;
图72示意性地示出了基于图71所示的交错操作的任务的动态调度;
图73示意性地例示了根据另一实施方式的渲染操作,其中即使在遇到不兼容基元之后,也可以在图块内重新开始“预通道”操作以提供持续的隐藏表面去除效率;以及
图74是示出根据实施方式的可以如何在图块内重新开始“预通道”操作的其他细节的流程图。
在附图中适当的地方,相同的附图标记用于相同的部件。
具体实施方式
本文所述技术的第一实施方式包括一种操作图形处理器的方法,所述方法包括:
对于要针对渲染输出进行渲染的基元序列:
执行第一预通道(pre-pass)操作,其中,将要渲染的基元序列中的基元被处理为一个或更多个片段的相应集合,每一片段与渲染输出内的一个或更多个采样位置的相应集合相关联,并且其中,针对所述基元序列,对照深度缓冲器对片段进行深度测试,其中,当一片段经受住所述深度测试时,相应地更新该片段所相关的采样位置的对应条目,以记录该片段的深度值;以及
此后执行第二主通道(main-pass)操作,在该第二主通道操作中,由第一预通道操作处理并且可能已经在第一预通道操作中更新了深度缓冲器的基元被再次处理成它们各自的一个或更多个片段的集合,用于处理渲染输出内的相应采样位置,其中,对通过第一预通道操作处理并且可能已经在第一预通道操作中更新了深度缓冲器的片段进行处理包括测试片段的深度值是否与深度缓冲器中的该片段所相关的一个或更多个采样位置的对应条目相匹配,以确定该片段是否应当被进一步处理用于渲染输出。
本文中所描述的技术的第二实施方式包括图形处理器,所述图形处理器包括用于处理基元的处理电路,其中,所述图形处理器被配置为:
对于要针对渲染输出进行渲染的基元序列:
使处理电路:
执行第一预通道操作,其中,要渲染的基元序列中的基元被处理为一个或更多个片段的相应集合,每一片段与渲染输出内的一个或更多个采样位置的相应集合相关联,并且其中,针对所述基元序列,对照深度缓冲器对片段进行深度测试,其中,当片段经受住所述深度测试时,相应地更新该片段所相关的一个或更多个采样位置的对应条目,以记录该片段的深度值;以及
此后执行第二主通道操作,在该第二主通道操作中,由第一预通道操作处理并且可能已经在第一预通道操作中更新了深度缓冲器的基元被再次处理成它们各自的一个或更多个片段的集合,用于处理渲染输出内的各自采样位置,其中,对通过第一预通道操作处理并且可能已经在第一预通道操作中更新了深度缓冲器的片段进行处理包括测试片段的深度值是否与深度缓冲器中用于该片段所相关的一个或更多个采样位置的对应条目相匹配,以确定该片段是否应当被进一步处理用于渲染输出。
本文所述的技术大体上涉及隐藏面消除。具体来说,本文中所描述的技术能够改进(例如,在实施方式中)要针对给定渲染输出渲染的基元序列内的(样本完美的)隐藏面消除(所述基元序列可以是(例如)要针对基于图块的渲染系统中的个别图块进行渲染的基元序列,但也可以是取决于所需渲染输出和所讨论的图形处理器的配置的任何其它适当限定的基元序列)。
如下文将进一步解释,这在本文中所描述的技术中通过引入初始的“预通道”操作作为对基元序列执行的渲染操作的一部分来实现,使得图形处理器在渲染基元序列时有效地经配置以渲染将在两个单独的处理通道中渲染的基元序列中的基元。
因此,当将基元序列发布到图形处理器以供渲染时,致使图形处理器最初执行第一“预通道”操作,其中,将基元光栅化成相应的片段集合(每一片段对应于渲染输出内的一个或更多个取样位置的集合),并且接着处理所得片段以确定与片段相关的“可见性”信息。所确定的可见性信息反映了片段是否将在最终渲染输出中可见,并且因此反映了片段是否需要(并且因此应该)被进一步处理以用于渲染输出。
本文所述技术中的“可见性”信息包括用于基元序列的深度缓冲器。因此,当发布待处理的基元序列以进行渲染时(所述序列可例如是将针对整个图块渲染的基元序列,但也可潜在地是对应于所述图块的子区域(例如,所述图块被进一步细分以用于渲染的子区域)的基元序列),使图形处理器初始地执行第一“预通道”操作,在该操作中,将基元光栅化为相应的片段集合,并且接着处理所得的片段以填充为所述基元序列分配的深度缓冲器。因此,可以通过以下操作在第一预通道期间填充深度缓冲器,即,对片段进行深度测试,并相应地更新深度缓冲器以记录经受住深度测试的任何片段的深度值,例如以用于这种深度测试的正常方式。因此,第一预通道的结果是至少为基元序列生成更新的深度缓冲器,该深度缓冲器为渲染输出中的每个采样位置存储相应的深度值,该深度值对应于导致关于该采样位置对深度缓冲器的更新的序列中的最新片段的深度值。深度缓冲器的内容然后可用于随后确定(在第二“主”通道操作期间)应进一步处理哪些片段,如下文将进一步描述。
然而,在第一预通道操作期间并不完全渲染基元,并且用于确定最终渲染的输出数据(例如,与基元相关联的采样点在最终渲染输出中应具有的外观(例如,颜色))的实际最终渲染操作中的至少一些以及最终渲染的输出数据(例如,颜色)值的对应写出被改为延迟到第二“主”通道操作,在所述第二主通道操作中,通过将基元再次光栅化成它们各自的片段集合并相应地渲染片段(如果需要),之前被第一预通道操作处理的至少一些基元被再次处理。因此,第二主通道操作的结果是产生最终的渲染输出数据(例如一组颜色值),并相应地将其写出(例如写到相应的图块缓冲器,例如用于提供给帧缓冲器以供显示)。
针对第二主通道对属于基元的片段进行进一步处理(且因此进一步处理基元)是基于在第一预通道期间生成的深度缓冲器来控制的。因此,深度缓冲器用作基元序列的“可见性”信息。可见性信息(深度缓冲器)可接着用于确定是否应针对渲染输出而进一步处理属于基元序列中的基元(且因此属于基元)的片段。
具体地,在第一预通道操作期间,在实施方式中对片段进行深度测试,并且在需要时以用于这种深度测试的正常方式更新深度缓冲器,例如,在实施方式中,使用由需要图形处理的应用为片段指定的(原始)深度测试功能。例如,在一实施方式中,基元序列中的每个基元具有与其相关联的应用专用(或“原始”)深度测试功能,该应用专用(或“原始”)深度测试功能应当在针对基元的深度测试片段的第一预通道操作期间使用。(原始)深度测试功能可以例如包括GREATER THAN(大于)测试,但也可以包括GREATER THAN EQUALS(大于等于)、LESS THAN(小于)、LESS THAN EQUALS(小于等于)或EQUALS(等于)测试中的任一种。还可将基元的深度测试函数设定为ALWAYS(始终),使得基元的片段始终更新深度缓冲器,而不管其深度值与当前存储在深度缓冲器中的深度值的关系。
因此,在第一预通道操作期间,在一实施方式中,使用为片段指定的(原始)深度测试函数,针对存储在深度缓冲器中的的采样位置的、所述片段所相关的对应条目来测试所述片段的深度值,并且(仅)在所述片段通过深度测试的情况下(否则在此点丢弃所述片段)相应地更新所述深度缓冲器。因此,对于(原始)深度测试函数包括GREATER THAN测试的片段,仅在所述片段的深度值大于存储在深度缓冲器的当前版本中的深度值时,所述片段将经受住深度测试(并且适当地更新深度缓冲器),并且类似地,对于被指定了其他深度测试函数的片段也是如此。在第一预通道操作结束时,在待处理的基元序列已被处理完成之后,所得的深度缓冲器因此反映引起深度缓冲器更新的最新片段的每一取样位置处的深度值。该信息然后被用于随后确定给定片段是否应该被进一步处理,或者相应地,该片段是否可以被剔除而不进一步处理。
因此,在当针对之前在第一预通道操作中被处理并且可能已更新了深度缓冲器(不管其实际上是否已更新深度缓冲器)的任何片段执行第二主通道操作时,接着使用在第一预通道操作期间生成的深度缓冲器来执行片段可见性测试,以确定在第二主通道操作期间是否应进一步处理所述片段。特别地,在第二主通道操作期间执行的片段可见性测试包括深度EQUALS测试。换句话说,对于之前在第一预通道操作中被处理的且可能已更新了深度缓冲器的片段,在第二主通道操作期间再次有效地执行深度测试,但深度测试函数经修改为包含EQUALS测试(不管在第一预通道操作期间使用的原始深度测试函数如何)。在一实施方式中,在第二主通道期间执行的任何深度测试不更新深度缓冲器。即,在第二主通道期间的所有深度测试使用由第一预通道操作生成的深度缓冲器的内容。这对于避免任何可能的假象在第二主通道期间重写深度缓冲器是重要的(尽管一般来说这无论如何是不可能的,因为在一个实施方式中的第一预通道操作已经处理了原则上可以更新深度缓冲器的所有基元,使得在任何情况下在第二主通道期间不存在对深度缓冲器的进一步更新)。
因此,在实施方式中,在第一预通道操作期间使用针对片段的指定深度测试函数来执行片段深度测试,而在第二主通道操作期间,将针对之前由第一预通道操作处理且可能已更新了第一预通道操作中的深度缓冲器的基元的片段的深度测试函数修改为等于测试函数,而不管为片段指定的深度测试函数如何。
这然后意味着深度值匹配(等于)存储在深度缓冲器中的对应于片段所相关的采样位置的深度值的片段将在第二主通道操作期间经受住片段可见性测试,并且片段将被进一步处理以完成片段的渲染,例如且在一实施方式中,通过执行片段着色器等来确定片段所相关的采样位置的对应渲染输出数据。另一方面,例如,在一实施方式中,未能通过片段可见性测试的任何片段(即,其深度值与存储在深度缓冲器中的深度值不匹配)可以在该基础上适当地剔除,而不进一步处理片段。
这工作得很好,因为存储在深度缓冲器中的通过第一预通道操作生成的深度值必须对应于保证对于渲染输出可见的片段。也就是说,如果片段在第一预通道操作期间本来可以更新深度缓冲器但却没有这样做,或者其深度值随后被后面的基元重写,则该片段是不可见的,并且这由第一预通道操作结束时的深度缓冲器的内容反映出来。然而,在这种情况下,片段的深度值将与存储在深度缓冲器中的值不匹配,因此片段将(正确地)在第二主通道中被剔除。另一方面,深度值与存储在深度缓冲器中的值匹配的片段应当被(和被)渲染,因为该片段是可见的。
因此,至少对于在第一预通道操作期间被处理的并且可能已在第一预通道操作中更新了深度缓冲器的片段,第二主通道操作执行包含深度EQUALS测试的片段可见性测试以确定所述片段的深度值是否与深度缓冲器中的对应条目匹配,其中,当所述片段的深度值与深度缓冲器中的对应条目匹配时,对所述片段进行进一步处理,而当所述片段的深度值与深度缓冲器中的对应条目不匹配时,省略对所述片段的一些或全部进一步处理。
以这种方式,可以在第二主通道期间控制片段的进一步处理,以提供改进的(例如,在一实施方式中)采样完美的隐藏面消除。举例来说,如上文所提及的,仅当片段通过片段可见性测试时,才对所述片段进行进一步处理以生成所要的渲染输出数据(因此,举例来说,第一预通道操作不产生任何最终的渲染输出数据,而是仅在第二主通道操作期间仅针对被确定为具有可见效果的片段产生所述最终的渲染输出数据)。
将了解,以上所描述的片段可见性测试仅可用于(安全地)剔除也通过第一预通道操作处理并且可能已更新了深度缓冲器的基元的片段。然而,可能存在未被第一预通道操作处理的其它基元(或可能从未更新深度缓冲器的基元,例如无法写入深度值)。因此,单独使用深度EQUALS测试不能安全地剔除这些基元。可以根据需要以各种适当的方式处理这些基元。例如,对于没有写入深度的基元(其通常是透明基元的情况),可以仅通过第二主通道来处理该基元,并使用其原始深度测试函数(例如,如应用程序所指定的)相对于深度缓冲器进行测试。也就是说,对于至少一些片段,在第二主通道操作期间执行的深度测试可以例如以用于这种深度测试的正常方式使用用于该片段的(原始)应用程序指定的深度测试函数,但是使用在第一预通道操作期间(预)生成的深度缓冲器的内容。另选地,可将此类基元视为与预通道不兼容,并且取而代之地由回退(fallback)操作来处理,如下文将进一步描述。在这点上,各种布置是可能的。
因此,执行本文中所描述的技术的新颖“预通道”操作的效果是在第二主通道操作期间可以适当地终止任何片段,只要通过使用深度缓冲器的片段可见性测试确定了所述片段不需要进一步处理以用于渲染输出(例如,在一实施方式中,一旦确定所述片段,则无需完整地渲染所述片段)。
因此,此方法的益处在于,因为整个基元序列(例如,图块的)通过第一预通道操作被预先处理以确定可见性信息,所以可见性信息反映正在被处理的基元序列中的所有基元(和片段)的完全可见性,这进而允许最佳的隐藏面消除(例如,并且在实施方式中),使得可针对第二主通道适当地剔除属于基元序列中的基元的任何和所有不可见片段。这又有助于更优化的隐藏面消除(例如,且在一实施方式中),使得可在第二主通道期间剔除基元序列中的基元的任何及所有被遮蔽片段。因此,在此描述的技术可以允许改进的(例如并且在一个实施方式中)采样完美的隐藏面消除。
此外,因为可见性信息包括深度缓冲器,所以这可以相对便宜地生成(例如,没有显著的附加硬件复杂性),因为图形处理器通常已经被配置成执行所需的深度测试,并根据需要适当地存储所得的深度缓冲器。与其它可能的隐藏面消除机制相比,也不需要尝试对基元重新排序或使用飞行中(in-flight)的可见性信息,或因此提供任何复杂机制来跟踪这一点。
因此,所有这些的效果是提供改进的隐藏面消除,该隐藏面消除在一个实施方式中可以提供样本完美的片段剔除而不引入显著的附加处理或硬件复杂性。
因此,与其它可能的布置相比,本文所述的技术可提供各种益处。
根据本文中描述的技术的要求,预通道操作和主通道操作可以包括任何适当的和期望的处理操作。
在一实施方式中,按照本文中所描述的技术(包括预通道操作)的方式对基元进行渲染可以(并且在一实施方式中是)作为响应于图形处理器接收并处理渲染命令而执行的渲染操作的一部分而自动发起的。因此,在一实施方式中,在图形处理器的完全控制下(例如,而非具有被配置为渲染整个场景两次的软件应用程序)执行按照本文所描述的技术(包括预通道操作)的方式渲染基元。
通过将图形处理器配置为自动执行这样的预通道操作作为响应于渲染命令而执行的渲染操作的一部分,可以在硬件中更有效地管理该处理,因为预通道的控制完全由图形处理器执行,例如并且在实施方式中,无需用户指定。因此,这减少了应用程序员的负担,因为图形处理器(硬件)被配置以为自动执行预通道操作以实现对针对场景绘制的任何基元序列的隐藏面消除,作为由图形处理器执行的标准渲染操作的一部分。
然而,这意味着图形处理器应且在一实施方式中能够处理可由应用程序指定的所有不同类型的基元(及不同基元特性),所述指定包括可能与使用根据本文所述技术的预通道操作来处理基元相关联的任何潜在副作用。
在这方面,申请人还认识到,可能不适合或不可能按照上述方式通过在两个单独的通道中渲染所述基元来处理基元序列中的每一个基元(例如,因为可能存在与正在两个单独的步骤中处理的基元不兼容的一些基元(使得它们与本文中描述的技术的预通道操作不兼容))。
因此,可能存在当处理基元序列(图块)时可能遇到的各种不同类型的基元,并且为了满足各种API要求,图形处理器应当(并且在实施方式中确实)能够相应地处理所有不同类型的基元而不引入伪像。
为了解决此问题,并且允许本文中所描述的技术有效地用于可针对渲染输出而限定的所有不同类型的基元,在一实施方式中提供“回退”操作,使得当图形处理器正对基元序列执行预通道操作时,如果在预通道操作期间遇到被确定为与按照这种方式处理不兼容的基元(例如,由于不能确保可以在两个单独的通道中(安全地)处理所述基元而不会潜在地引入伪像),则至少不针对该基元执行预通道操作,而是随后取而代之地利用在第三“回退”操作模式中工作的图形处理器来处理(即,光栅化和(如果必要的话)渲染)不兼容的基元。在这种情况下,可以不是仅对不兼容的基元执行预通道操作,或者可以不对序列中的所有后续基元执行预通道操作(使得在被确定为不兼容的基元处有效地停止预通道操作),这将在下面进一步解释。
通过提供此第三回退操作模式,这接着确保不能(安全地)在两个单独通道中渲染的任何基元仍可有效且自动地由图形处理器处理,而不会存在将任何误差或伪像引入最终渲染输出的风险。例如,在一实施方式中,第三回退操作模式被配置为能够以“防止故障”的方式处理(渲染)基元,例如通过在单个渲染操作中光栅化和渲染(必要时)基元,以确定相应的渲染输出值(例如按照基于光栅化的渲染系统的正常方式)。
因此,在实施方式中,所述方法还包含确定在第一预通道操作期间正被处理的基元序列中的基元与通过第一预通道操作处理的基元不相容;停止(不执行)关于该基元的第一预通道操作的一些或全部;以及随后在第三回退操作模式中处理被确定为与第一预通道操作不兼容的基元。
在一个实施方式中,对于要在第一预通道操作期间处理的每个基元,确定该基元是否与由第一预通道操作处理的基元兼容。为了便于此,可执行基元分类步骤,所述基元分类步骤基于基元的一个或更多个性质来确定基元是否与操作处理兼容。
该基元分类可以在运行时执行,例如作为渲染操作的一部分,例如在一个实施方式中作为预通道操作的一部分。然而,通常预先知道基元是否与预通道操作不兼容。因此,在一些实施方式中,预先执行整个基元分类,然后将基元分类的结果编译成表示基元是否与预通道操作兼容的单个指示符(例如标志)。在此情况下,可在预通道操作期间执行基元分类检查的步骤,该步骤包括使用所述指示符来确定基元是否与预通道操作兼容。在这点上,各种布置是可能的。
因此,当执行预通道操作时,只要基元序列中的基元与预通道操作兼容,则通过预通道操作来处理基元以确定期望的片段可见性信息。也就是说,只要当前基元与预通道操作兼容,就通过预通道操作等对其进行处理,直到处理到达基元序列的末尾。在一实施方式中,然后再次通过第二主通道操作来处理基元,其中基于所确定的片段可见性信息相应地控制基元的处理。另一方面,如果基元序列中正被处理的基元被确定为与预通道操作不兼容,则不对该基元执行预通道操作,而是随后通过回退操作来处理该基元,这将在下面进一步解释。
存在可能意味着基元与根据本文所述技术的预通道操作不兼容的各种条件。这些条件的示例通常可包括基元与可能的副作用相关联以使得应在单个渲染通道中仅处理基元一次的情况。一般来说,将基元分类为兼容或不兼容可取决于预通道操作的配置,并且可根据需要或多或少地复杂。也就是说,可根据需要将预通道操作配置为处理不同类型的基元。
例如,当如上所述在第二主通道中使用深度缓冲器来控制片段处理时可能遇到的潜在问题是当存在写入相同深度值的两个或更多基元,但其中基元的原始深度测试函数是排他性的(即,与GREATER THAN EQUALS、LESS THAN EQUALS或EQUALS相对的GREATER THAN或LESS THAN)时。在那种情况下,例如,如果使用排他性深度测试功能的后一基元在序列中写入与前一基元相同的深度值,并且该深度值被存储在深度缓冲器中,则在第二主通道操作期间执行的深度EQUALS测试将不正确地确定后一基元应当被进一步处理,而由应用程序指定的正确渲染行为实际上将用于剔除该基元。
因此,在一些实施方式中,具有排他性的深度测试函数的任何基元可被简单地视为不兼容的,并且被例外地处理,例如并且在一实施方式中,通过如上所述的第三回退操作来处理。因此,在实施方式中,具有排他性的(原始)深度测试函数的任何基元因此被认为与预通道操作不兼容,并且随后取而代之地使用第三回退操作来处理。这可以很好地工作以确保对基元进行连续安全的处理以供渲染输出。
然而,在更多的实施方式中,提供了一种歧义消除机制以便确保被指定使用排他性的(原始)深度测试函数的基元的正确渲染行为。特别地,在一实施方式中,在深度缓冲器中(并且可选地也在模板缓冲器中,如下面将描述的)存储有可以用于确保正确渲染行为的合适的“跟踪”位(bit)。
例如,在一实施方式中,额外的每样本“跟踪”位被存储在深度缓冲器中(并且可选地还存储在模板缓冲器中),该额外的每样本“跟踪”位可以在第一预通道操作期间和/或在第二主通道操作期间被适当地设置/清除,以便确保正确的渲染行为。
因此,在第一预通道操作期间,如果片段经受住原始的深度(或模版)测试,则根据原始的深度测试函数是包含性的还是排他性的,相应地设置/清除与采样位置相关联的相应“跟踪”位。
例如,在一实施方式中,如果片段经受住原始深度(或模版)测试,并且该片段的原始深度测试函数是包含性的,则在一实施方式中,在该点处将'跟踪'位设置为第一值(例如,设置为'1')。另一方面,如果片段经受住深度(或模版)测试,并且该片段的原始深度测试函数是排他性的,则在一实施方式中将'跟踪'位清除(到'0',或者通常设置为第二值)。
在相应的第二主通道操作期间,如果片段经受住深度EQUALS测试(或模版EQUALS测试),则在如下实施方式中,基于片段的原始深度测试函数和'跟踪'位的状态来确定行为;
(i)如果片段的原始深度测试函数是包含性的并且'跟踪'位被设置,则使片段通过,并且进一步处理以生成期望的渲染输出数据;
(ii)如果片段的原始深度测试函数是包含性的并且'跟踪'位未被设置,则可以将片段剔除(并且在实施方式中剔除)(注意,如果原始深度测试函数是包含性的,则由于'歧义消除'位应当总是处于第一状态,所以该状态应当是不可能的);
(iii)如果片段的原始深度测试函数是排他性的并且设置了'跟踪'位,则可以(并且在一实施方式中)将片段剔除;以及
(iv)如果片段的原始深度测试函数是排他性的并且'跟踪'位未设置,则使片段通过,并且进一步处理以生成期望的渲染输出数据,并且在此时设置'跟踪'位。
因此,所有这些的效果是额外的“跟踪”位实质上跟踪原始深度测试函数在以下方面是排他性的基元的片段,即基元的片段是否是引起深度缓冲器更新的片段,并且因此片段是否应被进一步处理。特别地,因为作为满足条件(iv)的结果,所述位被设置(到第一状态),这确保写入相同深度值但原始深度测试函数是排他性的任何稍后到达的片段将被正确地剔除(基于设置的'跟踪'位)。
因此,在实施方式中,对于在第一预通道操作期间使用排他性的深度测试函数的基元的片段,基于与所述片段所相关的采样位置相关联的跟踪位来进一步控制在第二主通道操作期间对所述片段的进一步处理,其中,可在相应的第一预通道操作及第二主通道操作期间设置/清除所述跟踪位,并且在第二主通道操作期间使用所述跟踪位,以针对深度值与深度缓冲器中与该片段所相关的采样位置相对应的条目相匹配的片段,确定该片段是否应当被剔除。
例如,当片段在第一预通道操作期间引起对深度缓冲器的更新时,在一实施方式中,如果该片段的指定深度测试函数是非排他性的,则将跟踪位设置为第一值,而在一实施方式中,如果该片段的指定深度测试函数是排他性的,则将跟踪位清除为第二值。
在相应的第二主通道操作期间,对于深度值与深度缓冲器中该片段所相关的采样位置的相应条目相匹配的片段,并且对于用于第一预通道操作的指定深度测试函数是排他性的片段,如果所述跟踪位被设定为第一值,则剔除所述片段;而如果跟踪位被设置为第二值,则片段被进一步处理,并且在该点跟踪位被设置为第一值。这意味着,当在第二主通道操作期间处理深度值也与深度缓冲器中该片段所相关的采样位置的对应条目相匹配的后续片段,并且对于用于第一预通道操作的指定深度测试函数是排他性的片段,基于被设置的跟踪位来剔除后续片段。
注意,只要原始深度测试函数不改变基元序列内的“极性”,上述方法工作良好。也就是说,上述方法在实施方式中仅在深度测试函数的极性在基元序列内的基元之间(或基元的前/后面之间)不改变时使用,例如,使得深度测试函数不从GREATER THAN(或GREATERTHAN OR EQUAL TO)测试改变为LESS THAN(或LESS THAN OR EQUAL TO)测试,或反之亦然,使得深度测试函数不从LESS THAN(或LESS THAN OR EQUAL TO)测试改变为GREATER THAN(或GREATER THAN OR EQUAL TO)测试,并且其中,深度测试功能不改变为ALWAYS写入深度缓冲器。例如,在那些情况下,正确的渲染行为变得更加复杂,使得不可能使用单个“跟踪”位来跟踪正确的行为。
原则上,也可以使用比上述更复杂或更不复杂并且能够处理更大范围的基元的各种其它歧义消除机制。然而,上述歧义消除的好处是实现起来相对较简单,只要深度测试函数的极性不改变,就只需要将单个附加位存储在深度(以及可选地还存储在模板)缓冲器中来实施正确的行为。
因此,在一实施方式中,仅当深度测试函数的极性在基元序列内的基元之间不改变时,才执行上述歧义消除过程。这可以由应用程序实施。然而,如上所述,在此描述的技术尤其涉及硬件友好的实现,因此该实现应该能够处理指定要绘制的所有类型的基元。因此,在实施方式中,如果深度测试函数的极性在基元序列内改变,则在实施方式中将具有与紧接在前的基元不同的极性深度测试函数的第一基元以及该序列中的所有后续基元视为“不兼容”基元,并因此使用第三回退操作来处理,如上所述。可在基元分类期间确定是否为这种情况,如下文将进一步描述的(尽管应注意,在实施方式中,仅向图形处理器提供基元分类的结果,标签因此将不知道基元标记为不兼容的原因,但将仅致使其以针对不兼容基元的指定方式(例如,并且在实施方式中,使用第三回退操作)来处理它)。
到目前为止的描述主要集中在深度测试。然而,应当理解,模板化(stencilling)也可以(并且在实施方式中)以类似的方式处理。例如,可以在第一预通道操作期间以与上述深度测试相对应的方式执行模版测试,以便填充模版缓冲器。然后,模板缓冲器可用于通过执行适当的模板EQUALS测试来控制第二主通道期间的片段处理。同样,如果两个基元写入相同的模板值,则可能需要消除歧义。在实施方式中,歧义消除过程以与上述关于深度测试消除歧义相同的方式执行,但是现在使用与模板缓冲器相关联的额外的每样本“跟踪”位。
另选地,如果需要模板化,这可以是另一个状况,其意味着基元被视为与预通道操作不兼容。在此情况下,需要执行模板化的基元可另选地由第三回退操作处理,如上文所描述。
所有这些的效果提供了可以在硬件中更有效地实现的图块内的改进的(以及潜在的样本完美的)隐藏面消除。
因此,与用于隐藏面消除的其它可能方法相比,本文所述的技术可提供各种益处。
根据在此描述的技术的要求,图形处理器可以按照需要以任何适当的方式配置。
本文所描述的技术在一实施方式中涉及基于图块的渲染。因此,图形处理器可具有图形处理器在执行基于图块的渲染时可具有的任何合适且所需的处理级和/或元件。
这里在实施方式中描述的技术的图形处理器包括几何处理(图块化)电路和渲染电路。
所述几何处理(图块化)电路被配置成生成基元列表。可以以任何合适的方式(例如,以用于产生基元列表的正常方式)来进行基元相对于图块的整理。可以针对渲染输出的任何适当区域准备基元列表。因此,在基元列表与实际渲染图块之间可存在或可不存在一对一的对应关系。
一旦所有处理了所有几何形状,则在一实施方式中,将基元列表写出,例如写到外部(例如主)存储器。
然后,在随后的渲染状态期间使用基元列表,以便执行各个图块的实际渲染。因此,在一实施方式中,图形处理器的渲染电路包括基元列表读取电路,该基元列表读取电路被配置为在发布图块以供渲染时,使用应用于所述图块的相应基元列表来识别应当针对该图块处理的基元序列。
因此,在一实施方式中,基元列表读取电路被配置为例如从存储器获得基元列表,识别应当针对图块进行处理的基元序列,并发出所识别的基元以供渲染。这可以按照任何适当和期望的方式来完成,例如取决于基元列表的格式。例如,在基元列表应用于渲染输出的分层布置的区域的情况下(使得在基元列表与要渲染的图块之间不必存在一对一的对应关系,并且使得给定的图块可以与多个基元列表相关联),识别基元序列的步骤可以包括处理多个基元列表,并且将来自多个基元列表的基元合并为期望的渲染顺序。
在一实施方式中,响应于对图块进行渲染的命令来执行这些操作。然后将所识别的基元相应地发布到渲染管线中以供进一步处理,如下文将进一步解释的。然而,在一些实施方式中,可在图形处理器执行触发预通道操作的渲染命令之前(并且(例如)预取)来识别基元序列。在这点上,各种布置是可能的。
本文中描述的技术具体涉及对被识别为要处理的基元执行的渲染操作。在一实施方式中,以作为一连串的处理级的流水线方式执行渲染。根据本文所描述的技术的要求,渲染管线通常可包含图形处理(渲染)管线可包含的任何合适且需要的处理级。
特别地,根据在此描述的技术的渲染使用基于光栅化的方法(其可以包括传统的基于光栅化的渲染,但是也可以包括混合光栅化/射线跟踪方法)。
因此,本文所述技术的图形处理器的渲染电路(管线)通常包括光栅化器和渲染器,所述光栅化器用于将基元处理为相应的片段集合,并且所述渲染器被配置为处理(渲染)所得的片段以确定相应的采样位置在最终的渲染器输出中应当具有的外观(例如,颜色)。
光栅化器(光栅化器电路)可以被配置成以任何适当和期望的方式工作,例如在已知的光栅化布置中。其应当工作为根据覆盖渲染器输出的区域的采样位置阵列中的哪些采样位置(或哪些采样位置集合)、由光栅化器接收的给定基元等(至少部分地)覆盖而产生用于处理的图形片段。
实施方式中的光栅化引擎针对被发现包括被光栅化的所述基元(和每个基元)覆盖的(并且不出于另一原因(例如因为基元未能通过早期深度测试)而被从处理剔除的)每个采样位置和/或针对被发现为包括被光栅化的所述基元(和每个基元)覆盖的每个采样位置的多个采样位置的每一个集合(例如,采样掩码)生成图形片段。
相应地,由光栅化器生成的每个片段可以根据需要来表示(与其相关联的)单个采样位置或多个采样位置。在一实施方式中,每个片段表示多个采样位置的集合,在一实施方式中表示四个采样位置的集合(并且在一实施方式中表示2×2阵列)。
图形处理器的渲染器(片段处理电路)应可工作为渲染其接收的(阴影)图形片段以生成所需的输出图形片段数据。渲染器可以包含任何适当的和期望的渲染元件,并且可以以任何适当的和期望的方式来配置。因此,例如,渲染器可以包括固定功能渲染流水线,包括一个或更多个固定功能渲染级(电路),诸如纹理映射器、混合器、雾化单元等。在实施方式中,渲染器包括片段着色器(着色器管线)(即,可编程处理电路,其可工作且可被编程为对片段执行片段着色程序以便渲染所述片段)。
渲染器(片段处理电路)将处理其接收到的片段,以随后生成输出的渲染片段数据,该渲染片段数据随后在一实施方式中被写入外部存储器中的输出缓冲器(例如帧缓冲器),以供使用(例如,在显示器上显示帧)。所渲染的片段数据可经由中间缓冲器(例如,图块(例如,颜色)缓冲器(如在基于图块的图形处理系统中的情况))写入到(外部)输出缓冲器。
要生成的渲染输出可包括要由图形处理器生成的任何渲染输出。因此,渲染输出可包括(例如)将在基于图块的图形处理器中生成的图块和/或输出片段数据的帧的全部或部分。
如上所述,在本文所述的技术中,基元的渲染是在两个单独的处理通道中有效地执行的:执行第一“预通道”以生成正被处理的基元序列的可见性信息,并且执行第二“主”通道,“主”通道执行实际的最终渲染操作以产生最终渲染输出(例如,颜色)值。
因此,第一预通道的结果是生成所需的“可见性”信息。在第一预通道中执行的处理可以包括任何适当的和期望的处理,例如取决于可见性信息的格式。然而,一般来说,第一预通道操作包含将基元光栅化成一个或更多个片段的相应集合,并且接着执行一个或更多个片段处理操作以确定所需的可见性信息。在实施方式中,可见性信息通常是基于片段深度值的。即,在特定采样位置处哪个片段将是可见的将通常是(并且在实施方式中是)由哪个片段在场景中处于最前面(即具有最靠近的深度值)来确定的。
因此,在一实施方式中,第一预通道包括对片段进行(早期)深度测试以更新用于深度缓冲器以供渲染输出。深度缓冲器存储用于渲染输出的每采样位置的深度值集合。因此,在实施方式中,第一预通道操作包括对照存储在深度(Z)缓冲器中的对应深度值来测试(当前)片段的深度值。如果片段经受住深度测试,那么在一实施方式中更新深度缓冲器以包括当前片段的深度值,依此类推,直到已处理完基元的所有片段为止。因此,在第一预通道操作结束时所得的深度缓冲器表示基元序列的作为一个整体的深度缓冲器。
在一些实施方式中,第一预通道因此包括将基元光栅化为一个或更多个片段的相应集合,并且接着对所述片段进行深度测试以更新深度缓冲器。在一实施方式中,深度缓冲器然后在第一预通道结束时被写入适当的存储器。深度缓冲器可被写出到外部存储器,但在实施方式中,深度缓冲器被写到本地存储器,例如已被分配用于当前渲染操作(例如用于正被渲染的图块)的RAM的专用部分,并且一旦当前渲染操作(当前图块的渲染)完成,所述本地存储器可因此被重写。在这点上,各种布置是可能的。
在实施方式中,第一预通道中的片段处理在这一点结束,即在写出深度缓冲器(以及可能期望由第一预通道操作生成并写出的任何其它可见性信息)之后结束。因此,在一些实施方式中,在(早期)深度测试被执行并且深度缓冲器被相应地更新(根据需要)之后,第一预通道中的片段处理完成,而不需要例如执行片段着色器以进一步渲染片段(例如,以确定最终渲染输出的颜色值)。
然而,在一些实施方式中,为了更新深度缓冲器,可执行部分片段着色器。举例来说,这可适合于处理那些需要片段着色器来确定片段的深度值和/或采样位置覆盖的基元。(否则,着色器可能修改所渲染的输出值的基元可能需要且在实施方式中确实被视为不兼容的基元。)在此情况下,最终(颜色)输出在实施方式中仍被禁用并且片段着色器运行得刚好足够长以更新深度缓冲器,但片段未被完全渲染。
实施方式中的预通道还包括如上所述的基元分类检查的步骤,用于确定基元是否与预通道兼容。在一实施方式中,在预通道开始时执行基元分类检查的步骤,例如,在一实施方式中,在光栅化基元之前。然而,其它布置也是可能的。
如果基元是兼容的,则预通道操作如正常那样继续。否则,如果基元与预通道操作不兼容,则在实施方式中不对该基元执行预通道操作。在此情况下,在一实施方式中,接着发起主通道操作以处理基元序列中的基元直到紧挨在不兼容基元之前(在不兼容基元之前)的基元,并且当主通道操作到达不兼容基元时,接着将图形处理器切换到回退操作模式(如上文所论述)。
在完成第一预通道(或例如响应于遇到不兼容的基元而终止第一预通道)之后,执行第二主通道操作以根据需要进一步处理在第一预通道期间已处理的基元,以产生最终渲染输出。
因此,第二主通道操作的结果是生成最终渲染输出,例如通过执行片段着色以生成用于最终渲染输出的一组渲染输出(例如颜色)值。因此,第二主通道中的处理通常可包含将基元光栅化成其相应片段集合,并且接着执行片段着色器以确定渲染输出中的采样位置的相应渲染输出值(例如,以确定相关联的采样位置在最终渲染输出中应具有的外观(例如,颜色),但一般来说,渲染可产生任何合适且所需的输出数据)。
第二主通道可以包括可以理想地执行的任何其它渲染级(例如混合等)。在一实施方式中,第二主通道操作还包括基元分类(检查)的步骤,用于确定基元是否与预通道操作兼容,并且在一实施方式中,根据需要触发切换到第三回退操作模式,例如如上所述。
在一实施方式中,第二主通道操作还包括可见性测试,可见性测试使用在第一预通道期间生成的可见性信息来控制第二主通道的基元(或片段)的处理。可见性测试的性质通常取决于可见性信息的格式。然而,在一实施方式中,在每个片段的基础上执行可见性测试。因此,在一实施方式中,在光栅化之后执行可见性测试。在实施方式中,在确定采样位置的渲染输出值的渲染操作之前(例如,在实施方式中,在片段着色之前)执行可见性测试。
根据本文中所描述的技术的要求,可见性信息可采取任何合适且所需的形式,只要其可以本文中所描述的技术的方式使用以在第二主通道期间控制基元的渲染即可。
在上述实施方式中,在第一预通道操作期间处理的至少一些基元的片段因此在第二主通道操作期间被再次处理,但是主通道操作包括可见性测试,可见性测试对照可见性信息(以深度缓冲器的形式)测试片段以控制在主通道期间对片段的进一步处理。因此,如果基元的片段在第二主通道操作中未能通过可见性测试,则可针对所述片段终止第二主通道操作。
因此,一般来说,相同的基元可以(并且在实施方式中确实)在相应的处理通道中经历不同的处理。例如,在一个实施方式中,第一预通道至少涉及将基元光栅化为片段并执行用于生成可见性信息的深度测试。预通道可执行或可不执行片段着色器。然而,在实施方式中,预通道操作至少不写出,并且在实施方式中也不生成最终输出(例如颜色)值。另一方面,在一实施方式中,第二主通道将基元光栅化成片段,使用在预通道期间生成的可见性信息执行一些可见性测试,并且接着执行片段着色以生成并输出(例如,颜色)用于在可见性测试之后存在的任何片段的值。
在预通道或主通道操作中执行的处理通常还可以包括可能期望的任何其它合适的处理步骤(级)。
只要基元与按照本文所述技术的方式(使用预通道)处理兼容,在一实施方式中(最初)使图形处理器在第一预通道模式处理基元序列中的所有基元并且接着在第二主通道模式中再次(从一开始)处理基元序列。
因此,在一实施方式中,相同的基元序列经受第一预通道操作和第二主通道操作。在这点上,例如还可以设想,处理的粒度可以在预通道与主通道之间变化。举例来说,可针对整个图块执行预通道操作,但接着可将所述图块细分成用于执行主通道的较小子图块,使得执行多个主通道。相应地,可以对子区块执行预通道操作,然后对多个(例如所有)子区块一起执行主通道操作。在这点上,各种布置是可能的。
在实施方式中,以相同的方式处理基元序列中的所有基元。然而,其他布置也是可能的,并且将渲染划分为两个单独的通道也可以允许进一步可能的优化。
例如,如果可以确定基元在已经在预通道中执行之后将没有进一步的效果,则在这种情况下,可以避免或省略在第二主通道中进一步处理基元的一些或全部,而不管可见性信息。可能是这种情况的例子是基元仅写到深度缓冲器和/或模版缓冲器,但不输出颜色值。这通常是预先已知的,因此可以例如根据与基元相关联的适当状态信息(例如描述符)来确定。
还可能在第一预通道操作期间确定某些基元(整体)不需要被进一步处理。例如,在一些实施方式中,除了如上所述在第二主通道操作期间消耗以控制主通道操作的片段处理的可见性信息之外,还可生成“基元剔除”数据结构作为预通道操作的一部分,该数据结构表示已完全剔除的任何基元,以避免在第二主通道中对那些基元进行不必要的处理。因此,如果在第一预通道操作期间确定与基元相关联的片段均不具有任何视觉效应,那么在此情况下,可相对较早地剔除作为整体的基元,例如并且在一实施方式中,无需任何片段处理。因此,在一些实施方式中,如果可以确定基元的所有片段都是不可见的,则可以剔除该基元。这种基元剔除可以(并且在一实施方式中确实)在第二主通道的开始时完成(例如,在基元分类(其中执行此分类)之后),但在一实施方式中,在将基元光栅化为其相应片段之前完成。以此方式,可从主通道的基元序列中移除基元,从而避免任何不必要的片段处理。由于每个基元存储该信息可能是禁止的,因此实施方式使用固定大小的基元剔除数据结构。这可根据需要来填充,并用于控制第二主通道的基元处理。
对于在第二主通道期间跳过一些或全部处理,各种其它布置是可能的。
相应地,如果可以确定给定基元不贡献任何有意义的预通道输出,则可以相应地跳过用于预通道的该基元的一些或全部处理。例如,这可以是不写出深度值或任何其它可见性信息的基元的情况。然后可以仅在主通道中(或仅在回退模式中)处理该基元。在一些情况下,甚至有可能在执行预通道操作之前识别出基元可以被全部剔除,使得基元不被任一通道处理。
另一方面,存在一些情况,其中需要在单个处理通道中处理所有基元,例如用于遮挡/流水线查询。在此情况下,图形处理器可被配置为确保所有基元均在预通道操作中处理,即使原则上可跳过一基元(因为未输出可见性信息)。或者,如果启用了遮挡/流水线查询,则这可以简单地触发回退操作。
本文描述的技术的预通道操作还与帧前着色器交互。例如,存在可以在渲染应用程序指定的几何形状之前在某些条件下运行的各种全帧着色器。这些可以用于各种用途,例如用数据预加载深度缓冲器、模板缓冲器和/或颜色缓冲器。通常,因为预通道操作不输出颜色值,所以这里在实施方式中描述的技术直到预通道已经完成才分配颜色缓冲器。因此,在一个实施方式中,在预通道之后相应地执行填充颜色缓冲器(颜色读回)的帧前着色器。这还可以允许使用可见性信息来剔除读回的颜色。另一方面,在实施方式中,在预通道之前执行填充深度缓冲器和/或模板缓冲器(ZS读回)的帧前着色器。
在这点上,各种其它布置和优化将是可能的。
如上所述,在一实施方式中,不能(安全地)使用单独的预通道操作和主通道操作来处理的任何基元改为在第三回退操作模式中处理。在一实施方式中,回退操作模式以“防止故障”方式光栅化和渲染基元,例如,在一实施方式中,以基于光栅化的渲染系统的正常方式。也就是说,在回退模式期间,将基元光栅化成片段的集合,并且接着渲染所得的片段以确定对应的渲染输出值(例如,以确定相关联的采样位置应具有的外观(例如,颜色值))。
回退模式通常可以执行任何适当的和期望的片段处理。例如,在实施方式中,回退模式可以执行其它适当形式的隐藏面消除,例如(早/晚)深度测试,例如按照用于这种深度测试的正常方式。
(相反,在一实施方式中,深度测试被修改用于预通道操作和主通道操作,使得在一实施方式中,深度缓冲器(仅)在第一预通道操作期间被更新,而第二主通道操作则使用基于深度缓冲器的可见性信息来控制片段处理,但是在一实施方式中不更新深度缓冲器。(第二主通道可以执行使用深度缓冲器。然而,当在第二主通道期间使用深度缓冲器时,在一实施方式中,在不更新深度缓冲器的情况下完成在第二主通道期间执行的使用深度缓冲器的任何深度测试。)类似地,在一实施方式中,主通道操作不需要执行任何后期深度测试,因为在一实施方式中,完整的片段可见度是提前(通过预通道)确定的。然而,在这点上,各种布置是可能的。
如上所述,如果在正在被处理的基元序列中遇到不兼容的基元,则触发回退操作模式。存在可能意味着基元与按照本文中描述的技术的方式被处理不兼容的各种条件。例如,这可以包括以下中的一个或更多个:(i)基元是透明的;(ii)基元具有副作用;(iii)基元使用模板化;(iv)基元不向所有渲染目标写入;(v)基元不向深度缓冲器写入;(vi)需要着色器来确定基元覆盖;(vii)着色器发射深度值。这些条件中的哪一个意味着基元与按照本文中描述的技术的处理方式不兼容,这通常取决于预通道操作的配置。举例来说,如上文所提及的,在一些实施方式中,可在预通道操作期间执行(部分)着色器,在此情况下,预通道操作可能能够处理需要着色器来确定基元覆盖的至少一些基元。取决于图形处理器的配置,各种其它示例也是可能的。
从上文可以理解,图形处理器的渲染电路可有效地配置为处于多个不同的渲染状态中,这些渲染状态调制对被传递到渲染电路的基元执行的处理。也就是说,在实施方式中,渲染电路执行图形处理管线,所述图形处理管线可被配置(并且在使用中被重新配置)为取决于图形处理器的状态来执行不同的处理操作。因此,当图形处理器处于第一预通道状态时,渲染电路的图形处理管线被配置为执行第一组处理操作以执行第一预通道操作,而当图形处理器处于第二主通道状态时,渲染电路的(相同)图形处理管线被不同地配置为执行第二组处理操作以执行第二主通道操作。相应地,图形处理器也可存在于第三回退状态中,在该状态中,渲染电路的图形处理管线被配置(再次不同地)为执行第三组处理操作来执行第三回退操作。因此,取决于图形处理器的当前状态,可以(并且在实施方式中确实是)相应地(例如且在实施方式中)通过启用/停用图形处理管线内的一个或更多个处理级(或一个或更多个处理级的一个或更多个输出)来配置渲染电路以使图形处理器执行所需处理操作。
可以按照需要以任何适当的方式来控制图形处理器的渲染状态。举例来说,如上文所提及的,可使用分类信息来注释基元,所述分类信息表示基元是否与使用本文中所描述的技术的预通道操作进行处理所兼容,所述信息可用于使图形处理器切换出预通道操作模式。还可使用合适的标记来确定图形处理器当前处于预通道状态还是主通道状态。因此,在处理基元时,可确定图形处理器的当前渲染状态,然后图形处理器控制所执行的处理。
例如,当发出(新的)基元序列用于渲染时,实施方式中的渲染电路以第一预通道状态开始。因此,如果第一基元与预通道操作兼容,则图形处理器保持在预通道状态,并相应地执行预通道操作。然后,发出下一个基元用于处理。另一方面,如果当图形处理器处于预通道状态时遇到不兼容的基元,则在一实施方式中,关于该基元停止预通道操作,然后在一实施方式中,图形处理器切换到主通道状态,其中,针对基元的处理从基元序列的开始重新开始,并且图形处理器被配置为处于主通道状态。
类似地,当图形处理器处于主通道状态时,只要基元是兼容的,图形处理器就保持在主通道状态,并执行主通道操作。另一方面,当处于主通道状态的图形处理器遇到不兼容的基元时,在一实施方式中,这触发切换到回退状态。图形处理器然后保持在回退状态并继续处理当前基元(即从主通道停止的位置继续)。
因此,在一实施方式中,基于基元分类和图形处理器的当前操作模式,以这种方式控制图形处理器状态机,以便控制本文中描述的技术的预通道操作。以此方式,可控制图形处理器在处理基元序列时适当地在操作模式(预通道/主通道/回退)之间切换。
图形处理器的渲染电路被配置为介于如上所述的不同渲染状态之间的这种状态机就其本身而言被认为是新颖且有利的。
因此,本文中描述的技术的另一实施方式包括被配置为生成渲染输出的图形处理器,所述图形处理器包括可工作为渲染用于所述渲染输出的基元序列的渲染电路,其中,所述渲染电路执行图形处理管线,所述图形处理管线可被配置为取决于所述图形处理器的状态而执行不同的处理操作,使得当所述图形处理器处于第一预通道状态时,渲染电路的图形处理管线被配置为执行第一组处理操作以执行第一预通道操作,而当图形处理器处于第二主通道状态时,渲染电路的图形处理管线被不同配置为执行第二组处理操作以执行第二主通道操作。如上所述,在一实施方式中,图形处理器还可存在于第三回退状态中,在该状态中,渲染电路的图形处理管线被配置为执行第三组处理操作以执行第三回退操作。
如所属领域的技术人员将了解的,本文描述的技术的这些其它实施方式可以(并且在实施方式中确实)在适当时包含本文中所描述的技术的任选特征中的任一者或更多者或全部。
因此,在实施方式中,存在单个(物理)渲染流水线,并且因此基于图形处理器的当前状态(即,图形处理器正在执行预通道或主通道等)来调制所执行的操作。然而,渲染电路还可以被配置为具有多个物理上分离的(并行)渲染流水线,这些渲染流水线可以根据渲染电路的不同状态来处理不同的操作。
各种其他布置也将是可能的。
本文描述的技术通常可以在任何合适的图形处理系统中找到应用。本文描述的技术特别涉及基于图块的渲染系统。
本文中所描述的技术可以针对图形处理流水线可用于生成的所有形式的输出(例如供显示的帧、渲染到纹理输出等)来使用。
在一些实施方式中,图形处理系统包括存储本文描述的数据的一个或更多个存储器和/或存储器设备和/或存储用于执行本文描述的处理的软件,和/或与存储本文描述的数据的一个或更多个存储器和/或存储器设备和/或存储用于执行本文描述的处理的软件进行通信。图形处理系统还可以与主机微处理器通信,和/或具有用于基于由图形处理系统生成的数据来显示图像的显示器。
在实施方式中,本文描述的技术的各种功能在单个图形处理平台上执行,该单个图形处理平台生成并输出经渲染的片段数据,该经渲染的片段数据例如被写入到用于显示设备的帧缓冲区。
本文描述的技术可以在任何合适的系统中实现,诸如基于适当配置的基于微处理器的系统。在实施方式中,本文描述的技术在基于计算机和/或微处理器的系统中实现。
本文描述的技术的各种功能可以以任何期望和合适的方式执行。例如,本文描述的技术的功能可以根据需要而在硬件或软件中实现。因此,例如,本文描述的技术的各种功能元件、级和流水线可以包括可操作以执行各种功能等的合适的一个处理器或多个处理器、一个控制器或多个控制器、功能单元、电路/电路系统、处理逻辑、微处理器布置结构等,诸如适当配置的专用硬件元件或处理电路/电路系统、和/或被编程为以期望的方式操作的可编程硬件元件或处理电路/电路系统。
这里还应当注意,如本领域技术人员将理解的,本文描述的技术的各种功能等可以在给定处理器上复制和/或并行地执行。同样,如果需要,各个处理级可以共享处理电路/电路系统。
因此,本文中所描述的技术扩展到图形处理器且扩展到图形处理平台,所述图形处理平台包括根据本文中所描述的技术的任何一个或更多个实施方式操作的装置或根据本文中所描述的技术的任何一个或更多个实施方式的装置。经受执行上述特定功能所需的任何硬件,这样的图形处理器可以另外包括图形处理器所包括的任何一个或更多个或所有通常的功能单元等。
本领域技术人员还将理解,本文中所描述的技术的所有所描述实施方式可以(并且在实施方式中确实)包括本文中所描述的任何一个或更多个或所有可选特征。
根据本文描述的技术的方法可以至少部分地使用软件(例如,计算机程序)来实现。因此,可以看出,当从另外的实施方式中观察时,本文描述的技术包括特别适用于执行本文描述的方法的计算机软件(当计算机软件在安装在数据处理器上时)、包括用于执行所描述的方法的计算机软件代码部分的计算机程序元件(当该程序元件在数据处理器上运行时)、以及包括适于执行本文描述的方法或方法的所有步骤的代码的计算机程序(当该程序在数据处理系统上运行时)。数据处理器可以是微处理器系统、可编程FPGA(现场可编程门阵列)等。
本文描述的技术还扩展到包括这样的软件的计算机软件载体,该软件在用于操作图形处理器、渲染器或包括数据处理器的微处理器系统时结合所述数据处理器、所述处理器、渲染器或系统来执行本文描述的技术的方法的步骤。这样的计算机软件载体可以是物理存储介质,诸如ROM芯片、RAM、闪存、CD ROM或磁盘,或者可以是信号,诸如导线上的电子信号、光信号或诸如卫星等的无线电信号。
还应当理解,并非本文描述的技术的方法的所有步骤都需要由计算机软件执行,并且因此根据另一广泛的实施方式,本文描述的技术包括计算机软件并且这样的软件被安装在计算机软件载体上以用于执行本文阐述的方法的步骤中的至少一个。
因此,本文描述的技术可以适当地实施为与计算机系统一起使用的计算机程序产品。这样的实现可以包括固定在有形介质上的一系列计算机可读指令,诸如非暂时性计算机可读介质,例如磁盘、CDROM、ROM、RAM、闪存或硬盘。它还可以包括一系列计算机可读指令,其可经由调制解调器或其他接口设备通过有形介质(包括但不限于光学或模拟通信线路)或不有形地使用无线技术(包括但不限于微波、红外或其他传输技术)发送到计算机系统。一系列计算机可读指令实施本文先前描述的全部或部分功能。
本领域技术人员将理解,这样的计算机可读指令可以用多种编程语言编写,以与许多计算机体系结构或操作系统一起使用。此外,这样的指令可以使用当前或将来的任何存储器技术(包括但不限于半导体、磁或光学)来存储,或使用当前或将来的任何通信技术(包括但不限于光学、红外或微波)来发送。可以设想,这样的计算机程序产品可以作为具有附带的打印或电子文档的可移动介质来分发,例如,收缩包装软件,其在系统ROM或固定盘上预先加载有计算机系统,或者通过网络(例如因特网或万维网)从服务器或电子公告板分发。
现在将在处理计算机图形以供显示的上下文中描述本文描述的技术的多个实施方式。然而,将理解,图形处理器还可总体上用于处理其它(例如,非图形)数据,并且本文中所描述的技术因此也可应用于其它上下文。
图1示出了示例性图形处理系统。在主机处理器1上执行的应用2(例如游戏)将需要由相关联的图形处理单元(图形处理器)3执行图形处理操作。为此,应用将生成API(应用编程接口)调用,该API调用由在主机处理器1上运行的图形处理器3的驱动器4解释,以生成对图形处理器3的适当命令,从而生成应用2所需的图形输出。为了促进这一点,将响应于来自在主机系统1上运行的应用2的用于图形输出(例如,生成要显示的帧)的命令而将一组“命令”提供到图形处理器3。
在本实施方式中,用于执行应用2所需的处理任务的适当命令和数据以一个或更多个命令流的形式提供给图形处理器3,每个命令流包括命令(指令)的序列以使图形处理器执行期望的处理任务。
命令流的整体准备由主机处理器1上的驱动器4执行,并且命令流可以例如被存储在适当的命令流缓冲区中,然后它们可以由图形处理器3读取以用于执行。每个命令流通常将包含用于设定针对图形处理器任务的参数的命令(指令),以及用于执行任务的命令(指令)等。
为了促进此操作,如图2所示,图形处理器3包括命令流前端20,所述命令流前端包括命令流管理器(控制器)21(以微控制器的形式),所述命令流管理器可操作以调度命令并将命令从命令流发布到相应命令流执行单元22。命令流执行单元22接着执行相应命令流中的命令以触发图形处理器的处理执行单元23(其在本示例中示出为包括多个着色器核心,但其它布置当然也是可能的)以执行所要处理任务。
本实施方式具体涉及使用被称为“基于图块的”渲染的图形处理系统。在基于图块的渲染中,要显示的二维场景被细分(sub-divided)或分区为多个较小的子区域,通常称为“图块”。图块(子区域)各自被单独地渲染(通常被逐个渲染)。然后重新组合所渲染的子区域(图块)来提供完整的帧以供显示。在这样的布置中,场景通常被划分为规则化大小和形状的子区域(图块)(它们通常是例如方形或矩形),但这不是必要的。
在基于图块的渲染系统中,因此通常期望能够识别和获知在给定子区域(例如,图块)中实际存在的那些基元,以便例如避免不必要地渲染实际上不存在于图块中的基元。为了促进这一点,已知为渲染输出的相应子区域(子区域可对应于相应图块,但也可例如对应于图块的组)准备将针对所述子区域渲染(例如,将出现在子区域中)的基元的列表。这样的“基元列表”(其也可以被称为“图块列表”)标识(例如,通过参考基元指示符)要针对所讨论的子区域渲染的基元(并且因此可以用于标识要针对对应于所讨论的子区域的相应的一个图块或多个图块渲染的基元)。
根据渲染输出的区域对基元进行拣选的处理通常被称为“分箱”,并且通常通过确定(以期望的精度水平)与所讨论的区域相交(即,将(至少部分地)出现在区域内)的基元、然后准备那些基元的列表以供图形处理系统将来使用来执行。(这里应当注意的是,基元落入多于一个区域中(将经常是这种情况))。它被包括在针对其落入的每个区域的基元列表中。
图3例示“精确”分箱处理,其中精确地确定给定基元将至少部分地出现在哪些图块中,并且基元接着仅被包括在针对那些图块的基元列表中。如图3所示,要显示的场景301被划分为十六个规则大小的子区域或图块302。然后针对场景中的每个基元确定基元实际上出现(落入)在哪个图块或哪些图块内。基元被添加到针对该基元被发现所落入的每个图块的基元列表。因此,以图3所示的示例为例,基元303被添加到针对图块304的基元列表,基元305被包括在针对图块306和图块307的基元列表中,基元308被包括在针对图块309、图块3010、图块3011和图块3012的基元列表中,并且基元3013被包括在针对图块3012的基元列表中。(这里应当注意,为了清楚起见,图3仅示出了几个图块和基元。如本领域技术人员将理解的,在实际图形处理操作中,通常将存在更多的基元和图块。
然而,还已知以比利用精确分箱实现的精度更低的精度来准备基元列表。这可用于例如简化基元列表的准备。一种常见的“较不精确”分箱技术是“限界框”分箱。在这种情况下,在基元或基元的集合周围绘制所谓的“限界框”,然后确定由限界框覆盖的图块。然后针对已经发现限界框所覆盖(至少部分地)的每个图块列出(分箱)限界框表示的一个基元或多个基元(即,由限界框涵盖)。因此,应当理解,确定应当针对上述任何给定区域列出(渲染)的基元的处理(“分箱”处理)可以以不同的精度水平来执行,例如,这取决于图块化和渲染处理的不同部分的效率优化。
一旦以这种方式针对每个子区域(图块)准备要渲染的基元的列表(基元列表),就存储(基元)列表以供使用,例如,以允许系统识别哪些基元需要被考虑(并且渲染)以用于相应渲染图块。
这种基于图块的渲染的优点是,不在给定图块中出现的基元不必针对该图块进行处理,并且因此可以在该图块被处理时被忽略。这可以允许减少给定场景所需的图形处理的总量。
图4示意性地示出了被配置为执行这样的基于图块的渲染的图形处理器420。图形处理器420包括几何形状处理器421和渲染器422,几何形状处理器421和渲染器422两者都可以访问存储器423。存储器423可以是具有几何形状处理器421和渲染器422的“片上”的,或者可以是可以由几何形状处理器421和渲染器422访问的外部存储器。
此外,并且如图4所示,存储器423存储一组原始几何形状数据424(其例如由图形处理器驱动器或在图形处理器420的主机系统(微处理器)上运行的API提供)、一组经变换的几何形状数据425(其是在原始几何形状结构424上执行的各种变换和处理操作的结果)和一组基元列表426。经变换的几何形状数据425包括例如变换的顶点(顶点数据)等。
此外,几何形状处理器421包括可编程顶点着色器427和基元列表构建单元428。可编程顶点着色器427将存储在存储器423中的原始几何形状数据424作为输入,并且处理该数据以提供经变换的几何形状数据425(然后将其存储在存储器423中),该经变换的几何形状数据425包括准备好在要显示的帧中进行二维(‘2D’)放置的形式的几何形状数据。可编程顶点着色器427及其执行的处理可以采取任何合适的形式,并且可以是任何合适的和期望的这样的处理。
基元列表构建单元428执行如下分块和基元列表准备处理:将基元(或基元的绘制调用)分配给基元列表,该基元列表然后由渲染器422用于识别应当针对待渲染的场景的每个子区域渲染的基元(绘制调用)(并且包括用于这样做的合适的电路)。为此,基元列表构建单元428将来自可编程顶点着色器427的经变换和处理的顶点数据(即,图形对象在场景中的位置)作为其输入,使用该数据构建基元列表,并且将那些列表在存储器423中存储为基元列表426。
渲染器422包括基元列表选择单元429、基元列表缓存430、顶点选择单元431、顶点数据缓存432、光栅化单元433、渲染单元434和图块缓冲区435。
在此实施方式中,光栅化单元433、渲染单元434、图块缓冲区435以与通常在图形处理系统中操作的此类单元相同的方式操作。因此,光栅化单元433将基元及其顶点作为其输入,将基元光栅化为片段,并将这些片段提供给渲染单元434。渲染单元434然后对片段执行多个渲染处理(诸如纹理映射、混合、着色等),并且生成渲染的片段数据,该渲染的片段数据被存储在图块缓冲区435中,以提供给帧缓冲区以供显示。
渲染器422的基元列表选择单元429确定接下来要渲染哪个基元(或例如哪个绘制调用,其中基元被一起批处理成绘制调用)。通过考虑存储在存储器423中的基元列表426并且从这些列表中的一个列表中选择要渲染的下一个图形对象(例如,基元或绘制调用)来实现这一点。
基元列表选择单元429向顶点选择单元431提供其已选择用于接下来进行渲染的基元。响应于此,顶点选择单元431获得所讨论的基元的相关顶点数据,然后将基元(即,其经变换的顶点数据)提供给光栅化单元433以进行处理。顶点数据的获得可以根据需要以各种方式完成。例如,在一些实施方式中,顶点选择单元431从存储在存储器423中的经变换的几何形状数据425检索针对所讨论的基元的适当的经变换的顶点数据。在这种情况下,经变换的顶点数据可以由几何形状处理器421的可编程顶点着色器427前期生成,并且然后被适当地存储以供渲染器422后续使用。然而,在其他实施方式中,顶点选择单元431本身可以触发顶点着色。即,在实施方式中,如下面将进一步描述的,渲染器422还可以包括可编程顶点着色器(图4中未示出),可编程顶点着色器可操作以将存储在存储器423中的原始几何形状数据424作为输入,并且根据需要处理该数据以提供经变换的几何形状数据。即,在一些实施方式中,可以由渲染器422执行一些或全部顶点着色。在这方面考虑了各种布置。
顶点选择单元431可以根据需要将其从存储器423检索到的顶点数据缓存在顶点数据缓存32中。基元列表选择单元429还可以将一个或多个基元列表放置在基元列表缓存430中。例如,基元列表缓存30和顶点数据缓存32可以包括提供在渲染器422上的本地存储器,与主存储器423相比,渲染器的处理单元(尤其是基元列表选择单元429和顶点选择单元431)可以更快速地访问本地存储器。
在上述基于图块的渲染方案中,第一处理级(其由几何形状处理器421执行)因此用于处理(例如,拣选)渲染输出的所有几何形状,以生成识别应当针对渲染输出的哪些区域渲染哪些基元的一组基元列表。然后在第二处理级(在渲染器422中)执行各个图块的渲染。因此,对于每个渲染图块,根据相应的图块列表确定应当针对该图块处理哪些基元,并且获得针对那些基元的相关联的经变换的几何形状数据,并且对其进行进一步图形处理以生成期望的最终渲染输出数据。如图5所示,使用驻留在渲染器422本地(例如,在片上存储器中)的图块缓冲区435来执行渲染。因此,给定图块的渲染在图形处理器本地执行。一旦图块的渲染已经完成,则经渲染的数据然后被写出到存储器423,例如被写入到帧缓冲区中,例如以供显示。基于图块的渲染方案中的整体处理流程例如在图5中示出。
如图5所示,在第一(“立即”)处理级,执行基元的所有几何形状相关处理(步骤530),以产生针对基元的经着色顶点集合,然后对基元执行分块操作(步骤531)以生成基元列表,然后将基元列表与经着色顶点数据一起写回到外部存储器(步骤532)。然后在第二(“推迟”)处理级中使用该数据,在第二(“推迟”)处理级期间,通过使用其相关联的几何形状对多边形进行光栅化/渲染来生成渲染输出。因此,如图5所示,第二处理级涉及在基元列表中读取当前图块的顶点数据(步骤533),然后执行期望的渲染操作以确定期望的渲染输出数据。
因此,第二处理(渲染)级使用由第一处理级生成的基元列表来识别应当针对哪些图块渲染哪些基元,并且然后(单独地)渲染各个图块,例如,一个接一个地渲染。因此,当渲染图块时,获得要针对该图块渲染的基元的顶点数据(这可以涉及从存储器423获得经变换的几何形状结构425,但是还可以涉及对原始顶点数据424进行重新着色,并且在这方面,在第二处理级期间执行一些或全部几何处理的各种布置是可能的)。然后,将指示要针对图块处理的基元的经着色顶点光栅化为相应的片段集合(步骤535),并且对所得片段执行片段着色操作(步骤536)。最后,对经着色片段进行混合操作(步骤537),然后将任何其他这样的操作(例如下采样等)和经混合的片段值写入合适的帧缓冲器中,例如以供显示。
本实施方式具体涉及由基于图块的渲染系统内的第二(“推迟”)处理级执行的渲染操作。应当理解,渲染操作由图形处理器接收和处理渲染图块的命令来触发。例如,如以上关于图1和图2所描述的,图形处理器3被控制成通过图形处理器3的驱动器4准备包括使图形处理执行期望图形处理工作的命令的命令流来执行针对主机处理器1上的应用2的图形处理工作。
因此,由驱动器4准备的命令由命令流前端20相应地进行处理,以调度图形处理器的功能单元的处理工作。这在例如图6中示出。
图6示意性地示出了用于使图形处理器以上述方式执行基于图块的渲染的示例命令流60。因此,命令流开始于合适的“开始渲染输出”命令61,该“开始渲染输出”命令61初始化用于当前渲染输出(例如,场景)的图形处理器。然后,在命令流60中,接着是“开始分块”命令62,该“开始分块”命令62在被执行时使图形处理器执行用于渲染输出的前期几何形状处理(例如,分块)操作。这之后是定义要处理的渲染输出的几何形状的相应绘制命令63的序列。这些绘制命令因此由命令流前端20处理以触发几何形状处理器420执行上述所需顶点着色和基元列表构建操作。
因此,该处理的结果是生成基元列表的集合,基元列表中的每个基元列表都包括与已经确定针对应当为其准备基元列表的渲染输出的区域而渲染的基元相对应的基元命令的相应列表。如上所述,一旦已经处理了所有几何形状并且生成了相应的基元列表,就完成初始几何形状处理操作。
相应地,与初始几何形状处理操作有关的命令62、63之后是相应的命令64,以触发后续渲染操作。在图6所示的示例中,由驱动器4准备的命令包括用于渲染渲染输出的更大面积区域(“元图块”)的命令64,更大面积区域包括渲染图块(即,出于渲染目的,渲染输出被细分的区域)的组。然后将这些元图块命令64传递到图形处理器片段着色器端点,所述图形处理器片段着色器端点将元图块命令拆分成针对相应渲染图块65的相应处理任务。然后,片段着色器端点控制任务65(例如,用于渲染图块)到渲染器422的调度和发布以供渲染。由命令流前端20对元图块命令的处理因此触发由片段着色器端点调度一个或更多个图块渲染任务。片段着色器端点然后将依次将图块渲染任务发布到渲染器422,渲染器422将触发要针对图块执行的处理(渲染)操作的序列,如下文将进一步描述。
然而,在这方面,各种其他布置也是可能的。例如,不是驱动器4准备与片段着色器端点拆分成更小的处理任务(图块)的更大处理作业(“元图块”)有关的命令,而是由驱动器4提供给命令流前端20的命令流本身可以包括渲染各个渲染图块的命令,使得片段着色器端点相应地调度这样的任务,但是无需将整个处理作业(元图块)划分成用于渲染目的的单独图块。在这种情况下,渲染操作(针对图块)可以由驱动器4准备的命令直接触发。
还应当理解,图6示出了用于例示性目的的简化的命令流,并且典型的图形处理命令流可以包括比图6中所示的那些更多的命令和不同类型的命令。在这方面,各种布置是可能的。
在任何事件中,响应于图形处理器命令流前端20遇到适当的渲染命令(无论其是用于渲染启动多个图块渲染任务的元图块的命令,还是如此渲染图块的命令),这最终会触发图块的渲染,其中使渲染器422执行期望的处理操作序列以便渲染图块。因此,渲染命令触发渲染器422自动执行处理操作的特定序列,以生成针对所讨论的图块的期望渲染输出数据。具体地,响应于这样的命令,可以(并且最终)使渲染器422经由基元列表选择单元429获得针对所讨论的图块的一个基元列表或多个基元列表,以识别要渲染的基元,获得基元的相关顶点数据,并且然后相应地光栅化和渲染基元,例如,如上所述。
然而,在本实施方式中,不是渲染命令触发渲染操作,在该渲染操作中基元被光栅化并且然后在单个渲染通道中(根据需要)被完全渲染(例如,如在图5中描绘的第二处理级中),而是将新颖的“预通道”操作引入到响应于渲染命令而自动执行的处理操作中,使得针对一个(以及每个)图块的基元的渲染被有效地划分成两个单独的处理通道(尽管在一些情况下,可以存在多于两个处理通道,特别是当在图块的渲染期间触发第三“回退”操作时,如下文将进一步解释的)。在本实施方式中,片段着色器端点在调度图块的渲染时被相应地配置为将图块的渲染划分成两个处理通道,使得同一图块被有效地发布用于渲染两次,但是其中图形处理器被配置为针对相应的不同处理通道执行不同的处理操作序列。
具体地,并且如下文将进一步解释的,当渲染针对图块的基元序列(例如,基元序列可以是针对图块的整个基元序列,或者可以是针对图块的绘制调用)时,在两个通道中执行基元序列中的基元的处理,由此最初执行第一“预通道”操作来处理基元,以确定基元序列的一组“可见性”信息,并且第一“预通道”操作之后是后续的“主”通道操作,该“主”通道操作再次处理通过对应的第一预通道操作处理的至少一些基元以完成其渲染,并且产生最终渲染输出数据(例如,以确定由基元覆盖的相应采样位置在最终渲染输出中应当具有的外观(例如,颜色))。因此,对于要渲染的给定图块,片段着色器端点将调度用于渲染器422的相应任务以执行第一“预通道”操作,然后执行对应的“主”通道操作。
根据本实施方式,第一预通道操作因此不产生任何渲染的输出数据,而是仅用于确定基元序列的一组“可见性”信息。如下面将进一步解释的,“可见性”信息可以采用各种合适的形式,但是通常反映针对基元序列中的基元的给定片段是否可见(并且因此该片段是否应当被进一步处理以用于渲染输出)。因此,由第一预通道操作确定的可见性信息可以因此(并且是)随后在对应的第二主通道操作期间被使用,以便在第二主通道期间控制片段的处理,例如并且特别是,剔除可以根据可见性信息确定片段不具有可见效果的任何片段,并且因此不需要进一步处理该片段。然后,这在提供改进的(例如,样本完美的)隐藏表面去除方面具有各种益处,这将在下文中进一步解释。特别地,因为第一预通道操作可操作为在前期处理基元序列,以确定整个基元序列的“可见性”信息,这意味着当在第二主通道操作期间再次处理相同的基元序列时,可以基于所确定的“可见性”信息来相应地控制在第二主通道操作中的基元的处理,使得在每个采样位置,只有需要针对该采样位置进一步处理的一个基元(或多个基元)才被进一步处理。
图7是例示根据本文描述的技术的实施方式的针对各个渲染图块执行的渲染操作的状态图。如上所述,渲染操作由图形处理器遇到渲染图块的适当命令来触发并且片段着色器端点响应于这样的命令来调度对应的渲染通道。然后自动地并且在硬件控制下执行渲染操作,其中图形处理器根据图7中所示的状态图在不同的相应“状态”之间转变(其中图形处理器在相应的状态中被配置成执行相应的对应处理操作),如下文将进一步解释的。
因此,响应于这样的合适命令(步骤70-开始),使得本实施方式中的图形处理器自动执行图7中所示的渲染操作,特别是由片段着色器端点调度适当的任务以针对所讨论的图块执行第一预通道操作。因此,此时图形处理器被配置为“预通道”状态。渲染操作相应地开始于由第一预通道操作处理被识别为要针对图块渲染的基元,以便针对基元序列(图块)生成期望的“可见性”信息(步骤71)。取决于“可见性”信息的期望格式,第一预通道操作通常可以包括任何合适的处理操作序列。下文将描述可以如何配置第一预通道操作的各种不同示例,但图8例示了在第一示例中根据第一预通道操作的处理操作(图形处理流水线),其中所确定的可见性信息包括针对基元序列(图块)的深度缓冲区。
在如图8所示的第一示例中,第一预通道操作因此包括流水线化的处理操作序列,其包括:片段着色器端点80,其调度图形处理流水线需要执行的渲染工作以便渲染图块;基元列表读取器(多边形列表读取器81),其读取针对图块的适当基元列表以识别要针对图块渲染的基元;基元分类单元82;预通道决策单元83;顶点处理(例如着色)级84,其获得(并且如果需要,着色)用于要针对图块渲染的基元的相关顶点数据;光栅化器85,其将基元光栅化成对应于渲染输出内的采样位置的相应片段;以及(早期)深度测试/更新级86,其执行片段深度测试并且相应地更新深度缓冲区。
因此,当片段着色器端点80发布用于渲染的图块时,基元列表读取器(多边形列表读取器81)继而将基元序列中的基元发布到图形处理器以供第一预通道操作处理。然后,图8所示的处理级相应地处理基元,以便确定期望的“可见性”信息。在此第一示例中,“可见性”信息包括深度缓冲区。因此,基元被处理直到且包括(早期)深度测试/更新级86,但在此示例中未进一步处理(例如,使得在第一预通道操作期间不存在片段着色)。在该第一示例中,一旦深度缓冲区已经被更新(如果需要),则基元的预通道处理在此时停止,并且序列中的下一基元被相应地处理。
只要基元序列中的被处理的基元与第一预通道操作的处理(其可以是(并且是)由基元分类单元82确定的,如将在下面进一步详细解释的)兼容,第一预通道操作就可以对基元序列中的基元进行工作(步骤72),相应地处理基元以更新针对该基元序列的深度缓冲区,直到第一预通道操作到达序列的末尾(图块的末尾)(步骤73)(或者直到第一预通道操作以其他方式停止)。
一旦第一预通道操作已完成(或停止),并且确定针对基元序列的深度缓冲区(可见性信息),此时应发起第二主通道操作(步骤74)。因此图形处理器应当(并且是)在此时切换为“主通道”状态。如上所述,执行第二主通道操作以再次处理通过第一预通道操作处理的至少一些基元(步骤71),以便生成最终期望的渲染输出数据。因此,在第一预通道操作结束时,基元列表读取器(多边形列表读取器81)在实施方式中“重新绕回”到基元序列的开始(步骤710),以为对应的第二主通道做好准备。然后,片段着色器端点80发布针对要执行的第二主通道操作的对应任务。因此,响应于针对第二主通道操作的相应任务,使图形处理器转变到“主通道”状态,并且然后从开始重新发布基元序列,以供第二主通道操作处理。因此,第二主通道操作相应地(再次)对基元序列中的基元进行工作以产生期望的渲染输出数据,例如通过再次将基元光栅化成其相应片段,然后完成片段的渲染。然而,当执行第二主通道时,图形处理器使用通过第一预通道操作产生的可见性信息,在可能的情况下剔除片段。例如,如下文将进一步解释的,在将基元光栅化为其相应片段之后,第二主通道然后使用可见性信息执行片段可见性测试以确定片段是否需要被进一步处理。因此,任何未通过片段可见性测试的片段都可以被相应地剔除,从而避免对这些片段的进一步处理。
图9例示在此第一示例中根据第二主通道操作执行的对应处理操作。如图9中所示,第二主通道操作包括流水线化的处理操作序列,其与第一预通道操作共同地包括:片段着色器端点80,其调度图形处理流水线需要执行的渲染工作以便渲染图块;基元列表读取器(多边形列表读取器81),其读取适当的针对图块的基元列表以识别将针对图块渲染的基元;基元分类单元82;预通道决策单元83;顶点处理(着色)级84,其获得(并且如果需要,着色)用于要针对图块渲染的基元的相关顶点数据;以及光栅化器85,其将基元光栅化成对应于渲染输出内的采样位置的相应片段。
第二主通道操作还执行片段的深度测试。然而,针对在第二主通道操作期间执行的深度测试,深度缓冲区写入是被禁用的,使得第二主通道操作不更新深度缓冲区。相反,如图9所示,在该示例中,深度测试函数被修改以用于第二主通道操作中的深度测试,使得深度测试包括“等于”测试。早期深度等于测试96相应地测试正被测试的片段的深度值是否与存储在深度缓冲区中的针对对应采样位置的深度值相匹配。因此,如果片段具有与存储在深度缓冲区中的深度值相同的深度值,则片段在早期深度等于测试96中存活,并且因此通过执行片段着色器87、然后执行混合90等来进一步处理以生成最终渲染输出数据。另一方面,如果片段的深度值与存储在深度缓冲区中的深度值不匹配,使得片段在早期深度等于测试96中失败,则片段可以(并且是)此时在第二主通道期间被剔除,其中避免片段着色87等。以此方式,可基于在第一预通道操作期间生成的深度缓冲区来控制第二主通道操作期间的片段处理,使得仅针对实际上可见的片段产生渲染输出数据。
因此,第二主通道操作的结果是产生期望的针对图块的最终渲染输出数据。然后,这可以从图块缓冲区相应地写出(例如,到帧缓冲区),例如以供显示。
再次,只要基元与以此方式的处理兼容,基元序列中的基元继而由第二主通道处理(步骤75),直到序列中的所有基元已被处理(例如,到达图块的末尾)(步骤76),此时图块的渲染完成(步骤77-结束)。
即,只要基元与以上描述的两级方式的处理兼容,就以此方式处理基元,使得同一基元经受第一预通道操作和第二主通道操作两者。然而,某些类型的基元具有一种或更多种性质,这意味着它们不能以这种方式安全地处理。这种情况可能有多种原因,如将在下面进一步讨论的,但是通常这将是由于将处理划分成两次单独的通道可能会将伪影引入最终渲染输出数据。
如图7所示,图形处理器在本实施方式中也可在第三“回退”操作中操作。第三回退操作可以(并且是)通过遇到“不兼容”基元(即,针对已经确定无法使用预通道操作安全地处理基元的基元)的第一预通道操作触发。在那种情况下,为了确保继续对基元序列进行安全处理,图形处理器可以切换到第三回退操作,其中基元以“故障安全”方式被处理。这是特别重要的,因为本文描述的技术中的渲染是在硬件控制下执行的,并且因此图形处理器应当(并且在本实施方式中是)能够安全地处理应用可以指定渲染的所有不同类型的基元,即,不潜在地引入伪影。在本实施方式中切换到第三回退操作可以(并且是)由预通道决策单元83基于来自基元分类单元82的输出触发和控制的,如现在将进一步解释的。
例如,如上所述,图8中所示的第一预通道操作(以及图9中所示的第二主通道操作)包括基元分类单元82和预通道决策单元83。基元分类单元82能够识别当前基元与预通道操作兼容还是不兼容。然后,预通道决策单元83能够确定处理应如何进行。例如,在基元分类单元82识别基元与第一预通道操作的处理不兼容(图7中的步骤78)的情况下,预通道决策单元83使第一预通道操作在此时停止(并且不兼容基元被剔除用于第一预通道操作-步骤79,使得其可在后续改为由第三回退操作处理)。
当由于不兼容基元而停止第一预通道操作时,此时,基元列表读取器(多边形列表读取器81)再次被“重新绕回”到基元序列的开始(步骤710),并且然后执行第二主通道操作以完成基元序列中的基元(直到紧接在不兼容基元之前的基元)的渲染操作(步骤74)。即,不是立即中止预通道操作以执行第三回退操作,而是首先将图形处理器切换到第二主通道操作以完成到目前为止已经通过第一预通道操作处理的基元的渲染。当第二主通道操作到达不兼容基元时,第二主通道操作中的基元分类单元82将相应地再次识别基元不兼容(步骤711),并且预通道决策单元83将相应地使第二主通道操作在此时停止。接着将图形处理器切换到第三回退操作以处理不兼容基元(步骤712)(并且在此示例中,图形处理器接着通过第三回退操作继续处理基元,直到图块的末尾(步骤714))。
图10例示了在第一示例中根据第三回退操作的处理操作。在图10所示的示例中,第三回退操作因此包括流水线化的处理操作序列,其包括:片段着色器端点80,其调度图形处理流水线需要执行的渲染工作以便渲染图块;基元列表读取器(多边形列表读取器81),其读取适当的针对图块的基元列表以识别将针对图块渲染的基元;基元分类单元82;预通道决策单元83;顶点处理(着色)级84,其获得(并且如果需要,着色)用于要针对图块渲染的基元的相关顶点数据;以及光栅化器85,其将基元光栅化成对应于渲染输出内的采样位置的相应片段。在第三回退操作中,在光栅化之后,片段接着经受早期深度(并且可选地(早期)模版)测试/更新86(例如,如在第一预通道操作中),但处理接着通过针对在早期深度测试/更新86中存活的任何片段执行片段着色器87、执行晚期深度(模版)测试/更新88,并且接着执行最终片段着色器89、并且接着针对任何剩余片段执行混合90等而继续,以产生期望的渲染输出数据。注意,在图10中,早期深度测试/更新86和晚期深度测试/更新88还执行对应的(早期/晚期)模版测试/更新。即,在该示例中,模版化在第一预通道操作和第二主通道操作期间是禁用的,但是在第三回退操作中处于活动状态。
因此,如图10中所示,第三回退操作在单个渲染通道中“完全”处理基元,例如,类似于传统的基于图块的渲染系统内的正常渲染操作(例如,如图5所示)。因此,第三回退操作允许以“故障安全”的方式处理基元。然后,这确保即使存在不能以这种方式处理的一些基元,也可以继续处理基元序列以生成期望的渲染输出数据。这有利于确保能够处理可能遇到的所有不同类型的基元(和基元性质)的改进的更安全的硬件实现,例如通过回退(如果需要)来以这种“故障安全”的方式(以隐藏表面去除效率为代价)进行处理。在图7所示的示例中,基元序列中的剩余基元然后都通过第三回退操作处理(步骤713),直到已经处理了针对图块的所有基元。(然而,还设想在一些实施方式中,图形处理器可尝试在可能的情况下,在针对图块的基元序列内从第三回退操作切换回到第一预通道操作。下面将关于图73对此进行进一步解释。)
此时,一旦已经相应地处理针对图块要渲染的基元以生成最终渲染输出数据(其中一些基元(即,在基元序列中的不兼容基元之前的基元)已经由预通道操作/主通道操作处理,并且另一些基元(即,不兼容基元)和基元序列中的任何后续基元通过第三回退操作处理)(步骤714),并且完成(针对图块)基元序列的渲染(步骤77-结束)。
一旦完成了(例如,针对当前图块的)基元序列的渲染(步骤77-结束),假设存在另外的要渲染的基元序列(图块),则片段着色器端点80然后可以(并且确实)调度下一个基元序列以用于相应地渲染。例如,此时片段着色器端点80可以发布用于渲染要渲染的下一图块的相应处理任务(尽管要渲染的下一个基元序列也可以例如是针对当前图块的另一个绘制调用)。
然后,以与上文关于图7所描述的相同方式处理要渲染的下一个基元序列,例如,通过发起新的预通道操作,并且然后根据需要接着控制图形处理器的状态以渲染基元。在这方面,应当理解,即使在图块确实包含不兼容基元的事件中,使得图形处理器必须恢复到针对该图块的第三回退操作,这可能仅影响该图块,并且针对下一个图块的渲染操作可以以新的预通道操作重新开始。因此,在遇到不兼容基元的事件中,隐藏表面去除效率仅是暂时损失,并且可以针对下一个图块恢复改进的隐藏表面去除。当然,如果在该图块的渲染期间遇到该不兼容基元或另一不兼容基元,则第三回退操作将再次以相同的方式被触发,但是至少对于不包含任何不兼容基元的图块,并且对于那些图块,可以使用本实施方式的新颖的预通道操作来实现样本完美隐藏表面去除。
因此,本实施方式的“图块内”预通道操作可以提供对隐藏表面去除的显著改进,并且因此可改进整体图形处理操作。
根据上文的描述将理解,在实施方式中,上文所描述的第一预通道操作、第二主通道操作和第三回退操作是使用相同的图形处理流水线但适当地启用/禁用不同级来执行的。因此,片段着色器端点80可经配置以发布用于渲染多次的相同基元序列,但其中针对每个通道执行的处理操作是根据图形处理器的状态有效地调制的,其中针对图形处理器的不同配置,不同处理级处于“活动状态”。因此,片段着色器端点80可向图形处理流水线指示正在执行哪一类型的任务,并且然后可以相应地配置(或重新配置)图形处理流水线以执行期望的处理操作。这例如在图11中示出。因此,图11例示了状态机112,其示出了针对传入的要处理的基元110,如何根据该第一示例中的图形处理器的不同可能状态来不同地处理基元110。
例如,当图形处理器正在执行第一预通道操作(即,图形处理器被配置在预通道状态114中)时,以图8所示配置的图形处理流水线以上述方式相应地处理基元,其中(仅)那些处理级处于“活动状态”,使得该基元由图形处理流水线处理直到并包括深度缓冲区的深度测试/更新,但是基元的处理在此时结束,而不执行进一步处理。相应地,当图形处理器正在执行第二主通道操作(即,图形处理器被配置在主通道状态116中)时,(相同)基元被再次处理,但是是利用如图9所示配置的图形处理流水线在主通道级中来处理的,其中不同的处理级集合处于“活动状态”。因此,在第二主通道操作期间,如上所述,(相同)基元可以被再次处理直到深度测试,但是深度测试现在被修改以执行等于测试,并且附加地,片段着色器和混合级处于活动状态,使得针对深度等于测试中存活的片段来随后执行片段着色器,并且执行混合,从而产生最终渲染输出数据。
另一方面,在第三回退操作(状态118)中,利用如图10中所示配置的图形处理流水线来处理基元。在这种情况下,基元经历深度(以及可选地模版)测试,其中在早期/晚期深度测试中存活的任何片段都被相应地着色,例如以深度(模版)测试的正常方式。例如,在回退状态下,所有图形处理流水线级可以处于“活动状态”,这样的基元在单个处理通道中被完全处理。
示例1-基元分类
如上所述,基于基元“分类”来执行关于基元是否与通过预通道操作的处理相兼容(以及因此如果需要,可能触发第三回退操作)的确定。通常,基元可能与预通道操作处理不兼容的原因有很多,具体取决于预通道操作的配置方式。因此,可以通过检查与基元(或基元性质)相关联的各种条件来执行基元分类,以确定基元是否与预通道操作兼容。
图12示出了上述第一示例的示例基元分类处理,其中如图8所示配置预通道操作,并且如图9所示配置对应的主通道操作。在此示例中,如上文所所述,预通道操作填充深度缓冲区,并且第二主通道操作接着针对深度缓冲区执行“等于”深度测试,其中仅在等于深度测试中存活的基元由第二主通道操作进一步处理。
在此示例中,对于要分类的传入基元120,检查以确定基元是否(潜在地)与此示例中的预通道操作不兼容的条件包含以下条件;
1)基元是透明的(步骤121)-因为透明基元通常将不更新深度缓冲区,并且因此在图9中所示的主通道期间将通过深度等于测试被不正确地剔除;
2)基元具有副作用(步骤122)-因为具有副作用的任何基元通常应当仅被处理一次;
3)基元使用模版化(步骤123);
4)基元不写入到所有渲染目标(步骤124);
5)基元在第一预通道操作期间使用排他性深度测试(诸如“大于”测试而不是“大于或等于”深度测试)(步骤125);
6)基元不写入深度(步骤126);
7)需要片段着色器来确定基元覆盖(换言之,片段着色器潜在地修改覆盖)(步骤127);或者
8)需要片段着色器来确定深度值(换言之,片段着色器发出深度值)(步骤128)。
如图12所示,此第一示例中的基元分类处理因此包括检查上文所列出的条件中的每一者以便确定基元是否兼容,并且仅在条件均不满足的情况下才将基于识别为与预通道兼容(步骤129)。即,在该示例中,利用如上所述配置的预通道操作,如果满足上述条件中的任一个,则将基元识别为与预通道不兼容(步骤130),并且进行相应地处理(即,通过使图形处理器切换到第三回退操作以处理该基元)。
因此,基元分类处理的结果是识别基元是否与第一预通道操作处理兼容。因此,可将基元分类结果提供到预通道决策单元83,以根据图7中所示的状态机控制图形处理器的状态,从而根据图形处理器当前处于何种状态来控制基元的处理方式(如图11所示)。应当理解,通常可以在逐基元的基础上或针对更大的几何形状单元(例如,在绘制调用的基础上)来执行该基元分类,这取决于系统的配置方式。例如,上面识别的性质通常仅在绘制调用的基础上变化,使得可以(并且在实施方式中是)对基元的绘制调用执行分类。然而,其他布置也是可能的。
图12中所示的基元分类处理可在第一预通道操作期间由基元分类单元82执行,其中基元分类的结果接着由预通道决策单元83相应地使用以确定处理应如何继续(即,预通道操作是否应继续或是否应终止预通道,并且基元改为随后由回退操作处理)。
然而,应当理解,在图12中的基元分类期间正被考虑的基元性质中的至少一些属性通常是预先已知的,使得图12中所示的基元分类处理中的一些或全部处理也可以相应地预先执行,例如由图形处理器3的驱动器4在准备图形处理器3的对应命令流时预先执行。在这种情况下,驱动器可以相应地利用合适的标志(例如,相关联的位)来注释命令流内的基元(或绘制调用),以向图形处理器指示基元是否与预通道操作兼容。然后,标志可以被提供给图形处理器,并且由基元分类单元82相应地检查,其中基元分类检查的结果然后被预通道决策单元83使用以确定处理是否应继续。例如,如果存在“不兼容”标志(即,取决于设计而设定或不设定相关位),则基元分类单元82可识别这一点,并且预通道决策单元83可适当地触发第三回退操作。然而,通常,在相应的第一预通道操作和/或第二主通道操作期间,在运行时执行基元分类中的至少一些基元分类,特别是对于稍后将在以下示例中描述的更复杂的分类。
将理解,图12中所示的基元分类处理基于上文所描述的第一示例中的通道操作的特定配置,其中预通道包括图8中所示的特定处理操作,但不(例如)执行模版化或执行片段着色器,使得任何需要模版化或需要片段着色器的基元被视为不兼容。因此,应理解,取决于预通道操作的特定配置,可存在(并且大体上将存在)不同的条件集合,这意味着基元可能与该预通道操作处理兼容或不兼容。即,根据本文描述的技术的实施方式的预通道操作可以根据需要或多或少地复杂,并且因此可以能够处理各种不同类型的基元,而不必恢复到第三回退操作。在这方面设想了各种布置,并且现在将设想多个示例以示出可以处理其他类型的基元(或其他基元性质)的另选预通道配置。
示例2-排他性深度测试消歧
例如,在与第一示例相关的图12所示的基元分类处理中,如果基元深度测试使用排他性深度测试,则基元被视为与预通道操作不兼容(步骤125)。这是因为,如果针对基元指定了排他性深度测试,因为在第二主通道操作期间执行的深度测试被修改为使用深度“等于”的测试(对于所有基元,不管在第一预通道操作期间使用的深度测试函数(例如,由应用指定的)如何),如果有两个基元写入相同的深度值,则第二主通道可能无法复制正确的渲染行为。
特别地,当两个基元写入相同的深度值时,但是在针对较晚基元的第一预通道操作中使用的深度测试函数是排他性测试(即,严格地“小于”或“大于”,而不是“小于或等于”、“大于或等于”或“等于”)时,API要求规定的正确行为是剔除较晚基元。即,如果深度缓冲区由较早基元更新以记录该深度值,则具有相同深度值的较晚基元应未通过排他性深度测试,例如,因为其深度值将等于存储在深度缓冲区中的深度值,并且不严格大于(或小于)所存储的深度值。然而,因为出于本实施方式的目的,在第二主通道操作中的深度测试被修改为包括针对所有基元的深度“等于”测试,在这种情况下,写入相同深度值的较晚基元也将在深度“等于”测试中不正确地存活。
因此,在一些实施方式中,应用指定在第一预通道操作期间应使用排他性深度测试函数的任何基元因此被简单地视为与预通道操作不兼容,并改为由第三回退操作处理。如上所述,这是例如图12中的情况。这可以很好地工作以确保在这种情况下继续安全处理渲染输出的基元。
然而,在其他实施方式中,根据第二示例,预通道操作和对应的主通道操作可以被配置为通过提供合适的深度测试消歧机制来处理这样的基元,该深度测试消歧机制允许对写入相同深度值的两个基元进行消歧以由此确保正确的渲染行为。例如,如上所述,当存在写入相同深度值的两个基元时,当较晚基元在第一预通道操作中使用排他性深度测试函数时,针对较晚基元的正确渲染行为是剔除较晚基元。(而如果较晚基元使用包含性深度测试函数,则它应存活)。
在第二示例中对此的解决方案是在深度缓冲区中存储适合的“跟踪”位,所述“跟踪”位可在第一预通道操作期间和/或在第二主通道操作期间适当地设定/清除,以便确保正确的渲染行为。该深度测试消歧机制例如在图13和图14中示出。在这些示例中,假设深度比较函数是“大于”(排他性)或“大于或等于”(包含性)测试。然而,类似的方法也可以用于“小于”(排他性)或“小于或等于”(包含性)测试。
图13例示了根据该第二示例的根据第一预通道操作的处理操作(图形处理流水线)。处理操作与以上关于图8所描述的相同,只是深度测试/更新级136被修改为包括另外的消歧机制,该另外的消歧机制适当地设定“跟踪”位,以确保在随后的第二主通道操作期间所期望的渲染行为。在图14中示出了在第一预通道期间的消歧机制。
如图14所示,对于到深度测试/更新级136的传入片段140,针对该片段执行深度测试(步骤141)。该片段深度测试是以(早期)深度测试的正常方式执行的。例如,生成片段的基元将与(例如,由应用)已经为基元指定的某个深度测试函数相关联。然后根据指定的深度测试函数,对照深度缓冲区中的对应条目测试片段的深度值。如果片段未通过深度测试,则确定片段是不可见的,并且因此在此基础上剔除(不更新深度缓冲区)(步骤142)。另一方面,如果片段在深度测试中存活,则相应地更新深度缓冲区(步骤143)以记录片段的深度值。
在片段导致深度缓冲区更新的事件中(步骤143),则进一步检查导致深度缓冲区更新的片段的指定深度测试函数是否是包含性测试函数(步骤144)。如果深度测试函数是包含性的(步骤144-是),则相应地设定与所讨论的采样位置相关联的深度缓冲区中的额外“跟踪”位(步骤145)。否则,如果深度测试函数是排他性的(步骤144-否),则不设定“跟踪”位(或者如果先前已设定,则清除该位)((步骤146)。
因此,在第一预通道操作期间,如果片段在原始深度(或模版)测试中存活,则与采样位置相关联的对应的‘跟踪’位随后被相应地设定/清除,这取决于原始深度测试函数是包含性的还是排他性的。
例如,在实施方式中,如果片段在原始深度(或模版)测试中存活,并且片段的原始深度测试函数是包含性的,则在实施方式中,“跟踪”位此时被设定为第一值(例如,“1”)。另一方面,如果片段在深度(或模版)测试中存活,并且片段的原始深度测试函数是排他性的,则在实施方式中,“跟踪”位被清除(到“0”,或通常被设定为第二值)。
以此方式继续基元的处理,并且然后在第一预通道操作结束时,适当地存储深度缓冲区的所得内容,以供后续第二主通道使用。因此,额外的每样本“跟踪”位的状态被携带通过具有深度缓冲区的第二主通道。因此,“跟踪”位可以在第二主通道中的深度测试期间使用,以确保正确的渲染行为。例如,在图15和图16中示出了在第二主通道操作期间使用该“跟踪”位。
图15例示在此示例中根据第二主通道操作的处理操作(图形处理流水线)。处理操作与以上关于图9所描述的相同,只是深度等于测试156被修改为包括另外的消歧处理,该另外的消歧处理适当地检查额外位的状态以确保期望的渲染行为。在图16中例示了在第二主通道期间的消歧处理。
因此,图16示出了在第二主通道操作期间对到图9中的深度等于测试156级的传入片段执行的处理流程。对于到深度等于测试156的传入片段160,因此检查片段160是否具有与在深度缓冲区中记录的对应深度值相同的深度值(步骤161)。如果深度值不匹配(步骤161-否),则可执行另外的深度测试(步骤162),并且取决于深度测试的结果,片段可以在深度测试中存活(使得其被确定为可见-步骤164),或可在此时被剔除(使得其被确定为不可见-步骤166)(注意,在此示例中,当使用深度“等于”测试时,与存储在深度缓冲区中的深度值不匹配的任何基元(步骤161-否)可能已经在此基础上被剔除,使得在此示例中可能不需要进一步深度测试(在步骤162)。
另一方面,如果深度值确实匹配,使得片段160在深度等于测试中存活(步骤161-是),则检查相关联的基元的原始指定深度测试函数(并且因此对于片段)是否是包含性测试(步骤163)。如果原始深度测试函数是包含性的(步骤163-是),则应当渲染片段160,并且因此确定片段160可见(步骤164)。然而,如果原始深度测试函数是排他性的(步骤163-否),则正确的渲染行为是只有该深度值的第一个片段应存活。因此,检查与所讨论的采样位置相关联的深度缓冲器中的“跟踪”位是否已经被设定(步骤165)。
如果尚未设定“跟踪”位(步骤165-是),则这意味着片段160是具有该深度值的第一个片段,并且片段160因此应存活(并且因此片段被确定为可见-步骤164)。此时,设定“跟踪”位(步骤167)。然后,这意味着如果处理了具有相同深度值的另一较晚基元(步骤161-是),并且针对其使用包含性测试(步骤163-是),则“跟踪”位将已在此时(即,由具有相同深度值的先前基元)被设定。因此,当较晚基元被处理时,现在将在该步骤处确定“跟踪”位被设定(步骤165-是),这将使得较晚片段被(正确地)剔除(步骤166)。
因此,如果片段在第二主通道操作期间在深度等于测试中存活,则基于片段的原始深度测试函数来确定行为,然后如下设定“跟踪”位的状态:
(i)如果片段的原始深度测试函数是包含性的并且“跟踪”位被设定,则片段通过,并且被进一步处理以生成期望的渲染输出数据;
(ii)如果片段的原始深度测试函数是包含性的并且“跟踪”位没有被设定,则片段可以(并且在实施方式中是)被剔除(注意,如果原始深度测试函数是包含性的,则该状态不应是可能的,因为“消歧”位应始终处于第一状态);
(iii)如果片段的原始深度测试函数是排他性的并且“跟踪”位被设定,则片段可以(并且在实施方式中是)被剔除;以及
(iv)如果片段的原始深度测试函数是排他性的并且“跟踪”位没有被设定,则片段通过,并且被进一步处理以生成期望的渲染输出数据,并且“跟踪”位在此时被设定。
因此,所有这些的效果是,额外的“跟踪”位本质上跟踪针对原始深度测试函数为排他性的基元的片段,无论该基元的片段是否是导致深度缓冲区更新的片段,并且因此无论该片段是否应当被进一步处理。特别地,由于满足条件(iv),“跟踪”位被设定为(第一状态),这确保了写入相同深度值但原始深度测试函数是排他性的任何较晚到达的片段将(基于正被设定的“跟踪”位)而被正确地剔除。
以此方式,即使在第二主通道中的深度测试被修改为使用深度等于测试,使得在第二主通道期间不使用原始深度测试函数时,深度缓冲区中的额外的“跟踪”位也可用于确保维持正确的渲染行为。通过提供这样的基于深度测试函数的类型来消除写入相同深度值的基元的机制,这意味着这样的基元可以通过预通道操作来安全地处理。
例如,考虑其中三个基元P0、P1、P2全部写入相同深度值的示例,并且其中每一基元可具有包含性或排他性深度比较函数。接下来的表格示出了根据八种可能情况中的每一者的操作。可以看出,在所有情况下都实现了期望的渲染行为(即,最终可见基元是基于应用指定的深度比较函数的正确基元)。
表1-深度测试消歧示例
应注意,上文所描述的消歧机制假定深度测试函数是单调的,即,深度测试函数的极性在基元序列内的基元之间(或基元的前面/后面之间)不改变,例如,使得深度测试函数不会从“大于”(或“大于或等于”)测试改变为“小于”(或“小于或等于”)测试,或反之亦然,并且深度测试函数不改变成“始终”写入到深度缓冲区。在这些情况下,正确的渲染行为变得更加复杂,使得可能无法使用单个“跟踪”位来跟踪正确的行为,并且因此可能需要使用更复杂的跟踪机制。否则,可以使用回退操作来处理这种情况,本示例就是这种情况。
因此,该示例的基元分类处理在图17中示出,并且如图所示,基元分类通常检查与图12中所示的示例相同的条件,只是不检查基元是否具有排他性深度测试函数(图12中的步骤125),而是改为检查基元是否具有单调的深度比较函数(在步骤175处)。在此示例中,因此,当确定深度测试函数在基元序列内改变极性时,可以因此(并且将)相应地触发第三回退操作。注意,对于该示例也不再需要检查是否启用了深度写入,因为深度比较函数必须是单调的限制也消除了该要求。
示例3-模版化
到目前为止的描述主要集中于在第一预通道操作期间基于基元的深度测试片段确定可见性信息,并且接着使用由第一预通道操作确定的深度缓冲区来控制在第二主通道操作期间基元的后续渲染。例如,在上文呈现的第一示例和第二示例中,在第一预通道操作或对应的第二主通道操作中不执行模版化。因此,对于这些示例,在基元分类处理期间,模版化被有效地禁用,并且因此需要模版化的任何基元被视为不兼容基元,如图12所示。因此,在到目前为止描述的示例中,任何需要模版化的基元都会随后通过第三回退操作来处理(针对其执行深度和模版测试/更新两者,如图10所示)。
然而,应当理解,在一些情况下(并且在一些实施方式中是)模版化可以以与上述深度测试类似的方式来处理。例如,某些类型的模版测试可以以与上述深度测试相对应的方式在第一预通道操作期间执行,以便填充模版缓冲区(例如并且特别地,只要前后比较操作是单调的(具有相同的极性))。然后,模版缓冲区可以通过执行合适的模版“等于”测试来控制在第二主通道期间的片段处理。同样,如果两个基元写入相同的模版值,则在正使用排他性模版测试函数的情况下可能需要合适的消歧机制。在实施方式中,模版等于测试消歧机制是在以与上述深度等于测试消歧机制相同的方式执行的,但是现在使用与模版缓冲区相关联的附加每样本“跟踪”位。
图18例示了在其中启用模版化的另一示例中根据第一预通道操作的处理操作(图形处理流水线)。处理操作与以上关于图8和图13所描述的相同,只是在深度测试/更新136之后执行具有消歧的早期模版测试/更新186的附加步骤。因此,存储在模版缓冲区中的每样本“跟踪”位可以以与上面关于图14描述的相同的方式相应地设定/清除,但是是基于模版测试而不是深度测试(在步骤141)。因此,在图19中例示了针对在第二主通道操作期间进行模版化的对应消歧处理,并且该对应消歧处理基本上反映了针对上面关于图16描述的深度测试的消歧处理。
因此,如图19所示,对于到模版测试186的传入片段190,检查片段190是否具有作为模版缓冲区中记录的对应模版值的模版值(步骤191)。如果模版值不匹配(步骤191-否),则可以执行另外的模版测试(如果需要/期望)(步骤192),并且根据模版测试的结果,片段可以在模版测试中存活(使得其被确定为可见-步骤194),或者可以在此时被剔除(使得其被确定为不可见-步骤196)。如果模版值确实匹配,使得片段190在模版等于测试中存活(步骤191-是),则检查针对相关联的基元(并且因此针对片段)的原始指定模版测试函数是否是包含性测试(步骤193)。如果原始模版测试函数是包含性的(步骤193-是),则应当渲染片段190,并且因此确定片段190可见(步骤194)。然而,如果原始模版测试函数是排他性的(步骤193-否),则正确的渲染行为是只有该模版值的第一个片段应存活。此时,检查是否已设定与所讨论的采样位置相关联的模版缓冲区中的“跟踪”位(步骤195)。如果尚未设定“跟踪”位(步骤195-是),这意味着片段190是具有该模版值的第一个片段,并且片段190因此应存活(并且因此片段被确定为可见-步骤194)。此时,设定“跟踪”位(步骤197)。这意味着如果处理了具有相同模版值的另一较晚基元(步骤191-是),并且针对其使用了包含性测试(步骤193-是),则“跟踪”位将在此时被设定,即,由具有相同模版值的先前基元设定。因此,此时将确定“跟踪”位被设定(步骤195-是),这将导致较晚片段被(正确地)剔除(步骤196)。
图20例示了在启用模版化的该另外的示例中根据第二主通道操作的对应处理操作(图形处理流水线)。这与图15中所示的处理流水线相同,只是在具有消歧的早期深度等于测试级156之后包括附加的具有消歧的早期模版等于测试级206。
这样做的效果是,至少一些类型的模版化现在可以通过预通道操作来处理。因此,图21示出了该示例的对应基元分类处理。具体地,如图21所示,基元分类通常与上述相同,只是现在只有某些类型的不兼容模版被视为与预通道操作不兼容(在步骤223)。即,可能存在某些类型的模版仍然与预通道操作不兼容。存在可能意味着模版化仍然与预通道操作不兼容的各种条件,并且这些条件通常可以(例如基于模版测试的性质)预先确定。例如,这可以是正面和背面模版测试函数具有不同极性的情况。在这种情况下,基元因此仍然被视为不兼容,使得它们应当改为使用如上所述的第三回退操作来处理。
示例4-着色器修改覆盖
在上文所描述的示例中,第一预通道操作不执行片段着色器。这意味着任何需要执行片段着色器以便完全确定基元的覆盖和/或深度值的基元必须被视为不兼容,并且这相应地在图12中示出。即,如图12所示,当基元具有着色器修改覆盖(步骤127)或着色器发出深度(步骤128)的性质时,确定基元与预通道操作不兼容。然而,可能期望在第一预通道操作期间执行至少部分片段着色器,以便将预通道暴露于足够信息以能够处理这样的基元,并且在另外的示例中因此这样做。
例如,如上所述,第一预通道操作的目的是确定基元序列的“可见性”信息,然后“可见性”信息可用于在第二主通道操作期间控制片段处理,例如,并且在实施方式中,以在第二主通道操作期间剔除基于片段对于渲染输出不具有可见效果的可见性信息确定的片段。在实施方式中,“可见性”信息是基于对片段进行深度(以及可选地模版)测试生成的。
然而,需要图形处理的应用可以指定需要片段着色以便确定最终片段覆盖和/或深度值的各种不同类型的基元。因此,对于这样的基元,可能期望在第一预通道操作期间执行第一(“预通道”)片段着色器例程以便确定期望的“可见性”信息(否则,基元可能必须被视为与预通道操作不兼容,例如并且改为由第三回退操作来处理,如在到目前为止描述的示例中那样)。其示例在图22中例示,图22示出了根据第四示例的第一预通道操作的配置,其中第一预通道操作也可操作以执行相应(部分)片段着色器。
因此,图22例示根据第四示例的根据第一预通道操作的处理操作(图形处理流水线),其中可见性信息包括深度/模版缓冲区(使得初始处理与图18中所示的示例相同),但其中在执行(早期)深度/模版测试之后,第一预通道操作进一步可操作,以至少针对需要执行片段着色器以确定最终覆盖的基元执行片段着色器227。然后可以相应地执行片段着色器227以确定最终覆盖,然后可以相应地使用最终覆盖来执行晚期深度测试/更新228和晚期模版测试/更新229。晚期深度/模版测试/更新可以以正常方式执行,但是在实施方式中还包括合适的消歧机制,以用于确保在存在写入相同深度/模版值的两个基元的情况下使用排他性深度/模版测试函数的基元的正确渲染行为,例如,如上面关于第二示例和第三示例所描述的。
因此,片段着色器可操作以在第一预通道操作期间执行第一片段着色器例程。例如,这在实施方式中是在第二主通道操作期间执行的完整片段着色器的部分版本。例如,第一片段着色器例程可以执行直到某个“丢弃”指令,其中片段着色器例程被相应地执行得刚好足够远以生成期望的可见性信息,但是不产生最终渲染输出数据(其仍然被推迟到第二主通道操作,在实施方式中,当需要完成渲染以产生最终渲染输出数据时,第二主通道操作然后运行完整片段着色器)。设想了用于确定片段着色器应在第一预通道操作期间执行多远以及是否执行的各种布置,例如取决于可期望在相应处理通道期间获得的期望的着色器状态(包括潜在的着色器副作用)。
因此,如图23所示相应地修改该第四示例中的分类处理,使得着色器修改覆盖的基元不再被视为与预通道操作不兼容。因此,分类处理大体上类似于上文所描述且在图17中示出的分类处理,只是着色器修改覆盖的条件不再需要被检查。
在图23所示的特定示例中,着色器发出深度的条件仍然被认为是不兼容的(因为在该示例中片段着色器不写入深度)。然而,当然也可以允许在预通道操作中执行的着色器写入深度,在这种情况下着色器发出深度的基元也将不再被确定为不兼容的。即,在预通道操作中执行的片段着色器可以被执行直到并且包括丢弃点,以确定着色器是否修改覆盖并且还可以被执行直到并包括确定晚期深度的点。通常,在预通道操作中执行的片段着色器可以因此被执行到任何合适的和期望的点,以便将第一预通道操作暴露到足够的状态以确定完全可见性信息(无论这涉及到什么)。在这方面,设想了可以在第一预通道中执行的片段着色器可以执行多远的各种布置。
示例5-“HSR ID”缓冲区
到目前为止描述的示例都涉及其中在第一预通道操作期间生成的深度缓冲区(以及可选地还有模版缓冲区)被用作在第二主通道操作期间控制片段处理的“可见性”信息的实施方式。然而,设想了各种其他示例,并且在其他布置中,在第一预通道操作期间生成的“可见性”信息然后被用作在第二主通道操作期间控制处理可以采取任何合适且期望的形式。
例如,在用于生成“可见性”信息的另一布置中,不是使用深度(模版)缓冲区自身作为用于在第二主通道操作期间控制基元的进一步处理的“可见性”信息,第一预通道操作以每样本基元识别信息的专用集合的形式生成“可见性”信息,所述信息存储针对渲染输出内的相应采样位置的相应的基元识别符,所述基元识别符指示应针对所关注的采样位置进一步处理哪一基元(所述基元识别符在本文中也将被称作隐藏表面去除识别符(“HSRID”),其中每样本基元识别信息集合对应地被称作“HSR ID缓冲区”)。
HSR ID缓冲区通常可以采取任何合适且期望的形式,但是通常可以匹配深度缓冲区的大小和形式,因为它能够以与深度缓冲区如何存储针对渲染输出内的每个采样位置的相应深度值类似的方式存储针对渲染输出内的每个采样位置的相应HSR ID。因此,HSR ID缓冲区可以(并且在该示例中是)在第一预通道操作期间被填充,以记录针对渲染输出的相应采样位置的期望可见性信息。因此,这样做的结果是,在第一预通道操作结束时的HSR ID缓冲区存储相应的HSR ID集合,该HSR ID集合指示应当针对渲染输出内的采样位置进一步处理哪些基元。
图24示出了根据以这种HSR ID缓冲区的形式生成可见性信息的布置的示例的预通道操作的处理操作的序列。在此示例中,第一预通道操作因此包括流水线化的处理操作序列,其包括:片段着色器端点80,其调度图形处理流水线需要执行的渲染工作以便渲染图块;基元列表读取器(多边形列表读取器81),其读取适当的针对图块的基元列表以识别将针对图块渲染的基元;基元分类单元82;预通道决策单元83;顶点处理(着色)级84,其获得(并且如果需要,着色)用于针对图块的要渲染的基元的相关顶点数据;光栅化器85,其将基元光栅化成对应于渲染输出内的采样位置的相应片段;以及(早期)深度测试/更新级86,其执行片段深度测试且相应地更新深度缓冲区。
到目前为止,处理流水线因此类似于以上关于较早示例描述的处理流水线。然而,在此示例中,在(早期)深度/模版测试/更新86之后,执行另外的HSR ID更新241,其响应于(早期)深度/模版测试/更新86而根据需要更新HSR ID缓冲区。在图24所示的示例中,第一预通道操作可以可选地还执行片段着色器227并执行如上面关于图22所述的晚期深度/模版测试/更新228。在这种情况下,可以有另外的晚期HSR ID更新242,其响应于晚期深度/模版测试/更新228的结果而根据需要更新HSR ID缓冲区。
因此,基于深度/模版测试来执行HSR ID缓冲区的更新。图25示意性地示出了可以如何在第一预通道操作期间填充这种HSR ID缓冲区。具体地,如图25所示,当在早期深度/模版测试/更新86期间确定基元的片段在该片段所涉及的一个采样位置或多个采样位置处可见时,然后此时更新HSR ID缓冲区250以记录针对该片段所涉及的基元的相关联HSR ID。每当确定片段在早期深度/模版测试/更新86中存活时,使得该片段(至少基于到目前为止生成的可见性信息)被确定为在该片段所涉及的相应的一个采样位置或多个采样位置处可见,则第一预通道操作相应地写入HSR ID缓冲区,其中写入的地址由样本位置252确定,并且写入的值对应于包含所讨论的样本的基元的HSR ID 254。以这种方式填充HSR ID缓冲区的工作示例在图26中示出。
在此示例中,示出了至少部分地彼此交叠的三个基元。将理解,在典型情况下,将存在需要渲染的许多基元,但是为了便于例示,使用该简化示例。如下面将进一步描述的,每个基元被分配相应的唯一基元识别符,即相应的HSR ID。在该示例中,最前面的基元首先被绘制,并且因此被分配第一HSR ID(即,其HSR ID=1)。在其后面绘制了更大的基元(具有HSR ID=2)和完全位于其它两个基元后面(使得其在最终渲染输出中不可见)的另一基元(具有HSR ID=3)。还示出了在渲染输出内定义的对应的一组采样位置{A,B…P}。
在此示例中,可看出左上采样位置(位置A)不被三个基元中的任一者覆盖。因此,如图26所示,在采样位置A的相应条目中的HSR ID缓冲区中记录“零”值(“0”)。对于下一采样位置(采样位置B),可以看出它被前两个基元覆盖,然而,从图25可以看出,第一基元(具有HSR ID=1)应当是可见的,因为它被绘制在另一基元的前面。因此,在该示例中,第一基元的片段将在采样位置B处的深度测试中存活,并且因此使得HSR ID缓冲区被相应地更新,使得其HSR ID(“1”)被存储在该采样位置的相应条目中。在此示例中,下一基元(具有HSRID=2)的那个采样位置的对应片段未通过深度测试,并且因此不会导致HSR ID缓冲区再次更新。然后对所有基元和所有采样位置适当地重复这个操作,以便确定最终的HSR ID缓冲区。然后在第二主通道操作期间使用所确定的HSR ID缓冲区,以便控制后续片段处理。
因此,在第一预通道操作期间,将基元序列中的基元处理成它们相应的片段,并且接着处理所得片段以确定与片段相关联的期望可见性信息(例如,并且在实施方式中,通过对照对应的深度(模版)缓冲区对片段进行深度(以及可选的模版)测试,以确定片段的可见性),其中在第一预通道操作期间相应地更新HSR ID缓冲区。即,如上所述,每当基于到目前为止通过处理基元序列中的较早基元而生成的可见性信息来确定针对渲染输出内的相应采样位置的基元的片段可见时,基元识别信息集合中的针对该片段所涉及的一个采样位置或多个采样位置的相应条目应当(并且在该示例中是)被相应地更新以记录所讨论基元(即,导致更新的基元)的基元识别符。然后对基元序列中的其它基元重复此操作。因此,应理解,如果随后确定较晚基元的片段在给定采样位置处可见,则针对该采样位置的条目可以(并且将)随后被重写。因此,这样做的效果是,在第一预通道操作结束时,HSR ID缓冲区对应地反映针对基元序列的完整可见性信息,其中所存储的HSR ID在每采样位置的基础上指示应针对哪些采样位置进一步处理哪些基元。
然后,可以将每采样位置基元识别符用作第二主通道操作期间的后续片段可见性测试操作的一部分,以识别应当针对给定采样位置进一步处理哪些基元,并且因此允许针对第二主通道相应地剔除其他基元的片段。图27示出了该示例中的对应主通道操作的处理操作序列,该处理操作序列在图24所示的预通道操作之后执行。
如图27所示,该示例中的第二主通道操作包括流水线化的处理操作序列,该流水线化处理操作序列与第一预通道操作共同地包括:片段着色器端点80,其调度图形处理流水线需要执行的渲染工作以便渲染图块;基元列表读取器(多边形列表读取器81),其读取适当的针对图块的基元列表以识别将针对图块渲染的基元;基元分类单元82;预通道决策单元83;顶点处理(着色)级84,其获得(并且如果需要,着色)用于要针对图块渲染的基元的相关顶点数据;以及光栅化器85,其将基元光栅化成对应于渲染输出内的采样位置的相应片段。
在该示例中,第二主通道操作不执行片段的深度测试(尽管如果需要,可以执行进一步的深度测试),而是改为执行HSR ID测试276,HSR ID测试276测试正在测试的片段的HSR ID是否与存储在HSR ID缓冲区250中的针对片段所涉及的一个采样位置或多个采样位置的HSR ID值相匹配。因此,如果片段具有与存储在HSR ID缓冲区250中的HSR ID值相同的HSR ID值,则片段在HSR ID测试276中存活,并且因此通过执行片段着色器87、然后执行混合90等的进一步处理来生成最终渲染输出数据。另一方面,如果片段的HSR ID与存储在HSRID缓冲区250中的值不匹配,使得片段未通过HSR ID测试276,则可以在第二主通道期间将片段在此时剔除,避免片段着色87等。以此方式,可以基于在第一预通道操作期间生成的深度缓冲区来控制第二主通道操作期间的片段处理,使得仅针对实际可见的片段产生经渲染输出数据。
图28示意性地示出了在第二主通道操作期间如何针对HSR ID缓冲区执行这种可见性测试。此处,从HSR ID缓冲区250读取的位置的地址由样本位置252确定。然后将存储在缓冲区284中的读取HSR ID值与正被测试的样本从其光栅化的基元的HSR ID 286进行比较。如果值相等(步骤287-是),则确定片段可见,并且因此该片段通过以供进一步处理。另一方面,如果值不相等(不匹配)(步骤287-否),则相应地确定样本不可见。即,对于在第一预通道操作期间被处理并且因此可能已经与特定采样位置相关地更新了HSR ID缓冲区(但没有这样做)的基元,这意味着基元在该采样位置处必须不可见,并且在此基础上与该采样位置有关的基元的片段可以相应地被剔除(步骤289)。
因此,在该示例中,HSR ID测试276使用“等于”的测试函数。例如,对于在第一预通道操作期间被处理并且可能因此已经更新HSR ID缓冲区250的任何基元,如果针对这样的基元的片段在最终渲染输出中可见,则针对该基元的相关联HSR ID应当(并且是)被存储在HSR ID缓冲区中的针对该片段所涉及的一个采样位置或多个采样位置的相应条目中。因此,HSR ID测试276允许图形处理器在可能的情况下剔除对于最终渲染输出不可见的基元的任何片段,从而提供样本完美的隐藏表面去除。因此,存储在HSR ID缓冲区250中的HSRID值可在第二主通道操作中的后续可见性测试期间使用,以确定针对渲染输出内的哪些采样位置应进一步处理哪些基元。
为了促进以这种方式生成和使用HSR ID缓冲区,每个基元因此被分配有在其基元序列内(即,在图块内)唯一地识别基元的相应HSR ID。这可以在图29所示的基元分类期间完成。
因此,图29示出根据此第五示例的示例基元分类处理,其中在第一预通道操作期间生成的可见性信息包括专用HSR ID缓冲区。在该示例中,可以在运行时执行基元分类。如图29所示,对于到基元分类的传入基元290,首先检查该基元是否是简单地指示图块的开始(步骤291)(在这种情况下,HSR ID被设定为“0”(步骤291-是))。对于所有后续基元(步骤291-否),所存储的HSR ID递增一,并且接着相应地被指派到基元(步骤294)。因此,正被处理的基元序列中的每个基元与唯一基元识别符相关联,其中基元识别符在基元序列内单调递增。具体地,在该示例中,可以在从“1”开始的基元序列内对基元进行索引(使得序列中的第一个基元可以被识别为基元“1”,第二个基元被识别为基元“2”等)。值“0”因此被用于指示为空或“清除”值,以指示在所讨论的采样位置处不存在基元覆盖。
然后,该示例中的基元分类继续,如图29所示。具体地,在该示例中,透明的任何基元(步骤295)具有副作用(步骤296),或者不写入到所有渲染目标的任何基元(步骤297)被视为不兼容基元。在该示例中,要检查另外的条件,即HSR ID是否大于最大可能HSR ID值。例如,如果存在太多的要处理的基元,则系统可以有效地耗尽可以被分配的HSR ID。在那种情况下,在该示例中,超过最大可能HSR ID值的任何基元被简单地视为与预通道操作不兼容(步骤298),并且因此改为被如上所述的第三回退操作处理。否则,如果这些条件都不满足,则基元被确定为与预通道操作兼容并且被相应地处理。
如上文所描述,接着使用基元分类结果来驱动图形处理器的状态机,使得预通道决策单元使图形处理器最初通过第一预通道操作来处理基元,并且只要基元与第一预通道操作处理兼容,就以此方式继续到图块的末尾,但在遇到不兼容基元的事件中,则导致转变到第三回退操作(例如,如上文所描述且在图7中示出)。
图30示意性地示出了根据该使用HSR ID缓冲区的示例进行操作的图形处理器的状态机312,从而示出了对于要处理的传入基元310,如何根据该示例中的图形处理器的不同可能状态来不同地处理基元310。因此,当图形处理器被配置成处于预通道状态314时,图24中所示的流水线级处于活动状态,并且基元被相应地处理。同样地,当图形处理器被配置为处于主通道状态316时,基元由图27中所示的流水线级相应地处理。在该示例中,回退状态318中的图形处理器可以如上面的图10所示进行配置,以便正常执行深度测试,但是一旦回退模式被触发,就不尝试更新HSR ID缓冲区(尽管在一些情况下,HSR ID更新241也可以在回退模式期间保持开启)。
与较早示例相比,此方法的益处在于,不需要对具有相同深度(或模版)值的基元进行消歧,因为这可全部在确定HSR ID缓冲区250时在第一预通道操作期间执行。这种方法也可以自然地处理模版,例如,因为模版测试可以在第一预通道操作期间正常执行,并且针对在深度/模版测试中存活的片段以HSR ID的形式记录所得可见性信息。因此,从图29可以看出,与一些较早示例相比,在该示例中触发回退模式的条件更少。
示例6-HSR ID缓冲区,仅ZS基元
在图29所示的示例分类中,不写入到所有渲染目标的基元仍然被视为与预通道操作不兼容(步骤297)。然而,在一些示例中,不写入到所有渲染目标的基元可以是兼容的,只要它们不写入到最终渲染输出数据(例如只要它们仅写入深度/模版值即可)。例如,这在图31和图32中示出。
图31示出了该示例的对应分类处理。图31中所示的基元分类处理大体上类似于图29中所示的处理,只是对于不写入到所有渲染目标的基元(步骤297-否)是接着检查该基元是否仅写入深度/模版值(步骤299)。如果基元仅写入深度/模版值(步骤299-是),则只要HSR ID不超过最大可能HSR ID值(步骤298-否),就确定基元是兼容的。
图32示出了该示例中的对应的预通道决策逻辑。同样,这通常与图30所示的状态机312相同,只是在第一预通道操作期间也检查基元是否仅写入深度/模版值。如果基元仅写入深度/模版值(步骤311-是),则执行深度/模版测试/更新,但是不需要更新HSR ID缓冲区(步骤313)。否则,如上所述执行第一预通道操作(步骤314)。还在第二主通道操作期间检查此条件,以便剔除仅写入深度/模版值的基元(步骤315)。因此,此时剔除仅写入深度/模版值(步骤315-是)且因此不需要由第二主通道处理以产生最终经渲染输出数据的任何基元(步骤317)。
示例7-HSR ID缓冲区、透明基元
在以上示例中,“透明”基元被确定为与预通道操作不兼容。这是因为透明基元通常不写入深度值,因此不能更新深度缓冲区或因此不能更新HSR ID缓冲区。这意味着,如果如上所述执行HSR ID等于测试将总是剔除不能更新HSR ID缓冲区的任何这样的透明基元(因为针对透明基元的HSR ID永远不能与HSR ID缓冲区中存储的值匹配),即使基于原始深度测试的正确行是要渲染透明基元。
例如,如上所述,至少对于在第一预通道操作期间能够更新HSR ID缓冲区的基元,在第二主通道操作期间针对HSR ID缓冲区的可见性测试应该(并且确实)包括“等于”测试。这是因为如果基元已经在第一预通道操作中被处理,使得原则上它可能已经与特定采样位置有关地更新了HSR ID缓冲区,但是它没有这样做,这一定意味着该基元在该采样位置实际上是不可见的。换言之,只有在第一预通道操作期间被确定为在特定采样位置可见的基元才会被记录在HSR ID缓冲器中,并且因此仅有其HSR ID与存储在HSR ID缓冲区中的针对片段所涉及的一个采样位置或多个采样位置的值相匹配的片段才应该在HSR可见性测试中存活。然而,这对于不能更新HSR ID缓冲区的透明基元不起作用。
因此,在上述示例中,任何透明基元被简单地视为与预通道操作不兼容。另一选项将是始终使透明基元通过并且允许它们被片段着色器适当地处理(或者甚至在HSR ID测试后进行额外的深度测试,如果期望的话)。然而,在实施方式中,还针对HSR ID缓冲区测试透明基元,以尝试在可能的情况下剔除它们。为此,在第二主通道操作期间执行的HSR ID测试276针对这样的透明基元被相应地修改,使得使用“大于”测试函数。即,HSR ID测试276可以使用“等于”测试或“大于”测试,这取决于基元的类型(特别是基元是否已经潜在地在第一预通道操作中更新了HSR ID缓冲区)。在此情况下,可能不需要首先在第一预通道操作中处理透明基元。
以下示例例示可如何通过“通过(pass)”操作处理“透明”基元。图33示出此示例的对应分类处理,并且图34示出此示例中的对应预通道决策逻辑。
如图33所示,该示例中的基元分类通常如上面关于图31所描述的那样进行,只是在这种情况下,如果确定基元是透明的(步骤295-是),并非这本身导致基元被分类为不兼容,而是检查深度写入是否被禁用并且基元不需要模版化(步骤2792)。如果不是这种情况,因为启用了深度写入或需要模版化(步骤2792-否),则确定基元不兼容。否则,只要HSR ID值不大于最大可用HSR ID值(步骤298-否),则基元兼容。在此情况下,将基元标志为透明的,并且将“seen_transparent”标志设定为“真”以指示已经看见透明基元(步骤2793)(注意,该标志最初在图块的开始处设定为假(在步骤292))。
在基元不透明(步骤295-否)并且基元不写入到所有渲染目标(步骤297-否)的情况下,还使用“seen_transparent”标志。在这种情况下,如果基元仅写入深度/模版值并且到目前为止还没有看见透明基元(即,“seen_transparent”标志被设定为假)(步骤2791-是),则基元仍然可以是兼容的(假设不存在使其不兼容的其他条件)。如果基元不是仅写入深度/模版值或者“seen_transparent”标志被设定为真(步骤2791-否),则继续分类以确定深度写入是否被禁用并且基元不需要模版化(步骤2792),并且测试从该步骤如上所述进行。
图34示出了该示例中的对应预通道决策逻辑。这基本上对应于图32所示的状态机,只是并入了另外的决策逻辑以处理被标记为透明的基元(在上图33中的步骤2793)。在该示例中,再次如图10所示配置处于回退状态318的图形处理器。
因此,如图31所示,当图形处理器被配置成预通道状态时,使得图24中所示的流水线级处于活动状态,对于不是仅写入深度/模版值的基元(步骤311-否),还检查(在步骤3140)基元是否被标记为透明。对于未被标记为透明的基元(步骤3140-否),以与上述相同的方式执行第一预通道操作,其中处理流水线如图24所示配置。
对于透明基元,当图形处理器处于预通道状态时,如果基元是透明的(步骤3140-是),则基元通常可以被剔除,除非启用遮挡查询,这意味着在第一预通道操作期间应当处理所有基元。因此,如果未启用遮挡查询(步骤3141-否),则此时剔除透明基元(步骤3142)。否则,如果启用遮挡查询(步骤3141-是),则应当执行包括遮挡查询的深度/模版测试(步骤3143)。
对应地,当图形处理器处于主通道状态时,如果基元是透明的(步骤3160-是),则应当使基元通过图形处理流水线以用于进一步处理,但是在这种情况下,应当将HSR ID测试修改为包括“大于”测试(步骤3162)。因此,如果透明基元的HSR ID大于存储在HSR ID缓冲区250中的对应值,则透明基元在HSR ID测试中存活,并且被相应地进一步处理。另一方面,如果HSR ID不大于存储在HSR ID缓冲区250中的对应值,则大于测试失败,并且可以在此基础上剔除透明基元(因为透明基元不写入深度(或模版)值(否则,透明基元将被确定为与预通道操作不兼容,如图31所示),因此正确的行为是使较晚的不透明基元存活)。(在这种情况下,在实施方式中,在主通道中执行另外的深度/模板测试,以在可能的情况下剔除在“大于”测试中存活的透明基元。然而,应当禁用遮挡查询)。然后可以针对任何存活片段运行片段着色器。
因此,在该示例中,不写入深度或模版值并且不执行任何模版化操作的透明基元不再必须被视为与预通道操作不兼容,而是在实施方式中改为仅在第二主通道操作期间进行处理,如图34所示。
示例8-HSR ID缓冲区,写入到少于所有渲染目标的基元
在上文的示例中,未写入到所有渲染目标的基元被确定为与预通道操作不兼容。例如,除了深度、模版等之外,基元可以写入到多个不同的渲染颜色目标。在这种情况下,在到目前为止呈现的示例中,基元被简单地视为不兼容基元,并且由第三回退操作处理。然而,在另外的示例中,至少在一些情况下,可以进一步修改基元分类以便处理这样的基元。因此,以下示例例示了预通道操作如何处理写入少于所有渲染目标的基元。
图35示出使用HSR ID缓冲区根据另一示例的对应分类处理,其中执行分类以允许预通道操作处理不写入到所有渲染目标的一些基元(而在以上图29中,不写入到所有渲染目标的任何基元被自动视为不兼容)。在该示例中,再次假设在深度/模版测试级期间执行任何遮挡查询。
如图35所示,基元分类通常与以上关于图33描述的基元分类相同,只是改为考虑(在步骤297)是否写入到所有渲染目标,基元分类仅要求写入到先前已经被写入的所有渲染目标(步骤2790)。因此,维持被写入渲染目标的渲染目标的集合,并且如果基元写入到被写入渲染目标的渲染目标的集合中的所有渲染目标(步骤2790-是),则将由基元写入的任何(另外的)渲染目标添加到被写入渲染目标的集合(步骤2974),并且然后确定基元是兼容的(只要其HSR ID不超过最大可能HSR ID(步骤298))。因此,此示例可支持仅写入渲染目标的子集的基元。在该示例中,先前被写入渲染目标的集合因此在图块的开始处被清零(在步骤292处)并且然后随着基元被处理而递增。将理解,在此示例中,因此必须在运行时执行所述基元。
图36示出了该示例中的对应预通道决策逻辑。如图36所示,该示例中的对应预通道决策逻辑与图34中所示的相同。
示例9-HSR ID缓冲区、分层HSR ID测试
在上述示例中,HSR ID缓冲区存储针对渲染输出内的每个采样位置的相应HSRID。然而,在一些实施方式中,HSR ID缓冲区还能够存储针对多个采样位置的组的HSR ID(并且包含针对存储多个采样位置的组的HSR ID的相应条目)(其中采样位置的组对应于渲染输出的相应“补丁”(区域),并且因此对应地对应于采样位置的“补丁”)。
具体地,HSR ID缓冲区可以(并且确实)针对渲染输出的相应补丁存储相应的“最小”HSR ID和对应的“最大”HSR ID,所述相应的“最小”HSR ID指示随后可能需要针对补丁所涵盖(覆盖)的采样位置进一步处理的基元序列中的第一基元,所述对应的“最大”HSR ID指示通过第一预通道操作处理的基元中的最终基元可能需要在第二主通道操作期间再次被处理。
如下面将进一步解释的,通过以这种“分层”方式布置HSR ID缓冲区,使得相应的HSR ID既存储在渲染输出内的各个采样位置的级别上又存储在更高级别的采样位置的组(“补丁”)中,这然后可以允许在渲染输出的一个或更多个不同细分级别上执行后续的可见性测试,例如,并且特别是通过允许在补丁级别测试片段的组,并且一次性剔除(在可能的情况下),例如从而避免可能在补丁级别已经确定各个片段对于其各自的采样位置不具有可见效果时还必须测试该片段。因此,这可以促进加速可见性测试,并且因此使整个图形处理操作更有效。
例如,在一些示例中,光栅化器85可以使用“分层”光栅化布置,其中针对渲染输出面积逐渐更小的补丁(区域)迭代地测试基元(并且因此对应地是片段的补丁(和采样位置的补丁))。因此,在实施方式中,首先针对渲染输出的更大补丁(例如,图块,在基于图块的渲染系统中)测试要光栅化的基元,以确定基元是否(至少部分地)覆盖由更大补丁所涵盖的渲染输出的任何更小补丁。如果基元确实(至少部分地)覆盖了由更大补丁所涵盖的渲染输出的任何更小补丁,则更大补丁然后被细分成那些更小补丁,并且然后针对被发现至少部分地被基元覆盖的渲染输出中的每个更小补丁重复该处理,直到达到最小补丁大小。
HSR ID缓冲区可以相应地也以这样的“分层”方式布置,以允许由光栅化器85输出的基元补丁对照HSR ID缓冲区的相应的每补丁条目(相应补丁的“最小值”和“最大值”)进行测试。
图37示意性地示出了这样的HSR ID缓冲区的“分层”布置,其中针对渲染输出的更大面积“补丁”存储相应的最小基元识别符和最大基元识别符。具体地,图34示出了其中渲染输出被细分成更大补丁340的布置,在该示例中,更大补丁340对应于4×4片段的补丁,并且更大补丁340又被细分为2×2补丁段的更小补丁342。尽管在该示例中仅示出了单个更大补丁340,但是应当理解,整个渲染输出将以这种方式类似地细分为相应(非交叠)补丁。还应当理解,可以根据需要选择补丁大小,并且图34仅是一个示例。
在图37所示的示例中,存在单个可见基元,其具有部分地覆盖更大补丁340的HSRID值5。因此,可以假设具有HSR ID值1至4的较早基元被可见基元完全遮挡。
图38例示了可以如何在第一预通道操作中在早期HSR ID更新241期间生成分层HSR ID缓冲区,其在该示例中是以分层方式执行的,首先测试渲染输出的更大补丁,并且然后根据需要将渲染输出的逐渐更小的补丁向下测试至个体片段的级别,以便确定HSR ID缓冲区。
如图38所示,对于从光栅化器传入的基元补丁(步骤350),首先确定补丁中的基元覆盖(步骤351)。还确定基元补丁是否被确定性地遮挡(步骤352)。如果基元在补丁中没有覆盖,或者被确定性地遮挡(步骤353-是),则丢弃基元补丁(步骤354),而不进行进一步测试。这然后意味着,可以省略针对由补丁所涵盖的各个采样位置的基元的任何进一步测试,因为已经在补丁级别确定基元对于那些采样位置中的任何采样位置都不可见。
另一方面,如果基元至少部分地覆盖了补丁并且没有被确定性地遮挡(步骤353-否),则继续测试补丁。因此,检查基元是否被配置为写入到HSR ID缓冲区(步骤354)。这可以根据基元分类来确定,例如如上所述。如果基元被配置为使得通过片段不更新HSR ID缓冲区(步骤355-否),则不应更新HSR ID缓冲区,并且假设存在要测试的另外的补丁,则应改为使补丁通过以进行进一步的细分(步骤359),并且完成对该补丁的测试(步骤3590)。
对于被配置为使得基元的通过片段应当写入到HSR ID缓冲区的基元(步骤355-是),应当继续测试以确定是否应当针对所讨论的补丁更新HSR ID缓冲区。因此,然后确定基元是否完全覆盖正被测试的补丁并且在该补丁处可见。如果补丁被完全覆盖并且在补丁处可见(步骤356-是),则相应地更新针对补丁位置的最小HSR ID,以记录与正被测试的基元相关联的HSR ID(步骤357)。基于基元潜在地可见,在任一情况下(步骤356-是或否)也更新补丁位置的最大HSR ID,因为此时已经确定基元必须部分地覆盖补丁(步骤353-是),并且已知任何存活片段应当写入到HSR ID缓冲区(步骤355-是)。因此,不能排除基元在补丁内可能是可见的,并且因此基元应当被进一步处理(因此最大HSR ID应相应地递增)。
然后,在第二主通道操作中的HSR ID测试276期间使用所确定的包括每补丁的最小值和最大值的分层HSR ID缓冲区,以尝试在可能的情况下在补丁级别剔除基元,从而避免必须总是测试各个采样位置。例如,针对分层HSR ID缓冲区的测试在图36中示出。
如图39所示,对于要针对渲染输出的相应补丁测试的传入基元补丁(步骤360),首先基于该基元补丁已经通过了与父补丁有关的测试来检查是否已经已知该基元补丁通过(步骤361)。因此,如果已知该基元补丁被设定为通过(步骤361-是),则确定补丁在分层HSRID测试中存活,而无需进一步的明确测试(步骤368),并且完成补丁的测试(步骤369)。测试然后可以根据需要进行到下一个更小的补丁。
假设已知基元补丁尚未被设定为通过(步骤361-否),则测试按如下方式进行。首先,确定应使用何种类型的HSR ID测试函数(步骤362)。对于使用“等于”测试函数的基元,然后将与基元相关联的基元HSR ID与所存储的补丁的最小HSR ID和最大HSR ID进行比较(步骤363)。如果与正被测试的基元补丁相关联的HSR ID小于补丁的最小HSR ID或大于补丁的最大HSR ID(步骤364-是),这意味着基元补丁可以被剔除(步骤365),并且不需要对基元进行进一步细分或测试。
如果与基元补丁相关联的HSR ID位于所存储的补丁的最小HSR ID与最大HSR ID之间,则基元补丁通常应当在该级别的分层HSR ID测试中存活。然而,存在所存储的补丁的最小HSR ID和最大HSR ID相同的特殊情况。在这种情况下,如果与基元补丁相关联的HSRID等于补丁的最小HSR ID和最大HSR ID(步骤366-是),则已知基元必须通过针对当前补丁所涵盖的任何采样位置的所有进一步的可见性测试,因为其它是唯一能够存活的基元。在这种情况下,基元因此可以被设定为已知通过(步骤367)。基元补丁因此存活(步骤368),并且完成该补丁的测试(步骤369)。在这种情况下,因为基元被设定为已知通过,所以任何更小的基元补丁也自动通过测试(步骤361-是)。
否则,如果所存储的补丁的最小HSR ID和最大HSR ID不相同,使得与基元补丁相关联的HSR ID不能等于它们两者(步骤366-否),则确定基元在该级别的分层HSR ID测试中存活(步骤368),并且在该级别的测试完成(步骤369),但是假设尚未达到最小补丁大小,则仍然可能需要针对渲染输出的更小补丁来进一步测试基元补丁。
以上涉及对使用“等于”测试的基元的测试(例如,原则上可以在预通道操作期间更新HSR ID缓冲区的不透明基元)。如先前所提及,可存在使用不同的“大于”测试的其它基元。对于不写入深度或模版值且在一些示例中仅在第二主通道操作期间处理的透明基元来说,尤其如此。
对于使用“大于”测试的此类基元,再次将与基元补丁相关联的HSR ID与所存储的所讨论的补丁的最小HSR ID和最大HSR ID进行比较(步骤3690)。然而,在这种情况下,如果与基元相关联的HSR ID低于所存储的补丁的最小HSR ID(步骤3691-是),则只能丢弃补丁(步骤365)。即,由于测试包括“大于”测试,因此不能基于最大HSR ID来剔除基元。相反,如果与基元补丁相关联的HSR ID大于最大HSR ID(步骤3692-是),这意味着基元针对补丁所涵盖的所有采样位置必须始终通过“大于”测试。因此,在这种情况下,可以将基元设定为已知通过(步骤367),使得使得基元通过当前级别处的分层测试(步骤368),并且总是被设定为针对由当前补丁所涵盖的所有采样位置自动地通过测试。
否则,如果与基元补丁相关联的HSR ID位于所存储的补丁的最小HSR ID与最大HSR ID值之间(步骤3692-否),则基元在针对当前补丁的测试中存活(步骤368),但是基元应当被进一步细分并且针对渲染输出的更小补丁进行进一步测试(假设尚未达到最小补丁大小)。例如,与基元补丁相关联的HSR ID可能小于针对渲染输出的更小补丁存储的最小值,或者大于最大值,在这种情况下,更小的基元补丁可以在该级别被剔除/通过。
因此,这样做的效果是,针对补丁所存储的最小HSR ID指示可能需要针对所讨论的补丁进一步处理的第一基元。因此,参考图37所示的示例,对于更大的补丁340,所示的基元没有完全覆盖更大的补丁340(步骤356-否)。因此,不能为更大的补丁340更新最小HSRID。因此,HSR ID缓冲区存储关于更大的补丁340的最小HSR ID值0和最大HSR ID值5。这意味着在第二主通道操作中的HSR ID测试276期间,具有HSR ID 1到5的基元中的每一者将在针对更大4×4补丁340的分层HSR ID测试中存活。
然后,分层HSR ID测试将相应地继续针对更小的2×2补丁342的集合测试每个基元。在这种情况下,如图37所示,左上2×2补丁被完全覆盖,因此针对该补丁342存储的最小HSR ID将在第一预通道操作期间被相应地更新,使得针对该补丁所存储的最小HSR ID是5。因此,当针对左上2×2补丁342进行测试时,具有相关联的HSR ID为5的基元补丁将被检测为已知通过,因为其HSR ID与针对该补丁所存储的最小HSR ID值和最大HSR ID值匹配。在这种情况下,可以避免左上四个片段的单独测试,因为那些片段全部是基于分层测试而已知通过的。否则,在该示例中,不可能剔除/通过任何其他补丁,并且因此剩余片段必须被单独测试。
在上述示例中,分层HSR ID缓冲区因此在第一预通道操作期间被“动态”确定为作为HSR ID更新241的一部分。因此,如上所述,每当发现完全覆盖该补丁的基元可见时,通常会更新针对补丁所存储的最小HSR ID,如上文关于图38所述。
在另外的示例中,可以在第一预通道操作结束时执行最终确定(“烘焙”)处理,该最终确定处理在所确定的分层HSR ID缓冲区上迭代以尝试完善所存储的针对不同补丁的最小HSR值和最大HSR值。例如,可能存在这样的情况:不存在完全覆盖补丁的单个基元,但是补丁被基元的组完全覆盖。在这种情况下,可以识别应当针对补丁进一步处理的基元的(更窄)范围,并且因此可以相应地更新针对补丁存储的最小HSR ID值和最大HSR ID值。例如,这在图40中示出。
在图40所示的示例中,现在有两个可见基元,其分别具有HSR ID值5和6。如图40所示,两个基元都没有完全覆盖更大的4×4补丁。同样,两个基元都没有完全覆盖任何更小的2×2补丁。因此,根据上图35中所示的方案,在第一预通道操作期间不更新针对任何补丁存储的最小HSR ID。然而,从图40可以看出,左上2×2补丁实际上完全被两个基元的组合覆盖。因此,通过适当地迭代最初确定的HSR ID缓冲区,可以相应地更新该补丁的最小HSR ID(使得现在最小HSR ID值是5)。因此,这允许针对该补丁提出至少具有HSR ID值1至4的基元,而不必针对由该补丁所覆盖的各个采样位置测试那些基元。
图41中示出了该示例中的最终确定(“烘焙”)处理。如图41所示,一旦针对图块的预通道操作已经完成,使得针对要通过预通道处理的图块的所有基元已经通过图24所示的图形处理流水线,从而确定初始HSR ID缓冲区,则通过开始遍历初始确定的HSR ID缓冲区来发起最终确定(“烘焙”)处理(步骤380)。
在该示例中,遍历以最小补丁大小开始,并且选择图块中的第一补丁位置(步骤381)。然后,遍历在由所选择的补丁所涵盖的采样位置上迭代,以找到存储在HSR ID缓冲区中的针对由所选择的补丁所涵盖的采样位置的实际的最小HSR ID值和最大HSR ID值(步骤382)。对于覆盖当前选择的补丁位置的所有更大补丁,然后相应地更新最小HSR ID值和最大HSR ID值(如果有可能这样做)(步骤383)。假设当前补丁位置不是当前补丁中的最后位置(步骤384-否),则选择下一个补丁位置(步骤385),并且针对该补丁位置重复该处理。一旦以这种方式处理了所有补丁位置(步骤384-是),则完成分层HSR ID缓冲区完善(步骤386)。
在图41所示的示例中,最终确定(“烘焙”)处理因此在渲染输出中的所有采样位置上迭代。因此,这可能花费大量时间。然而,在这方面,应当理解,如果已经可以从初始确定的HSR ID缓冲区中确定不可能进一步完善,则可以省略该迭代中的至少一些迭代。其示例在图42中示出。在该示例中,可以看出,三个2×2补丁被具有HSR ID值6的同一基元完全覆盖。如上所述,根据图38所示的HSR ID缓冲区的“动态”填充,HSR ID缓冲区因此将存储相同值(即,“6”)作为针对这些补丁中的每一者的相应的最小HSR ID和最大HSR ID,这指示针对2×2补丁所涵盖的所有采样位置,具有HSR ID 6的基元是已知通过的。在这种情况下,清楚的是,不可能进一步完善针对那些补丁的最小值或最大值。
因此,图43示出了根据另一示例的改进的最终确定(“烘焙”)处理,其中可以在可能已经确定不可能完善的情况下加速遍历。同样,这在一旦针对图块的预通道操作已经完成就开始(步骤400),使得将通过预通道处理的图块的所有基元已经通过图24所示的图形处理流水线,从而确定初始HSR ID缓冲区。在该示例中,读取当前补丁的最小HSR ID和最大HSR ID(步骤402),并且确定它们是否相同(即,所存储的最小HSR ID是否与所存储的最大HSR ID相匹配)。如果当前补丁的最小HSR ID和最大HSR ID相同(步骤403-是),则将补丁HSR ID添加到可见基元的列表中(步骤404)。此时,利用当前补丁的最小值和最大值更新(根据需要)所有较高级别补丁的最小值和最大值(步骤405)。如果当前补丁是当前测试级别的最后补丁(步骤406-是),则遍历完成(步骤407)。否则,如果当前补丁不是给定父补丁的最后一个子补丁,使得还有另外的“兄弟”补丁要被测试(步骤408-否),则选择下一个兄弟补丁(步骤409),然后相应地读取其最小HSR ID值和最大HSR ID值(步骤402)等。如果当前补丁是其父补丁的最后一个子补丁,则选择父补丁作为新的当前补丁(步骤410),如图43所示。
如果确定当前补丁的最小HSR ID和最大HSR ID不相同(步骤403-否),则确定当前补丁是否是最小补丁大小,并且如果不是(步骤411-否),则清除当前补丁的最小HSR ID和最大HSR ID,并且将当前补丁的第一子补丁选择作为用于测试的新当前补丁(步骤412)。因此,该处理从顶部向下遍历分层HSR ID缓冲区以找到最小补丁大小,除非在更高级别上确定不可能进一步完善。一旦达到最小补丁大小(步骤411-是),则以与上面关于图41所描述的类似的方式迭代该补丁所涵盖的采样位置(步骤413),并且然后相应地更新所有更高级别补丁的最小值和最大值(步骤405)。然后检查是否还有其他补丁要处理(步骤406等),直到遍历完成(步骤407)。
因此,遍历开始于首先选择根(即最大)分层HSR补丁作为当前补丁(步骤401)。如果根(最大)补丁的最小HSR ID和最大HSR ID相同(步骤403-是),则在该点完成遍历。否则,遍历通过检查逐渐变小的补丁的最小HSR ID和最大HSR ID是否相同来继续,以检查是否可能进一步完善。以这种方式,只有当存在可以进行一些可能的完善时,才执行在各个采样位置上的迭代(步骤413)。因此,这可以加速HSR ID缓冲区的最终确定。
在上文的示例中,在第一预通道操作期间,在确定基元覆盖渲染输出内的一个或更多个采样位置的事件中,针对基元可见的采样位置,将基元的HSR ID写入到HSR ID缓冲区。特别是如果发现更大的补丁覆盖许多采样位置,则这可以代表显著的写带宽。为了清除HSR ID缓冲区,在寄存器中提供多个“清除”位,这些位在被设定时能够指示由清除位表示的N个采样位置全部为零。在另一示例中,例如,这些清除位被重新用于简化HSR ID缓冲区的更新,如将关于图44解释的。
因此,图44示出存在两个基元的示例,其分别具有HSR ID值6和7。在该示例中,底部两个2×2补丁都被具有HSR ID值6的基元完全覆盖。左上2×2补丁被具有HSR ID值6的基元部分地覆盖。右上2×2补丁被具有HSR ID值6的基元完全覆盖,但是被具有HSR ID值7的较晚基元部分地覆盖。因此,上述最终确定处理的结果是,所存储的针对每个2×2补丁的最小HSR ID和最大HSR ID被设定,如图44所示。因此,所有右上和底部的两个2×2补丁的最小HSR ID被设定为6。
在该示例中,不是将值6写入到由这些补丁所涵盖的每个采样位置,而是使用“清除”值,即0,如下文将进一步解释的。然后这避免了多次明确地写入相同的值(在可能避免这样做时)。图45例示在第一预通道操作期间写入到HSR ID缓冲区的操作,并且图46例示在第二主通道操作期间如何使用“清除”值以确保正确渲染行为。
如图45所示,对于能够更新HSR ID缓冲区的传入基元补丁(步骤420),首先确定该基元补丁是否是从写入对应补丁的最小HSR ID值的基元得出的(步骤421)。如果是,则为HSR ID缓冲区中的补丁区域设定对应的“清除”位(步骤422)以指示(此时)可清除由补丁覆盖的所有采样位置。因此可以丢弃基元补丁(步骤427),并且因此完成针对基元补丁所覆盖的采样位置的基元补丁的HSR ID缓冲区的更新(步骤428)。因此,可以相应地处理下一个基元。
如果基元补丁不对应于写入对应补丁的最小HSR ID值的基元(步骤421-否),则操作继续执行必需的每采样位置深度(和模版)测试以及任何片段着色器执行等(步骤423),以确定补丁所涵盖的采样位置的最终可见性。如果尚未针对HSR缓冲区中的图块区域设定“清除”标志(步骤424-否),则针对任何覆盖的采样位置将基元的HSR ID写入到HSR ID缓冲区(步骤425),如上所述。另一方面,如果已经设定了“清除”标志(步骤424-是),则仍然针对任何覆盖的样本将基元的HSR ID写入到HSR ID缓冲区,并且将“清除”值写入没有覆盖的任何补丁样本。在任一种情况下,此时,可以丢弃基元补丁(步骤427),因为完成对该基元补丁的HSR ID的更新(步骤428)。
这样做的效果是,对于由与所存储的所讨论的补丁的最小HSR ID相关联的基元所覆盖的、渲染输出的补丁所涵盖的任何采样位置,不是针对该基元覆盖的各个采样位置中的每个采样位置存储相同HSR ID,而是清除采样位置。因此,返回参考图44,可以看出,由底部两个2×2补丁所涵盖的采样位置(其中HSR ID为6的基元可见)都被设定为清除值,而无需将该值明确写入HSR ID缓冲区。同样,对于右上2×2补丁,对于最左边的两个采样位置,具有HSR ID 6的基元是可见的,因此在HSR ID缓冲区中存储了针对这两个采样位置的“零”值。然而,两个最右边的采样位置被具有HSR ID为7的基元覆盖,并且因此针对那些采样位置存储值。然后,这减少了与更新HSR ID缓冲区相关联的写入带宽。然而,在第二主通道操作期间,必须能够正确解释任何清除值,以确保正确的渲染行为。例如,这在图46中示出。
因此,图46示出了针对待处理的传入基元的对应HSR ID测试(步骤430)。首先,执行分层HSR ID测试,如上所述。如果确定基元匹配所存储的正被测试的当前补丁的最小HSRID值,则通过设定“is_min”位来相应地标记基元,以指示基元是引起对当前补丁的最小HSRID值进行更新的基元(步骤431)。此“is_min”位在设定时可接着用于允许任何片段自动通过针对设定有“清除”或零值的任何采样位置的测试。
如果已知正被测试的基元补丁通过来自分层HSR ID测试的所有可见性测试(步骤432-是),则将基元补丁作为整体通过以供进一步处理,并且针对补丁所涵盖的所有片段相应地执行片段着色器(步骤436)以确定渲染输出数据,并且然后针对正被测试的基元补丁所涵盖的采样位置完成第二主通道操作(步骤438)。
另一方面,假设已知正被测试的基元补丁未通过来自分层HSR ID测试的所有可见性测试(步骤432-否),基元补丁的测试通过读取针对补丁区域的HSR ID缓冲区(步骤433)并且检查是否已经为所讨论的基元设定”is_min”位(步骤434)而继续。如果“is_min”位尚未被设定(步骤434-否),则对针对各个采样位置的片段的测试被正常执行,例如使得对于使用“等于”测试的基元,当片段的相关联的HSR ID与存储在HSR ID缓冲区中的值匹配时,该片段在HSR ID测试中存活(步骤437)。然而,当“is_min”位被设定时(步骤434-是),执行测试,使得除了当片段的相关联的HSR ID与存储在HSR ID缓冲区中的值匹配时该片段在测试中存活之外,还使得片段自动地通过针对设定有“清除”或零值的任何采样位置的可见性测试。
因此,以上关于分层HSR ID缓冲区布置的示例允许HSR ID测试的各种优化,并且因此允许改进整体图形处理操作。
剔除顶点(变量)属性着色
如上所述,光栅化和渲染处理使用与正被处理的基元的顶点相关联的顶点属性。为了促进该操作,在基元被例如光栅化和渲染之前,针对给定图形处理输出定义的顶点的至少一些属性通常经受初始所谓的“顶点着色”(顶点处理)操作。此“顶点着色”操作可操作以将顶点的属性变换为用于后续图形处理操作的期望形式。这可以包括例如将顶点位置属性从最初定义在其中的模型或用户空间变换到图形处理的输出将要显示在其中的屏幕空间。
因此,由图形处理器执行的图形处理流水线将通常包含顶点处理级(顶点着色器),其对针对顶点定义的初始顶点属性值执行顶点处理(着色)计算,以便生成用于图形处理流水线的后续处理级中的输出顶点属性的期望集合(即,适当“着色”属性)。
顶点着色器执行通常产生(经变换)顶点位置以及由顶点着色器明确写入的一个或更多个输出。从顶点着色器传送到光栅化和渲染的属性(除位置之外)通常被称为“变量”。(因此,来自顶点着色器的非位置输出(并且仅来自顶点着色器的非位置输出)是“变量”)。一旦顶点属性已被着色,则在图形处理流水线的剩余部分中处理顶点(及其与之相关的基元)时使用“着色”属性。
根据本实施方式的将被处理用于渲染输出的基元是(各自)根据顶点集合来定义的(例如,并且在实施方式中是从将用于图形处理输出(例如,用于显示的帧)的更大的顶点集合中选择的)。该顶点集合中的每个顶点将具有并与其相关联的一个或更多个顶点属性的集合(顶点属性数据(值))。这些顶点属性可以是可以与顶点相关联的任何合适的和期望的属性,诸如以下项中的一项或更多项:位置(例如,顶点的x、y、z、w坐标/值)、颜色(例如,顶点的RGB值)、透明度(顶点的阿尔法值)等。在实施方式中,每个顶点具有与其相关联的位置(位置数据)和一个或更多个其他非位置属性(数据)(变量),例如定义所讨论的顶点的颜色、光、法线、纹理坐标等。然后,当光栅化和渲染基元时,使用这些顶点属性。
如图形处理中常见的情况一样,顶点数据(顶点属性)可能需要被处理(例如,着色),以便将顶点属性变换成期望形式以供后续处理。因此,根据本实施方式,图形处理器包括顶点处理电路(例如,并且在实施方式中是以“顶点着色器”的形式),该顶点处理电路被配置为处理(例如,着色)图形处理器存储/获得的形式的顶点数据(“原始”顶点数据),以生成要针对渲染输出的基元的处理的顶点的适当顶点着色属性数据。
顶点属性的处理(着色)可在整个图形处理操作内的各个级执行。例如,在本实施方式中,图形处理器操作如上所述的基于图块的渲染方案,其中,如图4所示,可编程顶点着色器427被执行作为初始几何形状处理级的一部分,以便至少处理(着色)顶点位置属性以促进对几何形状进行这种拣选。初始前期几何形状处理还可对非位置(变量)顶点属性进行着色,并将所有经变换的顶点几何形状(属性)425一起存储在存储器423中,使得其可随后由渲染器422获得并使用以执行渲染操作。
然而,在一些示例中,对(至少一些)非位置(变量)顶点属性的处理被推迟到图形处理操作的渲染级,即,推迟到期望使用那些顶点属性的点。这可以有利地减少带宽要求,例如,通过避免必须提前写出所有顶点着色的变量数据,因为至少一些顶点属性处理(着色)可以针对个体图块而不是针对整个渲染输出执行。
图47示出根据此类示例的对应图形处理流水线。如图47所示,此示例中的顶点处理(着色)级84执行顶点着色。此示例中的顶点处理(着色)级84因此可触发顶点处理电路(例如,顶点着色器)来处理定义所讨论的基元的顶点集合的顶点数据,以生成基元的进一步处理所期望形式的基元顶点着色属性数据。如图47中所示,顶点处理(着色)级84也联接到顶点缓存(变换后缓存)432。当片段着色器端点80发布用于渲染的基元时,这可以因此触发顶点处理(着色)操作以处理所讨论的基元的对应顶点数据(顶点属性)。然后,在实施方式中,变换的(顶点着色的)几何数据被适当地存储,并且在相关图形处理级处(即,通过光栅化器85和片段着色器87)被读回图形处理器,以便对基元进行光栅化和渲染。
图47中所示的图形处理流水线大体上对应于以上图27中所示的图形处理流水线,其中测试包括HSR ID测试276。然而,应理解,也可针对上文所描述的其它示例中的任一者执行推迟顶点着色,并且不限于使用HSR ID缓冲区的示例。
如上文所描述,使片段着色器端点80将相同基元发布到图形处理流水线两次,即对基元执行相应的第一预通道操作且接着对基元执行对应的第二主通道操作。这意味着,对基元(及其对应片段)的一些处理被执行两次,即,同一基元可经受第一预通道操作和第二主通道操作两者。例如,当同一基元经受第一预通道操作和第二主通道操作两者时,其通常将(必然)被光栅化两次,因为两个通道都涉及将基元处理成其相关联的片段。类似地,因为在图47中所示的示例中,本文描述的技术中的至少一些顶点属性处理(着色)被推迟到渲染级,这意味着顶点属性处理(着色)可以(并且在一些情况下将是)在第一预通道操作期间被触发,并且然后在第二主通道操作期间再次被触发。
因此,在示例中,如果可以确定第一预通道操作实际上不需要变量以确定期望的“可见性”信息,则使图形处理器跳过预通道中的至少一些变量着色。例如,对于原本将与预通道操作兼容的基元,可以使用以下条件来证明在第一预通道操作中不使用变量:(i)片段着色器不修改覆盖;(ii)片段着色器不发出深度,并且(iii)不使用透明至覆盖(alpha-to-coverage)。
这可以由图形处理器3的驱动器4确定,如图48所示。因此,图48是例示驱动器操作以确定第一预通道操作是否需要变量的流程图。因此,对于传入的绘制调用(步骤450),检查透明至覆盖是否被启用(步骤451)以及着色器是否修改覆盖或发出深度(步骤452)。如果满足这些条件中的任一者,则预通道操作应因此着色由编译器确定的在预通道操作中需要的变量(步骤454)。否则,如果没有满足这些条件,则可以在第一预通道操作中省略变量着色(步骤453)。
这可以相应地标记。例如,在一些情况下,如果需要任何变量,则可以使图形处理器对所有变量进行着色。即,这可以二进制方式来指示。然而,编译器还能够确定实际需要哪些变量。例如,当第一预通道操作执行片段着色器时,片段着色器程序可以被配置(排序),使得片段仅运行直到某个点。因此,编译器可以检查通过片段着色器是否有任何路径将在该点之前读取特定变量。在这种情况下,需要哪些变量的指示可能更复杂,并且可以指示在第一预通道操作期间应当被着色的一个或更多个变量的集合。
图49是示出如何控制图形处理器的操作处于不同状态的状态图,这取决于是否需要变量。如图49所示,对于传入基元(步骤460),如果图形处理器状态机处于预通道状态(462),则使顶点着色器84对所有顶点位置属性进行着色,而是仅对已确定为第一预通道操作需要的顶点非位置(变量)属性进行着色(步骤464)。当图形处理器处于主通道状态时,在该示例中,使顶点着色器84对包括顶点位置和非位置(变量)属性两者的所有顶点属性进行着色(步骤466)。(在回退状态下,同样,包括顶点位置和非位置(变量)属性两者的所有顶点属性将被着色)。
当在第一预通道操作期间省略了一些顶点属性着色时,用于在顶点缓存(变换后缓存)432中为顶点数据分配存储的各种示例是可能的。
在图50中示出了第一示例。在图50所示的示例中,在针对整个顶点的第一预通道操作期间,即使仅填充顶点位置属性,也会在顶点缓存(变换后缓存)432中分配足够的空间。
如图50所示,对于传入基元(步骤470),对于每个顶点(步骤471),执行顶点缓存查找以确定顶点是否已经存储在缓存中(步骤472)。如果具有所有所需顶点数据的顶点已经存储在缓存中,则不需要针对该顶点的进一步处理,因此相应地递增引用计数(步骤473),并且处理下一顶点。另一方面,如果顶点根本不存在于缓存中,只要缓存中有足够的空间用于整个顶点(步骤474-是),则分配相应的缓存条目用于存储整个顶点,并且将所分配条目的引用计数设定为1(步骤476)。如果缓存中没有足够的空间用于整个顶点(步骤474-否),则顶点处理等待足够的缓存条目可用(步骤475)。
然后为所需顶点数据发布期望顶点着色请求(步骤477)。因此,如果不需要顶点变量属性,则此时可以简单地针对顶点位置属性发布请求。以此方式,在第一预通道操作结束时,顶点将被存储在具有所需顶点数据的子集的缓存中。因此,在对应的第二主通道操作期间,当该顶点需要顶点数据时,顶点缓存测试(步骤472)将确定顶点存在,但在顶点缓存中仅存在所需数据的子集(即,存储位置属性,但未存储一些或所有变量属性)。在这种情况下,增加引用计数(步骤478),然后针对缺失的顶点数据发布顶点着色请求(步骤477)。
一旦处理了所有顶点,然后该处理就等待所有顶点着色请求完成(步骤479),然后输出相应的基元(步骤4790)。一旦基元完成(步骤4791),则相应地递减所有顶点的引用计数(步骤4792)。
因此,图50所示的方法允许在主通道期间重新使用顶点分组。然而,这需要在预通道操作期间大于必要的顶点缓存分配,这可以增加分配停顿的频率。
因此,在图51中示出了另一种方法,其中在预通道操作期间,当不需要变量时,在顶点缓存中仅为顶点位置分配足够的空间。第二主通道在寻找顶点时不重复使用位置数据,而是进行新的分配,该新的分配可以适合整个顶点的位置和变量属性。这在预通道中保持了较小的顶点缓存分配,但代价是必须对位置进行两次着色。因此,图51中的顶点处理类似于图50,只是在图51中没有检查顶点是否已经存在于缓存中而是仅具有所需数据的子集,并且改为在所有情况下,当所需顶点数据尚未存在于顶点缓存中时,针对整个顶点进行新的顶点缓存分配(步骤476)。
图52示出了与图51类似的另一种方法,但是其中,主通道尝试重新使用来自第一预通道的位置属性,并且仅在第二主通道期间为变量属性进行新的分配。这也有效,但是位置和变量现在可以在不同的分配中结束。再次,此示例中的顶点处理因此类似于上文所描述的顶点处理,除了在这种情况下,仅针对尚未存在于顶点缓存中的所需数据进行第二主通道中的顶点缓存分配(步骤496)。相应地,仅针对尚未存在于缓存中的所需数据发布顶点着色请求(步骤497)。
作为本文中所描述的预通道操作的部分,用于处理顶点数据的各种其它布置将是可能的。
基元剔除
第一预通道操作可根据需要包括任何其它合适的处理操作。例如,在一些实施方式中,还在第一预通道操作期间生成“基元剔除”数据结构,所述“基元剔除”数据结构可用于识别不需要进一步处理的整个基元,并且因此所述基元可在第二主通道操作中(例如,在光栅化之前且还在主通道操作期间执行的任何顶点处理之前)被相对较早地剔除。例如,对于在第一预通道操作期间处理的任何基元,针对其可以确定不需要进一步处理相关联的片段中的任何一个(例如,由于没有任何片段对其在最终渲染输出内的相应采样位置具有任何可见效果),可以剔除其整体中的基元。以这种方式,可以避免在第二主通道期间对基元的一些或全部处理。
然后这可以避免片段前端中的基元处理(例如,直到并包括光栅化的处理)。例如,以这种方式剔除(整个)基元的能力在至少一些顶点属性处理(例如,变量着色)被推迟到渲染级的情况下也可能是特别有益的,因为在这种情况下,基元剔除数据结构的使用还可以(并且在实施方式中确实)至少允许在第二主通道期间避免针对可以使用基元剔除数据结构确定基元不需要进一步处理的任何基元的此类顶点属性处理。
图53示出基于上文在图24中例示的预通道操作构建此“基元剔除”数据结构的第一示例。在此示例中,基元因此经受如上文关于图24所描述的相同图形处理流水线操作,其中第一预通道操作相应地生成反映基元序列的可见性信息的HSR ID缓冲区。然而,在图53中,在最后确定HSR ID缓冲区之后执行构建“基元剔除”数据结构540的附加最后步骤。构建“基元剔除”数据结构540的步骤因此在预通道操作结束时执行,使得其针对每个图块仅执行一次。
图54接着示出根据此示例的对应修改主通道操作,其中主通道操作如上文关于图27所描述进行,只是预通道决策级550还可操作以根据“基元剔除”数据结构剔除整个基元。
图55是示出该示例中的图形处理器的操作的状态机。此示例中的状态机实质上与上文在图7中描述的状态机相同,只是在第一预通道操作完成或响应于遇到不兼容基元而停止之后,在重新绕回基元列表读取器(步骤710)以准备后续主通道操作(步骤74)之前,图形处理器必须首先停顿,直到所有基元已完成第一预通道操作(步骤560),以允许在第二主通道操作开始之前构建基元剔除数据结构(步骤561)。
图56是示出根据一个示例的可以如何从HSR ID缓冲区构建基元剔除数据结构的流程图。如图56所示,在处理开始时(步骤570),将HSR ID缓冲区地址初始化为零(步骤571)。接着检查当前HSR ID缓冲区地址以查看其是否与HSR ID缓冲区的大小相匹配(步骤572)。如果当前HSR ID缓冲区地址与HSR ID缓冲区的大小相匹配(步骤572-是),则这意味着已经处理了HSR ID缓冲区的所有条目,并且因此该处理完成(步骤573)。否则,通过读取存储在当前HSR ID缓冲区地址处的HSR ID值(步骤574)、将HSR ID值相应地添加到基元剔除数据结构(步骤575),然后递增HSR ID缓冲区地址(步骤576)以使处理继续下一个HSR ID缓冲区地址等来构建基元剔除数据结构。
因此,其结果是通过其HSR ID值来识别HSR ID值被存储在HSR ID缓冲区中的所有基元,并且将这些基元添加到基元剔除数据结构。因此,未添加到基元剔除数据结构的任何剩余基元在渲染输出内的任何采样位置处都不可见,并且可以相应地被整体剔除。
以此方式的“可见基元剔除数据结构”可接着在预通道决策级83期间使用以剔除整个基元,如图57所示。图57中的决策逻辑大体上与上文所描述的图36中所示的决策逻辑相同,然而,在第二主通道操作期间,对于原本会被向前传递的基元,进一步检查(在步骤580处)基元是否存在于可见基元剔除数据结构中。如果基元不存在(步骤3161-否),则可以剔除该基元(步骤3162)。否则,基元被传递到光栅化器85等,并且第二主通道操作被正常执行。
设想了用于构建基元剔除数据结构的各种其他示例。例如,图58示出了另一示例,其中在第一次预通道操作期间“动态”生成基元剔除数据结构,同时更新HSR ID缓冲区。因此,此示例中的处理流水线大体上与图24中所示的处理流水线相同,只是如图58中所示,(早期)HSR ID更新590被修改为也更新基元剔除结构(并且(晚期)HSR ID更新592在存在时也对应地被修改为执行基元剔除结构的晚期更新)。
图59示出了这种情况下的对应状态图。此处,第二主通道操作仍然必须停顿,直到从第一预通道操作中的所有基元都被耗尽(步骤560),然而,不存在构建基元剔除数据结构的附加步骤(例如,与图55相比),因为这改为作为第一预通道操作的部分完成。在这方面,各种其他布置是可能的。
也可以直接从深度(或模版)测试构建基元剔除数据结构,而不需要生成HSR ID缓冲区。该示例在图60中示出。如图60所示,对于要执行深度/模版测试的传入片段(步骤610),执行深度/模版测试(步骤611),并且如果确定片段可见(步骤612),则将识别从中得出片段的基元的相应HSR ID值添加到基元剔除数据结构(步骤613)。注意,在该示例中,基元因此仍然在基元分类期间被分配HSR ID,如上所述,然而,这些简单地用于构建基元剔除数据结构。然后,图61示出了状态机,其例示了针对待处理的传入基元110,如何根据图60的示例中的图形处理器的不同可能状态来不同地处理基元110。应当理解,状态机与图11中所示的状态机相同,只是当图形处理器被配置处于主通道状态时,预通道决策单元83还被配置为检查基元110是否存在于基元剔除数据结构中(步骤620),并且如果否,则此时相应地整体剔除基元(步骤622)。
在上面的示例中,描述了随着并且当基元被确定为可见时,基元如何被添加到基元剔除数据结构。然而,提供能够存储任意基元序列的所有可能基元的基元剔除数据结构可能是禁止的。因此,在一些示例中,基元剔除数据结构是固定大小的数据结构。在此情况下,如果可见基元的数量大于基元剔除数据结构的固定大小,则基元剔除可在该点处损失。另选地,考虑使用固定大小数据结构的条目来指示可见的多个基元的集合的各种布置。
例如,在图62中,当将HSR ID值630添加到基元剔除数据结构634(在此示例中,基元剔除数据结构634包括8位值)时,HSR ID值是以位阵列的长度为模计算的,并且然后如果该基元可见,则相应地设定对应位。因此,如图63所示,对于HSR ID值4,所计算的长度是4,因此第四位被相应地设定。同样,如图64所示,对于HSR值13,所计算的长度是5,因此第五位被相应地设定。当然,这意味着即使当被位覆盖的基元实际上不可见时,也可以设定该位。然而,这是可接受的,因为它简单地意味着基元随后将在片段级别处理期间被杀死。
图65示出了另一示例,其中在这种情况下,当将HSR ID值660添加到基元剔除数据结构634时,检查HSR ID值是否大于基元剔除数据结构中可用的位的数量(步骤662)。如果HSR ID值不大于基元剔除数据结构中可用的位的数量(步骤662-否),则直接使用HSR ID值来设定对应位。因此,如图66所示,对于HSR ID值为5(其小于8),直接使用HSR ID值,使得第五位被设定。另一方面,对于大于基元剔除数据结构中可用的位的数量的HSR ID值(步骤662-是),使用HSR ID值来计算合适的散列函数以确定应被设定的相应位。这在图67中示出。
图68示出了另一示例,其中在这种情况下,当将HSR ID值690添加到基元剔除数据结构634时,应当更新以反映这一点的位是通过对基元剔除数据结构所涉及的图块的最大HSR ID进行计算(步骤691)、计算基元剔除数据结构的每个位应当表示的基元的数量(步骤692)、然后通过将HSR ID值690除以基元剔除数据结构的每个位表示的基元的数量来计算索引来确定的。图69示出了这一点的工作示例。
片段着色器端点优化
如上所述,每个图块的渲染可以包括第一处理通道和第二处理通道。在典型的图形处理布置中,可能存在需要渲染的许多图块。在实施方式中,每个图块以上述相同方式处理。在这种情况下,图块可以被渲染为“背靠背”(back-to-back)的,使得仅在先前图块的主通道操作(或回退操作,如果需要)已经完成之后才开始图块的预通道操作。这通常可以很好地工作。该方法的示例在图70中示出。
如图70所示,向图形处理流水线发布用于对第一图块执行第一预通道操作的第一任务(“预通道T0”)。如上所述,与该图块相关联的基元然后在基元列表读取器中被相应的处理,并且由片段前端级对应地处理。在此示例中,在第一预通道操作期间没有执行片段着色器(尽管这可在需要时进行)。无法针对第一图块开始对应的主通道操作(“主通道T0”),直到所有基元已完成第一预通道操作。因此,如图70所示,第一图块的主通道操作(“主通道T0”)等待第一图块的对应的预通道(“预通道T0”)操作完成。第二图块的预通道操作(“预通道T1”)可以紧接在先前的主通道操作(“主通道T0”)之后启动。然而,同样,第二图块的对应的主通道操作(“主通道T1”)必须等待其预通道操作(“预通道T1”)完成。如图70所示,这的效果在于,可能存在不活动的气泡,尤其是在相邻主通道操作之间的执行核心中。
因此,设想了尝试提高预通道操作的速度的各种布置。
因此,这可以很好地工作以提高整个渲染作业的速度。在其它实施方式中,图形处理流水线可不被复制,而是改为片段着色器端点80尝试交错不同图块的处理任务以提供更连续的吞吐量。该方法的示例在图71中示出。特别地,如图71所示,片段着色器端点80可尝试交错针对不同图块的相应处理通道的处理任务。为了进行此工作,如图71中所示,片段着色器端点80可在尝试针对不同图块交错预通道操作及主通道操作之前最初调度两个(或更多个)预通道操作的集合。然后这意味着该处理有效地提前至少一次预通道操作,这可以减少上述气泡。因此,如图71所示,第一图块的主通道操作(“主通道T0”)可在片段前端中与第二图块的预通道操作(“预通道T1”)交叠。因此,可以相对较早地开始第二图块的主通道操作(“主通道T1”),因为在第二图块的主通道操作(“主通道T1”)准备好发布时其对应的预通道操作(“预通道T1”)已经完成。
在一些示例中,片段着色器端点80可以始终根据期望调度操作发布任务,如图71所示。然而,在其它示例中,片段着色器端点80可尝试根据如图71中所示的期望调度操作来交错任务,但也能够执行更动态的控制,例如,并且特别地,使得如果片段着色器端点80有效地耗尽预通道操作,但存在准备要执行的主通道操作,则可相应地中断期望调度操作以执行主通道操作,例如,而非等待从命令流前端20接收到与下一预通道操作有关的命令。在这种情况下,如果期望调度操作被中断,则可以使片段着色器端点20发布两个背靠背预通道的集合,以重新开始期望调度操作。图72示出用于调度的动态控制的对应工作流程,使得片段着色器端点80尝试执行如图71中所示的交错操作,但也能够在确定这样做可能更有效时中断期望调度操作。
如图72所示,并且如上面关于图6所描述的,响应于从命令流前端20接收到对应命令,由片段着色器端点80生成用于执行给定图块的相应的预通道和主通道操作的处理任务。因此,如上所述,命令流前端20将帧中的所有图块的所有任务/图块发送到片段着色器端点80,片段着色器端点80对应地将任务/图块分解成相应的预通道操作和主通道操作,然后将其发布到图形处理流水线,所述图形处理流水线包括基元列表读取器(多边形列表读取器81)、基元分类82/预通道决策单元83、光栅化85、片段着色87等。尽管图72示出简化图形处理流水线,但应理解,此示例中的图形处理流水线大体上可对应于上文所描述的示例中的图形处理流水线中的任一者。
在图72所示的示例中,在需要渲染多个不同图块的渲染作业开始时(步骤700),在实施方式中,片段着色器端点80发布两个背靠背预通道操作的集合,如图71所示。然后,如下执行控制:使用相应的计数器“num_issued_prepass”,其跟踪已经发布了多少预通道操作。如果发布的预通道操作的数量等于2(步骤701-是),则发布针对最旧预通道的主通道操作(步骤702),并且相应地递减计数器“num_issued_prepass”。如果所发布的预通道操作的数量不等于2(步骤701-否),则检查所发布的预通道操作的数量是否等于1(步骤703)。如果甚至不存在可用的单个预通道(步骤701-否),使得预通道操作的数量为零(步骤704-是),则片段着色器端点80被配置成检查新的图块/任务是否可从命令流前端20获得(步骤705),并且当存在可用的图块/任务(步骤705-是)时,发布预通道操作并相应地递增计数器“num_issued_prepass”(步骤706),或者在其他情况下(步骤705-否),等待直到新的图块/任务可用。因此,该循环的效果是,在作业开始时,或者如果片段着色器耗尽预通道操作,则在实施方式中,背靠背地启动两个预通道操作的集合。
然而,如上所述,在一些情况下,可能期望不按顺序发布主通道操作(当一个主通道操作可用于执行时)。因此,如果所发布的预通道操作的数量等于1(步骤703-是),则在该点处检查是否已经存在可从命令流前端20获得的新图块(步骤707)。如果新图块可用(步骤707-是),则调度操作根据图71中所示的通过发布预通道操作的期望调度操作进行(步骤706)。另一方面,如果没有图块可用,并且因此没有准备好发布的预通道操作(步骤707-否),则决定是否等待新图块变得可用,或者是否立即发布未完成的主通道操作。在图72所示的示例中,该决策检查当前的预通道操作是否完成了基元分类(步骤708)。因此,从基元分类82/预通道决策83级向片段着色器端点80提供信号以指示这一点。如果接收到的预通道已经进行了分类(步骤708-是),则发布主通道操作(步骤702)。否则(步骤708-否),使片段着色器端点80等待。在这方面,各种其他布置是可能的。例如,还可以使用超时机制来执行关于是否等待的决定,使得如果在某个时间段内没有新图块可用,则在该点发布主通道。
可重新开始的预通道
因此,本实施方式引入了一种新颖的“预通道”操作,如上所述,该操作促进改进的隐藏表面去除效率。如图7所示,如上所述,为了确保安全的硬件执行,还提供了“回退”操作,使得图形处理器能够根据需要切换到这样的回退操作,以便处理预通道操作无法安全处理的基元。例如,在图7所示的实施方式中,在第一预通道操作遇到不兼容的基元之后,处理切换到回退操作并且在回退操作中继续到图块的结束。然后可以针对要渲染的下一个基元序列(例如,下一个图块)发起新的预通道操作。
然而,在这方面,还可能例如响应于识别到另一兼容基元(或兼容基元序列)而重新开始图块内的预通道操作。这例如在图73中示出。
图73示意性地示出了根据另一实施方式的渲染操作,其中可以在图块内重新开始新颖的“预通道”操作。因此,处理操作通常如上文关于图7所述进行。然而,在该实施方式中,在切换到回退操作之后,图形处理器能够在遇到另一兼容基元的事件中从回退操作切换回到预通道操作。例如,考虑以下基元序列;
#基元1,兼容
#基元2,兼容
#基元3,不兼容
#基元4兼容
#基元5,兼容
#基元6,不兼容
如果根据图7中所示的实施方式处理基元序列,则在到达第一不兼容基元(“#基元3”)之后,图形处理器将切换到回退操作,并且然后继续处理回退操作中的所有剩余基元,尽管事实是下一基元(“#基元4”)实际上与第一预通道操作处理兼容。这意味着可能损失一些隐藏表面去除效率。例如,以上示例非常简单,并且一般来说基元序列可含有许多基元。在这种情况下,在第一不兼容基元之后可能存在相对较长的兼容基元序列,为此可能期望切换回到第一预通道操作,以便允许改进的隐藏表面去除效率。
因此,根据图73中所示的实施方式,在第一不兼容基元已由第三回退操作处理之后,使图形处理器切换回到第一预通道操作以用于下一兼容基元(“#基元4”)。本实施方式中的操作顺序为:
#针对基元1运行预通道
#针对基元2运行预通道
#遇到基元3
#重新绕回到基元1
#针对基元1运行主通道
#针对基元2运行主通道
#遇到基元3
#针对基元3运行回退
#遇到基元4
#切换到预通道操作,将基元4记录为重新开始点
#恢复针对基元4的预通道
#针对基元5运行预通道
#遇到基元6
#针对基元6运行回退
#图块的末尾
因此,如上文所描述,处理开始于第一预通道操作,并且当遇到第一个不兼容基元(“#基元3”)时,停止第一预通道操作,其中基元列表读取器重新绕回到基元序列的开始,并且接着执行对应的主通道操作以完成到目前为止处理的基元(“#基元1”和“#基元2”)的渲染。当第二主通道遇到第一个不兼容基元(“#基元3”)时,然后停止第二主通道,并且运行回退操作以处理不兼容基元。到目前为止,处理与图7实施方式中相同。然后,至少针对序列中的任何其他不兼容基元,该处理在回退操作中继续(步骤7130)。
然而,不是简单地在回退操作中继续到图块的末尾,而是响应于图形处理器在回退操作中识别到存在另一兼容基元(例如,“#基元4”),图形处理器能够切换回第一预通道操作并且从另一兼容基元的位置重新开始预通道操作(步骤7131)。
即,在图73中所示的示例中,在使图形处理器切换到回退操作(响应于预通道操作遇到不兼容基元)之后,图形处理器进一步能够响应于确定基元序列内存在另外的兼容基元而从第三回退操作切换回到第一预通道操作。因此,当可能这样做时,本文描述的技术允许在切换到第三回退操作之后在基元序列内重新开始第一预通道操作。
为了促进图形处理器在这些操作之间的切换,例如并且避免在第一预通道操作停止并且转变到第三回退操作时潜在地引入伪影(反之亦然),图形处理器应当并且在实施方式中确实存储合适的状态或信息,以允许基元序列的处理在这样的切换事件之后相应地继续,例如,并且在实施方式中,以能够在新操作模式中继续处理时使用来自先前操作模式的处理结果的更无缝方式。
例如,并且如下文将进一步解释的,在实施方式中,由第一预通道操作生成的可见性信息(并且用于控制第二主通道操作中的片段的处理)是基于在第一预通道操作期间处理的基元的片段的深度值生成的。因此,第一预通道操作可以并且在实施方式中确实涉及更新用于基元序列的深度缓冲区。在根据本文中所描述的技术的正常操作中,深度缓冲区或基于在第一预通道操作期间生成的深度值的其它可见性信息随后在第二主通道期间被用于控制片段处理。当针对基元序列停止第一预通道操作并且随后将图形处理器切换到第三回退操作以继续处理基元序列时,在实施方式中,第三回退操作也执行深度测试(例如,以正常方式)。
因此,在实施方式中,由中止的第一预通道操作产生的深度缓冲区被携带通过该转变,使得深度缓冲区的内容(反映到目前为止处理的基元的深度缓冲区,即,直到不兼容基元的位置)也可用于第三回退操作。然后,在实施方式中,第三回退操作然后基于由第三回退操作进行的深度测试基元来继续更新深度缓冲区,并且在随后执行切换回第一预通道操作的事件中,在实施方式中,使得在第三回退操作被停止的点处的深度缓冲区的内容在恢复的第一预通道操作期间在生成要由恢复的第一预通道操作处理的后续基元的可见性信息时可用于使用(并且然后被使用),例如并且在实施方式中,以允许在重新开始第一预通道操作时继续改进的隐藏表面去除。
因此,当图形处理器从第一预通道操作模式转变到第三回退操作时,在实施方式中,用于基元序列的深度缓冲区保留,并且由第一预通道操作到目前为止(直到触发转变的不兼容基元的点)对基元的处理生成的深度缓冲区的当前内容然后被用于在第三回退操作期间的深度测试基元(片段)。
对应地,当图形处理器从第三回退操作切换回第一预通道操作时,在实施方式中,深度缓冲区的内容被再次保留并由第一预通道操作用于继续生成针对要由恢复的第一预通道操作处理的基元的序列(或子序列)的可见性信息。
在实施方式中,还在第一预通道操作与第三回退操作之间的这样的转变期间跟踪到目前为止基元序列中的哪些基元已被处理到完成,以便潜在地生成渲染输出数据(即,通过执行第一预通道操作和第二主通道操作两者或通过执行第三回退操作哪些基元已被处理到完成)。在实施方式中,通过跟踪到目前为止哪些基元已被处理完成,这然后允许图形处理器从期望基元重新开始基元序列的处理(使得处理可以有效地快进通过基元序列并且从任意基元恢复)。因此,这可以促进图形处理器在单个基元序列内的操作模式之间的切换,例如,并且在实施方式中,通过避免必须重复已经处理的基元的大量处理。
例如,当重新开始第一预通道操作时,使得存在从第三回退操作切换回第一预通道操作的切换,通过跟踪到目前为止已处理哪些基元,只要深度缓冲区(以及用于重新开始预通道操作的任何其他期望信息)可用,则恢复的第一预通道操作然后可以(并且在实施方式中确实)跳过已经被处理的任何基元的大量处理,使得第一预通道操作有效地从触发第一预通道操作的重新开始的另外的兼容基元的位置恢复处理。
这可以根据需要以各种合适的方式完成。例如,在实施方式中,可以用指示它们是否先前已经以任一方式处理的合适状态来注释基元。在此情况下,仍可在恢复的预通道操作期间处理基元,但在此基础上相对较早地(例如,并且在实施方式中是在恢复的预通道操作开始时)有效地剔除基元,使得在恢复的预通道操作期间不发生基元的大量重复处理。这可以相对较简单地实现,因为它不需要对如何获得基元进行处理的任何改变(例如,可以根据其指定的渲染顺序(例如来自相应的基元列表)以正常方式处理所有基元,但是可以在第一预通道操作期间剔除已经处理过的基元,以避免这种基元的大量重复处理)。因此,该方法可以促进更高效的硬件实现。然而,各种其他布置也是可能的。例如,在其它实施方式中,当在操作模式之间转变时图形处理器可经配置以写出充足信息以允许处理从基元序列中的期望基元重新开始,然后,当第一预通道操作重新开始从期望基元开始时,可以相应地使用该信息。
对从第三回退操作切换到第一预通道操作的控制可以以任何合适且期望的方式执行,但是在实施方式中也基于基元分类,例如,并且在实施方式中,基于与上面关于第三回退操作的触发所描述的相同的基元分类。因此,实施方式中的第三回退操作模式还包括(检查)基元分类的步骤。然而,在一些实施方式中,从第三回退操作模式进行切换是更保守地执行的,并且因此可提供额外逻辑以促进此操作。在这方面,各种布置将是可能的,如下文将解释的。
例如,为了确保安全渲染操作,每当遇到不兼容基元时,图形处理器应(并且在实施方式中确实)切换到第三回退模式。因此,在实施方式中,基元序列中的第一个不兼容基元将触发停止第一预通道操作,并且随后以上述方式通过第三回退操作处理不兼容基元。
在一些实施方式中,每当遇到与第一预通道操作兼容的另外的基元时,图形处理器可对应地尝试从第三回退操作模式切换回到第一预通道操作。即,切换回到第一预通道操作以处理另外的兼容基元的决策可在每基元基础上执行,类似于响应于不兼容基元而停止第一预通道操作的决策。在这种情况下,图形处理器可以继续仅在第三回退操作中处理基元,直到遇到下一个兼容基元,此时图形处理器切换回第一预通道操作。这可以很好地工作,尤其是在不兼容的基元相对较少的典型情况下,使得在每基元基础上的切换可以提供改进,至少在平均情况下是这样。
即使从上述简单示例中也可以理解,在基元序列包括兼容基元和不兼容基元的混合的情况下,这可以导致图形处理器重复地切换状态。在某时,用于切换状态的附加时间和能量可能超过改进的隐藏表面去除的任何益处。因此,在实施方式中,图形处理器可以在触发切换出回退操作之前检查一个或更多个其他条件,而不是在遇到下一个兼容基元(因此在上面的示例中的“#基元4”)时立即切换回预通道操作。
可以根据需要设定这些其他条件,并且可以在这方面应用各种合适的试探法。例如,在上面的示例中,存在两个另外的兼容的基元(“#基元4”和“#基元5”)的序列。如果可以提前识别存在多于一个的另外的兼容基元的序列,则这可能使得更期望切换。因此,可以进行前瞻性检查,以检查基元序列中是否有多余一个的兼容基元的连续序列,并在此基础上做出是否切换(回)的决策。另一可能的试探法将是在触发切换之前等待直到已到达设定数量的另外的兼容基元。这可以很好地工作,因为通常期望相邻基元具有相似的基元性质(使得它们可以以相同的方式被处理)。
图74示出了这一点。因此,在第三回退操作期间,当确定存在另外的兼容基元时(步骤720),接着检查是否满足一个或更多个其它条件以使图形处理器恢复到预通道操作。然后相应地执行另外的处理(步骤722)。因此,如果满足一个或更多个条件(步骤721-是),则图形处理器相应地恢复到预通道操作。否则,如果不满足一个或更多个条件(步骤721-否),则图形处理器在回退操作中继续(至少目前是在回退操作中继续)。
在这方面,各种布置是可能的。
将理解,根据上文呈现的各种实施方式和示例,根据本文描述的技术的要求,可以根据需要以各种合适的方式配置预通道(和主通道)操作。还将理解,可以对预通道(和主通道)操作进行各种其他修改,并且例如,可以有利地组合上述示例和实施方式中的任一个。通常,第一预通道操作和第二主通道操作因此可以根据需要包括任何其他合适的处理操作。
因此已经出于说明和描述的目的呈现了前述详细描述。不旨在穷举或将本文描述的技术限于所公开的精确形式。根据上述教导,许多修改和变化是可能的。选择所描述的实施方式以便最好地解释本文描述的技术的原理及其实际应用,从而使本领域的其他技术人员能够最好地利用在各种实施方式中并且具有适合于预期的特定用途的各种修改的本文描述的技术。该范围旨在由所附权利要求限定。
Claims (20)
1.一种操作图形处理器的方法,所述方法包括以下步骤:
对于要针对渲染输出进行渲染的基元序列:
执行第一预通道操作,在所述第一预通道操作中,将待渲染的所述基元序列中的基元处理为一个或更多个片段的相应集合,各个片段与所述渲染输出内的一个或更多个采样位置的相应集合相关联,并且其中,作为所述第一预通道操作的一部分,针对所述基元序列的深度缓冲器对片段进行深度测试,并且其中,当一片段经受住所述深度测试时,相应地更新该片段所相关的采样位置的对应条目,以记录该片段的深度值;以及
此后执行第二主通道操作,在所述第二主通道操作中,将由所述第一预通道操作处理过并且在所述第一预通道操作中可能已更新了所述深度缓冲器的基元再次处理成它们的一个或更多个片段的相应集合,以用于处理所述渲染输出内的相应采样位置,并且其中,处理由所述第一预通道操作处理过的并且在所述第一预通道操作中可能已更新了所述深度缓冲器的片段包括测试所述片段的深度值是否与所述片段所相关的采样位置在所述深度缓冲器中的对应条目相匹配,以确定是否应当针对所述渲染输出进一步处理所述片段。
2.根据权利要求1所述的方法,其中,在所述第一预通道操作期间,使用所述片段的指定深度测试函数来执行片段深度测试,而在所述第二主通道操作期间,将由所述第一预通道操作处理过的并且在所述第一预通道操作中可能已更新了所述深度缓冲器的基元的片段的所述深度测试函数修改为等于测试函数,而不管所述片段的所述指定深度测试函数如何。
3.根据权利要求1或2所述的方法,所述方法包括以下步骤:响应于确定一基元与被所述第一预通道操作处理不兼容,相对于该不兼容基元停止所述第一预通道操作,并且随后替代地通过第三回退操作来处理该不兼容基元。
4.根据权利要求3所述的方法,其中,如果一基元的指定深度测试函数的极性与所述基元序列中的前一基元的指定深度测试函数的极性不同,则确定该基元是不兼容的。
5.根据权利要求4所述的方法,其中,对于在所述第一预通道操作期间使用排他性深度测试函数的基元的片段,基于与所述片段所相关的所述采样位置相关联的跟踪位来进一步控制在所述第二主通道操作期间对所述片段的进一步处理,其中,能够在相应的第一预通道操作和第二主通道操作期间设置/清除所述跟踪位并且在所述第二主通道操作期间使用所述跟踪位,以针对深度值与所述片段所相关的所述采样位置在所述深度缓冲器中的所述对应条目匹配的一片段,确定该片段是否应当被剔除。
6.根据权利要求5所述的方法,其中,在所述第一预通道操作期间,当一片段引起所述深度缓冲器的更新时,如果该片段的指定深度测试函数是非排他性的,则将所述跟踪位设定为第一值,而如果该片段的指定深度测试函数是排他性的,则将所述跟踪位清除为第二值。
7.根据权利要求5所述的方法,其中,在所述第二主通道操作期间,对于如下片段执行以下操作,即,该片段的深度值与该片段所相关的所述采样位置在所述深度缓冲器中的所述对应条目匹配并且该片段的用于所述第一预通道操作的指定深度测试函数是排他性的:
如果所述跟踪位被设定为第一值,则剔除该片段;
而如果所述跟踪位被设置为第二值,则进一步处理该片段,并且在该点将所述跟踪位设置为所述第一值。
8.根据权利要求7所述的方法,其中,如果在所述第二主通道操作期间对随后片段进行处理,并且该随后片段的深度值同样匹配该随后片段所相关的所述采样位置在所述深度缓冲器中的所述对应条目,并且该随后片段的用于所述第一预通道操作的指定深度测试函数是排他性的,则基于所述跟踪位被设置来剔除该后续片段。
9.根据权利要求4所述的方法,其中,如果一基元在所述第一预通道操作期间使用排他性深度测试函数,则确定该基元是不兼容的。
10.根据权利要求1或2所述的方法,其中,所述第一预通道操作还包含针对所述基元序列使用模板缓冲器对片段进行模板测试,其中,当一片段经受住所述模板测试时,相应地更新该片段所相关的所述采样位置的对应条目,以记录该片段的模板值,并且其中,所述第二主通道操作相应地包括:通过测试所述片段的模板值是否与所述片段所相关的所述采样位置在所述模板缓冲器中的对应条目相匹配,测试由所述第一预通道操作处理过并且可能已在所述第一预通道操作中更新了所述模板缓冲器的片段,以确定是否应当针对所述渲染输出进一步处理所述片段。
11.一种图形处理器,所述图形处理器包含用于处理基元的处理电路,其中,所述图形处理器被配置为:
对于要针对渲染输出进行渲染的基元序列:
使所述处理电路:
执行第一预通道操作,在所述第一预通道操作中,将待渲染的所述基元序列中的基元处理为一个或更多个片段的相应集合,各个片段与所述渲染输出内的一个或更多个采样位置的相应集合相关联,并且其中,针对所述基元序列的深度缓冲器对片段进行深度测试,并且其中,当一片段经受住所述深度测试时,相应地更新该片段所相关的采样位置的对应条目,以记录该片段的深度值;以及
此后执行第二主通道操作,在所述第二主通道操作中,将由所述第一预通道操作处理过并且在所述第一预通道操作中可能已经更新了所述深度缓冲器的基元被再次处理成它们的一个或更多个片段的相应集合,以用于处理所述渲染输出内的相应采样位置,并且其中,处理由所述第一预通道操作处理过并且在所述第一预通道操作中可能已经更新了所述深度缓冲器的片段包括测试所述片段的深度值是否与所述片段所相关的采样位置在所述深度缓冲器中的对应条目相匹配,以确定是否应当针对所述渲染输出进一步处理所述片段。
12.根据权利要求11所述的图形处理器,其中,在所述第一预通道操作期间,所述处理电路被配置为使用所述片段的指定深度测试函数来执行片段深度测试,而在所述第二主通道操作期间,所述处理电路被配置为针对由所述第一预通道操作处理过并且在所述第一预通道操作中可能已更新了所述深度缓冲器的基元的所有片段使用等于深度测试函数,而不管针对所述片段的所述指定深度测试函数如何。
13.根据权利要求11或12所述的图形处理器,其中,响应于确定一基元与被所述第一预通道操作处理不兼容,所述处理电路被配置为相对于该不兼容基元停止所述第一预通道操作,并且随后替代地通过第三回退操作来处理该不兼容基元。
14.根据权利要求13所述的图形处理器,其中,所述处理电路被配置为在一基元的指定深度测试函数的极性与所述基元序列中的前一基元的指定深度测试函数的极性不同的情况下确定该基元与所述第一预通道操作不兼容。
15.根据权利要求14所述的图形处理器,其中,对于在所述第一预通道操作期间使用排他性深度测试函数的基元的片段,所述处理电路被配置为基于与所述片段所相关的所述采样位置相关联的跟踪位来进一步控制在所述第二主通道操作期间对所述片段的进一步处理,其中,能够在相应的第一预通道操作和第二主通道操作期间设置/清除所述跟踪位并且在所述第二主通道操作期间使用所述跟踪位,以针对深度值与所述片段所相关的所述采样位置在所述深度缓冲器中的所述对应条目匹配的一片段,确定该片段是否应当被剔除。
16.根据权利要求15所述的图形处理器,其中,在所述第一预通道操作期间,当片段引起所述深度缓冲器的更新时,如果该片段的指定深度测试函数是非排他性的,则将所述跟踪位设定为第一值,而如果该片段的指定深度测试函数是排他性的,则将所述跟踪位清除为第二值。
17.根据权利要求15所述的图形处理器,其中,在所述第二主通道操作期间,对于如下片段执行以下操作,即,该片段的深度值与该片段所相关的所述采样位置在所述深度缓冲器中的所述对应条目匹配并且该片段的用于所述第一预通道操作的指定深度测试函数是排他性:
如果所述跟踪位被设定为第一值,则剔除该片段;
而如果所述跟踪位被设置为第二值,则进一步处理该片段,并且在该点将所述跟踪位设置为所述第一值。
18.根据权利要求17所述的图形处理器,其中,如果在所述第二主通道操作期间对随后片段进行处理,并且该随后片段的深度值同样匹配该随后片段所相关的所述采样位置在所述深度缓冲器中的所述对应条目,并且该随后片段的用于所述第一预通道操作的指定深度测试函数是排他性的,则基于所述跟踪位被设置来剔除该随后片段。
19.根据权利要求14所述的图形处理器,其中,如果一基元在所述第一预通道操作期间使用排他性深度测试函数,则确定该基元是不兼容的。
20.根据权利要求14或15所述的图形处理器,其中,所述第一预通道操作还包含针对所述基元序列使用模板缓冲器对片段进行模板测试,其中,当一片段经受住所述模板测试时,相应地更新该片段所相关的所述采样位置的对应条目,以记录该片段的模板值,并且其中,所述第二主通道操作相应地包括:通过测试所述片段的模板值是否与所述片段所相关的所述采样位置在所述模板缓冲器中的对应条目相匹配,测试由所述第一预通道操作处理过并且可能已在所述第一预通道操作中更新了所述模板缓冲器的片段,以确定是否应当针对所述渲染输出进一步处理所述片段。
Applications Claiming Priority (13)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
GB2217243.1 | 2022-11-17 | ||
GB2217219.1 | 2022-11-17 | ||
GB2217239.9 | 2022-11-17 | ||
GB2217247.2 | 2022-11-17 | ||
GB2217253.0 | 2022-11-17 | ||
GB2217223.3 | 2022-11-17 | ||
US17/989,548 | 2022-11-17 | ||
GB2217236.5 | 2022-11-17 | ||
US17/989,671 US20240169639A1 (en) | 2022-11-17 | 2022-11-17 | Graphics processors |
GB2217246.4 | 2022-11-17 | ||
US17/989,671 | 2022-11-17 | ||
GB2217238.1 | 2022-11-17 | ||
GB2217245.6 | 2022-11-17 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN118052691A true CN118052691A (zh) | 2024-05-17 |
Family
ID=91049131
Family Applications (5)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311526082.9A Pending CN118052692A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
CN202311525570.8A Pending CN118052691A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
CN202311527605.1A Pending CN118052694A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
CN202311524507.2A Pending CN118052690A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
CN202311527200.8A Pending CN118052693A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
Family Applications Before (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311526082.9A Pending CN118052692A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
Family Applications After (3)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202311527605.1A Pending CN118052694A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
CN202311524507.2A Pending CN118052690A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
CN202311527200.8A Pending CN118052693A (zh) | 2022-11-17 | 2023-11-15 | 图形处理器 |
Country Status (2)
Country | Link |
---|---|
US (1) | US20240169639A1 (zh) |
CN (5) | CN118052692A (zh) |
-
2022
- 2022-11-17 US US17/989,671 patent/US20240169639A1/en active Pending
-
2023
- 2023-11-15 CN CN202311526082.9A patent/CN118052692A/zh active Pending
- 2023-11-15 CN CN202311525570.8A patent/CN118052691A/zh active Pending
- 2023-11-15 CN CN202311527605.1A patent/CN118052694A/zh active Pending
- 2023-11-15 CN CN202311524507.2A patent/CN118052690A/zh active Pending
- 2023-11-15 CN CN202311527200.8A patent/CN118052693A/zh active Pending
Also Published As
Publication number | Publication date |
---|---|
US20240169639A1 (en) | 2024-05-23 |
CN118052690A (zh) | 2024-05-17 |
CN118052692A (zh) | 2024-05-17 |
CN118052693A (zh) | 2024-05-17 |
CN118052694A (zh) | 2024-05-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105321199B (zh) | 图形处理流水线及其操作方法与介质 | |
US10755473B2 (en) | Graphics processing system | |
KR20170015232A (ko) | 그래픽 처리 시스템 | |
US11861760B2 (en) | Tile-based graphics processing | |
GB2511177A (en) | Hidden surface removal in graphics processing systems | |
US11734869B2 (en) | Graphics processing | |
CN115311120A (zh) | 图形处理系统 | |
CN118052691A (zh) | 图形处理器 | |
US20240169644A1 (en) | Graphics processors | |
US20240169647A1 (en) | Graphics processors | |
US20240169619A1 (en) | Graphics processors | |
US20240169646A1 (en) | Graphics processors | |
US20240169618A1 (en) | Graphics processors | |
US20240169648A1 (en) | Graphics processors | |
US20240169663A1 (en) | Graphics Processors | |
US20240169649A1 (en) | Graphics processors | |
US20240169645A1 (en) | Graphics processors | |
US20240169669A1 (en) | Graphics processors | |
KR20240072942A (ko) | 그래픽 프로세서 | |
WO2024105396A1 (en) | Graphics processors | |
GB2624425A (en) | Graphics processors | |
GB2624430A (en) | Graphics processors | |
GB2624431A (en) | Graphics processors | |
KR20240072941A (ko) | 그래픽 프로세서 | |
GB2624429A (en) | Graphics processors |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |