CN118052693A - 图形处理器 - Google Patents

图形处理器 Download PDF

Info

Publication number
CN118052693A
CN118052693A CN202311527200.8A CN202311527200A CN118052693A CN 118052693 A CN118052693 A CN 118052693A CN 202311527200 A CN202311527200 A CN 202311527200A CN 118052693 A CN118052693 A CN 118052693A
Authority
CN
China
Prior art keywords
primitives
primitive
channel
channel operation
sequence
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
Application number
CN202311527200.8A
Other languages
English (en)
Inventor
T·K·伊加德
S·卡卡尔拉普迪
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
ARM Ltd
Original Assignee
ARM Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by ARM Ltd filed Critical ARM Ltd
Publication of CN118052693A publication Critical patent/CN118052693A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/005General purpose rendering architectures
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/10Geometric effects
    • G06T15/40Hidden 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)”操作,使得在两个处理通道(pass)中有效地渲染基元;
图8示意性地示出了根据第一示例的用于预通道操作的处理操作的序列;
图9示意性地示出了在图8所示的预通道操作之后要执行的对应的主通道操作的处理操作的序列;
图10示意性地示出了用于以故障安全方式处理基元的回退操作的处理操作的序列;
图11示意性地示出了根据第一示例操作的图形处理器的状态机。
图12示出了根据第一示例的基元分类处理;
图13示意性地示出了根据第二示例的包括深度测试消歧机制的预通道操作的处理操作的序列;
图14示意性地示出了根据第二示例的可以在预通道操作中执行的深度测试消歧机制的示例;
图15示意性地示出了在根据第二示例的图13所示的预通道操作之后要执行的对应的主通道操作的处理操作的序列;
图16示出了根据第二示例的第二主通道操作中的对应的深度测试消歧机制。
图17例示了根据第二示例的基元分类处理,其中具有排他性深度测试函数的基元不再被视为与“预通道”操作不兼容;
图18示意性地示出了根据第三示例的执行模版测试/更新的预通道操作的处理操作的序列;
图19示意性地示出了可以在根据第三示例的第二主通道操作期间执行的模版测试消歧机制;
图20示出了在根据第三示例的图18所示的预通道操作之后要执行的对应的主通道操作的处理操作序列;
图21例示了根据第三示例的基元分类处理,其中具有某些类型的模版的基元可以与“预通道”操作兼容;
图22示意性地示出了根据第四示例的预通道操作的处理操作的序列,其中在第一预通道操作期间执行片段着色器;
图23例示了根据第四示例的基元分类处理;
图24示意性地示出了根据实施方式的示例的用于预通道操作的处理操作序列,其中以每样本基元识别信息集(其在下文中将被称为“HSR ID”缓冲区)的形式生成可见性信息;
图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是示出根据实施方式的可以如何在图块内重新开始“预通道”操作的其它细节的流程图。
在附图中适当的地方,相同的附图标记用于相同的部件。
具体实施方式
本文所述技术的第一实施方式包括一种操作图形处理器的方法,所述方法包括:
对于要针对渲染输出渲染的基元序列:
执行第一预通道操作,其中,处理基元序列中的基元以确定基元序列的“可见性”信息;
在执行第一预通道操作的同时确定将由第一预通道操作处理的基元序列中的基元与由第一预通道操作进行处理不兼容;
停止基元序列的第一预通道操作,使得关于不兼容基元省略第一预通道操作中的一些或全部,且此后执行第二主通道操作,其中,处理基元序列中的基元,直到基元序列中的紧接在不兼容基元之前的基元,以基于所确定的基元序列的可见性信息生成经渲染输出数据;以及
当第二主通道操作到达不兼容基元时:切换到第三“回退”操作并通过第三“回退”操作模式处理包括不兼容基元的一个或更多个基元的后续集合。
本文所述技术的第二实施方式包括被配置为生成渲染输出的图形处理器,图形处理器包括能够操作为针对渲染输出渲染基元序列的渲染电路,其中,图形处理器被配置为:
对于要针对渲染输出渲染的基元序列:
执行第一预通道操作,其中,处理基元序列中的基元以确定基元序列的“可见性”信息;
在执行第一预通道操作的同时确定将由第一预通道操作处理的基元序列中的基元与由第一预通道操作进行处理不兼容;
停止基元序列的第一预通道操作,使得关于不兼容基元省略第一预通道操作中的一些或全部,且此后执行第二主通道操作,其中,处理基元序列中的基元直到紧接在不兼容基元之前的基元序列中的基元,以基于所确定的基元序列的可见性信息生成经渲染输出数据;以及
当第二主通道操作到达不兼容基元时:切换到第三“回退”操作,并通过第三“回退”操作模式处理包括不兼容基元的一个或更多个基元的后续集合。
所述方法还包括(并且图形处理器被进一步配置为):
在由第三回退操作处理基元的同时确定基元序列中的另一基元应由第一预通道操作处理;以及
从第三回退操作切换到第一预通道操作,且由第一预通道操作处理包括已确定的另一基元的一个或更多个基元的后续集合应由第一预通道操作处理。
本文所述的技术大体上涉及隐藏表面去除。具体来说,本文中所描述的技术能够实现将要针对给定渲染输出而处理的基元序列内的改进的(例如且在实施方式中,样本完美的)隐藏表面去除(该基元序列可以例如是将要针对基于图块的渲染系统中的各个图块被渲染的基元序列,但是也可以是取决于期望渲染输出和所讨论的图形处理器的配置的任何其它适当限定的基元序列)。
如下文将进一步解释,这在本文中所描述的技术中通过引入初始“预通道”操作作为针对基元序列执行的渲染操作的一部分来实现,使得图形处理器在渲染基元序列时有效地被配置为渲染将在两个单独处理通道中被渲染的基元序列中的基元。
因此,当将基元序列发布到图形处理器以供渲染时,使图形处理器初始地执行第一“预通道”操作,其中,在实施方式中,将基元光栅化成相应的片段集合(每个片段对应于渲染输出内的一个或更多个采样位置的集合),且接着处理所得片段以确定与片段相关的“可见性”信息。在实施方式中,所确定的可见性信息反映该片段是否将在最终渲染输出中可见,并且因此反映该片段是否需要(并且因此应该)被进一步处理以用于渲染输出。接着在第一预通道操作期间生成的可见性信息可以被(且被)(在第二“主”通道操作期间,如下文将进一步解释)使用来确定是否应进一步处理基元序列中的基元(且因此基元)的片段。
然而,在实施方式中,基元在第一预通道操作和至少一些实际最终渲染操作(例如,片段着色)期间未完全被渲染,以确定用于与基元相关联的采样位置的经渲染输出数据(例如,以确定与基元相关联的采样位置在最终渲染输出中应具有的外观(例如,颜色)),并且最终渲染输出(例如,颜色)值的相应写出改为被延迟到第二“主”通道,其中,通过将基元再次光栅化为其相应的片段集合并渲染片段(例如且在实施方式中,通过执行片段着色器)来再次处理基元,以便确定用于与片段相关联的采样位置的经渲染输出数据。
因此,第二主通道操作产生最终的经渲染输出数据,例如颜色值集合,并相应地将其写出,例如写到相应的图块缓冲器,例如用于提供到帧缓冲器以用于显示。然而,在第二主通道对基元的片段的进一步处理是基于由第一预通道生成的可见性信息来控制的。因此,在实施方式中,执行第二主通道操作以生成用于在渲染输出内的采样位置的经渲染输出数据,且在第二主通道操作中,控制在第一预通道操作期间处理的基元的片段的进一步处理。
因此,对于可见性信息指示片段应被进一步处理的基元的任何片段,(相同的)片段(以及因此基元)在第二主通道中被进一步处理,以便完成片段的渲染,以确定与片段相关联的采样位置在渲染输出中应具有的外观。另一方面,对于可见性信息指示片段不需要针对渲染输出被进一步处理的基元的任何片段,该片段可以在此基础上被剔除,从而避免由用于该片段的第二主通道进行的一些或全部处理。
因此,执行该“预通道”操作的效果是,可以适当地剔除在预通道操作期间可以确定片段不需要针对渲染输出被进一步处理的基元的任何片段,从而避免在第二主通道“完全”处理(渲染)片段。因此,根据该实施方式,在实施方式中,在第二主通道期间执行片段“可见性”测试,该测试使用所生成的可见性信息来确定片段是否应当在第二主通道被进一步处理。如果片段没有通过可见性测试,则可以在此基础上剔除该片段,从而避免对片段的一些或全部进一步处理。因此,在实施方式中,在将基元光栅化为片段之后但在最终渲染(例如,片段着色)操作之前执行片段可见性测试。然而,通常基于可见性信息被确定为不可见的任何片段的实际剔除可以以各种合适和期望的方式来完成,并且可以在第二主通道期间的任何合适点处完成,如下面将进一步解释的。
因此,该方法的益处在于,因为整个基元序列由第一预通道向前处理以确定可见性信息,所以可见性信息反映正被处理的基元序列中的所有基元(和片段)的全部可见性,其进而允许例如且在实施方式中的更优化隐藏表面去除,使得可以针对第二主通道剔除基元序列中的基元的任何和所有不可见片段。因此,这可以允许改进的(例如并且在实施方式中样本完美的)隐藏表面去除。
此外,因为预通道专用于生成用于控制主通道的片段处理的可见性信息,所以在预通道期间执行的处理可以为此目的而被优化。
因此,本文中所描述的技术可以实现具有特别有效且硬件友好的实现的改进的隐藏表面去除(例如,不需要任何基元重新排序机制或用于在单个渲染通道期间跟踪基元可见性信息以试图“在飞行中”剔除片段的任何机制)。举例来说,在实施方式中,如下文将进一步解释,第一预通道操作可以被(且被)例如图形处理器自动触发,且在实施方式中,使得图形处理器被配置为响应于渲染基元序列的适当命令(例如,响应于适当渲染命令)而自动发起用于处理基元序列的“预通道”操作。
通过将图形处理器配置为自动执行此类预通道操作作为响应于渲染基元序列的命令而执行的渲染操作的一部分,可以在硬件中更有效地管理期望处理,因为预通道操作的控制完全由图形处理器执行,例如且在实施方式中,无需用户规范。因此,这可以减少应用编程器的负担,因为图形处理器(硬件)在实施方式中被配置为自动执行预通道操作以实现对针对场景绘制的任何基元序列的隐藏表面去除,作为例如响应于渲染给定基元序列的命令(例如且在实施方式中为渲染图块的命令,如下文将进一步解释)而执行的标准渲染操作的一部分。
因此,实施方式有助于更有效和自动的硬件实现。然而,这意味着图形处理器应且在实施方式中能够处理可以由应用指定的所有不同类型的基元(及不同基元特性),包括可以与使用根据本文所述技术的预通道操作来处理基元相关联的任何潜在副作用。
在这方面,申请人还认识到,可能不适合或不可能以上述方式通过在两个单独通道中渲染基元来处理基元序列中的每个和每一个基元,例如,因为可能存在不能在两个单独的步骤中被安全地处理的一些基元(使得它们与这里描述的技术的预通道操作不兼容)。
这可能是这种情况的原因的各种示例,但通常这可能是因为基元的属性(如应用所指定的)意味着在第一预通道操作期间执行的处理可能潜在地引入一些副作用,这意味着如果在第二主通道操作期间再次处理基元,则这可能将伪像引入最终渲染输出中。示例可以是基元是透明的,其中需要特定类型的模版化(stencilling),或者通常其中基元需要从缓冲器读取以确定其最终渲染输出覆盖。另一示例可以是需要运行片段着色器以确定与基元相关联的覆盖。在此情况下,如果在第一预通道操作期间不启用片段着色,那么预通道可能错误地决定可以剔除基元。在这方面,例如根据在各个处理通道期间执行的特定处理,各种其它示例将是可能的。
因此,可以存在在处理基元序列时可能遇到的各种不同类型的基元,并且为了满足各种API要求,图形处理器应且在实施方式中能够相应地处理所有不同类型的基元而不引入伪像。
为了解决此问题,且允许本文中所描述的技术有效地用于可以针对渲染输出而限定的所有不同类型的基元,提供第三“回退”操作,使得当图形处理器对基元序列执行预通道操作时,如果在第一预通道操作期间遇到被确定为与以此方式处理不兼容的基元(因为无法确保可以在两个单独通道中安全地处理基元,例如,没有潜在引入伪像),则至少关于该基元停止预通道操作,并且随后用在第三“回退”操作模式中操作的图形处理器来处理(即,光栅化和(如果必要的话)渲染)不兼容基元。
通过提供该第三“回退”操作模式,这接着确保不能(安全地)在两个单独通道中渲染的任何基元仍可以由图形处理器有效且自动地处理,而没有将任何错误或伪像引入最终渲染输出中的风险。例如,在实施方式中,第三回退操作模式被配置为能够以“故障安全”方式处理(渲染器)基元,例如通过在单个渲染操作中,例如以基于光栅化的渲染系统的正常方式,光栅化和渲染(必要时)基元以确定相应的渲染输出值。
因此,当执行第一预通道操作时,只要序列中的基元与由预通道操作处理的基元兼容,则基元由第一预通道操作处理以确定期望的可见性信息。也就是说,只要当前基元与预通道操作兼容,就由第一预通道操作等对待处理的序列中的下一个基元进行处理,直到处理到达基元序列的末尾。在实施方式中,接着再次通过第二主通道操作来处理基元,以确定对应的经渲染输出数据,其中基于所确定的可见性信息相应地控制基元的处理。
另一方面,如果被处理的基元序列中的基元被确定为与预通道操作不兼容,则在该点处停止针对基元序列的第一预通道操作。因此,对于不兼容基元,省略了第一预通道操作的一些或全部,并且不兼容基元随后由第三回退操作处理。
根据本文中所描述的技术,在关于基元序列中间的基元(不兼容基元)停止第一预通道操作之后,接着针对(相同)基元序列例如且在实施方式中从开始执行第二主通道操作,使得迄今已由第一预通道操作成功处理的基元接着由第二主通道操作再次处理。因此,在停止第一预通道操作之后,接着执行第二主通道操作以处理基元,直到导致第一预通道操作停止的不兼容基元。
直到序列中的不兼容基元的位置的被处理的(相同)基元因此再次由第二主通道操作来处理以生成关于那些基元的期望的经渲染输出数据,其中,基元的渲染相应地基于在第一预通道操作期间确定的可见性信息来控制。然而,当第二主通道送操作到达不兼容基元时,处理随后切换到第三“回退”操作以处理不兼容基元。如上所述,在回退操作模式中,在实施方式中,以“故障安全”方式处理基元。因此,当以第三回退操作模式操作时,在实施方式中,例如以用于基于光栅化的渲染的正常方式,在单个渲染操作中对基元进行光栅化和渲染以生成期望的经渲染输出数据。
通过允许图形处理器在遇到不兼容基元时切换到此类第三回退操作,图形处理器因此能够识别并且处理异常情况,同时仍继续适当地渲染基元,该该异常情况种,基元与使用本文中所描述的技术的预通道操作进行处理不兼容。这可能会损失一些隐藏表面去除效率,但在确保更安全和完全兼容的硬件实现方面是有益的。
本申请人在这方面进一步认识到,在这样的布置中,在不兼容基元已经被处理之后,随后返回到第一预通道操作是可能的和期望的。也就是说,在已使用第三回退操作适当地处理不兼容基元之后,例如且在实施方式中,可能且期望恢复到使用第一预通道操作来处理基元序列中的后续(兼容)基元,以提供增加的隐藏表面去除。因此,在此描述的技术提供了用于当可能时在基元序列内从第三回退操作模式切换回第一预通道操作的有效机制。
根据本文中所描述的技术,在不兼容基元已由第三回退操作处理之后,当遇到另一(例如,下一个)兼容基元时,图形处理器可以恢复到第一预通道操作,使得第一预通道操作从另一兼容基元有效地重新开始,其中包括另一兼容基元的一个或更多个基元的后续集合接着由第一预通道操作相应地处理。以此方式,在实施方式中本文中所描述的技术允许在基元序列内持续改进的隐藏表面去除,甚至当基元中的一些与使用根据本文中所描述的技术的两级预通道操作进行处理不兼容时。
因此,本申请人认识到,当以上述方式处理基元时,其中图形处理器试图在两个级中处理基元(即,通过执行第一预通道操作且此后执行第二主通道操作),但能够切换到第三回退操作以在必要时以“故障安全”方式处理基元,即,响应于第一预通道操作在此类第三回退操作被触发之后遇到不兼容基元时,可以更好地尝试恢复到第一预通道操作(例如,而非简单地在第三回退模式中继续渲染基元,直到基元序列完成)。
例如,典型图形处理工作可能需要渲染越来越大的基元序列。此外,通常情况下,不兼容基元之后可以是与由第一预通道操作处理兼容的一个或更多个基元的序列。举例来说,当使用诸如帧缓冲器提取或子通道融合的扩展时,或当几何结构序列跟随图块着色器时,情况常常如此。在此情况下,如果图形处理器在切换到第三回退操作之后仅在第三回退操作中继续,直到已处理基元序列中的所有基元为止,那么在一些情况下可能存在隐藏表面去除效率的显著降低,且因此存在整体图形处理性能的显著下降。
因此,至少在不兼容基元后面跟随有可以由第一预通道操作处理的其它基元的情况下,本文中所描述的技术促进增加的隐藏表面去除,以借此提供整体上更有效的图形处理操作。
根据在此描述的技术的特定要求,可以以任何适当和期望的方式来执行对图形处理器在预通道操作和第三回退操作模式之间切换的控制。
通常,基于在执行第一预通道操作时确定将由第一预通道操作处理的基元序列中的基元与由第一预通道操作进行处理不兼容来执行从第一预通道操作到第三回退操作模式的切换的控制和触发。
因此,根据本文中所描述的技术,响应于确定基元与由第一预通道操作进行处理不兼容,接着关于该基元省略第一预通道操作的全部中的一些,且在该点处停止用于基元序列的第一预通道操作。如下文将进一步解释,接着执行第二主通道操作以完成对基元的处理,直到(但不包括)不兼容基元,例如且在实施方式中,生成关于那些基元的期望的经渲染输出数据。当第二主通道操作到达不兼容基元时,针对不兼容基元省略第二主通道操作的一些或全部,并且然后作为代替由第三回退操作来处理不兼容基元。
在实施方式中,基于适当的基元分类来确定基元是否与由第一预通道操作处理兼容(或不兼容)。在实施方式中,对于要在第一预通道操作期间处理的每个基元,确定该基元是否与由第一预通道操作处理兼容。为了便于此,可以执行基元分类步骤,基元分类步骤基于基元的一个或更多个性质来确定基元是否与由第一预通道操作处理兼容。
因此,在实施方式中,所述方法还包括将基元序列中的基元分类为与由第一预通道操作处理兼容或不兼容的步骤。如下文将进一步解释,存在各种条件,其可以意味着基元与以本文中所描述的技术的方式被处理不兼容,且分类步骤通常涉及检查一个或更多个(且在实施方式中为任何)此类条件。
该基元分类可以在运行时执行,例如作为渲染操作的一部分,例如并且在实施方式中,作为第一预通道操作的一部分。然而,通常,预先知道基元是否与预通道操作不兼容。因此,在一些实施方式中,例如由图形处理器的驱动器预先执行整个基元分类,然后将基元分类的结果编译成单个指示符(例如,标志),且在接着与基元相关联的实施方式中,指示基元是否与预通道操作兼容。在这种情况下,在第一预通道操作期间执行的基元分类步骤包括基元分类检查步骤,该基元分类检查步骤使用指示符来确定基元是否与预通道操作兼容。
各种其它布置将可能用于用信号通知/确定哪些基元与由第一预通道操作进行处理不兼容。
在此方面将了解,哪些基元与使用本文中所描述的技术的预通道操作进行处理不兼容可取决于图形处理器的配置,并且特别是,取决于预通道操作的配置。例如,在必须执行片段着色器以确定与基元相关联的覆盖的情况下,在某些情况下,例如如果预通道根本不执行片段着色器,则简单地将基元标记为不兼容可能是适当的。然而,还可以将预通道配置为例如运行至少部分片段着色器,以便将预通道暴露于足够信息以生成期望的可见性信息,同时仍然避免对片段进行完全着色并写出相应的(颜色)值。因此,一般来说,预通道可以根据期望或多或少地复杂,且因此可能能够或可能不能够处理各种不同类型的基元。
因此,根据预通道操作的配置,有可能处理预通道中的一些副作用,并且给定基元是否与预通道不兼容将相应地确切地取决于如何配置预通道。在这方面,存在各种选项来确定给定基元是否与预通道不兼容。然而,一般来说,将预先知道基元的特性是否意味着不应针对预通道操作处理基元,且因此可以根据期望基于基元的一个或更多个特性来确定基元是否与预通道不兼容并相应地标记这些基元,如上文所描述的。
根据本文所描述的技术,响应于第一预通道操作遇到不兼容基元,在该点处停止针对整个基元序列的第一预通道操作。
可以以任何适当和期望方式来执行响应于确定基元与预通道操作不兼容而停止预通道操作。
因此,在一些实施方式中,停止基元的预通道可以包括立即在该点处终止基元的预通道操作,且在实施方式中终止基元序列的预通道操作。然而,在一些实施方式中,执行“软”停止操作,例如且在实施方式中,其中当第一预通道操作停止时,对基元序列的处理继续但所有输出均被禁用,使得对基元的处理继续到基元序列的末尾但不生成任何其它(可见性)信息。在那种情况下,可见性信息的内容将是相同的(因为没有生成另外可见性信息),但是这种方法可以相对更容易管理,例如在硬件中,因为它避免了必须停止处理并在基元序列中间存储出中间预通道状态,并且一旦根据软停止操作已经处理完所有基元,就可以写出由第一预通道操作生成的可见性信息。在此情况下,如下文将进一步解释的,实施方式中的图形处理器跟踪哪些基元实际上已由第一预通道操作处理,例如以促进在已处理一个或更多个不兼容基元之后随后重新开始第一预通道。可以设想用于停止预通道的各种其它布置。
当第一预通道响应于第一预通道遇到不兼容基元而停止时,任何预通道状态(例如,包括迄今生成的可见性信息)可以因此相应地被写出以允许对基元序列的继续处理,如下文将进一步解释的。在一些情况下,触发终止预通道的不兼容基元的身份和/或位置也可以在此级被写出(但是通常这可能不是必需的,因为基元在实施方式中被分类(为兼容的或不兼容的)且可以在第二主通道期间通过执行如在第一预通道中执行的基元分类检查的对应步骤来如此识别)。
如上所述,当第一预通道操作由于第一预通道操作遇到不兼容基元而停止时,接着执行第二主通道操作以便再次处理基元序列中的基元直到不兼容基元,以生成用于那些基元的相应的经渲染输出数据。因此,执行第二主通道以生成用于基元的经渲染输出数据,直到但不包括不兼容基元。当第二主通道到达不兼容基元时,对于不兼容基元省略第二主通道操作的一些或全部,并且图形处理器改为切换到第三回退操作以处理不兼容基元。然后通过第三回退操作相应地处理不兼容基元和可选的一个或更多个后续基元。
可以以各种合适的方式来控制和触发从第二主通道操作到第三回退操作的切换,但在实施方式中,这通过使第二主通道操作还检查基元分类以确定基元是否与预通道操作不兼容(例如,以与上文针对第一预通道操作描述的相同方式)来控制。也就是说,在实施方式中,在预通道中使用基元分类来确定是否应停止预通道(使得发起主通道),且在主通道中使用基元分类来确定主通道中的处理何时已到达不兼容基元,此时图形处理器切换到回退模式以便以“故障安全”方式渲染基元。
在实施方式中,第二主通道中的基元分类检查以与第一预通道中的基元分类检查相同的方式执行。例如,在实施方式中,基元被预分类,并且在两个通道中的基元分类检查涉及检查适当指示符,例如标志。然而,这不需要是这种情况。例如,上面还设想,可以在第一预通道操作期间在运行中执行基元分类,在这种情况下,可以存储基元分类的结果以用于对第二主通道的基元分类检查。在这点上,各种其它布置也是可能的。
根据本文所描述的技术,图形处理器还能够响应于确定在基元序列内存在另一兼容基元而从第三回退操作切换回到第一预通道操作。因此,当可能这样做时,在此描述的技术允许在切换到第三回退操作之后在基元序列内重新开始第一预通道操作。
从第三回退操作切换到第一预通道操作的控制可以以任何适当和期望的方式来执行,但是在实施方式中还基于基元分类,例如并且在实施方式中,基于与以上关于第三回退操作的触发所描述的基元分类相同的基元分类。因此,实施方式中的第三回退操作模式还包括(检查)基元分类的步骤。然而,在一些实施方式中,更保守地执行从第三回退操作模式切换回来,且因此可以提供额外逻辑以促进此。在这点上,如下面将解释的,各种布置是可能的。
例如,为了确保安全的渲染操作,每当遇到不兼容基元时,图形处理器应当(并且在实施方式中确实)切换到第三回退模式。因此,在实施方式中,基元序列中的第一不兼容基元将以上述方式触发停止第一预通道操作并随后通过第三回退操作来处理不兼容基元。
在一些实施方式中,无论何时遇到与第一预通道操作兼容的另一基元,图形处理器都可以相应地尝试从第三回退操作模式切换回第一预通道操作。即,可以基于每基元执行切换回第一预通道操作以处理另一兼容基元的决定,类似于响应于不兼容基元停止第一预通道操作的决定。在此情况下,图形处理器可以仅在遇到下一个兼容基元之前在第三回退操作中继续处理基元,此时图形处理器切换回到第一预通道操作。这尤其在不兼容基元相对较稀少的典型情况下可以很好地工作,使得基于每基元的切换可以至少平均地提供改进。
然而,本申请人认识到,在可能导致图形处理器在不同渲染模式之间重复切换的情况下存在风险,这可能相应地降低整体图形处理性能(例如速度)并增加能量消耗。例如,在最坏的情况下,对于包括兼容基元和不兼容基元的交替序列的基元序列,将使图形处理器在每个基元的预通道和回退操作之间切换。在此描述的技术在这种情况下至少仍可以提供改进的隐藏表面去除,但整体处理可能比简单地以正常方式渲染所有基元(例如,通过简单地针对序列中的所有基元使用第三回退模式)效率低。
因此,在实施方式中,本文所描述的技术试图在从第三回退操作切换回第一预通道之前识别基元序列内的多于一个(连续)兼容基元的后续子序列。在这点上可以使用各种试探法来试图识别多于一个兼容基元的这种子序列。
例如,这可以通过在恢复到第一预通道操作之前等待遇到阈值数量的兼容基元(的序列)来完成。这可以很好地工作,因为通常情况下要处理的基元序列中的相邻基元具有类似的特性,这意味着它们可以以相同的方式被处理。因此,在实施方式中,不是每当遇到另外兼容基元时尝试切换回第一预通道操作,而是仅在已经遇到阈值数量的另外兼容基元之后触发切换回第一预通道操作。在这种情况下,可以根据期望设置阈值(例如,在触发切换回第一预通道操作之前需要遇到的其它兼容基元的阈值数量可以根据期望是两个、三个、四个或更多基元)。因此,可以使用适当的计数器来跟踪遇到的兼容基元的数量,并相应地控制该切换(如果遇到不兼容基元,则重置计数器)。
作为另一示例,可以在第三回退操作模式期间预先查看基元序列以有效地预执行基元分类(检查)步骤。以这种方式,可以预先识别兼容基元的集合,从而确定在切换回第一预通道操作时是否有益处。
因此,在实施方式中,在由第三回退操作模式处理基元的同时确定基元序列中的另一基元应由第一预通道操作处理的步骤可以包括应用试探法来确定另一(兼容)基元是否应实际上触发到第一预通道操作的切换。
在这点上,用于控制第三回退操作模式的停止和随后切换回到第一预通道操作的各种其它布置将是可能的。
根据本文所描述的技术,因此可以致使图形处理器不仅响应于遇到不兼容基元而从第一预通道操作切换到第三回退操作,而且在存在可以由第一预通道操作处理且应由第一预通道操作处理的其它基元的情况下还能够随后切换回到第一预通道操作。如上文所暗示的,为了例如促进图形处理器在这些操作之间的切换且避免在停止第一预通道操作且进行到第三回退操作(或反之亦然)的转变时可能引入伪像,图形处理器应(且在实施方式中确实)存储合适的状态或信息以允许基元序列的处理例如在此类切换事件之后相应地继续,且在实施方式中,当以新操作模式继续处理时,以能够使用来自先前操作模式的处理结果的更无缝方式继续。
举例来说,且如下文将进一步解释,在实施方式中,基于在第一预通道操作期间处理的基元的片段的深度值来生成由第一预通道操作生成的可见性信息(且其被用于控制第二主通道操作中的片段的处理)。因此,第一预通道操作可以并且在实施方式中确实涉及更新用于基元序列的深度缓冲器。在根据本文所述技术的正常操作中,接着在第二主通道期间使用基于在第一预通道期间生成的深度值的深度缓冲器或其它可见性信息来控制片段处理。当针对基元序列停止第一预通道操作,且图形处理器随后切换到第三回退操作以继续处理基元序列时,实施方式中的第三回退操作还执行深度测试(例如,以正常方式)。
因此,在实施方式中,由中止的第一预通道操作产生的深度缓冲器被携带通过该转变,使得深度缓冲器的内容(反映到目前为止处理的基元的深度缓冲器,即,直到不兼容基元的位置)也可以由第三回退操作使用。在实施方式中,第三回退操作接着继续基于第三回退操作对基元进行深度测试来更新深度缓冲器,且在随后执行切换回到第一预通道操作的情况下,当生成将由恢复的第一预通道操作处理的后续基元的可见性信息时,在实施方式中,在第三回退操作停止的点处的深度缓冲器的内容接着可用于在恢复的第一预通道期间使用(且接着被使用),例如且在实施方式中,允许在重新开始第一预通道操作时继续改进隐藏表面去除。
因此,当图形处理器从第一预通道操作模式转变到第三回退操作时,在实施方式中保留用于基元序列的深度缓冲器,且由第一预通道操作处理到目前为止(直到触发转变的不兼容基元的点)的处理所生成的深度缓冲器的当前内容接着在第三回退操作期间被用于对基元(片段)进行深度测试。
相应地,当图形处理器从第三回退操作切换回第一预通道操作时,在实施方式中,深度缓冲器的内容再次由第一预通道操作保留并使用,以继续生成将由恢复的第一预通道操作处理的基元序列(或子序列)的可见性信息。
(相反,如下面将进一步解释的,实施方式中的第二主通道操作不更新深度缓冲器。因此,虽然深度缓冲器在实施方式中仍可以在第二主通道期间用于对在第二主通道期间处理的基元的片段进行深度测试,使得其内容在实施方式中在从第一预通道切换到第二主通道时仍保留,但在实施方式中在第二主通道期间禁用任何深度缓冲器写入。因此,在实施方式中,只有第一预通道操作和第三回退操作能够(并且被允许)更新深度缓冲器。)
在从第三回退操作到第一预通道操作的转变之后,当恢复第一预通道操作时,可以针对整个基元序列生成在恢复的第一预通道操作期间生成的可见性信息,或可以仅针对将由恢复的第一预通道操作处理的基元子序列生成可见性信息。在这种情况下,在一些实施方式中,可以为每个(恢复的)预通道操作对基元重新编索引,以便生成指示哪些基元可能需要为哪些采样位置进一步被处理的进一步数据结构(在这方面,基元编索引的目的将在下面进一步解释)。在这点上,根据提供可见性信息的形式,各种布置是可能的。
在实施方式中,还在第一预通道和第三回退操作之间的这种转变期间跟踪到目前为止已将基元序列中的哪些基元处理为完成,以便潜在地生成所渲染的输出数据(即,哪些基元已通过执行第一预通道和第二主通道操作两者或通过执行第三回退操作被处理完成)。通过跟踪到目前为止哪些基元已被处理完成,在实施方式中,这允许图形处理器重新开始对来自期望基元的基元序列的处理(使得处理可以有效地快进通过基元序列并从任意基元恢复)。因此,这可以例如且在实施方式中通过避免必须重复已处理的基元的实质处理来促进图形处理器在单个基元序列内的操作模式之间的切换。
举例来说,当重新开始第一预通道操作时,使得存在从第三回退操作切换回到第一预通道操作,这是通过跟踪到目前为止已处理哪些基元来实现的,只要深度缓冲器(和用于重新开始预通道操作的任何其它期望信息)可用,则恢复的第一预通道操作可以(且在实施方式中确实)跳过已被处理的任何基元的实质处理,使得第一预通道操作可以从触发第一预通道操作的重新开始的进一步兼容基元的位置有效地恢复处理。
这可以根据期望以各种合适的方式进行。例如,在实施方式中,可以用适当的状态来注释基元,该状态指示它们先前是否已经以任一方式被处理。在此情况下,仍可在恢复的预通道操作期间处理基元,但是在实施方式中,在第一预通道操作中在此基础上(例如且在实施方式中,在恢复的预通道操作开始时)相对较早地有效地剔除基元,使得在恢复的预通道操作期间不发生基元的实质上重复处理。这可以相对更简单地实现,因为它不需要对如何获得用于处理的基元进行任何改变(例如,可以根据其指定的渲染顺序(例如来自相应的基元列表)获得用于以正常方式进行处理的所有基元,但是已经被处理的基元然后可以在第一预通道操作期间被剔除,以避免对这些基元的实质重复处理)。因此,该方法可以促进更有效的硬件实现。然而,各种其它布置也是可能的。举例来说,在其它实施方式中,当在操作模式之间转变时,图形处理器可以被配置为写出足够的信息以允许处理从基元序列中的期望基元重新开始,接着可以在重新开始第一预通道操作以从期望基元开始时相应地使用所述信息。
因此,所有这些的效果是提供增加的隐藏表面去除。特别地,如上所述,根据在此描述的技术的两级预通道操作允许增加的(例如,样本完美的)隐藏表面去除。然而,本文描述的技术认识到一些基元不能(安全地)以这种方式处理。因此,本文中所描述的技术提供用于在此类预通道操作与其中以“故障安全”方式处理基元的第三回退操作之间来回切换图形处理器的有效机制。这确保了基元可以继续被安全地处理,同时提供更优化的隐藏表面去除。
因此,与其它可能的方法相比,本文所述的技术可以提供各种益处。
根据在此描述的技术的特定要求,图形处理器可以以任何适当和期望的方式配置。
本文所描述的技术尤其涉及基于图块的渲染。因此,图形处理器可以具有图形处理器在执行基于图块的渲染时可以具有的任何合适且期望的处理级和/或元件。
这里在实施方式中描述的技术的图形处理器包括几何处理(平铺)电路和渲染电路。
几何处理(平铺)电路被配置成生成基元列表。可以以任何合适的方式(例如,以用于生成基元列表的正常方式)来进行基元相对于图块的排序。可以针对渲染输出的任何适当区域准备基元列表。因此,在基元列表与实际渲染图块之间可以存在或可以不存在一对一的对应关系。
在实施方式中,一旦处理了所有几何形状,就将基元列表写出,例如写到外部(例如主)存储器。
然后在随后的渲染状态期间使用基元列表,以便执行各个图块的实际渲染。因此,在实施方式中,图形处理器的渲染电路包括基元列表读取电路,该基元列表读取电路被配置为:当发布用于渲染的图块时,使用应用于图块的一个或更多个相应基元列表来识别应当针对该图块处理的基元序列。
因此,在实施方式中,基元列表读取电路被配置为例如从存储器获得基元列表,识别应当针对图块处理的基元序列,并且发布所识别的基元以用于渲染。例如根据基元列表的格式,这可以以任何适当和期望的方式来完成。例如,在基元列表应用于渲染输出的分层布置区域的情况下(使得在基元列表和要渲染的图块之间不必存在一对一的对应关系,并且使得给定图块可以与多个基元列表相关联),识别基元序列的步骤可以包括处理多个基元列表,并且将来自多个基元列表的基元合并为期望的渲染顺序。
在实施方式中,响应于渲染图块的命令来执行这些操作。然后将所识别的基元相应地发布到渲染流水线中以供进一步处理,如下文将进一步解释。然而,在一些实施方式中,可以在图形处理器执行触发预通道操作的渲染命令之前(且例如预取)识别基元序列。在这点上,各种布置是可能的。
这里描述的技术具体涉及对被标识为要处理的基元执行的渲染操作。在实施方式中,以流水线方式执行渲染作为一系列处理级。根据本文所描述的技术的要求,渲染流水线通常可以包括图形处理(渲染)流水线可以包含的任何合适且期望处理级。
特别地,根据在此描述的技术的渲染使用基于光栅化的方法(其可以包括传统的基于光栅化的渲染,但是也可以包括混合光栅化/射线跟踪方法)。
因此,本文所述技术的图形处理器的渲染电路(流水线)通常包括光栅化器和渲染器,光栅化器用于将基元处理为相应的片段集合,渲染器被配置为处理(渲染)所得片段,以确定相应采样位置在最终渲染输出中的外观(例如,颜色)。
光栅化器(光栅化器电路)可以被配置成以任何适当和期望的方式操作,例如按已知光栅化布置。其应操作以生成用于根据采样位置阵列中的哪些采样位置(或哪些采样位置集合)覆盖渲染输出的区域来处理由光栅化器覆盖(至少部分地)接收的给定基元等等的图形片段。
实施方式中的光栅化器针对由多个采样位置的每个集合(例如,采样掩码)覆盖的和/或针对多个采样位置的每个集合的每个采样位置生成图形片段,多个采样位置被发现为包括由被光栅化的所述(和每个)基元覆盖的采样位置(并且否则出于另一原因,不从处理中剔除该基元,例如通过基元未能通过早期深度测试)。
相应地,由光栅化器生成的每个片段可以根据期望表示单个采样位置或多个采样位置(与其相关联)。在实施方式中,每个片段表示多个采样位置的集合,在实施方式中表示四个采样位置的集合(并且在实施方式中表示2×2阵列)。
图形处理器的渲染器(片段处理电路)应能够操作为渲染(着色)其接收的图形片段以生成期望的输出图形片段数据。它可以包含任何适当的和期望的渲染元件,并且可以以任何适当的和期望的方式来配置。因此,例如,它可以包括固定功能渲染流水线,包括一个或更多个固定功能渲染级(电路),诸如纹理映射器、混合器、雾化单元等。在实施方式中,渲染器包括片段着色器(着色器流水线)(即,可编程处理电路,其可操作且可被编程为对片段执行片段着色程序以便渲染所述片段)。
渲染器(片段处理电路)将处理其接收到的片段,以随后生成输出渲染片段数据,该渲染片段数据随后在实施方式中被写入外部存储器中的输出缓冲器,例如帧缓冲器,以供使用(例如,在显示器上显示帧)。渲染片段数据可以经由中间缓冲器(例如,图块(例如,颜色)缓冲器)写入到(外部)输出缓冲器(如在基于图块的图形处理系统中的情况)。
要生成的渲染输出可以包括要由图形处理器生成的任何渲染输出。因此,其可以包括例如将在基于图块的图形处理器中生成的图块和/或输出片段数据的帧的全部或部分。
如上所述,在本文所述的技术中,基元的渲染在两个单独的处理通道中有效地执行:执行第一“预通道”以生成正被处理的基元序列的可见性信息,且执行第二“主”通道,其执行实际最终渲染操作以产生最终渲染输出(例如,颜色)值。
因此,第一预通道的结果是生成期望的“可见性”信息。例如根据可见性信息的格式,在第一预通道中执行的处理可以包括任何适当的和期望的处理。然而,一般来说,第一预通道操作包括将基元光栅化成一个或更多个片段的相应集合,且接着执行一个或更多个片段处理操作以确定期望的可见性信息。在实施方式中,可见性信息通常基于片段深度值。即,在特定采样位置处哪个片段将是可见的将通常是(并且在实施方式中是)由哪个片段在场景中最前面(即,具有最接近的深度值)来确定的。
因此,在实施方式中,第一预通道包括对片段进行(早期)深度测试以更新用于渲染输出的深度缓冲器。深度缓冲器存储用于渲染输出的每采样位置深度值的集合。因此,在实施方式中,第一预通道操作包括对照存储在深度(Z)缓冲器中的对应深度值测试(当前)片段的深度值。如果片段经受住深度测试,那么在实施方式中更新深度缓冲器以包括当前片段的深度值,依此类推,直到已处理完基元的所有片段为止。因此,在第一预通道的末尾处的所得深度缓冲器整体上表示用于基元序列的深度缓冲器。
在一些实施方式中,第一预通道因此包括将基元光栅化为一个或更多个片段的相应集合,且接着对片段进行深度测试以更新深度缓冲器。在实施方式中,深度缓冲器然后在第一预通道结束时被写入适当的存储器。深度缓冲器可以被写出到外部存储器,但在实施方式中,深度缓冲器被写到本地存储器,例如已被分配用于当前渲染操作(例如用于正被渲染的图块)的RAM的专用部分,且一旦当前渲染操作(当前图块的渲染)完成,该本地存储器可以因此被重写。在这点上,各种布置是可能的。
在实施方式中,第一预通道中的片段处理在该点结束,即,在写出深度缓冲器(以及可能期望由第一预通道操作生成并写出的任何其它可见性信息)之后结束。因此,在一些实施方式中,在(早期)深度测试被执行并且深度缓冲器被相应地更新(根据需要)之后,在第一预通道中的片段处理被完成,而不需要例如执行片段着色器以进一步渲染片段(例如,以确定最终渲染输出的颜色值)。
然而,在一些实施方式中,可以执行部分片段着色器以更新深度缓冲器。举例来说,这可以适合于处理其中需要片段着色器来确定片段的深度值和/或采样位置覆盖的基元。(否则,着色器可能修改渲染输出值的基元可能需要被且在实施方式中被视为不兼容基元。)在此情况下,最终(颜色)输出在实施方式中仍被禁用且片段着色器运行得刚好足够远以更新深度缓冲器,但片段未被完全渲染。
实施方式中的预通道还包括如上所述的基元分类检查步骤,以确定基元是否与预通道兼容。在实施方式中,在预通道开始时执行基元分类检查的步骤,例如,在实施方式中,在光栅化基元之前。然而,其它布置也是可能的。
如果基元是兼容的,则预通道如正常那样继续。否则,如果基元与预通道不兼容,则在实施方式中不对该基元执行预通道。在此情况下,在实施方式中,接着发起主通道以处理基元序列中的基元,直到紧挨在不兼容基元前面(在不兼容基元之前)的基元,且当主通道到达不兼容基元时,接着将图形处理器切换到回退操作模式(如上文所论述)。
在完成第一预通道(或例如响应于遇到不兼容基元而终止第一预通道)之后,执行第二主通道操作以根据需要进一步处理在第一预通道期间已处理的基元,以生成最终渲染输出。
因此,第二主通道的结果是例如通过执行片段着色以生成用于最终渲染输出的渲染输出(例如颜色)值的集合来生成最终渲染输出。因此,第二主通道中的处理通常可以包括将基元光栅化成其相应片段集合,且接着执行片段着色器以确定渲染输出中的采样位置的相应渲染输出值(例如,以确定相关联采样位置在最终渲染输出中应具有的外观(例如,颜色),但一般来说,渲染可以产生任何合适且期望的输出数据)。
第二主通道可以包括任何其它渲染级,诸如混合等,其可以理想地执行。在实施方式中,第二主通道还包括基元分类(检查)步骤,以确定基元是否与预通道操作兼容,并且在实施方式中,根据需要触发切换到第三回退操作模式,例如如上所述。
在实施方式中,第二主通道还包括可见性测试,其使用在第一主通道期间生成的可见性信息来控制第二主通道的基元(或片段)的处理。可见性测试的性质通常取决于可见性信息的格式。然而,在实施方式中,基于每片段执行可见性测试。因此,在实施方式中,在光栅化之后执行可见性测试。在实施方式中,在确定采样位置的渲染输出值的渲染操作之前(例如并且在实施方式中,在片段着色之前)执行可见性测试。
可见性信息可以采取任何合适且期望的形式,只要其可以以本文中所描述的技术的方式使用以在第二主通道期间控制基元的渲染即可。
例如,在第一主要实施方式中,可见性信息包括深度缓冲器本身。
在这种情况下,在预通道操作期间填充深度缓冲器。然后,主通道操作对照深度缓冲器执行可见性测试,在实施方式中,深度缓冲器包括经修改的深度测试,其中测试功能包括“等于”功能,并且对深度缓冲器的写入被禁用。
因此,在第二主通道期间,深度缓冲器被用于确定当前片段是否具有正确的深度值,如果是,则相应地进一步处理该片段(例如,着色)。另一方面,如果当前片段的深度值与深度缓冲器中的当前深度值不匹配,则可以丢弃该片段。因此,在实施方式中,在将基元光栅化为片段集合的步骤之后但在渲染片段以确定相关联采样位置应具有的外观之前(例如且在实施方式中,在片段着色器之前),针对主通道操作执行使用深度缓冲器的该片段可见性测试。然而,在实施方式中,深度缓冲器在第二主通道期间不被更新,而是在第一预通道期间被完全填充。
因此,该方法通常允许样本完全隐藏的表面去除。然而,应了解,在同一采样位置处的两个或更多个片段可以具有相同的深度值,且因此可能需要另一机制来在第二主通道期间消除此类基元的歧义。在这种情况下,通常预先知道应当渲染具有相同深度值的两个或更多个片段中的哪一个,并且因此这可以在预通道操作期间例如通过适当地注释基元或者设置适当的标志来跟踪,以控制针对相应的采样位置进一步处理哪一个片段。
然而,例如根据可见性信息的形式,各种其它布置将是可以的。
例如,在另一主要实施方式中,不是简单地使用深度缓冲器本身作为可见性信息,而是在预通道操作期间生成为基元识别信息集合(“HSR ID缓冲器”)的形式的专用数据结构,在实施方式中,该专用数据结构针对渲染输出中的每个采样位置存储相应的基元标识符,该基元标识符通过参考相关联的基元来指示应该针对该采样位置渲染哪个片段。以与第一主要实施方式类似的方式,通常可以基于深度测试来确定应针对相应采样位置处理哪一片段(且因此基元)。因此,在第二主要实施方式中,深度缓冲器在实施方式中在第一预通道操作期间被更新,例如像正常的那样。然而,根据第二主要实施方式,不是使用深度缓冲器本身作为第二主通道的可见性信息,而是在第一预通道期间生成基元识别信息集合(“HSR ID缓冲器”),且接着使用基元识别信息集合(“HSR ID缓冲器”)作为用于控制第二主通道的片段处理的可见性信息。例如,对于基于深度测试确定片段是可见的(至少基于深度缓冲器的当前状态)的任何片段,在更新深度缓冲器的同时,将相关联的基元标识符写入对应于与所讨论的片段相关联的采样位置的基元识别信息集合(“HSR ID缓冲器”)中的条目。
在这种情况下,预通道处理还可以包括相应地填充这样一组基元识别信息(“HSRID缓冲器”)。因此,这样的实施方式中的可见性信息包括或具有“基元识别信息集合(“HSRID缓冲器”)”的形式。然后,在第二主通道期间,通过适当的片段可见性测试级来消耗基元识别信息集合(“HSR ID缓冲器”),所述片段可见性测试级对照针对所讨论的采样位置被存储在可见性缓冲器中的对应基元标识符测试与当前片段相关联的基元标识符以确定是否应进一步处理片段。再次,在实施方式中,在将基元光栅化为片段集合的步骤之后但在渲染片段以确定相关联采样位置应具有的外观之前(例如且在实施方式中,在片段着色器之前),在第二主通道操作期间执行使用基元识别信息集合(“HSR ID缓冲器”)的该可见性测试。
在第二主要实施方式的实施方式中,深度缓冲器也在第一预通道期间被更新,并且保持可用于随后的使用。可以以各种方式使用深度缓冲器。例如,在一些实施方式中,实施方式中的第二主通道不对照深度缓冲器进行更新或测试。然而,在处理需要“回退”(如上所述)的情况下,第三回退操作将执行正常的深度测试,其中在第三回退操作期间深度缓冲器被更新并被对照测试。然而,至少对于一些基元,还预期深度缓冲器也可以在第二主通道期间使用。举例来说,某些基元可能能够跳过预通道处理(因为其不生成任何可见性信息,例如,其不能更新深度缓冲器,例如,某些透明基元)。在此情况下,可以在第二主通道中处理此类基元,然而此类基元将永远不匹配存储在基元识别信息集合(“HSR ID缓冲器”)中的基元标识符,且因此不能以与在第一预通道操作中可能已更新基元识别信息集合(“HSR ID缓冲器”)的(不透明)基元相同的方式被剔除(且可能需要执行不同的可见性测试)。因此,在此情况下,可能期望还允许在第二主通道期间进行深度测试以允许在可能的情况下剔除透明基元的片段。在这点上,各种布置是可能的。
在上述实施方式中,在第一预通道操作期间处理的至少一些基元的片段因此在第二主通道操作期间被再次处理,但是主通道操作包括可见性测试,其对照可见性信息(以所采取的任何形式)测试片段以控制在主通道期间对片段的进一步处理。因此,如果基元的片段在第二主通道中未能通过可见性测试,则可以关于该片段终止第二主通道。
因此,一般来说,相同的基元可以(且在实施方式中确实)在相应的处理通道中经历不同的处理。例如,在实施方式中,第一预通道至少涉及将基元光栅化为片段并执行用于生成可见性信息的深度测试。预通道可以执行或可以不执行片段着色器。然而,在实施方式中,预通道至少不被写出,并且在实施方式中也不生成最终输出(例如颜色)值。另一方面,在实施方式中,第二主通道将基元光栅化成片段,使用在预通道期间生成的可见性信息执行一些可见性测试,且接着执行片段着色以生成并输出(例如,颜色)值以用于在可见性测试之后存在的任何片段。
在预通道或主通道中执行的处理通常还可以包括可能期望的任何其它合适的处理步骤(级)。
只要基元与以本文所述技术的方式(使用预通道)处理兼容,在实施方式中(最初)使图形处理器以第一预通道模式处理基元序列中的所有基元且接着以第二主通道模式再次(从开始)处理基元序列。
因此,在实施方式中,相同的基元序列经受第一预通道操作和第二主通道操作。在这点上,例如还可以设想,处理的粒度可以在预通道和主通道之间变化。举例来说,可以针对整个图块执行预通道,但接着可以将图块细分成用于执行主通道的较小子图块,使得执行多个主通道。相应地,可以对子图块执行预通道操作,然后对多个(例如所有)子图块一起执行主通道。在这点上,各种布置是可能的。
在实施方式中,以相同的方式处理基元序列中的所有基元。然而,其它布置也是可能的,并且将渲染划分为两个单独的通道也可以允许进一步可能的优化。
例如,如果可以确定基元在已经在预通道中执行之后将没有进一步的效果,则在这种情况下,可以避免或省略在第二主通道中进一步处理基元的一些或全部,而不管可见性信息。可能是这种情况的示例是基元仅写到深度和/或模版缓冲器,但不输出颜色值。这通常是预先已知的,因此可以例如根据与基元相关联的适当状态信息(例如描述符)来确定。
还可能在第一预通道操作期间确定某些基元(整体)不需要被进一步处理。例如,在一些实施方式中,除了如上所述在第二主通道期间消耗以控制主通道中的片段处理的可见性信息之外,还可以生成“基元剔除”数据结构作为预通道的一部分,其指示已全部剔除的任何基元,以避免针对第二主通道中的那些基元进行不必要的处理。因此,如果在第一预通道操作期间确定与基元相关联的片段均不具有任何可见效应,那么在此情况下,可以相对较早地剔除作为整体的基元,例如且在实施方式中,无需任何片段处理。因此,在一些实施方式中,如果可以确定基元的所有片段都是不可见的,则可以剔除该基元。该基元剔除可以(且在实施方式中)在第二主通道的开始处(例如,在基元分类(其中执行此分类)之后),但在实施方式中在将基元光栅化为其相应片段之前完成。以此方式,可以从主通道的基元序列中去除基元,从而避免任何不必要的片段处理。由于每基元存储该信息可能是禁止的,因此实施方式使用固定大小的基元剔除数据结构。这可以根据期望来填充,并用于控制第二主通道的基元的处理。
对于在第二主通道期间跳过一些或全部处理,各种其它布置是可能的。
相应地,如果可以确定给定基元不针对预通道贡献任何有意义的输出,则可以相应地跳过用于预通道的对该基元的一些或全部处理。例如,这可以是不写出深度值或任何其它可见性信息的基元的情况。然后可以仅在主通道中(或仅在回退模式中)处理该基元。在一些情况下,甚至有可能在执行预通道操作之前识别出基元可以全部被剔除,使得基元不被任一通道处理。
另一方面,存在一些情况,其中需要在单个处理通道中处理所有基元,例如用于阻塞/流水线查询。在此情况下,图形处理器可以被配置为确保所有基元均在预通道中被处理,即使原则上可以跳过基元(因为未输出可见性信息)。或者,如果启用了阻塞/流水线查询,则这可以简单地触发回退操作。
本文描述的技术的预通道操作还与预帧着色器交互。例如,存在可以在渲染应用指定几何形状之前在某些条件下运行的各种全帧着色器。这些可以用于各种目的,例如用数据预加载深度、模版和/或颜色缓冲器。通常,因为预通道不输出颜色值,所以这里在实施方式中描述的技术直到预通道已经完成才分配颜色缓冲器。因此,在实施方式中,在预通道之后相应地执行填充颜色缓冲器(颜色读回)的预帧着色器。这还可以允许使用可见性信息来剔除回读的颜色。另一方面,在实施方式中,在预通道之前执行填充深度和/或模版缓冲器(ZS读回)的预帧着色器。
在这点上,各种其它布置和优化将是可能的。
如上所述,在实施方式中,不能(安全地)使用单独的预通道和主通道操作来处理的任何基元改为在第三回退操作模式中被处理。在实施方式中,回退操作模式以“故障安全”方式光栅化和渲染基元,例如并且在实施方式中,以基于光栅化的渲染系统的正常方式。也就是说,在回退模式期间,将基元光栅化成片段集合,且接着渲染所得片段以确定对应的渲染输出值(例如,以确定相关联采样位置应具有的外观(例如,颜色值))。
回退模式通常可以执行任何适当的和期望的片段处理。例如,在实施方式中,回退模式可以执行其它适当形式的隐藏表面去除,例如(早/晚)深度测试,例如以用于这种深度测试的正常方式。
(相反,在实施方式中,深度测试被修改用于预通道操作和主通道操作,使得在实施方式中,深度缓冲器在第一预通道操作(仅)期间被更新,而第二主通道操作则使用基于深度缓冲器的可见性信息来控制片段处理,但是在实施方式中不更新深度缓冲器。(第二主通道可以或可以执行使用深度缓冲器。然而,当在第二主通道期间使用深度缓冲器时,在实施方式中,在不更新深度缓冲器的情况下完成在第二主通道期间执行的使用深度缓冲器的任何深度测试。)类似地,在实施方式中,主通道不需要执行任何后期深度测试,因为在实施方式中,完整的片段可见性是在前面(通过预通道)确定的。然而,在这点上,各种布置是可能的。
如上所述,当在正在处理的基元序列中遇到不兼容基元时,触发回退操作模式。存在可能意味着基元与以这里描述的技术的方式进行处理不兼容的各种条件。例如,这可以包括以下中的一者或更多者:(i)基元是透明的;(ii)基元产生副作用;(iii)基元使用模版化;(iv)基元不写入到所有渲染目标;(iv)基元不写入到深度缓冲器;(v)需要着色器来确定基元覆盖;(vi)着色器发射深度值。这些条件中的哪一个意味着基元与以这里描述的技术的方式进行处理不兼容通常取决于预通道操作的配置。举例来说,如上文所提及的,在一些实施方式中,可以在预通道期间执行(部分)着色器,在此情况下,预通道可能能够处理需要着色器来确定基元覆盖的至少一些基元。作为另一示例,当可见性信息包括在预通道期间生成(根据用于确定可见性信息的上述第二主要实施方式)的专用基元识别信息集合(“HSR ID缓冲器”)时,在这种情况下,预通道可以是在预通道中处理模版化。根据图形处理器的配置,各种其它示例也是可能的。
从上文可以理解,图形处理器的渲染电路可以有效地配置成处于多个不同的渲染状态,这些渲染状态调制针对传递到渲染电路的基元执行的处理。也就是说,在实施方式中,渲染电路执行图形处理流水线,图形处理流水线可以被配置(且在使用中被重新配置)为根据图形处理器的状态执行不同处理操作。因此,当图形处理器处于第一预通道状态时,渲染电路的图形处理流水线被配置为执行第一处理操作集合以执行第一预通道操作,而当图形处理器处于第二主通道状态时,渲染电路的(相同)图形处理流水线被不同地配置为执行第二处理操作集合以执行第二主通道操作。相应地,图形处理器也可以存在于第三回退状态中,其中,渲染电路的图形处理流水线被配置(再次不同地)为执行第三处理操作集合来执行第三回退操作。因此,根据图形处理器的当前状态,可以(且在实施方式中)相应地(例如且在实施方式中)通过启用/禁用图形处理流水线内的一个或更多个处理级(或一个或更多个处理级的一个或更多个输出)来配置渲染电路以致使图形处理器执行期望处理操作。
可以按照期望以任何适当的方式来控制图形处理器的渲染状态。举例来说,如上文所提及的,可以使用分类信息来注释基元,分类信息指示基元是否与使用本文中所描述的技术的预通道操作进行处理兼容,该信息可以用于致使图形处理器切换出预通道操作模式。还可以使用合适的标记来确定图形处理器当前处于预通道状态还是主通道状态。因此,当处理基元时,可以确定图形处理器的当前渲染状态,然后图形处理器控制所执行的处理。
例如,当发布(新的)基元序列用于渲染时,实施方式中的渲染电路开始于第一预通道状态。因此,如果第一基元与预通道操作兼容,则图形处理器保持在预通道状态,并相应地执行预通道操作。然后发布下一个基元以用于处理。另一方面,如果当图形处理器处于预通道状态时遇到不兼容基元,则在实施方式中关于该基元停止预通道操作,然后在实施方式中图形处理器切换到主通道状态,其中用于基元的处理从具有配置为主通道状态的图形处理器的基元序列的开始重新开始。
类似地,当图形处理器处于主通道状态时,只要基元兼容,图形处理器就保持在主通道状态,并执行主通道操作。另一方面,当处于主通道状态的图形处理器遇到不兼容基元时,这在实施方式中触发切换到回退状态。图形处理器然后保持在回退状态并继续处理当前基元(即从主通道停止的位置继续)。
因此,在实施方式中,基于基元分类和图形处理器的当前操作模式,以这种方式控制图形处理器状态机,以便控制这里描述的技术的预通道操作。以此方式,可以控制图形处理器以在处理基元序列时适当地在操作模式(预通道/主通道/回退)之间切换。
相信其中图形处理器的渲染电路被配置在如上所述的不同渲染状态之间的这种状态机在其自身权利方面是新颖且有利的。
因此,本文中所描述的技术的另一实施方式包括被配置为生成渲染输出的图形处理器,图形处理器包括能够操作为针对渲染输出渲染基元序列的渲染电路,其中渲染电路执行图形处理流水线,图形处理流水线可以被配置为根据图形处理器的状态而执行不同的处理操作,使得当图形处理器处于第一预通道状态时,渲染电路的图形处理流水线被配置为执行第一处理操作集合以执行第一预通道操作,而当图形处理器处于第二主通道状态时,渲染电路的图形处理流水线被不同地配置为执行第二处理操作集合以执行第二主通道操作。如上所述,在实施方式中,图形处理器还可以存在于第三回退状态中,其中渲染电路的图形处理流水线被配置为执行第三处理操作集合以执行第三回退操作。
如所属领域的技术人员将了解,本文中所描述的技术的这些其它实施方式可以(且在实施方式中确实)在适当时包括本文中所描述的技术的可选特征中的任一者或更多者或全部。
因此,在实施方式中,存在单个(物理)渲染流水线,并且因此基于图形处理器的当前状态(即,图形处理器正在执行预通道或主通道等)来调制所执行的操作。然而,渲染电路还可以被配置为具有多个物理上分离的(并行)渲染流水线,这些渲染流水线可以根据渲染电路的不同状态来处理不同的操作。
各种其它布置也将是可能的。
本文描述的技术通常可以在任何合适的图形处理系统中找到应用。本文描述的技术特别涉及基于图块的渲染系统。
本文中所描述的技术可以针对图形处理流水线可用于生成的所有形式的输出(例如供显示的帧、渲染到纹理输出等)来使用。
在一些实施方式中,图形处理系统包括存储本文描述的数据的一个或更多个存储器和/或存储器设备和/或存储用于执行本文描述的处理的软件,和/或与存储本文描述的数据的一个或更多个存储器和/或存储器设备和/或存储用于执行本文描述的处理的软件进行通信。图形处理系统还可以与主机微处理器通信,和/或具有用于基于由图形处理系统生成的数据来显示图像的显示器。
在实施方式中,本文描述的技术的各种功能在单个图形处理平台上执行,该单个图形处理平台生成并输出经渲染的片段数据,该经渲染的片段数据例如被写入到用于显示设备的帧缓冲区。
本文描述的技术可以在任何合适的系统中实现,诸如基于适当配置的基于微处理器的系统。在实施方式中,本文描述的技术在基于计算机和/或微处理器的系统中实现。
本文描述的技术的各种功能可以以任何期望和合适的方式执行。例如,本文描述的技术的功能可以根据需要而在硬件或软件中实现。因此,例如,本文描述的技术的各种功能元件、级和流水线可以包括能够操作为执行各种功能等的合适的一个处理器或多个处理器、一个控制器或多个控制器、功能单元、电路/电路系统、处理逻辑、微处理器布置结构等,诸如适当配置的专用硬件元件或处理电路/电路系统、和/或被编程为以期望的方式操作的可编程硬件元件或处理电路/电路系统。
这里还应当注意,如本领域技术人员将理解的,本文描述的技术的各种功能等可以在给定处理器上复制和/或并行地执行。同样,如果需要,各个处理级可以共享处理电路/电路系统。
因此,本文中所描述的技术扩展到图形处理器且扩展到图形处理平台,所述图形处理平台包括根据本文中所描述的技术的任何一个或更多个实施方式操作的装置或根据本文中所描述的技术的任何一个或更多个实施方式的装置。经受执行上述特定功能所需的任何硬件,这样的图形处理器可以另外包括图形处理器所包括的任何一个或更多个或所有通常的功能单元等。
本领域技术人员还将理解,本文中所描述的技术的所有所描述实施方式可以(并且在实施方式中确实)包括本文中所描述的任何一个或更多个或所有可选特征。
根据本文描述的技术的方法可以至少部分地使用软件(例如,计算机程序)来实现。因此,可以看出,当从另外的实施方式中观察时,本文描述的技术包括特别适用于执行本文描述的方法的计算机软件(当计算机软件在安装在数据处理器上时)、包括用于执行所描述的方法的计算机软件代码部分的计算机程序元件(当该程序元件在数据处理器上运行时)、以及包括适于执行本文描述的方法或方法的所有步骤的代码的计算机程序(当该程序在数据处理系统上运行时)。数据处理器可以是微处理器系统、可编程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”缓冲区
到目前为止描述的示例都涉及其中在第一预通道操作期间生成的深度缓冲区(以及可选地还有模版缓冲区)被用作在第二主通道操作期间控制片段处理的“可见性”信息的实施方式。然而,设想了各种其它示例,并且在其它布置中,在第一预通道操作期间生成的“可见性”信息然后被用作在第二主通道操作期间控制处理可以采取任何合适且期望的形式。
例如,在用于生成“可见性”信息的另一布置中,不是使用深度(模版)缓冲区自身作为用于在第二主通道操作期间控制基元的进一步处理的“可见性”信息,第一预通道操作以每样本基元识别信息的专用集合的形式生成“可见性”信息,所述信息存储针对渲染输出内的相应采样位置的相应基元标识符,所述基元标识符指示应针对所关注的采样位置进一步处理哪一基元(所述基元标识符在本文中也将被称作隐藏表面去除标识符(“HSR ID”),其中每样本基元识别信息的集合对应地被称作“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确定,并且写入的值对应于包括所讨论的样本254的基元的HSR ID。以这种方式填充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与存储在HSR ID缓冲区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缓冲区)。在此情况下,可能不需要首先在第一预通道操作中处理透明基元。
以下示例例示可如何通过预通道操作处理“透明”基元。图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 (21)

1.一种操作图形处理器的方法,所述方法包括:
对于要针对渲染输出渲染的基元序列:
执行第一预通道操作,其中,处理所述基元序列中的基元以确定所述基元序列的可见性信息;
在执行所述第一预通道操作的同时,确定将由所述第一预通道操作处理的所述基元序列中的基元与由所述第一预通道操作进行处理不兼容;
停止对所述基元序列的所述第一预通道操作,使得关于不兼容基元省略所述第一预通道操作中的一些或全部,并且此后执行第二主通道操作,其中,处理所述基元序列中直到所述基元序列中的紧接在所述不兼容基元之前的基元的基元,以基于所确定的所述基元序列的可见性信息生成针对所述渲染输出内的采样位置的经渲染输出数据;以及
当所述第二主通道操作到达所述不兼容基元时:切换到第三回退操作并通过第三回退操作模式处理包括所述不兼容基元的一个或更多个基元的后续集合。
2.根据权利要求1所述的方法,所述方法还包括:
在由所述第三回退操作处理基元的同时确定所述基元序列中的另一基元应由所述第一预通道操作处理;以及
从所述第三回退操作切换到所述第一预通道操作,并且由所述第一预通道操作处理包括已确定为应由所述第一预通道操作处理的所述另一基元的一个或更多个基元的后续集合。
3.根据权利要求1或2所述的方法,其中,当所述图形处理器在操作之间切换时,所述方法包括存储合适的信息以允许后续处理操作继续处理所述基元序列,所述基元序列包括触发切换操作的基元。
4.根据权利要求1或2所述的方法,其中,所述第一预通道操作包括针对所述基元序列执行深度测试以更新深度缓冲器,并且其中,当针对所述基元序列停止所述第一预通道操作时,所述深度缓冲器的内容保持能够用于后续第三回退操作。
5.根据权利要求4所述的方法,其中,所述第三回退操作包括执行深度测试以针对所述基元序列更新深度缓冲器,并且其中,当所述图形处理器从所述第三回退操作切换回所述第一预通道操作时,所述深度缓冲器的所述内容保持能够用于后续第一预通道操作。
6.根据权利要求1或2所述的方法,所述方法包括跟踪所述基元序列中的哪些基元迄今已由所述第一预通道操作或由所述第三回退操作处理,并且其中,当所述图形处理器从所述第三回退操作切换到所述第一预通道操作时,所述方法包括在所恢复的第一预通道操作期间使用所述跟踪以避免已由所述第一预通道操作或所述第三回退操作处理的基元的一些或全部重复处理。
7.根据权利要求1或2所述的方法,其中,所述基元序列中的基元与指示所述基元是否与由所述第一预通道操作处理的基元兼容的相应指示符相关联,并且其中,所述第一预通道操作包括检查所述相应指示符以确定基元是否与所述第一预通道兼容,并且其中,停止所述第一预通道操作的步骤基于所述第一预通道操作从其指示符确定基元与所述第一预通道操作不兼容。
8.根据权利要求7所述的方法,其中,所述第二主通道操作还包括检查所述相应指示符以确定基元是否与所述第一预通道操作兼容,并且其中,基于所述第二主通道操作从其指示符确定基元与所述第一预通道操作不兼容,执行到所述第三回退操作的所述切换。
9.根据权利要求1或2所述的方法,所述方法还包括将所述基元序列中的基元分类为与由所述第一预通道操作进行处理兼容或不兼容的步骤。
10.根据权利要求1或2所述的方法,其中,在通过所述第三回退操作处理基元的同时确定所述基元序列中的另一基元应通过所述第一预通道操作来处理的步骤包括:确定所述另一基元与所述第一预通道操作兼容。
11.根据权利要求10所述的方法,其中,在通过所述第三回退操作处理基元的同时确定所述基元序列中的另一基元应通过所述第一预通道操作来处理的步骤包括:确定所述另一基元与所述第一预通道操作兼容且确定是否满足用于触发切换回到所述第一预通道操作的一个或更多个其它条件。
12.一种图形处理器,所述图形处理器被配置为生成渲染输出,所述图形处理器包括能够操作为针对所述渲染输出渲染基元序列的渲染电路,其中,所述图形处理器被配置为:
对于要针对渲染输出渲染的基元序列:
执行第一预通道操作,其中,通过将所述基元光栅化为一个或更多个片段的相应集合来处理所述基元序列中的基元,每个片段与所述渲染输出内的一个或更多个采样位置的相应集合相关联,并且其中,作为所述第一预通道操作的一部分,处理所述基元序列中的所述基元的片段以确定所述基元序列的可见性信息;
在执行所述第一预通道操作的同时确定将由所述第一预通道操作处理的所述基元序列中的基元与由所述第一预通道操作进行处理不兼容;
停止对所述基元序列的所述第一预通道操作,使得关于不兼容基元省略所述第一预通道操作中的一些或全部,并且此后执行第二主通道操作,其中,处理所述基元序列中直到所述基元序列中的紧接在所述不兼容基元之前的基元的基元,以生成针对所述渲染输出内的采样位置的经渲染输出数据,并且在所述第二主通道操作中,基于所确定的所述基元序列的可见性信息来控制对在所述第一预通道操作期间处理的基元的片段的进一步处理;以及
当所述第二主通道操作到达所述不兼容基元时:切换到第三回退操作,并且通过第三“回退”操作模式处理包括所述不兼容基元的一个或更多个基元的后续集合。
13.根据权利要求12所述的图形处理器,所述图形处理器还被配置成:
在由所述第三回退操作处理基元的同时确定所述基元序列中的另一基元应由所述第一预通道操作处理;以及
从所述第三回退操作切换到所述第一预通道操作,并且由所述第一预通道操作处理包括已确定为应由所述第一预通道操作处理的所述另一基元的一个或更多个基元的后续集合。
14.根据权利要求12或13所述的图形处理器,其中,当所述图形处理器在操作之间切换时,所述图形处理器被配置为存储合适的信息以允许后续处理操作继续处理所述基元序列,所述基元序列包括触发切换操作的基元。
15.根据权利要求12或13所述的图形处理器,其中,所述图形处理器在执行所述第一预通道操作时被配置为执行深度测试以针对所述基元序列更新深度缓冲器,并且其中,当针对所述基元序列停止所述第一预通道操作时,所述深度缓冲器的内容保持能够用于后续第三回退操作。
16.根据权利要求15所述的图形处理器,其中,所述图形处理器在执行所述第三回退操作时被配置为执行深度测试以更新用于所述基元序列的深度缓冲器,并且其中,当所述图形处理器从所述第三回退操作切换回所述第一预通道操作时,所述深度缓冲器的所述内容保持能够用于后续第一预通道操作。
17.根据权利要求12或13所述的图形处理器,其中,所述图形处理器被配置为跟踪所述基元序列中的哪些基元迄今已由所述第一预通道操作或由所述第三回退操作处理,并且其中,当所述图形处理器从所述第三回退操作切换到所述第一预通道操作时,所述图形处理器使用所述跟踪来避免在所恢复的第一预通道操作期间对已由所述第一预通道操作或所述第三回退操作处理的基元的一些或全部重复处理。
18.根据权利要求12或13所述的图形处理器,其中,所述基元序列中的基元与指示所述基元是否与由所述第一预通道操作进行处理兼容的相应指示符相关联,并且其中,所述第一预通道操作包括检查所述相应指示符以确定基元是否与所述第一预通道兼容,并且其中,停止所述第一预通道操作的步骤基于所述第一预通道操作从其指示符确定基元与所述第一预通道操作不兼容。
19.根据权利要求18所述的图形处理器,其中,所述图形处理器还被配置为检查所述相应指示符以确定在所述第二主通道操作期间基元是否与所述第一预通道操作兼容,并且其中,基于所述第二主通道操作从其指示符确定基元与所述第一预通道操作不兼容来执行到所述第三回退操作的切换。
20.根据权利要求12或13所述的图形处理器,其中,在由所述第三回退操作处理基元的同时确定所述基元序列中的另一基元应由所述第一预通道操作处理的步骤包括:确定所述另一基元与所述第一预通道操作兼容。
21.根据权利要求20所述的图形处理器,其中,在由所述第三回退操作处理基元的同时确定所述基元序列中的另一基元应由所述第一预通道操作处理的步骤包括:确定所述另一基元与所述第一预通道操作兼容并且确定是否满足用于触发切换回到所述第一预通道操作的一个或更多个其它条件。
CN202311527200.8A 2022-11-17 2023-11-15 图形处理器 Pending CN118052693A (zh)

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
CN118052693A true CN118052693A (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 (4)

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 图形处理器

Country Status (2)

Country Link
US (1) US20240169639A1 (zh)
CN (5) CN118052692A (zh)

Also Published As

Publication number Publication date
US20240169639A1 (en) 2024-05-23
CN118052690A (zh) 2024-05-17
CN118052692A (zh) 2024-05-17
CN118052694A (zh) 2024-05-17
CN118052691A (zh) 2024-05-17

Similar Documents

Publication Publication Date Title
CN105321199B (zh) 图形处理流水线及其操作方法与介质
EP2834794B1 (en) Patched shading in graphics processing
US11170555B2 (en) Graphics processing systems
US11734869B2 (en) Graphics processing
CN115311120A (zh) 图形处理系统
CN118052693A (zh) 图形处理器
US20240169646A1 (en) Graphics processors
US20240169647A1 (en) Graphics processors
US20240169644A1 (en) Graphics processors
US20240169619A1 (en) Graphics processors
US20240169649A1 (en) Graphics processors
US20240169618A1 (en) Graphics processors
US20240169648A1 (en) Graphics processors
US20240169663A1 (en) Graphics Processors
US20240169645A1 (en) Graphics processors
US20240169669A1 (en) Graphics processors
KR20240072942A (ko) 그래픽 프로세서
WO2024105396A1 (en) Graphics processors
GB2624430A (en) Graphics processors
GB2624425A (en) Graphics processors
KR20240072941A (ko) 그래픽 프로세서
GB2624428A (en) Graphics processors
GB2624431A (en) Graphics processors
GB2624429A (en) Graphics processors
KR20240072940A (ko) 그래픽 프로세서

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication