CN118052690A - 图形处理器 - Google Patents

图形处理器 Download PDF

Info

Publication number
CN118052690A
CN118052690A CN202311524507.2A CN202311524507A CN118052690A CN 118052690 A CN118052690 A CN 118052690A CN 202311524507 A CN202311524507 A CN 202311524507A CN 118052690 A CN118052690 A CN 118052690A
Authority
CN
China
Prior art keywords
primitive
primitives
channel operation
fragment
rendering
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
CN202311524507.2A
Other languages
English (en)
Inventor
T·K·伊加德
S·卡卡尔拉普迪
P·C·加西亚
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 CN118052690A publication Critical patent/CN118052690A/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)”操作,使得在两次处理通道中有效地渲染基元;
图8示意性地示出了根据第一示例的用于预通道操作的处理操作的序列;
图9示意性地示出了在图8所示的预通道操作之后要执行的对应的主通道(mainpass)操作的处理操作的序列;
图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是示出根据实施方式的可以如何在图块内重新开始“预通道”操作的其他细节的流程图。
在附图中适当的地方,相同的附图标记用于相同的部件。
具体实施方式
本文描述的技术的第一实施方式包括一种操作图形处理器的方法,该方法包括:
对于要针对渲染输出进行渲染的基元序列:
执行第一预通道操作,在所述第一预通道操作中,要渲染的所述基元序列中的基元被处理成一个或更多个片段的相应集合,每个片段与所述渲染输出内的一个或更多个采样位置的相应集合相关联,并且其中,作为所述第一预通道操作的部分,所述基元序列中的基元的片段被处理以确定所述基元序列的可见性信息,
其中,所确定的可见性信息包括基元识别信息集合,所述基元识别信息集合针对所述渲染输出内的相应的采样位置存储相应的基元识别符,其中,针对相应的采样位置存储的所述基元识别符指示所述基元序列中的随后应当针对所述采样位置被另外处理的所述基元;以及
此后执行第二主通道操作,在所述第二主通道操作中,由所述第一预通道操作处理过的至少一些基元被再次处理成所述至少一些基元的一个或更多个片段的相应集合,以用于针对所述渲染输出内的相应的采样位置进行处理,其中,在所述第二主通道操作期间对片段的所述处理包括可见性测试的步骤,在所述可见性测试中,对照所述基元识别信息集合中的针对所述片段所相关的采样位置的对应条目来测试与所述片段相关联的基元识别符,以确定是否应当针对所述采样位置另外处理所述片段。
本文中所描述的技术的第二实施方式包括一种图形处理器,所述图形处理器被配置成生成渲染输出,所述图形处理器包括光栅化电路和渲染电路,所述光栅化电路能够被操作以将基元光栅化为一个或更多个片段的相应集合,所述渲染电路能够被操作以处理所述所得片段以生成经渲染输出数据,其中,所述图形处理器被配置成:
对于要针对渲染输出进行渲染的基元序列:
执行第一预通道操作,在所述第一预通道操作中,通过以下操作处理要渲染的所述基元序列中的基元:
所述光栅化电路将所述基元光栅化为一个或更多个片段的相应集合,每个片段与所述渲染输出内的一个或更多个采样位置的相应集合相关联;以及
作为所述第一预通道操作的部分,片段可见性确定电路处理所述基元序列中的基元的片段,以确定所述基元序列的可见性信息,
其中,所确定的可见性信息包括基元识别信息集合,所述基元识别信息集合针对所述渲染输出内的相应的采样位置存储相应的基元识别符,其中,针对相应的采样位置存储的所述基元识别符指示所述基元序列中的随后应当针对所述采样位置被另外处理的所述基元;以及
此后执行第二主通道操作,在所述第二主通道操作中,通过由所述光栅化电路对所述基元进行光栅化来将由所述第一预通道操作处理过的至少一些基元再次处理成所述至少一些基元的一个或更多个片段的相应集合,以用于针对所述渲染输出内的相应的采样位置进行处理,其中,作为所述第二主通道操作的部分,可见性测试电路通过执行可见性测试来控制对片段的所述另外处理,在所述可见性测试中,对照所述基元识别信息集合中的针对所述片段所相关的一个或更多个采样位置的对应条目来测试与所述片段相关联的基元识别符,以确定是否应当针对所述采样位置另外处理所述片段。
本文描述的技术总体上涉及隐藏表面去除。具体地,本文描述的技术使得能够在要针对给定渲染输出渲染的基元序列内的改进(例如并且在实施方式中是,样本完美)隐藏表面去除(该基元序列可以例如是要针对基于图块的渲染系统中的个体图块渲染的基元序列,但是也可以是取决于所讨论的图形处理器的期望渲染输出和配置的任何其他适当定义的基元序列)。
如下文将进一步解释,这在本文中所描述的技术中通过引入初始“预通道”操作作为对基元序列执行的渲染操作的一部分来实现,使得图形处理器在渲染基元序列时被有效地配置成在两个单独的处理通道中渲染要渲染的基元序列中的基元。
因此,当将基元序列发布到图形处理器用于渲染时,使图形处理器最初执行第一“预通道”操作,在第一“预通道”操作中,将基元光栅化为片段的相应集合(每个片段对应于渲染输出内的一个或更多个采样位置的集合),并且接着处理所得片段以确定与所述片段有关的“可见性”信息。所确定的可见性信息反映片段在最终渲染输出中是否将是可见的,并且因此反映片段是否需要被(并且应该被)另外处理以用于渲染输出。
根据本文中所描述的技术,在第一预通道操作期间通过片段的处理确定的可见性信息包括基元识别信息集合(其在本文中也将被称作“HSR ID”缓冲区)。如下面将进一步解释的,该基元识别信息集合然后可以(并且是)随后在第二“主”通道操作期间被使用以控制对基元序列中的基元的片段的另外处理。
根据本文中所描述的技术的基元识别信息集合针对渲染输出内的相应的采样位置存储相应的基元识别符,所述基元识别符识别基元序列中的哪些基元应当针对渲染输出内的哪些采样位置被另外处理。因此,针对相应的采样位置存储的基元识别符指示与随后应当针对采样位置另外处理的片段相关联的基元序列中的基元。在实施方式中,识别要针对相应的采样位置进行进一步处理的单个基元。(因此,在针对采样位置的最终输出值可以取决于处理多个片段(例如由于混合)的情况下,基元处理可以在实施方式中被不同地处理,例如,并且在实施方式中,使用第三“回退”操作模式,如下文进一步描述的。
因此,通过参考所存储的基元识别符,基元识别信息集合指示哪些基元随后应当针对哪些采样位置被另外处理。因此,该基元识别信息集合包含对应于渲染输出内的采样位置的多个条目,并且这些条目能够为渲染输出内的相应的采样位置存储相应的基元识别符,该基元识别符指示应当针对对应的采样点另外处理哪个基元(如果有的话)。
根据本文描述的技术的特定要求,通常可以在基元识别信息集合中的条目与渲染输出内的采样位置之间存在任何合适且期望的对应关系。例如,基元识别信息集合应当(并且在实施方式中是)能够存储与渲染输出内的每个采样位置有关的基元识别符。即,实施方式中的基元识别信息集合针对渲染输出内的每个采样位置存储相应的基元识别符,该相应的基元识别符指示应当针对该采样位置处理的基元(如果有的话)。
因此,在一些实施方式中,可以在基元识别信息集合中的条目的数量与渲染输出内的采样位置的数量之间存在直接的一一对应关系,使得每个采样位置在基元识别信息集合中具有存储针对该采样位置的相应的基元识别符的对应唯一条目。然而,还可以以“分层”方式布置基元识别信息集合,例如,使得基元识别信息集合(还)包括对应于渲染输出内的多个采样位置的组的条目,并且在一些实施方式中是这样做的。在这种情况下,基元识别信息集合通常可以包含比存在采样位置的数量更多的条目,例如,并且在实施方式中,使得基元识别信息集合包含针对各个个体采样位置的相应条目,但是还包含应用于采样位置的组的一个或更多个条目(例如并且在实施方式中,基于渲染输出的分层划分)。在这种情况下,除了对应于各个采样位置的条目之外,还可以存在对应于例如4、16、32、64等个采样位置的组(或“补丁”)的条目。此外,可以提供对应于整个渲染输出的条目。在这种情况下,对照基元识别信息集合的可见性测试可以并且在实施方式中是以分层方式执行,其中基元针对渲染输出区域的逐渐更小的补丁(区域)(并且因此对应地,采样位置的补丁)被迭代地测试。因此,这可以允许潜在地一次性剔除/通过采样位置的整个补丁(组),在这种情况下,可以省略对针对由补丁所涵盖的各个采样位置的基元的测试。即,一些实施方式中的可见性测试包括针对渲染输出的逐渐更小的补丁的第一测试,并且仅在基元在渲染输出的所有细分水平上的补丁测试中存活的情况下,然后需要针对各个采样位置进行测试基元。然而,在这方面,各种布置是可能的。
因此,第一预通道操作用于利用这样的信息填充基元识别信息集合。然而,在实施方式中,基元在第一预通道操作期间未被完全渲染,并且用于确定最终渲染输出值(例如,以确定在最终渲染输出中与基元相关联的采样位置应当具有的外观(例如,颜色))的实际最终渲染操作中的至少一些操作以及渲染输出值(例如,颜色)的对应写入在实施方式中改为被推迟到第二“主”通道操作中,在第二“主”通道操作中,在第一预通道期间处理过的基元通过将基元再次光栅化为其片段的相应集合并且然后根据需要另外处理该片段而被再次处理。因此,在第二主通道操作期间(例如并且在实施方式中)对片段的另外处理包括(例如并且在实施方式中)通过执行片段着色器来渲染片段,以便确定针对采样位置的渲染输出(例如,颜色)值。因此,在实施方式中,第二主通道操作产生渲染图块的最终输出,例如渲染输出(例如,颜色)值的集合,并且相应地将该输出写出例如到相应的输出缓冲区(例如,图块缓冲区),例如以提供给帧缓冲区以供显示。
在第二主通道操作期间,在第一预通道操作期间处理过的基元因此被再次处理,并且将被光栅化为其片段的相应集合以供另外处理。然后基于在第一预通道操作期间生成的基元识别信息集合来控制在第二主通道期间的片段处理。具体地,根据本文描述的技术,在第二主通道期间,在基元已经被光栅化成其相应的片段之后,对照基元识别信息集合测试片段以确定片段是否应当被另外处理。当这样的测试确定片段不(并且不应当)另外处理时,片段然后可以(并且在实施方式中是)被“剔除”,例如并且在实施方式中,而不另外处理片段。
因此,第二主通道操作包括片段可见性测试的步骤,该片段可见性测试使用在第一预通道操作期间生成的基元识别信息集合来在每片段基础上确定片段是否应当被另外处理(即,基于片段对于最终输出是否具有可见效果,如根据基元识别信息集合所识别的)。因此,在第一预通道操作期间生成的基元识别信息集合在第二主通道操作期间被消耗,作为这种可见性测试的一部分。因此,一旦通过第二主通道操作对基元序列的渲染完成,就可以在实施方式中丢弃该基元识别信息集合(并且适当地针对新的要处理的基元序列生成的新基元识别信息集合)。
片段可见性测试的步骤可以以任何合适且期望的方式执行,但通常讲片段可见性测试包括将与正被测试的片段相关联的基元识别符(即,片段所涉及的基元的识别符)与存储在基元识别信息集合中的针对与片段相关联的采样位置(或多个位置)的对应条目中的基元识别符进行比较。比较/测试函数可以取决于基元类型,例如,并且具体地,基元是否在第一预通道期间被处理,使得基元原则上可以更新基元识别信息集合。
例如,对于在第一预通道操作期间被处理并且原则上可能已经更新了该基元识别信息集合的基元(例如,能够在第一预通道操作期间生成可见性信息的基元),在实施方式中的第二主通道中的片段可见性测试包括“等于”测试,使得当当前片段的基元识别符匹配该基元识别信息集合内的对应基元识别符时,在此基础上确定应当针对所讨论的采样位置另外处理片段。另一方面,如果片段可能已更新基元识别信息集合,但其基元识别符不匹配基元识别信息集合内的对应基元识别符(即,片段未通过“等于”的测试),则这意味着可相应地剔除片段。因此,至少对于在第一预通道期间处理且可能已更新基元识别信息集合的基元(即使它们未匹配),实施方式中的片段可见性测试的步骤包括:测试当前片段的基元识别符是否匹配基元识别信息集合内的对应基元识别符,并且当当前片段的基元识别符不匹配基元识别信息集合内的对应基元识别符时,在此基础上剔除片段。
这种形式的可见性测试可以特别适合于例如不透明基元。例如,如下文将进一步解释,在实施方式中,基元识别信息集合基于深度(并且可选地模版)测试基元而更新。因此,如果不透明基元在深度测试(和模版测试,如果执行)中存活,其将在第一预通道操作期间更新基元识别信息集合。对于这样的基元,在第二主通道期间的对照基元识别信息集合的测试应当因此并且在实施方式中确实检查基元识别符是否匹配(即,“等于”测试),以确定相关联的片段是否可以被剔除。
在这方面,应当理解,基元识别信息集合应当(并且在实施方式中是)基于不透明基元的处理而被填充(因为不被遮挡的不透明基元将总是需要被渲染)。然而,还可存在也写入到深度缓冲区的其它非不透明基元。在这种情况下,仍然需要渲染非不透明基元下面的任何不透明基元。因此,在实施方式中,也可以写入到深度缓冲区的任何非不透明基元被视为“不兼容”基元,并且触发下面描述的第三回退操作。
另一方面,可能存在可能遇到不同可见性测试可能适用的其它类型的基元。因此,取决于基元的类型,可以修改片段可见性测试(测试/比较功能)。在此情况下可能是情况的示例将是针对在第一预通道操作期间可能尚未更新基元识别信息集合的基元(例如,其可能是不更新深度缓冲区并且因此也无法更新基元识别信息集合的某些透明基元的情况,或是不生成任何可见性信息的其它基元,并且这些基元可在实施方式中跳过第一预通道操作中的一些或全部操作,并且改为仅在第二主通道操作中被处理)。在这种情况下,由于基元可以永远不更新基元识别信息集合,所以“等于”的测试总是失败。因此,如果对这些基元使用“等于”的测试,则这可能导致基元被错误地剔除。因此,这些基元可以并且在一些实施方式中是被视为与预通道操作不兼容,而是随后在第三“回退”操作模式中被处理,如下文将进一步描述的。然而,在一些情况下,能够使用根据本文中所描述的技术的两级预通道操作继续处理此类基元可能是有益的,并且在实施方式中,这通过修改在第二主通道期间用于此类基元的片段可见性测试函数来完成。具体地,如下面将进一步解释的,在这样的情况下,片段可见性测试可以并且在实施方式中确实是使用“大于”测试(至少当基元识别符在基元序列内单调增加时),这然后允许至少一些这样的基元在第二主通道期间被处理,而不必要求图形处理器切换到第三回退操作模式以处理此类基元。
因此,在实施方式中,作为第二主通道操作的部分执行的片段可见性测试的步骤可以根据基元的类型而不同地执行。即,作为第二主通道操作的部分,片段可经受多个不同可见性测试的集合中的一者,以对照所述基元识别信息集合测试片段的相关联的基元识别符,其中至少基于特定基元是否能够在第一预通道操作期间生成可见性信息来确定多个不同可见性测试的集合中的针对该片段的一者。因此,在实施方式中,基元可以用合适的状态注释,以指示应当在第二主通道操作期间针对基元的相关联片段对照基元识别信息集合执行什么类型的片段可见性测试(测试函数)。具体地,如果基元潜在地能够在第一预通道期间更新基元识别信息集合,则该基元应当被相应地标记,并且在实施方式中,在第二主通道期间使用“等于”测试,以便剔除其基元识别符与基元识别信息集合中的对应条目不匹配的片段。另一方面,如果基元在第一预通道期间不能更新基元识别信息集合(和/或基元仅在第二主通道期间被处理),则在实施方式中,该基元被相应地标记,以导致在实施方式中将不同的片段可见性测试函数用于在第二主通道操作期间处理此类基元的片段。例如,并且在实施方式中,当基元序列内的基元识别符单调地增加时,对于在第一预通道操作期间不能生成可见性信息但在第二主通道操作期间将被处理的基元,在实施方式中,在第二主通道操作期间执行的对照基元识别信息集合的针对此类基元的片段的测试包括确定与片段相关联的基元的基元识别符值是否大于存储在基元识别信息集合中的针对片段所相关的采样位置的对应条目的基元识别符。相反,如果基元识别符序列内的基元识别符被布置为从特定最大值单调递减,则可以适当地使用“小于”可见性测试。
在这方面,各种其他布置是可能的。然而,在任何情况下,无论执行何种片段可见性测试,其结果都确定是否需要针对所讨论的采样位置另外处理片段。
因此,当片段通过使用基元识别信息集合执行的可见性测试(使得可见性测试指示片段应被另外处理)时,相应地另外处理片段,以确定针对与片段相关联的采样位置的对应的渲染输出值(例如,以确定采样位置在渲染输出中应具有的外观)。在这种情况下,在实施方式中,例如(并且在实施方式中)通过执行片段着色器来渲染片段,以确定针对与片段相关联的采样位置的相应渲染输出(例如颜色)值。
另一方面,当片段在使用基元识别信息集合执行的可见性测试中失败(使得可见性测试指示片段不应被另外处理)时,在此基础上片段然后可以(并且在实施方式中是)被剔除,即,使得避免片段的一些或全部被另外处理。例如,在不对片段执行任何另外处理的实施方式中,片段在此时在实施方式中被剔除。出于此原因,在实施方式中,在第二主通道开始时执行可见性测试,(例如,在实施方案中)在光栅化之后立即执行可见性测试,以最小化对(将)在可见性测试失败的片段的不必要处理。然而,一般来说,可见性测试可以根据需要在第二主通道期间的任何合适的点进行,并且在这方面可以进行各种安排。
因此,此方法的益处在于,因为(例如,针对图块的)整个基元序列由第一预通道在前期进行处理以确定基元识别信息集合形式的可见性信息,基元识别信息集合反映正在处理的基元序列中的所有基元(和片段)的完全“可见性”。换言之,本文中所描述的技术的预通道操作可允许图形处理器在初始预通道期间作为整体确定基元序列(例如,图块)的完整可见性信息。这进而促进更优化的隐藏表面去除,例如,并且在实施方式中,使得可以在第二主通道期间剔除基元序列中的基元的任何和所有被遮挡片段。因此,本文中所描述的技术可允许改进(例如并且在实施方式中)样本完美的隐藏表面去除。
此外,通过在专用的基元识别信息集合中提供第一预通道期间确定的可见性信息,基元识别信息集合可以针对每个采样位置唯一地识别哪个基元(并且因此哪个片段)应当被另外处理,以确定所讨论的采样位置的对应的渲染输出值。因此,在第二主通道操作期间执行的可见性测试可以被简化,并且至少对于在第一预通道操作期间已经被处理并且其可见性因此被基元识别信息集合反映的片段,不需要例如在主通道期间执行进一步的深度测试,因为可以使用存储在基元识别信息集合中的信息完美地执行隐藏表面去除。
例如,在实施方式中,如下面将进一步解释的,包括基元识别信息集合的可见性信息是基于测试片段的深度(并且可选地是模版)。通过在第一预通道操作期间前期生成基元识别信息集合,然后在第二主通道操作期间将该基元识别信息集合用于控制片段处理,这然后避免了能够在第二主通道操作期间在相同深度处的片段之间进行消歧的任何需要(因为在那种情况下应当渲染哪个片段可以取决于应用和深度测试的类型,但是这可以在第一预通道操作期间被执行并且因此被包括在基元识别信息集合中)。因此,通过以本文中所描述的技术的方式生成基元识别信息集合,在此方面可能需要解决的任何歧义可以(并且因此)在第一预通道操作期间解决,并且第二主通道操作可以简单地读取基元识别信息集合,以确定应当另外处理哪一片段,例如无需深度缓冲区的任何知识。
因此,在一些实施方式中,第二主通道操作不需要(并且不)执行任何另外的深度测试,因为该信息全部被提供到基元识别信息集合中。
(然而,也可以设想,在一些实施方式中,仍然可以针对第二主通道操作执行深度测试,并且至少在一些情况下,这可能是有益的。例如,这可有益于或处理仅在第二主通道操作期间可处理的某些类型(例如,透明)基元。在这种情况下,可能期望仍然能够在第二主通道操作期间对这样的片段进行深度测试,尽管在实施方式中第二主通道操作不更新深度缓冲区)。
以类似的方式,使用基元识别信息集合也可以促进使用模版化。例如,在实施方式中,可以在第一预通道操作期间更新模版缓冲区,例如,以正常方式在第一预通道操作期间执行模版测试,并且在以与深度测试的结果类似的方式生成基元识别信息集合时也考虑模版操作的结果。然后,第二主通道操作可以简单地使用基元识别信息集合来控制片段处理,如上所述,而不需要模版缓冲区的任何知识。
(否则可能需要禁用模版化,以确保在这方面不存在与预通道操作的不兼容性,或者在实施方式中,需要模版化的基元可以通过停止预通道来处理,并且改为随后使用第三“回退”操作模式来处理基元,如下文将描述的)。
本文中所描述的技术也不需要图形处理器的显著额外复杂性或面积。例如,在实施方式中所需的唯一附加数据结构是针对基元序列(例如,针对图块)的基元识别信息集合,基元识别信息集合可以是相对较小的数据结构,例如,并且在实施方式中,使得针对基元序列的基元识别信息集合被本地存储到图形处理器(并且在基元序列已经被渲染时被丢弃,而不必写入到外部存储器)。也不需要尝试重新排序基元或在飞行中使用可见性信息,或因此不需要提供任何复杂机制来跟踪这一点。
因此,所有这些的效果是提供改进的隐藏表面去除,这在实施方式中可以提供样本完美的片段剔除,而不引入显著的附加处理或硬件复杂性。
因此,与其他可能的布置相比,本文描述的技术可以提供各种益处。
根据本文描述的技术的要求,预通道操作和主通道操作可以包括任何合适和期望的处理操作。
在实施方式中,基于片段深度值(特别是通过对照基元序列的对应深度缓冲区来对片段进行深度测试,并且根据深度测试的结果相应地更新深度缓冲区(根据需要)),在第一预通道操作期间生成基元识别信息集合。实际深度测试可以以任何合适和期望的方式执行,例如以通常执行的方式。通常,这涉及对照存储在深度缓冲区中的对应采样位置的对应深度值来测试(当前)片段的深度值,并且当片段通过深度测试(在深度测试中存活)时,相应地更新深度缓冲区。在此情况下,当片段导致深度缓冲区更新(使得片段将是可见的,至少基于深度缓冲区的当前状态)时,可对基元识别信息集合进行对应更新。
因此,在实施方式中,第一预通道操作包括操作序列,在实施方式中,该操作序列按这种顺序包括:将基元光栅化为片段的相应集合以供处理、使用针对基元序列的深度缓冲区对片段进行深度测试、以及在必要时更新深度缓冲区。在实施方式中,第一预通道操作还包括更新基元序列的基元识别信息集合。在实施方式中,基元识别信息集合在第一预通道操作期间被“动态”更新(并且因此生成)。例如,并且在实施方式中,每当片段导致对深度缓冲区的更新时,与片段相关联的基元识别符在实施方式中被写入到基元识别信息集合中的(一个或更多个)对应条目。因此,如果随后确定采样位置由基元序列中的较晚基元覆盖,则会重写相同条目。因此,在实施方式中,在第一预通道结束时,生成存储针对渲染输出内的采样位置的相应深度值的深度缓冲区,并且该基元识别信息集合存储识别要针对渲染输出内的采样位置另外处理的基元(并且因此是片段)的相应的基元识别符。在一些实施方式中,在第一预通道期间对片段的处理在深度缓冲区和基元识别信息集合被更新(如果需要)之后停止。即,在一些实施方式中,实施方式中的第一预通道操作包括(早期)深度测试片段,但不例如执行片段着色器(或因此执行晚期深度测试)。在这种情况下,如果基元需要片段着色来确定其覆盖,则基元可以被视为与预通道不兼容(并且改为随后由第三“回退”操作模式处理,如下文将进一步讨论的)。然而,在其他实施方式中,片段处理可以在深度测试和深度(以及可选地还有模版)缓冲区和基元识别信息集合的更新之后继续。例如,在一些实施方式中,可执行(部分)片段着色器,并且在片段着色之后相应地更新深度(并且可选地还有模版)缓冲区和基元识别信息集合,如下文将进一步解释。
在实施方式中,第一预通道操作还包括基元分类或检查基元分类的步骤,其目的将在下面更详细地解释。在实施方式中,这在光栅化之前执行,但是通常可以在预通道操作期间在任何合适的和期望的点处发生。
如上所述,在实施方式中,基元识别信息集合在每样本位置的基础上存储基元识别符集合,该基元识别符集合指示应当针对渲染输出中的相应的采样位置另外处理哪些基元(以及因此是哪些片段)。因此,在实施方式中,基元识别信息集合能够存储针对渲染输出内的每个采样位置的相应的基元识别符。
在实施方式中,存储在基元识别信息集合中的基元识别符唯一地识别基元序列内的基元。应当理解,需要图形处理的应用通常还将指定全局基元识别符,并且这些应用指定的基元识别符可以用于本文描述的技术的目的。然而,由应用指定的基元识别符通常为相对较大的32位值的形式,并且因此存储这些可能需要比处理基元序列所必需的更大的基元识别信息集合。另外,从应用的角度来看,基元识别符仅持续单个绘制调用,而渲染通道可以构成多个不同的绘制调用。因此,在实施方式中,出于本文中所描述的技术的目的在基元序列内重新索引基元,并且针对基元识别信息集合存储/使用的基元识别符因此唯一地识别正被处理的基元序列内的基元(但不一定全局唯一地识别基元)。因此,在实施方式中,该方法可以包括重新索引基元序列内的基元的步骤。在实施方式中,对基元的重新索引是在基元(例如,从基于图块的渲染系统中的基元列表读取器)被获得用于处理时执行的。这有助于减小基元识别符的大小,并且因此有利地减小基元识别信息集合的大小(例如,并且在实施方式中,使得基元序列的基元识别信息集合可以本地存储(例如片上),并且一旦基元序列的处理完成就丢弃基元识别信息集合,而不必写入到外部存储器)。
在实施方式中,如果采样位置未被任何基元覆盖,则在可见性缓冲区中记录合适的值以指示这一点。被记录以指示采样位置未被覆盖的特定值本身并不重要,并且可以根据需要使用任何合适的默认或零值。例如,在实施方式中,值“0”可用于指示在给定采样位置处不存在基元覆盖。在这种情况下,在实施方式中,基元在从“1”开始的基元序列内被索引(使得序列中的第一基元可以被识别为基元“一”,第二基元被识别为基元“二”,依此类推)。然而,各种其他布置也是可能的。
因此,在实施方式中,基元识别信息集合存储相应的基元标识符或指示采样位置未被针对渲染输出内的每个采样位置的任何基元覆盖的值。
在实施方式中,基元序列的基元识别符在基元序列内从特定起始值单调地改变。例如,在实施方式中,基元识别符从零单调增加。然而,基元识别符也可以从特定最大值单调减少。这具有以下益处:可以确保存储在可见性缓冲区中的基元识别符表示基元序列中的第一个(即,“最旧的”)基元,基于到目前为止生成的可见性信息保证该基元在该采样位置可见。这继而可以帮助管理例如片段处理依赖性的处理,特别是对于不更新深度缓冲区并且不能对照该基元识别信息集合(诸如在第一预通道操作期间基本上不被处理的(例如)透明基元的片段)来剔除的片段。
例如,如果基元不能写入到深度缓冲区(例如,禁用写入到深度缓冲区),这可能是某些类型的透明基元的情况,例如,基元可以在那种情况下(并且在一些实施方式中)被视为与根据本文描述的技术的两级预通道操作不兼容,而是在实施方式中随后由第三“回退”操作模式处理的,如下文将进一步描述的。然而,仍有可能以上述方式处理此类基元,并且在一些实施方式中,这因此这样做。因为这样的基元不(也不能)生成可见性信息,所以不需要在第一预通道中处理基元,并且因此在实施方式中,不能生成可见性信息的此类基元跳过第一预通道操作且改为仅在第二主通道操作期间处理。
在此情况下,如上文所暗示,当在第二主通道中处理此类基元时使用不同片段可见性测试函数可能是合适的(因为其将必然在“等于”测试中失败且因此可能在此基础上不正确地剔除)。因此,在实施方式中,对于在第一预通道期间无法生成可见性信息但仍将在第二主通道中处理的任何基元(并且在因此仅在第二主通道中处理的实施方式中),片段可见性测试包括确定与片段相关联的(针对基元的)基元识别符是否大于存储在基元识别信息集合中的对应条目中的基元识别符。然而,这依赖于基元识别符在基元序列内单调增加。例如,在这种情况下,如果片段与具有比存储在用于对应采样位置的基元识别信息集合中的对应识别符大的基元识别符的基元相关联,则图形处理器可以安全地渲染透明片段,因为在基元识别信息集合中识别的片段将已经被处理。
然而,在这种情况下,在第二主通道期间不知道基元的片段是否位于基元识别信息集合中识别的基元的片段的前面或后面。因此,对于片段可见性测试函数被设定为“大于”测试函数的片段,通过“大于”可见性测试的片段可以在基元识别信息集合中的针对所讨论的采样位置的被识别片段前面或后面。因此,对于片段可见性测试函数被设定为“大于”的基元(片段),可能期望在主通道期间执行深度测试(但是在实施方式中不更新深度缓冲区),以允许基于它们的深度值来剔除这样的片段。因此,在实施方式中,对于片段可见性测试函数被设定为“大于”测试函数的片段,也在第二主通道期间执行深度测试。在实施方式中,该深度测试是在片段可见性测试之后执行的。另一方面,在实施方式中,执行基元分类,使得如果此类片段在“大于”可见性测试中失败,则指示基元序列中的相关联基元的(基元序列)位置在被识别为在基元识别信息集合中被渲染的基元的位置之前,剔除片段是安全的(并且因此这样做)(例如,这可以是透明基元的情况,只要它们不写入深度/模版,在这种情况下,可见性应当基于渲染顺序来确定,并且如果透明在大于测试中失败,则可以保证它将被较晚的基元覆盖)。
在这方面,各种其他布置是可能的。
基元识别信息集合至少存储基元识别符。在一些实施方式中,基元识别信息集合还可存储与图形处理的较大单元(例如针对基元的组(例如,绘制调用))有关的可见性信息。基元识别信息集合还可以根据需要通常存储任何其他合适的信息,例如,包括可用于控制针对渲染输出内的相应的采样位置的基元的另外处理的任何合适的描述符或标志。因此,基元识别信息集合通常可存储可期望被存储的任何其它合适的信息。
在实施方式中,基元识别信息集合因此在第一预通道操作期间以此方式生成,并且可用于在第二主通道操作期间控制片段处理。
在实施方式中,基元识别信息集合被本地存储到图形处理器,并且在实施方式中,基元识别信息集合不被写入到外部存储器。因此,基元识别信息集合在第二主通道操作期间(在可见性测试步骤期间)消耗,并且一旦完成了对基元识别信息集合相关的基元序列的处理(例如,并且在实施方式中)就丢弃,而不将基元识别信息集合写入到外部存储器。因此,在实施方式中,基元识别信息集合被设计和设定大小为能够适合本地存储,以防止必须将基元识别信息集合写出到外部存储器。然而,可能存在期望写出基元识别信息集合的一些情况,在这种情况下可以这样做。
本文描述的技术的实施方式涉及基于图块的渲染。因此,在实施方式中,图形处理器被配置为执行基于图块的渲染。因此,图形处理器可以具有图形处理器在执行基于图块的渲染时可以具有的任何合适的和期望的处理级和/或元件。
当在这样的基于图块的渲染系统中处理渲染输出时,执行初始分块操作,以便相对于渲染输出被细分以用于渲染的渲染图块对几何形状进行拣选,该几何形状是根据渲染输出要处理的基元集合定义的。此分块操作的结果是生成基元列表集合,所述基元列表指示基元相对于图块的分布,该图块可用于识别将针对哪些图块渲染哪些基元。然后在后续渲染操作中执行图块的实际渲染,其中在实施方式中,图块被单独渲染,例如,一个接一个地渲染。
在实施方式中,本文中所描述的技术的操作是作为响应于图形处理器接收到渲染图块的命令而执行的图块渲染操作的部分而执行的。即,在实施方式中,“预通道”操作是在渲染图块内执行的。因此,在实施方式中,以上述方式处理的基元序列对应于将针对相应渲染图块渲染的基元序列(例如,如使用与在分块操作期间已经生成的图块相关联的一个或更多个基元列表来识别的)。
在实施方式中,以本文描述的技术的方式渲染基元(包括预通道操作)可以(并且在实施方式中)被自动发起,作为响应于图形处理器接收和处理渲染图块的命令而执行的渲染操作的部分。因此,在实施方式中,以本文描述的技术的方式渲染基元(包括预通道操作)是在图形处理器的完全控制下执行的(例如,而不是具有经配置以渲染整个场景两次的软件应用程序)。
即,当(例如,并且在实施方式中,每当)发布新的针对图块的基元序列以用于渲染时,响应于渲染图块的命令,在实施方式中,图形处理器在经配置以自动发起用于处理基元的“预通道”操作。此外,这可以(并且在实施方式中是)完全在基于图块的渲染系统的渲染级内完成,并且因此在生成图块列表的初始几何形状处理已经完成之后。该方法可以提供各种益处。
例如,在基于图块的渲染系统中,图形处理器的命令处理电路(命令流前端)通常将接收命令流以控制图形处理器的操作。具体地,当执行基于图块的渲染时,在实施方式中,命令流将包括第一命令集合和第二命令集合,第一命令集合以使图形处理器执行初始几何形状处理(分块),以将基元拣选到相应的基元列表,第二命令集合使图形处理器随后使用基元列表相应地渲染图块。因此,可以并且在实施方式中针对渲染输出被细分为的每个图块提供相应的渲染命令,其中,当处理这样的命令时,使图形处理器(通过处理另外的命令)识别要针对所讨论的图块渲染的基元,并且然后依次渲染基元。
在实施方式中,命令由例如需要执行图形处理的主(例如,主机)处理器(例如,CPU)生成。具体地,命令流(命令)可以由图形处理器的驱动器生成。因此,触发本文中所描述的技术的预通道操作的渲染命令可包括已经由驱动器生成的命令。在实施方式中,驱动器生成的命令由图形处理器的命令处理电路(命令流前端)进一步处理,以调度图形处理器的处理工作。因此,图形处理器的命令处理电路(命令流前端)还可以基于驱动器生成的命令来为图形处理器生成的另外的命令(任务)。因此,触发本文中所描述的技术的预通道操作的渲染命令还可以包括由图形处理器的命令处理电路(命令流前端)生成的命令。在这方面,各种布置是可能的。
通过将图形处理器配置为自动执行这样的预通道操作,作为响应于渲染图块的命令而执行的渲染操作的一部分,可以在硬件中更高效地管理处理,因为预通道的控制完全由图形处理器执行,例如,并且在实施方式中,无需用户指定。因此,这减少了应用程序员的负担,因为图形处理器(硬件)被配置成自动执行预通道操作,以实现针对场景绘制的任何基元序列的隐藏表面去除,作为响应于渲染图块的命令而执行的标准渲染操作的一部分。
然而,这意味着图形处理器应当并且在实施方式中能够处理可以由应用指定的所有不同类型的基元(和不同的基元性质),包括可以与使用根据本文描述的技术的预通道操作处理基元相关联的任何潜在副作用。
在这方面,申请人进一步认识到,以上述方式通过在两个单独的通道中渲染基元来处理基元序列中的每个基元可能是不适当的或不可能的,例如,因为可能存在与在两个单独步骤中处理不兼容的一些基元(使得它们与本文中所描述的技术的预通道操作不兼容)。
存在为什么可能是这种情况的各种示例,但通常这可能是因为基元的性质(如由应用所指定的)意味着在第一预通道操作期间执行的处理可能潜在地引入一些副作用,这意味着如果基元在第二主通道期间被再次处理,则这可能将伪影引入最终渲染输出。示例可以是基元是透明的(特别是如果透明基元仍可以生成可见性信息,例如仍然可以写入到深度缓冲区,因为在这种情况下,透明基元不应当被存储在基元识别信息集合中,因为还可能存在透明基元下面的仍然需要被渲染的对应的不透明基元,并且因此如果透明基元被存储在基元识别信息集合中,则可能被不正确地剔除)。因此,在实施方式中,基元识别信息集合仅存储不透明基元的基元识别符,其中需要某些类型的模版,或者通常在基元需要从缓冲区读取以确定其最终渲染输出覆盖的情况下。另一示例可能是需要运行片段着色器以便确定与基元相关联的覆盖。在这种情况下,如果在第一预通道操作期间未启用片段着色,则预通道可能错误地决定基元可以被剔除。在这方面,各种其他示例是可能的,例如,取决于在相应处理通道期间执行的特定处理。
因此,可能存在当处理基元序列(图块)时可能遇到的各种不同类型的基元,并且为了满足各种API要求,图形处理器应是并且在实施方式中能够相应地处理所有不同类型的基元,而不引入伪影。
为了解决这一问题,并且允许本文中所描述的技术有效地用于可针对渲染输出定义的所有不同类型的基元,在实施方式中提供“回退”操作,使得当图形处理器正在对基元序列执行预通道操作时,如果在预通道操作期间遇到被确定为与以这种方式处理不兼容的基元(例如,由于不能确保基元可在两个单独的通道中处理而不潜在地引入伪影),则至少不针对那个基元执行预通道操作,并且改为随后利用图形处理器在第三“回退”操作模式中操作来处理(即,被光栅化和(如果必要)被渲染)不兼容基元。在此情况下,预通道操作可以不是仅针对不兼容基元来执行,或者预通道操作可以不是针对序列中的所有后续基元来执行(使得在被确定为不兼容的基元处有效地停止预通道操作),如下文将进一步解释的。
通过提供该第三回退操作模式,这然后确保在两个单独的通道中不能(安全地)渲染的任何基元仍然可以由图形处理器高效地且自动地处理,而没有将任何错误或伪影引入最终渲染输出的风险。例如,在实施方式中,第三回退操作模式在被配置为能够以“故障安全”的方式处理(渲染)基元,例如通过光栅化和渲染(根据需要)基元,以在单个渲染操作中(例如,以基于光栅化的渲染系统的正常方式)确定对应的渲染输出值。
因此,在实施方式中,方法还包括确定在第一预通道操作期间正被处理的基元序列中的基元与由第一预通道操作处理不兼容;针对该基元停止(不执行)第一预通道操作中的一些或全部;以及随后以第三回退操作模式处理被确定为与第一预通道操作不兼容的基元。
在实施方式中,针对将在第一预通道操作期间处理的每个基元确定所述基元是否与由第一预通道操作处理兼容。为了促进这一点,可执行基元分类步骤,其基于基元的一个或更多个性质确定基元是否与由第一预通道操作处理兼容。
该基元分类可以在运行时执行,例如作为渲染操作的一部分,例如,并且在实施方式中,作为预通道操作的部分。然而,通常,将预先获知基元是否与预通道操作不兼容。可能存在一些条件仅能在运行时检查,并且在这种情况下,至少部分基元分类应因此在运行时执行。然而,可能存在至少一些条件,通常情况下,可以预先(例如,在编译时)获知基元是否满足将意味着该基元与本文中描述的技术的预通道操作不兼容的任何此类条件。因此,在一些实施方式中,可以至少部分地预先执行基元分类,其中基元分类的结果然后被编译成单个指示符,例如标志,其指示基元是否与预通道操作兼容。在此情况下,可在预通道操作期间执行基元分类检查的步骤,其包括使用指示符来确定基元是否与预通道操作兼容。在这方面,各种布置是可能的。
因此,当执行预通道操作时,只要序列中的基元与预通道操作兼容,就通过预通道操作处理基元以确定期望的基元识别信息集合。即,只要当前基元与预通道操作兼容,其通过预通道操作等进行处理,直到处理到达基元序列的末尾。在实施方式中,基元接着由第二主通道操作再次处理,其中基于所确定的基元识别信息集合相应地控制基元的处理。
另一方面,如果正被处理的基元序列中的基元被确定为与预通道操作不兼容,则不对该基元执行预通道操作,并且改为随后由回退操作处理该基元,如下文将进一步解释的。
应当理解,包括回退操作模式的这种总体方法在基于图块的渲染的上下文中可能是特别有利的,该回退操作模式允许在与以这种方式处理的基元不兼容时停止预通道操作,因为在这种情况下,如果在渲染特定图块时发起回退操作,则这不一定影响任何其他图块的渲染,并且一旦已经处理了当前图块(包括不兼容基元),则可以通过预通道操作等重新开始对下一个图块的处理。
因此,这是响应于渲染图块的命令而在图块内执行预通道操作的进一步益处。
通常,并且如下文将进一步讨论的,可以基于可以基于所讨论的基元的一个或更多个属性设定的合适的基元分类(指示符)来确定基元与由第一预通道操作处理不兼容。例如,如果基元需要执行片段着色器以便确定其片段覆盖,则在预通道未运行片段着色器的情况下,可能无法在预通道中处理此基元。另一示例将是当遇到透明基元时,因为这可能不更新可见性信息,并且因此如果根据本文中所描述的技术的预通道操作在两个级中处理,则可能不正确地剔除透明基元。因此,可以改为以第三回退操作模式来处理这样的基元,以确保即使在不能执行预通道时基元的渲染也可以适当地继续。取决于图形处理器(以及预通道和主通道)的配置,可能存在不兼容基元的各种其他示例,如下文将进一步解释的。
因此,在实施方式中,当处理基元序列时,针对要处理的每个基元检查改该基元是否与由第一预通道操作处理兼容。如果基元与以这种方式处理不兼容,则针对该基元省略第一预通道操作的一些或全部。在实施方式中,基元分类检查通常可以作为预通道操作的部分来执行,使得当确定基元不兼容时,针对那个基元立即停止预通道操作。在实施方式中,在预通道操作开始时(例如,并且在实施方式中,在光栅化级之前)执行基元分类检查,使得如果基元与以这种方式处理不兼容,则不启动实质的预通道片段处理(例如生成可见性信息的处理)。然而,一般来说,可根据需要在第一预通道操作期间的任何适合点处执行基元分类检查。
响应于确定基元与预通道操作不兼容而停止针对该基元的预通道操作可以以任何合适且期望的方式执行。在实施方式中,针对整个基元序列停止预通道操作。
例如,当在预通道期间遇到不兼容基元时,可以在该点终止针对基元序列的预通道处理操作,例如,并且在实施方式中,相应地写出的任何合适且期望的预通道状态(例如,包括深度缓冲区并且可选地还包括到目前为止生成的基元识别信息集合)。在一些情况下,在实施方式中,也可在此级写出触发终止预通道的不兼容基元的标识和/或位置(但通常这可能不是必需的,因为在实施方式中,基元在被分类为(如兼容或不兼容),并且可以通过执行如在第一预通道中执行的基元分类检查的对应步骤而在第二主通道期间如此识别)。
因此,在一些实施方式中,停止基元的预通道可以包括针对基元终止预通道操作,并且在实施方式中,针对基元序列在该点立即终止预通道操作。然而,其他布置也是可能的。例如,在另外实施方式中,当针对基元序列内的基元的预通道处理操作停止时,基元序列的处理可继续,但所有输出都被禁用,使得第一预通道操作继续到基元序列的结束,但不生成任何进一步的(可见性)信息。该方法可以相对更容易管理,因为它避免了必须在基元序列的中途停止处理并存储中间预通道状态。可以设想用于停止预通道的各种其他布置。
在预通道操作已经停止之后,处理可以以任何合适的方式继续。然而,在实施方式中,当在基元序列的中途针对基元(不兼容基元)停止预通道操作时,接着针对基元序列(例如,并且在实施方式中)从开始执行第二主通道操作,使得由第一预通道操作成功处理的基元接着由第二主通道操作再次处理。
因此,在实施方式中,当遇到不兼容基元使得针对那个基元停止第一预通道操作时,则执行第二主通道以处理基元序列中的基元直到不兼容基元的位置。即,当遇到不兼容基元时,使得针对那个基元停止第一预通道操作,然后在实施方式中,对基元序列的处理则接着从序列的开始处重新开始,以针对到目前为止已经通过第一预通道操作处理的基元的子序列执行第二主通道操作。
因此,被处理过的、直到序列中的不兼容基元的位置处的(相同的)基元由第二主通道操作再次处理,其中基于在第一预通道操作期间确定的可见性信息相应地控制对基元的渲染。当第二主通道操作到达序列中的不兼容基元的位置时,在实施方式中,处理然后切换到第三“回退”操作模式以处理不兼容基元。在实施方式中,在回退操作模式中,基元例如根据正常渲染操作处理,而不尝试生成或使用本文描述的技术的“可见性”信息。因此,当在回退操作模式下操作时,在实施方式中,基元是以“故障安全”方式处理的,例如,并且在实施方式中,其中基元在单个渲染操作中(例如,以用于基于光栅的渲染的正常方式)被光栅化和渲染(根据需要)。
可以以各种不同的方式来控制从主通道到回退模式的切换,但是在实施方式中,这通过使第二主通道也检查基元分类来控制的,以确定基元是否与预通道操作不兼容。即,在实施方式中,基元分类既在预通道中被使用以确定是否应当停止预通道(使得主通道被启动),还在主通道中被使用以确定在主通道中的处理何时已经到达不兼容基元,在该点图形处理器切换到回退模式以便以“故障安全”的方式渲染基元。在实施方式中,在第二主通道中的基元分类检查以与在第一预通道中的基元分类检查相同的方式执行。例如,在实施方式中,基元被预分类,并且两个通道中的基元分类检查涉及检查合适的指示符,例如标志。然而,不是必须如此。例如,还可以设想,可以在第一预通道操作期间动态地执行基元分类,在这种情况下,可以存储基元分类的结果以用于第二主通道的基元分类检查。在这方面,各种其他布置是可能的。
因此,在实施方式中,当在执行第一预通道操作时确定基元序列中的基元与由第一预通道操作处理不兼容使得针对那个基元的第一预通道操作停止时,该方法包括:通过第二主通道操作重新处理基元序列中的基元,直到基元序列中的紧接在被确定为与第一预通道操作不兼容的基元之前(前一个)的基元,以便完成对那些基元的处理;并且当第二主通道操作到达基元序列中的被确定为与第一预通道操作不兼容的基元时,将图形处理器切换到第三回退操作模式中且在回退操作模式中处理基元。
在实施方式中,一旦渲染电路切换到第三回退操作模式,处理在该状态下继续,直到(当前)基元序列的末尾。即,一旦在基元序列内遇到第一个不兼容基元时,就针对包括不兼容基元的基元序列终止预通道操作,并且在第三回退操作模式中全部处理序列中的任何剩余(后续)基元。因此,在实施方式中,在将图形处理切换到第三回退操作模式之后,该方法包括在回退操作模式中继续处理基元序列中的剩余基元,直到已经处理了当前基元序列中的所有基元。
一旦已经完整地处理了基元序列,就可以发布新基元序列(其可以例如是要针对新图块渲染的基元序列,但是也可以例如是针对当前图块的新绘制调用,或其他合适的新基元序列)用于渲染,并且对新基元序列的处理可以在预通道操作中开始。因此,在实施方式中,在已处理(当前)基元序列之后,所述方法包括针对新(不同)基元序列执行(新)预通道操作。在实施方式中,响应于渲染新基元序列的命令(例如,以与上述相同的方式),发起对新基元序列的预通道操作的执行。例如,在实施方式中,图形处理器可随后接收渲染另一基元序列(例如,另一图块)的命令,并且响应于渲染其它基元序列(例如,图块)的命令,所述方法可以包括获得要处理的基元序列并且接着发起预通道操作以处理其它基元序列(例如,图块)的基元。然而,在此方面将设想各种其它布置,并且可以交错或并行地执行针对不同基元序列的至少一些处理。
然而,还设想在已在第三回退操作模式中处理不兼容基元之后,当遇到另一(例如,下一)兼容基元时,图形处理器可尝试恢复到预通道操作。为了促进这一点,图形处理器(例如,并且在实施方式中,包括其基元列表读取电路,在要渲染的基元是从相应的基元列表中识别的情况下)可以可操作以从序列中的任意位置重新开始对基元序列的处理(使得处理可以有效地快速地向前通过基元序列)。在这方面考虑了各种布置。
通过允许图形处理器回退到在第三回退模式中(例如,在单个通道中)(例如,以基于光栅的渲染系统的正常方式)处理基元,当遇到不兼容基元时,图形处理器因此能够识别和处理基元与使用本文中所描述的技术的预通道操作来处理不兼容的异常情况,同时仍然适当地继续渲染基元。然后这可能失去一些隐藏表面去除效率,但是在确保更安全和完全投诉(complaint)的硬件实现方面是有益的。
在此方面将理解,哪些基元与使用本文中所描述的技术的预通道操作处理不兼容可取决于图形处理器的配置,并且尤其取决于如上文所暗示的预通道操作的配置。例如,在需要执行片段着色器以确定与基元相关联的覆盖的情况下,在一些情况下,简单地将基元标记为不兼容可能是适当的,例如,如果预通道根本不执行片段着色器。然而,还可以配置预通道以运行至少部分片段着色器,以便将预通道暴露于足够的信息以生成期望的基元识别信息集合,同时在实施方式中仍然避免对片段进行完全着色并且写出对应的(颜色)值。因此,一般来说,预通道可根据需要或多或少地复杂,并且因此可以能够或可以不能够处理各种不同类型的基元。
因此,取决于预通道操作的配置,可以在预通道中处理一些副作用,并且给定基元是否与预通道不兼容将相应地取决于预通道具体如何被配置。在这方面存在各种选项以确定给定基元是否与预通道不兼容。然而,一般来说,预先(例如,在编译时)已知基元的性质是否意味着基元不应被处理用于预通道操作,并且因此图形处理器可根据需要基于基元的一个或更多个性质将基元确定为与预通道不兼容,并且相应地标记这些基元,如上文所描述。
因此,本文中所描述的技术的实施方式提供新颖的片段“预通道”操作,其可用于处理基元序列中的基元以确定“可见性”信息,所述“可见性”信息又可用于控制第二主通道中的基元的渲染,以便避免渲染对最终渲染输出无贡献的任何基元(片段)。可见性信息被存储在基元识别信息集合中,可以(并且随后)在主通道期间对照基元识别信息集合测试片段,以确定哪些片段应当被另外处理以确定渲染输出的最终输出值。在实施方式中,在基于图块的渲染系统中的渲染图块内执行该预通道操作。
在实施方式中,提供“回退”模式以允许图形处理器处理与以这种方式处理不兼容的基元。
所有这些的效果提供了改进的(和潜在的样本完美的)隐藏表面去除,其可以在硬件中更有效地实现。
根据本文描述的技术的要求,图形处理器可以根据需要以任何合适的方式配置。
在实施方式中,本文中描述的技术的图形处理器包括几何形状处理(分块)电路和渲染电路。
几何形状处理(分块)电路被配置为生成基元列表。与图块有关的基元的拣选可以以任何合适的方式完成,例如以生成基元列表的正常方式完成。可以针对渲染输出的任何合适的区域准备基元列表。因此,基元列表与实际渲染图块之间可存在或可不存在一一对应关系。
一旦已经处理了所有几何形状,则在实施方式中,将基元列表写出,例如写入到外部(例如,主)存储器。
然后在后续渲染状态期间使用基元列表,以便执行各个图块的实际渲染。因此,在实施方式中,图形处理器的渲染电路包括基元列表读取电路,该基元列表读取电路被配置为当发布用于渲染的图块时,使用应用于所讨论的图块的相应的(一个或多个)基元列表来识别应当针对图块处理的基元序列。
因此,在实施方式中,基元列表读取电路被配置为例如从存储器获得基元列表,识别应当针对图块处理的基元序列,并且发布所识别的基元用于渲染。这可以以任何合适且期望的方式完成,例如,取决于基元列表的格式。例如,在基元列表应用于渲染输出的分层布置的区域(使得基元列表与要渲染的图块之间不一定存在一一对应关系,并且使得给定图块可以与多个基元列表相关联)的情况下,识别基元序列的步骤可以包括处理多个基元列表并且将来自多个基元列表的基元合并成期望的渲染顺序。
在实施方式中,这些操作是响应于渲染图块的命令而执行的。然后将所识别的基元相应地发布到渲染流水线中以用于进一步处理,如下文将进一步解释的。然而,在一些实施方式中,可以在图形处理器执行触发预通道操作的渲染命令之前预先(并且例如,预取)识别基元序列。在这方面,各种布置是可能的。
本文描述的技术特别涉及对被识别为要处理的基元执行的渲染操作。在实施方式中,渲染以流水线方式执行为一系列处理级。根据本文描述的技术的要求,渲染流水线通常可以包括图形处理(渲染)流水线可以包含的任何合适的和期望的处理级。
具体地,根据本文描述的技术的渲染使用基于光栅化的方法。
因此,本文描述的技术的图形处理器的渲染电路(流水线)通常包括用于将基元处理成片段的相应集合的光栅化器和被配置为处理(渲染)所得片段以确定对应的采样位置在最终渲染输出中应当具有的外观(例如,颜色)的渲染器。
光栅化器(光栅化器电路)可以被配置为以任何合适和期望的方式操作,例如如在已知的光栅化布置结构中。它应当操作以根据由光栅化器接收到的给定基元等(至少部分地)覆盖的覆盖渲染输出的区域的采样位置阵列中的哪些采样位置(或哪些采样位置的集合)来生成用于处理的图形片段。
在实施方式中,光栅化器针对如下基元(和每个基元)覆盖的每个采样位置和/或被发现包括由如下基元(和每个基元)覆盖的采样位置的多个采样位置(例如,采样掩码)的每个集合生成图形片段,所述如下基元(和每个基元)由正被光栅化(并且没有出于另一原因以其他方式从处理中剔除,诸如通过在早期深度测试中失败的基元)。
相应地,根据需要,由光栅化器生成的每个片段可以表示(具有与其相关联的)单个采样位置或多个采样位置。在实施方式中,每个片段表示多个采样位置的集合,在一个实施方式中是四个(并且在一个实施方式中是2×2阵列的)采样位置的集合。
图形处理器的渲染器(片段处理电路)应当可操作以渲染(着色)其接收的图形片段,以生成期望的输出图形片段数据。它可以包含任何合适的和期望的渲染元素,并且可以以任何合适和期望的方式配置。因此,例如,其可以包括固定功能渲染流水线,包括一个或更多个固定功能渲染级(电路),诸如纹理映射器、混合器、起雾单元等。在实施方式中,渲染器包括片段着色器(着色器流水线)(即,可编程处理电路,其可操作用于并且可以被编程为对片段执行片段着色程序以便渲染它们)。
渲染器(片段处理电路)将对其接收的片段进行处理,然后以生成输出渲染片段数据,然后在实施方式中,将输出渲染片段数据写入外部存储器中的输出缓冲区(诸如帧缓冲区)以供使用(例如,在显示器上显示帧)。渲染片段数据可经由中间缓冲区(例如图块(例如,色彩)缓冲区(如基于图块的图形处理系统中的情况))写入到(外部)输出缓冲区。
要生成的渲染输出可以包括要由图形处理器生成的任何渲染输出。因此,其可以包括例如要在基于图块的图形处理器中生成的图块,和/或输出片段数据的帧的全部或部分。
如上所述,在本文描述的技术中,渲染基元在两个单独的处理通道中被有效地执行:被执行以生成正被处理的基元序列的可见性信息的第一“预通道”和执行实际最终渲染操作以产生最终渲染输出(例如,颜色)值的第二“主”通道。
因此,第一预通道的结果是生成片段“可见性”缓冲区形式的期望“可见性”信息。如上所述,第一预通道操作的结果因此是填充了专用数据结构(基元识别信息集合),该专用数据结构针对渲染输出中的每个采样位置存储指示应当针对该采样位置渲染哪个基元的相应基元识别符。然后在第二主通道期间通过适当的可见性测试级来消耗在第一预通道操作期间生成的基元识别信息集合,该可见性测试级对照存储在可见性缓冲区中的对应的基元识别符来测试与当前片段相关联的基元识别符,以确定片段是否应当被另外处理。
根据本文描述的技术的要求,在第一预通道中执行的处理可以包括任何合适的和期望的处理。然而,通常,第一预通道操作包括将基元光栅化为一个或更多个片段的相应集合,然后执行一个或更多个片段处理操作以确定期望的可见性信息。可见性信息通常且在实施方式中是基于片段深度值的。即,哪个片段将在特定采样位置可见通常将并且在实施方式中是由哪个片段在场景中最前面(即,具有最近的深度值)来(至少部分地)确定的。
因此,在实施方式中,第一预通道包括对片段进行(早期)深度测试以更新针对渲染输出的深度缓冲区。深度缓冲区存储针对渲染输出的每采样位置深度值的集合。因此,在实施方式中,第一预通道操作包括对照存储在深度(Z)缓冲区中的对应深度值测试(当前)片段的深度值。如果片段在深度测试中存活,则在实施方式中,深度缓冲区被更新以包括当前片段的深度值,直到基元的所有片段已经被处理。因此,在第一预通道结束时产生的深度缓冲区表示整个基元序列的深度缓冲区。
在一些实施方式中,第一预通道因此包括将基元光栅化为一个或更多个片段的相应集合,然后对片段进行深度测试以更新深度缓冲区。在实施方式中,深度缓冲区用于生成基元识别信息集合,如上所述,基元识别信息集合在第一预通道结束时被写入到合适的存储装置。在实施方式中,深度缓冲区也在第一预通道结束时被写入到合适的存储装置。深度和基元识别信息集合可以被写出到外部存储器,但是在实施方式中,深度和基元识别信息集合被写入到本地存储装置,例如RAM中的已经被分配用于当前渲染操作的专用部分(例如,针对正被渲染的图块),并且一旦当前渲染操作(当前图块的渲染)完成,就可以重写(overwritten)哪些本地存储装置。在这方面,各种布置是可能的。
如上所述,在实施方式中,用于第一预通道操作的片段处理在此时完成,即,在写出基元识别信息集合(和任何其它缓冲区,例如可能期望写出的深度缓冲区)之后。因此,在实施方式中,在执行(早期)深度测试并且相应地更新深度缓冲区(根据需要)之后,用于第一预通道的片段处理完成,并且片段不由预通道操作另外处理(尽管预通道操作可以继续,例如,以在预通道操作本身完成之前填充基元识别信息集合和/或基元剔除数据结构)。因此,在实施方式中,第一预通道操作例如不执行片段着色器以渲染片段(例如,确定最终渲染输出的颜色值)。然而,在一些实施方式中,可以执行(部分)片段着色器。例如,这可能适合于处理需要片段着色器来确定片段的深度值和/或覆盖的基元。在这种情况下,在实施方式中,最终(颜色)输出仍然被禁用,并且片段着色器被运行得足够远以更新深度缓冲区,但是在实施方式中,片段在未被完全渲染,以避免必须在该级计算最终渲染输出数据,因为它可能稍后被重写。(否则,着色器修改深度值的此类基元可能需要被视为不兼容基元)。
在实施方式中,预通道操作还包括如上所述的基元分类检查的步骤,以确定基元是否与预通道兼容。在实施方式中,在预通道开始时(例如并且在实施方式中,在光栅化基元之前)执行基元分类检查的步骤。然而,其他布置也是可能的。
如果基元是兼容的,则预通道操作正常继续。否则,如果基元与预通道不兼容,则在实施方式中,不对该基元执行预通道。在这种情况下,在实施方式中,然后发起主通道以处理基元序列中的基元,直到紧接在不兼容基元之前(前一个)的基元,并且当主通道到达不兼容基元时,图形处理器然后被切换到第三回退操作模式(如上所述)。
在第一预通道完成之后(或者已经终止,例如响应于遇到不兼容基元),执行第二主通道操作,以根据需要另外处理在第一预通道期间已经处理的基元,以生成最终渲染输出。
因此,例如通过执行片段着色以生成最终渲染输出的渲染输出(例如,颜色)值集合来生成最终渲染输出。因此,在第二主通道中的处理通常可以包括将基元光栅化为它们的片段的相应集合,然后执行片段着色器,以便确定针对渲染输出中的采样位置的对应的渲染输出值(例如,确定相关联的采样位置在最终渲染输出中应当具有的外观(例如,颜色))。
第二主通道可以包括可以期望执行的任何其他渲染级,诸如混合等。在实施方式中,第二主通道还包括基元分类(检查)的步骤,以确定基元是否与预通道操作兼容,并且在实施方式中,根据需要触发切换到第三回退操作模式,例如,如上所述。
如上文所描述,第二主通道还包括可见性测试,该可见性测试使用在第一预通道期间生成的可见性信息(基元识别信息集合)来控制第二主通道的基元(或片段)的处理。在实施方式中,在每片段的基础上执行可见性测试。因此,在实施方式中,在光栅化之后执行可见性测试。在实施方式中,在渲染操作之前(例如,并且在实施方式中,在片段着色之前)执行可见性测试,该渲染操作确定针对采样位置的渲染输出值。
在实施方式中,在第二主通道期间不更新深度缓冲区。在一些实施方式中,在第二主通道期间根本没有片段深度测试。即,在一些实施方式中,仅使用基元识别信息集合来执行隐藏表面去除。然而,在一些情况下,仍可执行片段深度测试(但对深度缓冲区的写入被禁用)。例如,取决于基元的类型以及因此在对照基元识别信息集合测试给定片段时使用的测试函数,仍可能期望在主通道期间执行一些深度测试,这可能特别是基元不(并且不可)更新深度缓冲区且因此可跳过预通道的情况,在此情况下,基元可由第二主通道处理,但在实施方式中,片段可见性测试函数被修改成对照基元识别信息集合的大于测试,如上文所描述。这可以是例如对于不写入深度的透明基元的情况。在此情况下,仅有基元识别符大于基元识别信息集合中的对应条目的基元应在第二主通道中进行进一步处理。然而,透明基元可能仍在最终渲染输出中被遮挡,使得其可能潜在地被剔除。因此,深度测试可用于剔除未生成可见性信息(使得使用大于测试)且通过片段可见性测试但实际上不具有任何可见效果的任何基元。
因此,一般来说,相同基元可(并且在实施方式中确实)在相应处理通道中经历不同处理。例如,在实施方式中,第一预通道涉及将基元至少光栅化为片段并执行用于生成可见性信息的深度测试。预通道可以执行或可以不执行片段着色器。然而,在实施方式中,预通道至少不写出并且在实施方式中也不生成最终渲染输出(例如,颜色)值。另一方面,在实施方式中,第二主通道将基元光栅化为片段,使用在预通道期间生成的可见性信息来执行一些可见性测试,然后执行片段着色以针对在可见性测试存活的任何片段生成和输出(例如,颜色)值。
在预通道或主通道中执行的处理通常还可以包括可能期望的任何其他合适的处理步骤(级)。
只要基元与本文中所描述的技术的方式(使用预通道)兼容,则在实施方式中,使图形处理器(最初)以第一预通道模式处理基元序列中的所有基元,并且接着在第二主通道模式中(从开始)再次处理该基元序列。
因此,在实施方式中,相同的基元序列经受第一预通道操作和第二主通道操作两者。在此方面,也设想例如处理的粒度可在预通道与主通道之间改变。例如,可以针对整个图块执行预通道,但接着可将图块细分成用于执行主通道的更小子图块,使得执行多个主通道。相应地,可以对子图块执行预通道操作,然后针对多个(例如,所有)子图块一起执行主通道。在这方面,各种布置是可能的。
在实施方式中,以相同方式处理基元序列中的所有基元。然而,其他布置是可能的,并且将渲染划分成两个单独的通道也可以允许进一步可能的优化。
例如,如果可以确定基元在在预通道中执行之后将没有进一步的效果,则在这种情况下,无论可见性信息如何,都可以避免在第二主通道中另外处理基元。这种情况的一个示例是,基元仅写入到深度和/或模版缓冲区,但不输出颜色值。这通常是预先已知的,并且因此可以例如根据与基元相关联的合适的状态信息(例如,描述符)来确定。
还可以在第一预通道操作期间确定一些基元(其整体)不需要被另外处理。例如,在一些实施方式中,除了如上文所描述的用于在主通道中控制片段处理的、在第二主通道期间消耗的可见性信息之外,可以生成作为预通道的部分的“基元剔除”数据结构,其指示可能已经整体剔除的任何基元,以避免在第二主通道中对那些基元的不必要处理。因此,如果在第一预通道操作期间确定与基元相关联的任何片段都没有任何可见效果,则在这种情况下,可以例如并且在实施方式中整体剔除基元而无需任何片段处理。因此,在一些实施方式中,如果可以确定基元的所有片段是不可见的,则可以剔除基元。该基元剔除可以(并且在实施方式中)在第二主通道的开始处完成,例如,在基元分类(在其执行)之后,但在实施方式中,是在将基元光栅化成其相应片段之前。以此方式,可从用于主通道的基元序列去除基元,因此避免任何不必要的片段处理。由于可能禁止按每基元存储该信息,所以这样的实施方式可以使用固定大小的基元剔除数据结构。这可以根据需要填充,并且用于控制对第二主通道中对基元的处理。
在第二主通道期间跳过一些或所有处理将是可能的。
相应地,如果可以确定给定基元没有对预通道贡献任何有意义的输出,则可以相应地跳过由第一预通道操作对该基元的一些或全部处理。例如,对于不生成任何可见性信息的基元,例如不写出深度值的透明基元,可能是这种情况,如上所述。因此,可以省略第一预通道操作中对基元的所有处理中的一些,使得实施方式中,基元基本上仅在主通道操作中(或仅在回退模式中)处理。此示例可以是不更新深度缓冲区的透明基元。这些基元可被简单地视为触发回退模式的不兼容基元,但在第一预通道操作期间,基元分类检查可以被另选地进一步修改以识别此类基元,并且通过第一预通道操作停止对此类基元的处理,使得基元改为基本上仅在具有针对此类基元选择的适当修改的片段可见性测试的第二主通道操作中被处理。
另一方面,存在一些情况,其中所有基元需要在单个处理通道中处理,例如对于遮挡/流水线查询,例如,可作为深度(或模版)测试/更新的部分执行。在此情况下,图形处理器可经配置以确保在第一预通道操作中处理所有基元,即使基元原则上可跳过第一预通道操作(因为基元不产生任何可见性信息)。另选地,如果启用遮挡/流水线查询,则这可能简单地触发回退操作。
本文描述的技术的预通道操作还与预帧着色器交互。例如,存在可在渲染应用指定的几何形状之前在某些条件下运行的各种全帧着色器。这些可以用于各种目的,例如利用数据预加载深度、模版和/或颜色缓冲区。通常,因为预通道不输出颜色值,所以本文中描述的技术在实施方式中不分配颜色缓冲区,直到预通道已经完成。因此,在实施方式中,填充颜色缓冲器(颜色读回)的预帧着色器相应地是在预通道之后执行的。这还可以允许使用可见性信息剔除颜色读回。另一方面,在实施方式中,填充深度和/或模版缓冲区(ZS读回)的预帧着色器是在预通道之前执行的。
在这方面,各种其他布置和优化将是可能的。
如上所述,在实施方式中,不能(安全地)使用单独的预通道操作和主通道操作来处理的任何基元都以第三种回退操作模式来处理。在实施方式中,回退操作模式以“故障安全”方式对基元进行光栅化和渲染,例如,并且在实施方式中,以基于光栅的渲染系统的正常方式对基元进行光栅化和渲染。即,在回退模式期间,将基元光栅化为片段的集合,并且然后渲染所得片段以确定对应的渲染输出值(例如,以确定相关联的采样位置应当具有的外观(例如,颜色值))。
回退模式通常可以执行任何合适的和期望的片段处理。例如,在实施方式中,回退模式可以执行其他合适形式的隐藏表面去除,诸如(早期/晚期)深度测试,例如以用于此类深度测试的正常方式。
如上所述,当在正在处理的基元序列内遇到不兼容基元时,触发回退操作模式。存在可能意味着基元与以本文描述的技术的方式处理不兼容的各种条件。例如,这可以包括以下项中的一项或更多项:(i)基元是透明的(特别是如果基元是透明的,但是仍然可以更新深度缓冲区,因为基元识别信息集合在实施方式中应当仅指示不透明基元);(ii)基元具有副作用;(iii)基元使用模版化;(iv)基元不写入到所有渲染目标;(iv)基元不写入到深度缓冲区;(v)需要着色器来确定基元覆盖;(vi)着色器发出深度值。这些条件中的哪一者意味着基元与以本文中所描述的技术的方式处理不兼容通常可取决于预通道操作的配置。例如,如上所述,在一些实施方式中,可在预通道期间执行(部分)着色器,在此情况下,预通道可能够处理需要着色器来确定基元覆盖的至少一些基元。作为另一示例,当可见性信息包括在预通道期间生成的专用基元识别信息集合(根据用于确定上述可见性信息的第二主要实施方式)时,在这种情况下,预通道可以是在预通道中处理模板化。类似地,可以进一步修改或优化预通道操作以允许处理至少一些片段着色器副作用,或者处理不写入到所有渲染目标的基元。取决于图形处理器的配置,各种其他示例是可能的。
从上文将理解,图形处理器的渲染电路可有效地配置处于多个不同状态,其调制针对传递到渲染电路的基元执行的处理。可以根据需要以任何合适的方式控制渲染状态。例如,如上所述,可以使用指示基元是否与使用本文中所描述的技术的预通道操作处理兼容的分类信息来注释基元,该信息可用于使图形处理器切换出预通道操作模式。合适的标志还可用于确定图形处理器当前处于预通道状态还是主通道状态。因此,当正在处理基元时,可以确定图形处理器的当前状态,然后图形处理器控制所执行的处理。
例如,当发布(新)基元序列以供渲染时,实施方式中的渲染电路在第一预通道状态下开始。因此,如果第一个基元与预通道操作兼容,则图形处理器保持在预通道状态,并相应地执行预通道操作。接着发布下一基元以供处理。另一方面,如果当图形处理器处于预通道状态时遇到不兼容基元,则在实施方式中,针对那个基元停止预通道操作,并且然后在实施方式中,图形处理器切换到主通道状态,其中堆基元的处理从基元序列的开始处重新开始,其中图形处理器被配置处于主通道状态中。
类似地,当图形处理器处于主通道状态时,只要基元是兼容的,图形处理器就保持在主通道状态,并且执行主通道操作。另一方面,当处于主通道状态的图形处理器遇到不兼容基元时,这在实施方式中触发切换到回退状态。然后,图形处理器保持在回退状态并且继续处理当前基元(即,从主通道停止的位置继续)。
因此,在实施方式中,基于图形处理器的基元分类和当前操作模式以这种方式控制图形处理器状态机,以便控制本文描述的技术的预通道操作。以此方式,图形处理器可经控制以在处理基元序列时适当地在操作模式(预通道/主通道/回退)之间切换。
因此,在实施方式中,存在单个(物理)渲染流水线,并且因此基于图形处理器的当前状态(即,图形处理器正在执行预通道或主通道等)来调制所执行的操作。然而,渲染电路还可以被配置为具有多个物理上分离的(并行)渲染流水线,这些渲染流水线可以根据渲染电路的不同状态来处理不同的操作。
各种其他布置也将是可能的。
本文描述的技术通常可以在任何合适的图形处理系统中找到应用。本文描述的技术特别涉及基于图块的渲染系统。
本文中所描述的技术可以针对图形处理流水线可用于生成的所有形式的输出(例如供显示的帧、渲染到纹理输出等)来使用。
在一些实施方式中,图形处理系统包括存储本文描述的数据的一个或更多个存储器和/或存储器设备和/或存储用于执行本文描述的处理的软件,和/或与存储本文描述的数据的一个或更多个存储器和/或存储器设备和/或存储用于执行本文描述的处理的软件进行通信。图形处理系统还可以与主机微处理器通信,和/或具有用于基于由图形处理系统生成的数据来显示图像的显示器。
在实施方式中,本文描述的技术的各种功能在单个图形处理平台上执行,该单个图形处理平台生成并输出经渲染的片段数据,该经渲染的片段数据例如被写入到用于显示设备的帧缓冲区。
本文描述的技术可以在任何合适的系统中实现,诸如基于适当配置的基于微处理器的系统。在实施方式中,本文描述的技术在基于计算机和/或微处理器的系统中实现。
本文描述的技术的各种功能可以以任何期望和合适的方式执行。例如,本文描述的技术的功能可以根据需要而在硬件或软件中实现。因此,例如,本文描述的技术的各种功能元件、级和流水线可以包括可操作以执行各种功能等的合适的一个处理器或多个处理器、一个控制器或多个控制器、功能单元、电路/电路系统、处理逻辑、微处理器布置结构等,诸如适当配置的专用硬件元件或处理电路/电路系统、和/或被编程为以期望的方式操作的可编程硬件元件或处理电路/电路系统。
这里还应当注意,如本领域技术人员将理解的,本文描述的技术的各种功能等可以在给定处理器上复制和/或并行地执行。同样,如果需要,各个处理级可以共享处理电路/电路系统。
因此,本文中所描述的技术扩展到图形处理器且扩展到图形处理平台,所述图形处理平台包括根据本文中所描述的技术的任何一个或更多个实施方式操作的装置或根据本文中所描述的技术的任何一个或更多个实施方式的装置。经受执行上述特定功能所需的任何硬件,这样的图形处理器可以另外包括图形处理器所包括的任何一个或更多个或所有通常的功能单元等。
本领域技术人员还将理解,本文中所描述的技术的所有所描述实施方式可以(并且在实施方式中确实)包括本文中所描述的任何一个或更多个或所有可选特征。
根据本文描述的技术的方法可以至少部分地使用软件(例如,计算机程序)来实现。因此,可以看出,当从另外的实施方式中观察时,本文描述的技术包括特别适用于执行本文描述的方法的计算机软件(当计算机软件在安装在数据处理器上时)、包括用于执行所描述的方法的计算机软件代码部分的计算机程序元件(当该程序元件在数据处理器上运行时)、以及包括适于执行本文描述的方法或方法的所有步骤的代码的计算机程序(当该程序在数据处理系统上运行时)。数据处理器可以是微处理器系统、可编程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,检查以确定基元是否(潜在地)与此示例中的预通道操作不兼容的条件包含以下条件;
基元是透明的(步骤121)-因为透明基元通常将不更新深度缓冲区,并且因此在图9中所示的主通道期间将通过深度等于测试被不正确地剔除;
基元具有副作用(步骤122)-因为具有副作用的任何基元通常应当仅被处理一次;
基元使用模版化(步骤123);
基元不写入到所有渲染目标(步骤124);
基元在第一预通道操作期间使用排他性深度测试(诸如“大于”测试而不是“大于或等于”深度测试)(步骤125);
基元不写入深度(步骤126);
需要片段着色器来确定基元覆盖(换言之,片段着色器潜在地修改覆盖)(步骤127);或者
需要片段着色器来确定深度值(换言之,片段着色器发出深度值)(步骤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)。
因此,如果片段在第二主通道操作期间在深度等于测试中存活,则基于片段的原始深度测试函数来确定行为,然后如下设定“跟踪”位的状态:
如果片段的原始深度测试函数是包含性的并且“跟踪”位被设定,则片段通过,并且被进一步处理以生成期望的渲染输出数据;
如果片段的原始深度测试函数是包含性的并且“跟踪”位没有被设定,则片段可以(并且在实施方式中是)被剔除(注意,如果原始深度测试函数是包含性的,则该状态不应是可能的,因为“消歧”位应始终处于第一状态);
如果片段的原始深度测试函数是排他性的并且“跟踪”位被设定,则片段可以(并且在实施方式中是)被剔除;以及
如果片段的原始深度测试函数是排他性的并且“跟踪”位没有被设定,则片段通过,并且被进一步处理以生成期望的渲染输出数据,并且“跟踪”位在此时被设定。
因此,所有这些的效果是,额外的“跟踪”位本质上跟踪针对原始深度测试函数为排他性的基元的片段,无论该基元的片段是否是导致深度缓冲区更新的片段,并且因此无论该片段是否应当被进一步处理。特别地,由于满足条件(iv),“跟踪”位被设定为(第一状态),这确保了写入相同深度值但原始深度测试函数是排他性的任何较晚到达的片段将(基于正被设定的“跟踪”位)而被正确地剔除。
以此方式,即使在第二主通道中的深度测试被修改为使用深度等于测试,使得在第二主通道期间不使用原始深度测试函数时,深度缓冲区中的额外的“跟踪”位也可用于确保维持正确的渲染行为。通过提供这样的基于深度测试函数的类型来消除写入相同深度值的基元的机制,这意味着这样的基元可以通过预通道操作来安全地处理。
例如,考虑其中三个基元P0、P1、P2全部写入相同深度值的示例,并且其中每一基元可具有包含性或排他性深度比较函数。接下来的表格示出了根据八种可能情况中的每一者的操作。可以看出,在所有情况下都实现了期望的渲染行为(即,最终可见基元是基于应用指定的深度比较函数的正确基元)。
表1-深度测试消歧示例
应注意,上文所描述的消歧机制假定深度测试函数是单调的,即,深度测试函数的极性在基元序列内的基元之间(或基元的前面/后面之间)不改变,例如,使得深度测试函数不会从“大于”(或“大于或等于”)测试改变为“小于”(或“小于或等于”)测试,或反之亦然,并且深度测试函数不改变成“始终”写入到深度缓冲区。在这些情况下,正确的渲染行为变得更加复杂,使得可能无法使用单个“跟踪”位来跟踪正确的行为,并且因此可能需要使用更复杂的跟踪机制。否则,可以使用回退操作来处理这种情况,本示例就是这种情况。
因此,该示例的基元分类处理在图17中示出,并且如图所示,基元分类通常检查与图12中所示的示例相同的条件,只是不检查基元是否具有排他性深度测试函数(图12中的步骤125),而是改为检查基元是否具有单调的深度比较函数(在步骤175处)。在此示例中,因此,当确定深度测试函数在基元序列内改变极性时,可以因此(并且将)相应地触发第三回退操作。注意,对于该示例也不再需要检查是否启用了深度写入,因为深度比较函数必须是单调的限制也消除了该要求。
示例3-模版化
到目前为止的描述主要集中于在第一预通道操作期间基于对基元的片段进行深度测试来确定可见性信息,并且接着使用由第一预通道操作确定的深度缓冲区来控制在第二主通道操作期间基元的后续渲染。例如,在上文呈现的第一示例和第二示例中,在第一预通道操作或对应的第二主通道操作中不执行模版化。因此,对于这些示例,在基元分类处理期间,模版化被有效地禁用,并且因此需要模版化的任何基元被视为不兼容基元,如图12所示。因此,在到目前为止描述的示例中,任何需要模版化的基元都会随后通过第三回退操作来处理(针对其执行深度和模版测试/更新两者,如图10所示)。
然而,应当理解,在一些情况下(并且在一些实施方式中是)模版化可以以与上述深度测试类似的方式来处理。例如,某些类型的模版测试可以以与上述深度测试相对应的方式在第一预通道操作期间执行,以便填充模版缓冲区(例如并且特别地,只要前后比较操作是单调的(具有相同的极性))。然后,模版缓冲区可以通过执行合适的模版“等于”测试来控制在第二主通道期间的片段处理。同样,如果两个基元写入相同的模版值,则在正使用排他性模版测试函数的情况下可能需要合适的消歧机制。在实施方式中,模版等于测试消歧机制是在以与上述深度等于测试消歧机制相同的方式执行的,但是现在使用与模版缓冲区相关联的附加每样本“跟踪”位。
图18例示了在其中启用模版化的另一示例中根据第一预通道操作的处理操作(图形处理流水线)。处理操作与以上关于图8和图13所描述的相同,只是在深度测试/更新136之后执行具有消歧的早期模版测试/更新186的附加步骤。因此,存储在模版缓冲区中的每样本“跟踪”位可以以与上面关于图14描述的相同的方式相应地设定/清除,但是是基于模版测试而不是深度测试(在步骤141)。因此,在图19中例示了针对在第二主通道操作期间进行模版化的对应消歧处理,并且该对应消歧处理基本上反映了针对上面关于图16描述的深度测试的消歧处理。
因此,如图19所示,对于到模版测试186的传入片段190,检查片段190是否具有作为模版缓冲区中记录的对应模版值的模版值(步骤191)。如果模版值不匹配(步骤191-否),则可以执行另外的模版测试(如果需要/期望)(步骤192),并且根据模版测试的结果,片段可以在模版测试中存活(使得其被确定为可见-步骤194),或者可以在此时被剔除(使得其被确定为不可见-步骤196)。如果模版值确实匹配,使得片段190在模版等于测试中存活(步骤191-是),则检查针对相关联的基元(并且因此针对片段)的原始指定模版测试函数是否是包含性测试(步骤193)。如果原始模版测试函数是包含性的(步骤193-是),则应当渲染片段190,并且因此确定片段190可见(步骤194)。然而,如果原始模版测试函数是排他性的(步骤193-否),则正确的渲染行为是只有该模版值的第一个片段应存活。此时,检查是否已设定与所讨论的采样位置相关联的模版缓冲区中的“跟踪”位(步骤195)。如果尚未设定“跟踪”位(步骤195-是),这意味着片段190是具有该模版值的第一个片段,并且片段190因此应存活(并且因此片段被确定为可见-步骤194)。此时,设定“跟踪”位(步骤197)。这意味着如果处理了具有相同模版值的另一较晚基元(步骤191-是),并且针对其使用了包含性测试(步骤193-是),则“跟踪”位将在此时被设定,即,由具有相同模版值的先前基元设定。因此,此时将确定“跟踪”位被设定(步骤195-是),这将导致较晚片段被(正确地)剔除(步骤196)。
图20例示了在启用模版化的该另外的示例中根据第二主通道操作的对应处理操作(图形处理流水线)。这与图15中所示的处理流水线相同,只是在具有消歧的早期深度等于测试级156之后包括附加的具有消歧的早期模版等于测试级206。
这样做的效果是,至少一些类型的模版化现在可以通过预通道操作来处理。因此,图21示出了该示例的对应基元分类处理。具体地,如图21所示,基元分类通常与上述相同,只是现在只有某些类型的不兼容模版被视为与预通道操作不兼容(在步骤223)。即,可能存在某些类型的模版仍然与预通道操作不兼容。存在可能意味着模版化仍然与预通道操作不兼容的各种条件,并且这些条件通常可以(例如基于模版测试的性质)预先确定。例如,这可以是正面和背面模版测试函数具有不同极性的情况。在这种情况下,基元因此仍然被视为不兼容,使得它们应当改为使用如上所述的第三回退操作来处理。
示例4-着色器修改覆盖
在上文所描述的示例中,第一预通道操作不执行片段着色器。这意味着任何需要执行片段着色器以便完全确定基元的覆盖和/或深度值的基元必须被视为不兼容,并且这相应地在图12中示出。即,如图12所示,当基元具有着色器修改覆盖(步骤127)或着色器发出深度(步骤128)的性质时,确定基元与预通道操作不兼容。然而,可能期望在第一预通道操作期间执行至少部分片段着色器,以便将预通道暴露于足够信息以能够处理这样的基元,并且在另外的示例中因此这样做。
例如,如上所述,第一预通道操作的目的是确定基元序列的“可见性”信息,然后“可见性”信息可用于在第二主通道操作期间控制片段处理,例如,并且在实施方式中,以在第二主通道操作期间剔除基于片段对于渲染输出不具有可见效果的可见性信息确定的片段。在实施方式中,“可见性”信息是基于对片段进行深度(以及可选地模版)测试生成的。
然而,需要图形处理的应用可以指定需要片段着色以便确定最终片段覆盖和/或深度值的各种不同类型的基元。因此,对于这样的基元,可能期望在第一预通道操作期间执行第一(“预通道”)片段着色器例程以便确定期望的“可见性”信息(否则,基元可能必须被视为与预通道操作不兼容,例如并且改为由第三回退操作来处理,如在到目前为止描述的示例中那样)。其示例在图22中例示,图22示出了根据第四示例的第一预通道操作的配置,其中第一预通道操作也可操作以执行相应(部分)片段着色器。
因此,图22例示根据第四示例的根据第一预通道操作的处理操作(图形处理流水线),其中可见性信息包括深度/模版缓冲区(使得初始处理与图18中所示的示例相同),但其中在执行(早期)深度/模版测试之后,第一预通道操作进一步可操作,以至少针对需要执行片段着色器以确定最终覆盖的基元执行片段着色器227。然后可以相应地执行片段着色器227以确定最终覆盖,然后可以相应地使用最终覆盖来执行晚期深度测试/更新228和晚期模版测试/更新229。晚期深度/模版测试/更新可以以正常方式执行,但是在实施方式中还包括合适的消歧机制,以用于确保在存在写入相同深度/模版值的两个基元的情况下使用排他性深度/模版测试函数的基元的正确渲染行为,例如,如上面关于第二示例和第三示例所描述的。
因此,片段着色器可操作以在第一预通道操作期间执行第一片段着色器例程。例如,这在实施方式中是在第二主通道操作期间执行的完整片段着色器的部分版本。例如,第一片段着色器例程可以执行直到某个“丢弃”指令,其中片段着色器例程被相应地执行得刚好足够远以生成期望的可见性信息,但是不产生最终渲染输出数据(其仍然被推迟到第二主通道操作,在实施方式中,当需要完成渲染以产生最终渲染输出数据时,第二主通道操作然后运行完整片段着色器)。设想了用于确定片段着色器应在第一预通道操作期间执行多远以及是否执行的各种布置,例如取决于可期望在相应处理通道期间获得的期望的着色器状态(包括潜在的着色器副作用)。
因此,如图23所示相应地修改该第四示例中的分类处理,使得着色器修改覆盖的基元不再被视为与预通道操作不兼容。因此,分类处理大体上类似于上文所描述且在图17中示出的分类处理,只是着色器修改覆盖的条件不再需要被检查。
在图23所示的特定示例中,着色器发出深度的条件仍然被认为是不兼容的(因为在该示例中片段着色器不写入深度)。然而,当然也可以允许在预通道操作中执行的着色器写入深度,在这种情况下着色器发出深度的基元也将不再被确定为不兼容的。即,在预通道操作中执行的片段着色器可以被执行直到并且包括丢弃点,以确定着色器是否修改覆盖并且还可以被执行直到并包括确定晚期深度的点。通常,在预通道操作中执行的片段着色器可以因此被执行到任何合适的和期望的点,以便将第一预通道操作暴露到足够的状态以确定完全可见性信息(无论这涉及到什么)。在这方面,设想了可以在第一预通道中执行的片段着色器可以执行多远的各种布置。
示例5-“HSR ID”缓冲区
到目前为止描述的示例都涉及其中在第一预通道操作期间生成的深度缓冲区(以及可选地还有模版缓冲区)被用作在第二主通道操作期间控制片段处理的“可见性”信息的实施方式。然而,设想了各种其他示例,并且在其他布置中,在第一预通道操作期间生成的“可见性”信息然后被用作在第二主通道操作期间控制处理可以采取任何合适且期望的形式。
例如,在用于生成“可见性”信息的另一布置中,不是使用深度(模版)缓冲区自身作为用于在第二主通道操作期间控制基元的进一步处理的“可见性”信息,第一预通道操作以每样本基元识别信息的专用集合的形式生成“可见性”信息,所述信息存储针对渲染输出内的相应采样位置的相应的基元识别符,所述基元识别符指示应针对所关注的采样位置进一步处理哪一基元(所述基元识别符在本文中也将被称作隐藏表面去除识别符(“HSRID”),其中每样本基元识别信息集合对应地被称作“HSR ID缓冲区”)。
HSR ID缓冲区通常可以采取任何合适且期望的形式,但是通常可以匹配深度缓冲区的大小和形式,因为它能够以与深度缓冲区如何存储针对渲染输出内的每个采样位置的相应深度值类似的方式存储针对渲染输出内的每个采样位置的相应HSR ID。因此,HSR ID缓冲区可以(并且在该示例中是)在第一预通道操作期间被填充,以记录针对渲染输出的相应采样位置的期望可见性信息。因此,这样做的结果是,在第一预通道操作结束时的HSR ID缓冲区存储相应的HSR ID集合,该HSR ID集合指示应当针对渲染输出内的采样位置进一步处理哪些基元。
图24示出了根据以这种HSR ID缓冲区的形式生成可见性信息的布置的示例的预通道操作的处理操作的序列。在此示例中,第一预通道操作因此包括流水线化的处理操作序列,其包括:片段着色器端点80,其调度图形处理流水线需要执行的渲染工作以便渲染图块;基元列表读取器(多边形列表读取器81),其读取适当的针对图块的基元列表以识别将针对图块渲染的基元;基元分类单元82;预通道决策单元83;顶点处理(着色)级84,其获得(并且如果需要,着色)用于针对图块的要渲染的基元的相关顶点数据;光栅化器85,其将基元光栅化成对应于渲染输出内的采样位置的相应片段;以及(早期)深度测试/更新级86,其执行片段深度测试且相应地更新深度缓冲区。
到目前为止,处理流水线因此类似于以上关于较早示例描述的处理流水线。然而,在此示例中,在(早期)深度/模版测试/更新86之后,执行另外的HSR ID更新241,其响应于(早期)深度/模版测试/更新86而根据需要更新HSR ID缓冲区。在图24所示的示例中,第一预通道操作可以可选地还执行片段着色器227并执行如上面关于图22所述的晚期深度/模版测试/更新228。在这种情况下,可以有另外的晚期HSR ID更新242,其响应于晚期深度/模版测试/更新228的结果而根据需要更新HSR ID缓冲区。
因此,基于深度/模版测试来执行HSR ID缓冲区的更新。图25示意性地示出了可以如何在第一预通道操作期间填充这种HSR ID缓冲区。具体地,如图25所示,当在早期深度/模版测试/更新86期间确定基元的片段在该片段涉及的一个采样位置或多个采样位置处可见时,然后此时更新HSR ID缓冲区250以记录针对该片段涉及的基元的相关联HSR ID。每当确定片段在早期深度/模版测试/更新86中存活时,使得该片段(至少基于到目前为止生成的可见性信息)被确定为在该片段涉及的相应的一个采样位置或多个采样位置处可见,则第一预通道操作相应地写入HSR ID缓冲区,其中写入的地址由样本位置252确定,并且写入的值对应于包含所讨论的样本的基元的HSR ID 254。以这种方式填充HSR ID缓冲区的工作示例在图26中示出。
在此示例中,示出了至少部分地彼此交叠的三个基元。将理解,在典型情况下,将存在需要渲染的许多基元,但是为了便于例示,使用该简化示例。如下面将进一步描述的,每个基元被分配相应的唯一基元识别符,即相应的HSR ID。在该示例中,最前面的基元首先被绘制,并且因此被分配第一HSR ID(即,其HSR ID=1)。在其后面绘制了更大的基元(具有HSR ID=2)和完全位于其它两个基元后面(使得其在最终渲染输出中不可见)的另一基元(具有HSR ID=3)。还示出了在渲染输出内定义的对应的一组采样位置{A,B…P}。
在此示例中,可看出左上采样位置(位置A)不被三个基元中的任一者覆盖。因此,如图26所示,在采样位置A的相应条目中的HSR ID缓冲区中记录“零”值(“0”)。对于下一采样位置(采样位置B),可以看出它被前两个基元覆盖,然而,从图25可以看出,第一基元(具有HSR ID=1)应当是可见的,因为它被绘制在另一基元的前面。因此,在该示例中,第一基元的片段将在采样位置B处的深度测试中存活,并且因此使得HSR ID缓冲区被相应地更新,使得其HSR ID(“1”)被存储在该采样位置的相应条目中。在此示例中,下一基元(具有HSRID=2)的那个采样位置的对应片段未通过深度测试,并且因此不会导致HSR ID缓冲区再次更新。然后对所有基元和所有采样位置适当地重复这个操作,以便确定最终的HSR ID缓冲区。然后在第二主通道操作期间使用所确定的HSR ID缓冲区,以便控制后续片段处理。
因此,在第一预通道操作期间,将基元序列中的基元处理成它们相应的片段,并且接着处理所得片段以确定与片段相关联的期望可见性信息(例如,并且在实施方式中,通过对照对应的深度(模版)缓冲区对片段进行深度(以及可选的模版)测试,以确定片段的可见性),其中在第一预通道操作期间相应地更新HSR ID缓冲区。即,如上所述,每当基于到目前为止通过处理基元序列中的较早基元而生成的可见性信息来确定针对渲染输出内的相应采样位置的基元的片段可见时,基元识别信息集合中的针对该片段涉及的一个采样位置或多个采样位置的相应条目应当(并且在该示例中是)被相应地更新以记录所讨论基元(即,导致更新的基元)的基元识别符。然后对基元序列中的其它基元重复此操作。因此,应理解,如果随后确定较晚基元的片段在给定采样位置处可见,则针对该采样位置的条目可以(并且将)随后被重写。因此,这样做的效果是,在第一预通道操作结束时,HSR ID缓冲区对应地反映针对基元序列的完整可见性信息,其中所存储的HSR ID在每采样位置的基础上指示应针对哪些采样位置进一步处理哪些基元。
然后,可以将每采样位置基元识别符用作第二主通道操作期间的后续片段可见性测试操作的一部分,以识别应当针对给定采样位置进一步处理哪些基元,并且因此允许针对第二主通道相应地剔除其他基元的片段。图27示出了该示例中的对应主通道操作的处理操作序列,该处理操作序列在图24所示的预通道操作之后执行。
如图27所示,该示例中的第二主通道操作包括流水线化的处理操作序列,该流水线化处理操作序列与第一预通道操作共同地包括:片段着色器端点80,其调度图形处理流水线需要执行的渲染工作以便渲染图块;基元列表读取器(多边形列表读取器81),其读取适当的针对图块的基元列表以识别将针对图块渲染的基元;基元分类单元82;预通道决策单元83;顶点处理(着色)级84,其获得(并且如果需要,着色)用于要针对图块渲染的基元的相关顶点数据;以及光栅化器85,其将基元光栅化成对应于渲染输出内的采样位置的相应片段。
在该示例中,第二主通道操作不执行片段的深度测试(尽管如果需要,可以执行进一步的深度测试),而是改为执行HSR ID测试276,HSR ID测试276测试正在测试的片段的HSR ID是否与存储在HSR ID缓冲区250中的针对片段所相关的一个采样位置或多个采样位置的HSR ID值相匹配。因此,如果片段具有与存储在HSR ID缓冲区250中的HSR ID值相同的HSR ID值,则片段在HSR ID测试276中存活,并且因此通过执行片段着色器87、然后执行混合90等的进一步处理来生成最终渲染输出数据。另一方面,如果片段的HSR ID与存储在HSRID缓冲区250中的值不匹配,使得片段未通过HSR ID测试276,则可以在第二主通道期间将片段在此时剔除,避免片段着色87等。以此方式,可以基于在第一预通道操作期间生成的深度缓冲区来控制第二主通道操作期间的片段处理,使得仅针对实际可见的片段产生经渲染输出数据。
图28示意性地示出了在第二主通道操作期间如何对照HSR ID缓冲区执行这种可见性测试。此处,从HSR ID缓冲区250读取的位置的地址由样本位置252确定。然后将存储在缓冲区284中的读取HSR ID值与正被测试的样本从其光栅化的基元的HSR ID 286进行比较。如果值相等(步骤287-是),则确定片段可见,并且因此该片段通过以供进一步处理。另一方面,如果值不相等(不匹配)(步骤287-否),则相应地确定样本不可见。即,对于在第一预通道操作期间被处理并且因此可能已经与特定采样位置相关地更新了HSR ID缓冲区(但没有这样做)的基元,这意味着基元在该采样位置处必须不可见,并且在此基础上与该采样位置有关的基元的片段可以相应地被剔除(步骤289)。
因此,在该示例中,HSR ID测试276使用“等于”的测试函数。例如,对于在第一预通道操作期间被处理并且可能因此已经更新HSR ID缓冲区250的任何基元,如果针对这样的基元的片段在最终渲染输出中可见,则针对该基元的相关联HSR ID应当(并且是)被存储在HSR ID缓冲区中的针对该片段涉及的一个采样位置或多个采样位置的相应条目中。因此,HSR ID测试276允许图形处理器在可能的情况下剔除对于最终渲染输出不可见的基元的任何片段,从而提供样本完美的隐藏表面去除。因此,存储在HSR ID缓冲区250中的HSR ID值可在第二主通道操作中的后续可见性测试期间使用,以确定针对渲染输出内的哪些采样位置应进一步处理哪些基元。
为了促进以这种方式生成和使用HSR ID缓冲区,每个基元因此被分配有在其基元序列内(即,在图块内)唯一地识别基元的相应HSR ID。这可以在图29所示的基元分类期间完成。
因此,图29示出根据此第五示例的示例基元分类处理,其中在第一预通道操作期间生成的可见性信息包括专用HSR ID缓冲区。在该示例中,可以在运行时执行基元分类。如图29所示,对于到基元分类的传入基元290,首先检查该基元是否是简单地指示图块的开始(步骤291)(在这种情况下,HSR ID被设定为“0”(步骤291-是))。对于所有后续基元(步骤291-否),所存储的HSR ID递增一,并且接着相应地被指派到基元(步骤294)。因此,正被处理的基元序列中的每个基元与唯一基元识别符相关联,其中基元识别符在基元序列内单调递增。具体地,在该示例中,可以在从“1”开始的基元序列内对基元进行索引(使得序列中的第一个基元可以被识别为基元“1”,第二个基元被识别为基元“2”等)。值“0”因此被用于指示为空或“清除”值,以指示在所讨论的采样位置处不存在基元覆盖。
然后,该示例中的基元分类继续,如图29所示。具体地,在该示例中,透明的任何基元(步骤295)具有副作用(步骤296),或者不写入到所有渲染目标的任何基元(步骤297)被视为不兼容基元。在该示例中,要检查另外的条件,即HSR ID是否大于最大可能HSR ID值。例如,如果存在太多的要处理的基元,则系统可以有效地耗尽可以被分配的HSR ID。在那种情况下,在该示例中,超过最大可能HSR ID值的任何基元被简单地视为与预通道操作不兼容(步骤298),并且因此改为被如上所述的第三回退操作处理。否则,如果这些条件都不满足,则基元被确定为与预通道操作兼容并且被相应地处理。
如上文所描述,接着使用基元分类结果来驱动图形处理器的状态机,使得预通道决策单元使图形处理器最初通过第一预通道操作来处理基元,并且只要基元与第一预通道操作处理兼容,就以此方式继续到图块的末尾,但在遇到不兼容基元的事件中,则导致转变到第三回退操作(例如,如上文所描述且在图7中示出)。
图30示意性地示出了根据该使用HSR ID缓冲区的示例进行操作的图形处理器的状态机312,从而示出了对于要处理的传入基元310,如何根据该示例中的图形处理器的不同可能状态来不同地处理基元310。因此,当图形处理器被配置成处于预通道状态314时,图24中所示的流水线级处于活动状态,并且基元被相应地处理。同样地,当图形处理器被配置为处于主通道状态316时,基元由图27中所示的流水线级相应地处理。在该示例中,回退状态318中的图形处理器可以如上面的图10所示进行配置,以便正常执行深度测试,但是一旦回退模式被触发,就不尝试更新HSR ID缓冲区(尽管在一些情况下,HSR ID更新241也可以在回退模式期间保持开启)。
与较早示例相比,此方法的益处在于,不需要对具有相同深度(或模版)值的基元进行消歧,因为这可全部在确定HSR ID缓冲区250时在第一预通道操作期间执行。这种方法也可以自然地处理模版,例如,因为模版测试可以在第一预通道操作期间正常执行,并且针对在深度/模版测试中存活的片段以HSR ID的形式记录所得可见性信息。因此,从图29可以看出,与一些较早示例相比,在该示例中触发回退模式的条件更少。
示例6-HSR ID缓冲区,仅ZS基元
在图29所示的示例分类中,不写入到所有渲染目标的基元仍然被视为与预通道操作不兼容(步骤297)。然而,在一些示例中,不写入到所有渲染目标的基元可以是兼容的,只要它们不写入到最终渲染输出数据(例如只要它们仅写入深度/模版值即可)。例如,这在图31和图32中示出。
图31示出了该示例的对应分类处理。图31中所示的基元分类处理大体上类似于图29中所示的处理,只是对于不写入到所有渲染目标的基元(步骤297-否)是接着检查该基元是否仅写入深度/模版值(步骤299)。如果基元仅写入深度/模版值(步骤299-是),则只要HSR ID不超过最大可能HSR ID值(步骤298-否),就确定基元是兼容的。
图32示出了该示例中的对应的预通道决策逻辑。同样,这通常与图30所示的状态机312相同,只是在第一预通道操作期间也检查基元是否仅写入深度/模版值。如果基元仅写入深度/模版值(步骤311-是),则执行深度/模版测试/更新,但是不需要更新HSR ID缓冲区(步骤313)。否则,如上所述执行第一预通道操作(步骤314)。还在第二主通道操作期间检查此条件,以便剔除仅写入深度/模版值的基元(步骤315)。因此,此时剔除仅写入深度/模版值(步骤315-是)且因此不需要由第二主通道处理以产生最终经渲染输出数据的任何基元(步骤317)。
示例7-HSR ID缓冲区、透明基元
在以上示例中,“透明”基元被确定为与预通道操作不兼容。这是因为透明基元通常不写入深度值,因此不能更新深度缓冲区或因此不能更新HSR ID缓冲区。这意味着,如果如上所述执行HSR ID等于测试将总是剔除不能更新HSR ID缓冲区的任何这样的透明基元(因为针对透明基元的HSR ID永远不能与HSR ID缓冲区中存储的值匹配),即使基于原始深度测试的正确行是要渲染透明基元。
例如,如上所述,至少对于在第一预通道操作期间能够更新HSR ID缓冲区的基元,在第二主通道操作期间对照HSR ID缓冲区的可见性测试应该(并且确实)包括“等于”测试。这是因为如果基元已经在第一预通道操作中被处理,使得原则上它可能已经与特定采样位置有关地更新了HSR ID缓冲区,但是它没有这样做,这一定意味着该基元在该采样位置实际上是不可见的。换言之,只有在第一预通道操作期间被确定为在特定采样位置可见的基元才会被记录在HSR ID缓冲区中,并且因此仅有其HSR ID与存储在HSR ID缓冲区中的针对片段所相关的一个采样位置或多个采样位置的值相匹配的片段才应该在HSR可见性测试中存活。然而,这对于不能更新HSR ID缓冲区的透明基元不起作用。
因此,在上述示例中,任何透明基元被简单地视为与预通道操作不兼容。另一选项将是始终使透明基元通过并且允许它们被片段着色器适当地处理(或者甚至在HSR ID测试后进行额外的深度测试,如果期望的话)。然而,在实施方式中,还对照HSR ID缓冲区测试透明基元,以尝试在可能的情况下剔除它们。为此,在第二主通道操作期间执行的HSR ID测试276针对这样的透明基元被相应地修改,使得使用“大于”测试函数。即,HSR ID测试276可以使用“等于”测试或“大于”测试,这取决于基元的类型(特别是基元是否已经潜在地在第一预通道操作中更新了HSR ID缓冲区)。在此情况下,可能不需要首先在第一预通道操作中处理透明基元。
以下示例例示可如何通过“通过(pass)”操作处理“透明”基元。图33示出此示例的对应分类处理,并且图34示出此示例中的对应预通道决策逻辑。
如图33所示,该示例中的基元分类通常如上面关于图31所描述的那样进行,只是在这种情况下,如果确定基元是透明的(步骤295-是),并非这本身导致基元被分类为不兼容,而是检查深度写入是否被禁用并且基元不需要模版化(步骤2792)。如果不是这种情况,因为启用了深度写入或需要模版化(步骤2792-否),则确定基元不兼容。否则,只要HSR ID值不大于最大可用HSR ID值(步骤298-否),则基元兼容。在此情况下,将基元标志为透明的,并且将“seen_transparent”标志设定为“真”以指示已经看见透明基元(步骤2793)(注意,该标志最初在图块的开始处设定为假(在步骤292))。
在基元不透明(步骤295-否)并且基元不写入到所有渲染目标(步骤297-否)的情况下,还使用“seen_transparent”标志。在这种情况下,如果基元仅写入深度/模版值并且到目前为止还没有看见透明基元(即,“seen_transparent”标志被设定为假)(步骤2791-是),则基元仍然可以是兼容的(假设不存在使其不兼容的其他条件)。如果基元不是仅写入深度/模版值或者“seen_transparent”标志被设定为真(步骤2791-否),则继续分类以确定深度写入是否被禁用并且基元不需要模版化(步骤2792),并且测试从该步骤如上所述进行。
图34示出了该示例中的对应预通道决策逻辑。这基本上对应于图32所示的状态机,只是并入了另外的决策逻辑以处理被标记为透明的基元(在上图33中的步骤2793)。在该示例中,再次如图10所示配置处于回退状态318的图形处理器。
因此,如图31所示,当图形处理器被配置成预通道状态时,使得图24中所示的流水线级处于活动状态,对于不是仅写入深度/模版值的基元(步骤311-否),还检查(在步骤3140)基元是否被标记为透明。对于未被标记为透明的基元(步骤3140-否),以与上述相同的方式执行第一预通道操作,其中处理流水线如图24所示配置。
对于透明基元,当图形处理器处于预通道状态时,如果基元是透明的(步骤3140-是),则基元通常可以被剔除,除非启用遮挡查询,这意味着在第一预通道操作期间应当处理所有基元。因此,如果未启用遮挡查询(步骤3141-否),则此时剔除透明基元(步骤3142)。否则,如果启用遮挡查询(步骤3141-是),则应当执行包括遮挡查询的深度/模版测试(步骤3143)。
对应地,当图形处理器处于主通道状态时,如果基元是透明的(步骤3160-是),则应当使基元通过图形处理流水线以用于进一步处理,但是在这种情况下,应当将HSR ID测试修改为包括“大于”测试(步骤3162)。因此,如果透明基元的HSR ID大于存储在HSR ID缓冲区250中的对应值,则透明基元在HSR ID测试中存活,并且被相应地进一步处理。另一方面,如果HSR ID不大于存储在HSR ID缓冲区250中的对应值,则大于测试失败,并且可以在此基础上剔除透明基元(因为透明基元不写入深度(或模版)值(否则,透明基元将被确定为与预通道操作不兼容,如图31所示),因此正确的行为是使较晚的不透明基元存活)。(在这种情况下,在实施方式中,在主通道中执行另外的深度/模板测试,以在可能的情况下剔除在“大于”测试中存活的透明基元。然而,应当禁用遮挡查询)。然后可以针对任何存活片段运行片段着色器。
因此,在该示例中,不写入深度或模版值并且不执行任何模版化操作的透明基元不再必须被视为与预通道操作不兼容,而是在实施方式中改为仅在第二主通道操作期间进行处理,如图34所示。
示例8-HSR ID缓冲区,写入到少于所有渲染目标的基元
在上文的示例中,未写入到所有渲染目标的基元被确定为与预通道操作不兼容。例如,除了深度、模版等之外,基元可以写入到多个不同的渲染颜色目标。在这种情况下,在到目前为止呈现的示例中,基元被简单地视为不兼容基元,并且由第三回退操作处理。然而,在另外的示例中,至少在一些情况下,可以进一步修改基元分类以便处理这样的基元。因此,以下示例例示了预通道操作如何处理写入少于所有渲染目标的基元。
图35示出使用HSR ID缓冲区根据另一示例的对应分类处理,其中执行分类以允许预通道操作处理不写入到所有渲染目标的一些基元(而在以上图29中,不写入到所有渲染目标的任何基元被自动视为不兼容)。在该示例中,再次假设在深度/模版测试级期间执行任何遮挡查询。
如图35所示,基元分类通常与以上关于图33描述的基元分类相同,只是改为考虑(在步骤297)是否写入到所有渲染目标,基元分类仅要求写入到先前已经被写入的所有渲染目标(步骤2790)。因此,维持被写入渲染目标的渲染目标的集合,并且如果基元写入到被写入渲染目标的渲染目标的集合中的所有渲染目标(步骤2790-是),则将由基元写入的任何(另外的)渲染目标添加到被写入渲染目标的集合(步骤2974),并且然后确定基元是兼容的(只要其HSR ID不超过最大可能HSR ID(步骤298))。因此,此示例可支持仅写入渲染目标的子集的基元。在该示例中,先前被写入渲染目标的集合因此在图块的开始处被清零(在步骤292处)并且然后随着基元被处理而递增。将理解,在此示例中,因此必须在运行时执行所述基元。
图36示出了该示例中的对应预通道决策逻辑。如图36所示,该示例中的对应预通道决策逻辑与图34中所示的相同。
示例9-HSR ID缓冲区、分层HSR ID测试
在上述示例中,HSR ID缓冲区存储针对渲染输出内的每个采样位置的相应HSRID。然而,在一些实施方式中,HSR ID缓冲区还能够存储针对多个采样位置的组的HSR ID(并且包含针对存储多个采样位置的组的HSR ID的相应条目)(其中采样位置的组对应于渲染输出的相应“补丁”(区域),并且因此对应地对应于采样位置的“补丁”)。
具体地,HSR ID缓冲区可以(并且确实)针对渲染输出的相应补丁存储相应的“最小”HSR ID和对应的“最大”HSR ID,所述相应的“最小”HSR ID指示随后可能需要针对补丁所涵盖(覆盖)的采样位置进一步处理的基元序列中的第一基元,所述对应的“最大”HSR ID指示通过第一预通道操作处理的基元中的最终基元可能需要在第二主通道操作期间再次被处理。
如下面将进一步解释的,通过以这种“分层”方式布置HSR ID缓冲区,使得相应的HSR ID既存储在渲染输出内的各个采样位置的级别上又存储在更高级别的采样位置的组(“补丁”)中,这然后可以允许在渲染输出的一个或更多个不同细分级别上执行后续的可见性测试,例如,并且特别是通过允许在补丁级别测试片段的组,并且一次性剔除(在可能的情况下),例如从而避免可能在补丁级别已经确定各个片段对于其各自的采样位置不具有可见效果时还必须测试该片段。因此,这可以促进加速可见性测试,并且因此使整个图形处理操作更有效。
例如,在一些示例中,光栅化器85可以使用“分层”光栅化布置,其中对照渲染输出面积逐渐更小补丁(区域)迭代地测试基元(并且因此对应地是片段的补丁(和采样位置的补丁))。因此,在实施方式中,首先对照渲染输出的更大补丁(例如,图块,在基于图块的渲染系统中)测试要光栅化的基元,以确定基元是否(至少部分地)覆盖由更大补丁所涵盖的渲染输出的任何更小补丁。如果基元确实(至少部分地)覆盖了由更大补丁所涵盖的渲染输出的任何更小补丁,则更大补丁然后被细分成那些更小补丁,并且然后针对被发现至少部分地被基元覆盖的渲染输出中的每个更小补丁重复该处理,直到达到最小补丁大小。
HSR ID缓冲区可以相应地也以这样的“分层”方式布置,以允许由光栅化器85输出的基元补丁对照HSR ID缓冲区的相应的每补丁条目(相应补丁的“最小值”和“最大值”)进行测试。
图37示意性地示出了这样的HSR ID缓冲区的“分层”布置,其中针对渲染输出的更大面积“补丁”存储相应的最小基元识别符和最大基元识别符。具体地,图34示出了其中渲染输出被细分成更大补丁340的布置,在该示例中,更大补丁340对应于4×4片段的补丁,并且更大补丁340又被细分为2×2补丁段的更小补丁342。尽管在该示例中仅示出了单个更大补丁340,但是应当理解,整个渲染输出将以这种方式类似地细分为相应(非交叠)补丁。还应当理解,可以根据需要选择补丁大小,并且图34仅是一个示例。
在图37所示的示例中,存在单个可见基元,其具有部分地覆盖更大补丁340的HSRID值5。因此,可以假设具有HSR ID值1至4的较早基元被可见基元完全遮挡。
图38例示了可以如何在第一预通道操作中在早期HSR ID更新241期间生成分层HSR ID缓冲区,其在该示例中是以分层方式执行的,首先测试渲染输出的更大补丁,并且然后根据需要将渲染输出的逐渐更小补丁向下测试至个体片段的级别,以便确定HSR ID缓冲区。
如图38所示,对于从光栅化器传入的基元补丁(步骤350),首先确定补丁中的基元覆盖(步骤351)。还确定基元补丁是否被确定性地遮挡(步骤352)。如果基元在补丁中没有覆盖,或者被确定性地遮挡(步骤353-是),则丢弃基元补丁(步骤354),而不进行进一步测试。这然后意味着,可以省略对照由补丁所涵盖的各个采样位置的基元的任何进一步测试,因为已经在补丁级别确定基元对于那些采样位置中的任何采样位置都不可见。
另一方面,如果基元至少部分地覆盖了补丁并且没有被确定性地遮挡(步骤353-否),则继续测试补丁。因此,检查基元是否被配置为写入到HSR ID缓冲区(步骤354)。这可以根据基元分类来确定,例如如上所述。如果基元被配置为使得通过片段不更新HSR ID缓冲区(步骤355-否),则不应更新HSR ID缓冲区,并且假设存在要测试的另外的补丁,则应改为使补丁通过以进行进一步的细分(步骤359),并且完成对该补丁的测试(步骤3590)。
对于被配置为使得基元的通过片段应当写入到HSR ID缓冲区的基元(步骤355-是),应当继续测试以确定是否应当针对所讨论的补丁更新HSR ID缓冲区。因此,然后确定基元是否完全覆盖正被测试的补丁并且在该补丁处可见。如果补丁被完全覆盖并且在补丁处可见(步骤356-是),则相应地更新针对补丁位置的最小HSR ID,以记录与正被测试的基元相关联的HSR ID(步骤357)。基于基元潜在地可见,在任一情况下(步骤356-是或否)也更新补丁位置的最大HSR ID,因为此时已经确定基元必须部分地覆盖补丁(步骤353-是),并且已知任何存活片段应当写入到HSR ID缓冲区(步骤355-是)。因此,不能排除基元在补丁内可能是可见的,并且因此基元应当被进一步处理(因此最大HSR ID应相应地递增)。
然后,在第二主通道操作中的HSR ID测试276期间使用所确定的包括每补丁的最小值和最大值的分层HSR ID缓冲区,以尝试在可能的情况下在补丁级别剔除基元,从而避免必须总是测试各个采样位置。例如,对照分层HSR ID缓冲区的测试在图36中示出。
如图39所示,对于要对照渲染输出的相应补丁测试的传入基元补丁(步骤360),首先基于该基元补丁已经通过了与父补丁有关的测试来检查是否已经已知该基元补丁通过(步骤361)。因此,如果已知该基元补丁被设定为通过(步骤361-是),则确定补丁在分层HSRID测试中存活,而无需进一步的明确测试(步骤368),并且完成补丁的测试(步骤369)。测试然后可以根据需要进行到下一个更小补丁。
假设已知基元补丁尚未被设定为通过(步骤361-否),则测试按如下方式进行。首先,确定应使用何种类型的HSR ID测试函数(步骤362)。对于使用“等于”测试函数的基元,然后将与基元相关联的基元HSR ID与所存储的补丁的最小HSR ID和最大HSR ID进行比较(步骤363)。如果与正被测试的基元补丁相关联的HSR ID小于补丁的最小HSR ID或大于补丁的最大HSR ID(步骤364-是),这意味着基元补丁可以被剔除(步骤365),并且不需要对基元进行进一步细分或测试。
如果与基元补丁相关联的HSR ID位于所存储的补丁的最小HSR ID与最大HSR ID之间,则基元补丁通常应当在该级别的分层HSR ID测试中存活。然而,存在所存储的补丁的最小HSR ID和最大HSR ID相同的特殊情况。在这种情况下,如果与基元补丁相关联的HSRID等于补丁的最小HSR ID和最大HSR ID(步骤366-是),则已知基元必须通过针对当前补丁所涵盖的任何采样位置的所有进一步的可见性测试,因为其它是唯一能够存活的基元。在这种情况下,基元因此可以被设定为已知通过(步骤367)。基元补丁因此存活(步骤368),并且完成该补丁的测试(步骤369)。在这种情况下,因为基元被设定为已知通过,所以任何更小的基元补丁也自动通过测试(步骤361-是)。
否则,如果所存储的补丁的最小HSR ID和最大HSR ID不相同,使得与基元补丁相关联的HSR ID不能等于它们两者(步骤366-否),则确定基元在该级别的分层HSR ID测试中存活(步骤368),并且在该级别的测试完成(步骤369),但是假设尚未达到最小补丁大小,则仍然可能需要对照渲染输出的更小补丁来进一步测试基元补丁。
以上涉及对使用“等于”测试的基元的测试(例如,原则上可以在预通道操作期间更新HSR ID缓冲区的不透明基元)。如先前所提及,可存在使用不同的“大于”测试的其它基元。对于不写入深度或模版值且在一些示例中仅在第二主通道操作期间处理的透明基元来说,尤其如此。
对于使用“大于”测试的此类基元,再次将与基元补丁相关联的HSR ID与所存储的所讨论的补丁的最小HSR ID和最大HSR ID进行比较(步骤3690)。然而,在这种情况下,如果与基元相关联的HSR ID低于所存储的补丁的最小HSR ID(步骤3691-是),则只能丢弃补丁(步骤365)。即,由于测试包括“大于”测试,因此不能基于最大HSR ID来剔除基元。相反,如果与基元补丁相关联的HSR ID大于最大HSR ID(步骤3692-是),这意味着基元针对补丁所涵盖的所有采样位置必须始终通过“大于”测试。因此,在这种情况下,可以将基元设定为已知通过(步骤367),使得使得基元通过当前级别上的分层测试(步骤368),并且总是被设定为针对由当前补丁所涵盖的所有采样位置自动地通过测试。
否则,如果与基元补丁相关联的HSR ID位于所存储的补丁的最小HSR ID与最大HSR ID值之间(步骤3692-否),则基元在对照当前补丁的测试中存活(步骤368),但是基元应当被进一步细分并且对照渲染输出的更小补丁进行进一步测试(假设尚未达到最小补丁大小)。例如,与基元补丁相关联的HSR ID可能小于针对渲染输出的更小补丁存储的最小值,或者大于最大值,在这种情况下,更小的基元补丁可以在该级别被剔除/通过。
因此,这样做的效果是,针对补丁所存储的最小HSR ID指示可能需要针对所讨论的补丁进一步处理的第一基元。因此,参考图37所示的示例,对于更大补丁340,所示的基元没有完全覆盖更大补丁340(步骤356-否)。因此,不能为更大补丁340更新最小HSR ID。因此,HSR ID缓冲区存储关于更大补丁340的最小HSR ID值0和最大HSR ID值5。这意味着在第二主通道操作中的HSR ID测试276期间,具有HSR ID 1到5的基元中的每一者将在对照更大4×4补丁340的分层HSR ID测试中存活。
然后,分层HSR ID测试将相应地继续对照更小的2×2补丁342的集合测试每个基元。在这种情况下,如图37所示,左上2×2补丁被完全覆盖,因此针对该补丁342存储的最小HSR ID将在第一预通道操作期间被相应地更新,使得针对该补丁所存储的最小HSR ID是5。因此,当对照左上2×2补丁342进行测试时,具有相关联的HSR ID为5的基元补丁将被检测为已知通过,因为其HSR ID与针对该补丁所存储的最小HSR ID值和最大HSR ID值匹配。在这种情况下,可以避免左上四个片段的单独测试,因为那些片段全部是基于分层测试而已知通过的。否则,在该示例中,不可能剔除/通过任何其他补丁,并且因此剩余片段必须被单独测试。
在上述示例中,分层HSR ID缓冲区因此在第一预通道操作期间被“动态”确定为作为HSR ID更新241的一部分。因此,如上所述,每当发现完全覆盖该补丁的基元可见时,通常会更新针对补丁所存储的最小HSR ID,如上文关于图38所述。
在另外的示例中,可以在第一预通道操作结束时执行最终确定(“烘焙”)处理,该最终确定处理在所确定的分层HSR ID缓冲区上迭代以尝试完善所存储的针对不同补丁的最小HSR值和最大HSR值。例如,可能存在这样的情况:不存在完全覆盖补丁的单个基元,但是补丁被基元的组完全覆盖。在这种情况下,可以识别应当针对补丁进一步处理的基元的(更窄)范围,并且因此可以相应地更新针对补丁存储的最小HSR ID值和最大HSR ID值。例如,这在图40中示出。
在图40所示的示例中,现在有两个可见基元,其分别具有HSR ID值5和6。如图40所示,两个基元都没有完全覆盖更大的4×4补丁。同样,两个基元都没有完全覆盖任何更小的2×2补丁。因此,根据上图35中所示的方案,在第一预通道操作期间不更新针对任何补丁存储的最小HSR ID。然而,从图40可以看出,左上2×2补丁实际上完全被两个基元的组合覆盖。因此,通过适当地迭代最初确定的HSR ID缓冲区,可以相应地更新该补丁的最小HSR ID(使得现在最小HSR ID值是5)。因此,这允许针对该补丁提出至少具有HSR ID值1至4的基元,而不必对照由该补丁所覆盖的各个采样位置测试那些基元。
图41中示出了该示例中的最终确定(“烘焙”)处理。如图41所示,一旦针对图块的预通道操作已经完成,使得针对要通过预通道处理的图块的所有基元已经通过图24所示的图形处理流水线,从而确定初始HSR ID缓冲区,则通过开始遍历初始确定的HSR ID缓冲区来发起最终确定(“烘焙”)处理(步骤380)。
在该示例中,遍历以最小补丁大小开始,并且选择图块中的第一补丁位置(步骤381)。然后,遍历在由所选择的补丁所涵盖的采样位置上迭代,以找到存储在HSR ID缓冲区中的针对由所选择的补丁所涵盖的采样位置的实际的最小HSR ID值和最大HSR ID值(步骤382)。对于覆盖当前选择的补丁位置的所有更大补丁,然后相应地更新最小HSR ID值和最大HSR ID值(如果有可能这样做)(步骤383)。假设当前补丁位置不是当前补丁中的最后位置(步骤384-否),则选择下一个补丁位置(步骤385),并且针对该补丁位置重复该处理。一旦以这种方式处理了所有补丁位置(步骤384-是),则完成分层HSR ID缓冲区完善(步骤386)。
在图41所示的示例中,最终确定(“烘焙”)处理因此在渲染输出中的所有采样位置上迭代。因此,这可能花费大量时间。然而,在这方面,应当理解,如果已经可以从初始确定的HSR ID缓冲区中确定不可能进一步完善,则可以省略该迭代中的至少一些迭代。其示例在图42中示出。在该示例中,可以看出,三个2×2补丁被具有HSR ID值6的同一基元完全覆盖。如上所述,根据图38所示的HSR ID缓冲区的“动态”填充,HSR ID缓冲区因此将存储相同值(即,“6”)作为针对这些补丁中的每一者的相应的最小HSR ID和最大HSR ID,这指示针对2×2补丁所涵盖的所有采样位置,具有HSR ID 6的基元是已知通过的。在这种情况下,清楚的是,不可能进一步完善针对那些补丁的最小值或最大值。
因此,图43示出了根据另一示例的改进的最终确定(“烘焙”)处理,其中可以在可能已经确定不可能完善的情况下加速遍历。同样,这在一旦针对图块的预通道操作已经完成就开始(步骤400),使得将通过预通道处理的图块的所有基元已经通过图24所示的图形处理流水线,从而确定初始HSR ID缓冲区。在该示例中,读取当前补丁的最小HSR ID和最大HSR ID(步骤402),并且确定它们是否相同(即,所存储的最小HSR ID是否与所存储的最大HSR ID相匹配)。如果当前补丁的最小HSR ID和最大HSR ID相同(步骤403-是),则将补丁HSR ID添加到可见基元的列表中(步骤404)。此时,利用当前补丁的最小值和最大值更新(根据需要)所有较高级别补丁的最小值和最大值(步骤405)。如果当前补丁是当前测试级别的最后补丁(步骤406-是),则遍历完成(步骤407)。否则,如果当前补丁不是给定父补丁的最后一个子补丁,使得还有另外的“兄弟”补丁要被测试(步骤408-否),则选择下一个兄弟补丁(步骤409),然后相应地读取其最小HSR ID值和最大HSR ID值(步骤402)等。如果当前补丁是其父补丁的最后一个子补丁,则选择父补丁作为新的当前补丁(步骤410),如图43所示。
如果确定当前补丁的最小HSR ID和最大HSR ID不相同(步骤403-否),则确定当前补丁是否是最小补丁大小,并且如果不是(步骤411-否),则清除当前补丁的最小HSR ID和最大HSR ID,并且将当前补丁的第一子补丁选择作为用于测试的新当前补丁(步骤412)。因此,该处理从顶部向下遍历分层HSR ID缓冲区以找到最小补丁大小,除非在更高级别上确定不可能进一步完善。一旦达到最小补丁大小(步骤411-是),则以与上面关于图41所描述的类似的方式迭代该补丁所涵盖的采样位置(步骤413),并且然后相应地更新所有更高级别补丁的最小值和最大值(步骤405)。然后检查是否还有其他补丁要处理(步骤406等),直到遍历完成(步骤407)。
因此,遍历开始于首先选择根(即最大)分层HSR补丁作为当前补丁(步骤401)。如果根(最大)补丁的最小HSR ID和最大HSR ID相同(步骤403-是),则在该点完成遍历。否则,遍历通过检查逐渐变小的补丁的最小HSR ID和最大HSR ID是否相同来继续,以检查是否可能进一步完善。以这种方式,只有当存在可以进行一些可能的完善时,才执行在各个采样位置上的迭代(步骤413)。因此,这可以加速HSR ID缓冲区的最终确定。
在上文的示例中,在第一预通道操作期间,在确定基元覆盖渲染输出内的一个或更多个采样位置的事件中,针对基元可见的采样位置,将基元的HSR ID写入到HSR ID缓冲区。特别是如果发现更大补丁覆盖许多采样位置,则这可以代表显著的写带宽。为了清除HSR ID缓冲区,在寄存器中提供多个“清除”位,这些位在被设定时能够指示由清除位表示的N个采样位置全部为零。在另一示例中,例如,这些清除位被重新用于简化HSR ID缓冲区的更新,如将关于图44解释的。
因此,图44示出存在两个基元的示例,其分别具有HSR ID值6和7。在该示例中,底部两个2×2补丁都被具有HSR ID值6的基元完全覆盖。左上2×2补丁被具有HSR ID值6的基元部分地覆盖。右上2×2补丁被具有HSR ID值6的基元完全覆盖,但是被具有HSR ID值7的较晚基元部分地覆盖。因此,上述最终确定处理的结果是,所存储的针对每个2×2补丁的最小HSR ID和最大HSR ID被设定,如图44所示。因此,所有右上和底部的两个2×2补丁的最小HSR ID被设定为6。
在该示例中,不是将值6写入到由这些补丁所涵盖的每个采样位置,而是使用“清除”值,即0,如下文将进一步解释的。然后这避免了多次明确地写入相同的值(在可能避免这样做时)。图45例示在第一预通道操作期间写入到HSR ID缓冲区的操作,并且图46例示在第二主通道操作期间如何使用“清除”值以确保正确渲染行为。
如图45所示,对于能够更新HSR ID缓冲区的传入基元补丁(步骤420),首先确定该基元补丁是否是从写入对应补丁的最小HSR ID值的基元得出的(步骤421)。如果是,则为HSR ID缓冲区中的补丁区域设定对应的“清除”位(步骤422)以指示(此时)可清除由补丁覆盖的所有采样位置。因此可以丢弃基元补丁(步骤427),并且因此完成针对基元补丁所覆盖的采样位置的基元补丁的HSR ID缓冲区的更新(步骤428)。因此,可以相应地处理下一个基元。
如果基元补丁不对应于写入对应补丁的最小HSR ID值的基元(步骤421-否),则操作继续执行必需的每采样位置深度(和模版)测试以及任何片段着色器执行等(步骤423),以确定补丁所涵盖的采样位置的最终可见性。如果尚未针对HSR缓冲区中的图块区域设定“清除”标志(步骤424-否),则针对任何覆盖的采样位置将基元的HSR ID写入到HSR ID缓冲区(步骤425),如上所述。另一方面,如果已经设定了“清除”标志(步骤424-是),则仍然针对任何覆盖的样本将基元的HSR ID写入到HSR ID缓冲区,并且将“清除”值写入没有覆盖的任何补丁样本。在任一种情况下,此时,可以丢弃基元补丁(步骤427),因为完成对该基元补丁的HSR ID的更新(步骤428)。
这样做的效果是,对于由与所存储的所讨论的补丁的最小HSR ID相关联的基元所覆盖的、渲染输出的补丁所涵盖的任何采样位置,不是针对该基元覆盖的各个采样位置中的每个采样位置存储相同HSR ID,而是清除采样位置。因此,返回参考图44,可以看出,由底部两个2×2补丁所涵盖的采样位置(其中HSR ID为6的基元可见)都被设定为清除值,而无需将该值明确写入HSR ID缓冲区。同样,对于右上2×2补丁,对于最左边的两个采样位置,具有HSR ID 6的基元是可见的,因此在HSR ID缓冲区中存储了针对这两个采样位置的“零”值。然而,两个最右边的采样位置被具有HSR ID为7的基元覆盖,并且因此针对那些采样位置存储值。然后,这减少了与更新HSR ID缓冲区相关联的写入带宽。然而,在第二主通道操作期间,必须能够正确解释任何清除值,以确保正确的渲染行为。例如,这在图46中示出。
因此,图46示出了针对待处理的传入基元的对应HSR ID测试(步骤430)。首先,执行分层HSR ID测试,如上所述。如果确定基元匹配所存储的正被测试的当前补丁的最小HSRID值,则通过设定“is_min”位来相应地标记基元,以指示基元是引起对当前补丁的最小HSRID值进行更新的基元(步骤431)。此“is_min”位在设定时可接着用于允许任何片段自动通过针对设定有“清除”或零值的任何采样位置的测试。
如果已知正被测试的基元补丁通过来自分层HSR ID测试的所有可见性测试(步骤432-是),则将基元补丁作为整体通过以供进一步处理,并且针对补丁所涵盖的所有片段相应地执行片段着色器(步骤436)以确定渲染输出数据,并且然后针对正被测试的基元补丁所涵盖的采样位置完成第二主通道操作(步骤438)。
另一方面,假设已知正被测试的基元补丁未通过来自分层HSR ID测试的所有可见性测试(步骤432-否),基元补丁的测试通过读取针对补丁区域的HSR ID缓冲区(步骤433)并且检查是否已经为所讨论的基元设定”is_min”位(步骤434)而继续。如果“is_min”位尚未被设定(步骤434-否),则对对照各个采样位置的片段的测试被正常执行,例如使得对于使用“等于”测试的基元,当片段的相关联的HSR ID与存储在HSR ID缓冲区中的值匹配时,该片段在HSR ID测试中存活(步骤437)。然而,当“is_min”位被设定时(步骤434-是),执行测试,使得除了当片段的相关联的HSR ID与存储在HSR ID缓冲区中的值匹配时该片段在测试中存活之外,还使得片段自动地通过针对设定有“清除”或零值的任何采样位置的可见性测试。
因此,以上关于分层HSR ID缓冲区布置的示例允许HSR ID测试的各种优化,并且因此允许改进整体图形处理操作。
剔除顶点(变量)属性着色
如上所述,光栅化和渲染处理使用与正被处理的基元的顶点相关联的顶点属性。为了促进该操作,在基元被例如光栅化和渲染之前,针对给定图形处理输出定义的顶点的至少一些属性通常经受初始所谓的“顶点着色”(顶点处理)操作。此“顶点着色”操作可操作以将顶点的属性变换为用于后续图形处理操作的期望形式。这可以包括例如将顶点位置属性从最初定义在其中的模型或用户空间变换到图形处理的输出将要显示在其中的屏幕空间。
因此,由图形处理器执行的图形处理流水线将通常包含顶点处理级(顶点着色器),其对针对顶点定义的初始顶点属性值执行顶点处理(着色)计算,以便生成用于图形处理流水线的后续处理级中的输出顶点属性的期望集合(即,适当“着色”属性)。
顶点着色器执行通常产生(经变换)顶点位置以及由顶点着色器明确写入的一个或更多个输出。从顶点着色器传送到光栅化和渲染的属性(除位置之外)通常被称为“变量”。(因此,来自顶点着色器的非位置输出(并且仅来自顶点着色器的非位置输出)是“变量”)。一旦顶点属性已被着色,则在图形处理流水线的剩余部分中处理顶点(及其与之相关的基元)时使用“着色”属性。
根据本实施方式的将被处理用于渲染输出的基元是(各自)根据顶点集合来定义的(例如,并且在实施方式中是从将用于图形处理输出(例如,用于显示的帧)的更大的顶点集合中选择的)。该顶点集合中的每个顶点将具有并与其相关联的一个或更多个顶点属性的集合(顶点属性数据(值))。这些顶点属性可以是可以与顶点相关联的任何合适的和期望的属性,诸如以下项中的一项或更多项:位置(例如,顶点的x、y、z、w坐标/值)、颜色(例如,顶点的RGB值)、透明度(顶点的阿尔法值)等。在实施方式中,每个顶点具有与其相关联的位置(位置数据)和一个或更多个其他非位置属性(数据)(变量),例如定义所讨论的顶点的颜色、光、法线、纹理坐标等。然后,当光栅化和渲染基元时,使用这些顶点属性。
如图形处理中常见的情况一样,顶点数据(顶点属性)可能需要被处理(例如,着色),以便将顶点属性变换成期望形式以供后续处理。因此,根据本实施方式,图形处理器包括顶点处理电路(例如,并且在实施方式中是以“顶点着色器”的形式),该顶点处理电路被配置为处理(例如,着色)图形处理器存储/获得的形式的顶点数据(“原始”顶点数据),以生成要针对渲染输出的基元的处理的顶点的适当顶点着色属性数据。
顶点属性的处理(着色)可在整个图形处理操作内的各个级执行。例如,在本实施方式中,图形处理器操作如上所述的基于图块的渲染方案,其中,如图4所示,可编程顶点着色器427被执行作为初始几何形状处理级的一部分,以便至少处理(着色)顶点位置属性以促进对几何形状进行这种拣选。初始前期几何形状处理还可对非位置(变量)顶点属性进行着色,并将所有经变换的顶点几何形状(属性)425一起存储在存储器423中,使得其可随后由渲染器422获得并使用以执行渲染操作。
然而,在一些示例中,对(至少一些)非位置(变量)顶点属性的处理被推迟到图形处理操作的渲染级,即,推迟到期望使用那些顶点属性的点。这可以有利地减少带宽要求,例如,通过避免必须提前写出所有顶点着色的变量数据,因为至少一些顶点属性处理(着色)可以针对个体图块而不是针对整个渲染输出执行。
图47示出根据此类示例的对应图形处理流水线。如图47所示,此示例中的顶点处理(着色)级84执行顶点着色。此示例中的顶点处理(着色)级84因此可触发顶点处理电路(例如,顶点着色器)来处理定义所讨论的基元的顶点集合的顶点数据,以生成基元的进一步处理所期望形式的基元顶点着色属性数据。如图47中所示,顶点处理(着色)级84也联接到顶点缓存(变换后缓存)432。当片段着色器端点80发布用于渲染的基元时,这可以因此触发顶点处理(着色)操作以处理所讨论的基元的对应顶点数据(顶点属性)。然后,在实施方式中,变换的(顶点着色的)几何数据被适当地存储,并且在相关图形处理级处(即,通过光栅化器85和片段着色器87)被读回图形处理器,以便对基元进行光栅化和渲染。
图47中所示的图形处理流水线大体上对应于以上图27中所示的图形处理流水线,其中测试包括HSR ID测试276。然而,应理解,也可针对上文所描述的其它示例中的任一者执行推迟顶点着色,并且不限于使用HSR ID缓冲区的示例。
如上文所描述,使片段着色器端点80将相同基元发布到图形处理流水线两次,即对基元执行相应的第一预通道操作且接着对基元执行对应的第二主通道操作。这意味着,对基元(及其对应片段)的一些处理被执行两次,即,同一基元可经受第一预通道操作和第二主通道操作两者。例如,当同一基元经受第一预通道操作和第二主通道操作两者时,其通常将(必然)被光栅化两次,因为两个通道都涉及将基元处理成其相关联的片段。类似地,因为在图47中所示的示例中,本文描述的技术中的至少一些顶点属性处理(着色)被推迟到渲染级,这意味着顶点属性处理(着色)可以(并且在一些情况下将是)在第一预通道操作期间被触发,并且然后在第二主通道操作期间再次被触发。
因此,在示例中,如果可以确定第一预通道操作实际上不需要变量以确定期望的“可见性”信息,则使图形处理器跳过预通道中的至少一些变量着色。例如,对于原本将与预通道操作兼容的基元,可以使用以下条件来证明在第一预通道操作中不使用变量:(i)片段着色器不修改覆盖;(ii)片段着色器不发出深度,并且(iii)不使用透明至覆盖(alpha-to-coverage)。
这可以由图形处理器3的驱动器4确定,如图48所示。因此,图48是例示驱动器操作以确定第一预通道操作是否需要变量的流程图。因此,对于传入的绘制调用(步骤450),检查透明至覆盖是否被启用(步骤451)以及着色器是否修改覆盖或发出深度(步骤452)。如果满足这些条件中的任一者,则预通道操作应因此着色由编译器确定的在预通道操作中需要的变量(步骤454)。否则,如果没有满足这些条件,则可以在第一预通道操作中省略变量着色(步骤453)。
这可以相应地标记。例如,在一些情况下,如果需要任何变量,则可以使图形处理器对所有变量进行着色。即,这可以二进制方式来指示。然而,编译器还能够确定实际需要哪些变量。例如,当第一预通道操作执行片段着色器时,片段着色器程序可以被配置(排序),使得片段仅运行直到某个点。因此,编译器可以检查通过片段着色器是否有任何路径将在该点之前读取特定变量。在这种情况下,需要哪些变量的指示可能更复杂,并且可以指示在第一预通道操作期间应当被着色的一个或更多个变量的集合。
图49是示出如何控制图形处理器的操作处于不同状态的状态图,这取决于是否需要变量。如图49所示,对于传入基元(步骤460),如果图形处理器状态机处于预通道状态(462),则使顶点着色器84对所有顶点位置属性进行着色,而是仅对已确定为第一预通道操作需要的顶点非位置(变量)属性进行着色(步骤464)。当图形处理器处于主通道状态时,在该示例中,使顶点着色器84对包括顶点位置和非位置(变量)属性两者的所有顶点属性进行着色(步骤466)。(在回退状态下,同样,包括顶点位置和非位置(变量)属性两者的所有顶点属性将被着色)。
当在第一预通道操作期间省略了一些顶点属性着色时,用于在顶点缓存(变换后缓存)432中为顶点数据分配存储的各种示例是可能的。
在图50中示出了第一示例。在图50所示的示例中,在针对整个顶点的第一预通道操作期间,即使仅填充顶点位置属性,也会在顶点缓存(变换后缓存)432中分配足够的空间。
如图50所示,对于传入基元(步骤470),对于每个顶点(步骤471),执行顶点缓存查找以确定顶点是否已经存储在缓存中(步骤472)。如果具有所有所需顶点数据的顶点已经存储在缓存中,则不需要针对该顶点的进一步处理,因此相应地递增引用计数(步骤473),并且处理下一顶点。另一方面,如果顶点根本不存在于缓存中,只要缓存中有足够的空间用于整个顶点(步骤474-是),则分配相应的缓存条目用于存储整个顶点,并且将所分配条目的引用计数设定为1(步骤476)。如果缓存中没有足够的空间用于整个顶点(步骤474-否),则顶点处理等待足够的缓存条目可用(步骤475)。
然后为所需顶点数据发布期望顶点着色请求(步骤477)。因此,如果不需要顶点变量属性,则此时可以简单地针对顶点位置属性发布请求。以此方式,在第一预通道操作结束时,顶点将被存储在具有所需顶点数据的子集的缓存中。因此,在对应的第二主通道操作期间,当该顶点需要顶点数据时,顶点缓存测试(步骤472)将确定顶点存在,但在顶点缓存中仅存在所需数据的子集(即,存储位置属性,但未存储一些或所有变量属性)。在这种情况下,增加引用计数(步骤478),然后针对缺失的顶点数据发布顶点着色请求(步骤477)。
一旦处理了所有顶点,然后该处理就等待所有顶点着色请求完成(步骤479),然后输出相应的基元(步骤4790)。一旦基元完成(步骤4791),则相应地递减所有顶点的引用计数(步骤4792)。
因此,图50所示的方法允许在主通道期间重新使用顶点分组。然而,这需要在预通道操作期间大于必要的顶点缓存分配,这可以增加分配停顿的频率。
因此,在图51中示出了另一种方法,其中在预通道操作期间,当不需要变量时,在顶点缓存中仅为顶点位置分配足够的空间。第二主通道在寻找顶点时不重复使用位置数据,而是进行新的分配,该新的分配可以适合整个顶点的位置和变量属性。这在预通道中保持了更小的顶点缓存分配,但代价是必须对位置进行两次着色。因此,图51中的顶点处理类似于图50,只是在图51中没有检查顶点是否已经存在于缓存中而是仅具有所需数据的子集,并且改为在所有情况下,当所需顶点数据尚未存在于顶点缓存中时,针对整个顶点进行新的顶点缓存分配(步骤476)。
图52示出了与图51类似的另一种方法,但是其中,主通道尝试重新使用来自第一预通道的位置属性,并且仅在第二主通道期间为变量属性进行新的分配。这也有效,但是位置和变量现在可以在不同的分配中结束。再次,此示例中的顶点处理因此类似于上文所描述的顶点处理,除了在这种情况下,仅针对尚未存在于顶点缓存中的所需数据进行第二主通道中的顶点缓存分配(步骤496)。相应地,仅针对尚未存在于缓存中的所需数据发布顶点着色请求(步骤497)。
作为本文中所描述的预通道操作的部分,用于处理顶点数据的各种其它布置将是可能的。
基元剔除
第一预通道操作可根据需要包括任何其它合适的处理操作。例如,在一些实施方式中,还在第一预通道操作期间生成“基元剔除”数据结构,所述“基元剔除”数据结构可用于识别不需要进一步处理的整个基元,并且因此所述基元可在第二主通道操作中(例如,在光栅化之前且还在主通道操作期间执行的任何顶点处理之前)被相对较早地剔除。例如,对于在第一预通道操作期间处理的任何基元,针对其可以确定不需要进一步处理相关联的片段中的任何一个(例如,由于没有任何片段对其在最终渲染输出内的相应采样位置具有任何可见效果),可以剔除其整体中的基元。以这种方式,可以避免在第二主通道期间对基元的一些或全部处理。
然后这可以避免片段前端中的基元处理(例如,直到并包括光栅化的处理)。例如,以这种方式剔除(整个)基元的能力在至少一些顶点属性处理(例如,变量着色)被推迟到渲染级的情况下也可能是特别有益的,因为在这种情况下,基元剔除数据结构的使用还可以(并且在实施方式中确实)至少允许在第二主通道期间避免针对可以使用基元剔除数据结构确定基元不需要进一步处理的任何基元的此类顶点属性处理。
图53示出基于上文在图24中例示的预通道操作构建此“基元剔除”数据结构的第一示例。在此示例中,基元因此经受如上文关于图24所描述的相同图形处理流水线操作,其中第一预通道操作相应地生成反映基元序列的可见性信息的HSR ID缓冲区。然而,在图53中,在最后确定HSR ID缓冲区之后执行构建“基元剔除”数据结构540的附加最后步骤。构建“基元剔除”数据结构540的步骤因此在预通道操作结束时执行,使得其针对每个图块仅执行一次。
图54接着示出根据此示例的对应修改主通道操作,其中主通道操作如上文关于图27所描述进行,只是预通道决策级550还可操作以根据“基元剔除”数据结构剔除整个基元。
图55是示出该示例中的图形处理器的操作的状态机。此示例中的状态机实质上与上文在图7中描述的状态机相同,只是在第一预通道操作完成或响应于遇到不兼容基元而停止之后,在重新绕回基元列表读取器(步骤710)以准备后续主通道操作(步骤74)之前,图形处理器必须首先停顿,直到所有基元已完成第一预通道操作(步骤560),以允许在第二主通道操作开始之前构建基元剔除数据结构(步骤561)。
图56是示出根据一个示例的可以如何从HSR ID缓冲区构建基元剔除数据结构的流程图。如图56所示,在处理开始时(步骤570),将HSR ID缓冲区地址初始化为零(步骤571)。接着检查当前HSR ID缓冲区地址以查看其是否与HSR ID缓冲区的大小相匹配(步骤572)。如果当前HSR ID缓冲区地址与HSR ID缓冲区的大小相匹配(步骤572-是),则这意味着已经处理了HSR ID缓冲区的所有条目,并且因此该处理完成(步骤573)。否则,通过读取存储在当前HSR ID缓冲区地址处的HSR ID值(步骤574)、将HSR ID值相应地添加到基元剔除数据结构(步骤575),然后递增HSR ID缓冲区地址(步骤576)以使处理继续下一个HSR ID缓冲区地址等来构建基元剔除数据结构。
因此,其结果是通过其HSR ID值来识别HSR ID值被存储在HSR ID缓冲区中的所有基元,并且将这些基元添加到基元剔除数据结构。因此,未添加到基元剔除数据结构的任何剩余基元在渲染输出内的任何采样位置处都不可见,并且可以相应地被整体剔除。
以此方式的“可见基元剔除数据结构”可接着在预通道决策级83期间使用以剔除整个基元,如图57所示。图57中的决策逻辑大体上与上文所描述的图36中所示的决策逻辑相同,然而,在第二主通道操作期间,对于原本会被向前传递的基元,进一步检查(在步骤580处)基元是否存在于可见基元剔除数据结构中。如果基元不存在(步骤3161-否),则可以剔除该基元(步骤3162)。否则,基元被传递到光栅化器85等,并且第二主通道操作被正常执行。
设想了用于构建基元剔除数据结构的各种其他示例。例如,图58示出了另一示例,其中在第一次预通道操作期间“动态”生成基元剔除数据结构,同时更新HSR ID缓冲区。因此,此示例中的处理流水线大体上与图24中所示的处理流水线相同,只是如图58中所示,(早期)HSR ID更新590被修改为也更新基元剔除结构(并且(晚期)HSR ID更新592在存在时也对应地被修改为执行基元剔除结构的晚期更新)。
图59示出了这种情况下的对应状态图。此处,第二主通道操作仍然必须停顿,直到从第一预通道操作中的所有基元都被耗尽(步骤560),然而,不存在构建基元剔除数据结构的附加步骤(例如,与图55相比),因为这改为作为第一预通道操作的部分完成。在这方面,各种其他布置是可能的。
也可以直接从深度(或模版)测试构建基元剔除数据结构,而不需要生成HSR ID缓冲区。该示例在图60中示出。如图60所示,对于要执行深度/模版测试的传入片段(步骤610),执行深度/模版测试(步骤611),并且如果确定片段可见(步骤612),则将识别从中得出片段的基元的相应HSR ID值添加到基元剔除数据结构(步骤613)。注意,在该示例中,基元因此仍然在基元分类期间被分配HSR ID,如上所述,然而,这些简单地用于构建基元剔除数据结构。然后,图61示出了状态机,其例示了针对待处理的传入基元110,如何根据图60的示例中的图形处理器的不同可能状态来不同地处理基元110。应当理解,状态机与图11中所示的状态机相同,只是当图形处理器被配置处于主通道状态时,预通道决策单元83还被配置为检查基元110是否存在于基元剔除数据结构中(步骤620),并且如果否,则此时相应地整体剔除基元(步骤622)。
在上面的示例中,描述了随着并且当基元被确定为可见时,基元如何被添加到基元剔除数据结构。然而,提供能够存储任意基元序列的所有可能基元的基元剔除数据结构可能是禁止的。因此,在一些示例中,基元剔除数据结构是固定大小的数据结构。在此情况下,如果可见基元的数量大于基元剔除数据结构的固定大小,则基元剔除可在该点处损失。另选地,考虑使用固定大小数据结构的条目来指示可见的多个基元的集合的各种布置。
例如,在图62中,当将HSR ID值630添加到基元剔除数据结构634(在此示例中,基元剔除数据结构634包括8位值)时,HSR ID值是以位阵列的长度为模计算的,并且然后如果该基元可见,则相应地设定对应位。因此,如图63所示,对于HSR ID值4,所计算的长度是4,因此第四位被相应地设定。同样,如图64所示,对于HSR值13,所计算的长度是5,因此第五位被相应地设定。当然,这意味着即使当被位覆盖的基元实际上不可见时,也可以设定该位。然而,这是可接受的,因为它简单地意味着基元随后将在片段级别上理期间被杀死。
图65示出了另一示例,其中在这种情况下,当将HSR ID值660添加到基元剔除数据结构634时,检查HSR ID值是否大于基元剔除数据结构中可用的位的数量(步骤662)。如果HSR ID值不大于基元剔除数据结构中可用的位的数量(步骤662-否),则直接使用HSR ID值来设定对应位。因此,如图66所示,对于HSR ID值为5(其小于8),直接使用HSR ID值,使得第五位被设定。另一方面,对于大于基元剔除数据结构中可用的位的数量的HSR ID值(步骤662-是),使用HSR ID值来计算合适的散列函数以确定应被设定的相应位。这在图67中示出。
图68示出了另一示例,其中在这种情况下,当将HSR ID值690添加到基元剔除数据结构634时,应当更新以反映这一点的位是通过对基元剔除数据结构所涉及的图块的最大HSR ID进行计算(步骤691)、计算基元剔除数据结构的每个位应当表示的基元的数量(步骤692)、然后通过将HSR ID值690除以基元剔除数据结构的每个位表示的基元的数量来计算索引来确定的。图69示出了这一点的工作示例。
片段着色器端点优化
如上所述,每个图块的渲染可以包括第一处理通道和第二处理通道。在典型的图形处理布置中,可能存在需要渲染的许多图块。在实施方式中,每个图块以上述相同方式处理。在这种情况下,图块可以被渲染为“背靠背”(back-to-back)的,使得仅在先前图块的主通道操作(或回退操作,如果需要)已经完成之后才开始图块的预通道操作。这通常可以很好地工作。该方法的示例在图70中示出。
如图70所示,向图形处理流水线发布用于对第一图块执行第一预通道操作的第一任务(“预通道T0”)。如上所述,与该图块相关联的基元然后在基元列表读取器中被相应的处理,并且由片段前端级对应地处理。在此示例中,在第一预通道操作期间没有执行片段着色器(尽管这可在需要时进行)。无法针对第一图块开始对应的主通道操作(“主通道T0”),直到所有基元已完成第一预通道操作。因此,如图70所示,第一图块的主通道操作(“主通道T0”)等待第一图块的对应的预通道(“预通道T0”)操作完成。第二图块的预通道操作(“预通道T1”)可以紧接在先前的主通道操作(“主通道T0”)之后启动。然而,同样,第二图块的对应的主通道操作(“主通道T1”)必须等待其预通道操作(“预通道T1”)完成。如图70所示,这的效果在于,可能存在不活动的气泡,尤其是在相邻主通道操作之间的执行核心中。
因此,设想了尝试提高预通道操作的速度的各种布置。
因此,这可以很好地工作以提高整个渲染作业的速度。在其它实施方式中,图形处理流水线可不被复制,而是改为片段着色器端点80尝试交错不同图块的处理任务以提供更连续的吞吐量。该方法的示例在图71中示出。特别地,如图71所示,片段着色器端点80可尝试交错针对不同图块的相应处理通道的处理任务。为了进行此工作,如图71中所示,片段着色器端点80可在尝试针对不同图块交错预通道操作及主通道操作之前最初调度两个(或更多个)预通道操作的集合。然后这意味着该处理有效地提前至少一次预通道操作,这可以减少上述气泡。因此,如图71所示,第一图块的主通道操作(“主通道T0”)可在片段前端中与第二图块的预通道操作(“预通道T1”)交叠。因此,可以相对较早地开始第二图块的主通道操作(“主通道T1”),因为在第二图块的主通道操作(“主通道T1”)准备好发布时其对应的预通道操作(“预通道T1”)已经完成。
在一些示例中,片段着色器端点80可以始终根据期望调度操作发布任务,如图71所示。然而,在其它示例中,片段着色器端点80可尝试根据如图71中所示的期望调度操作来交错任务,但也能够执行更动态的控制,例如,并且特别地,使得如果片段着色器端点80有效地耗尽预通道操作,但存在准备要执行的主通道操作,则可相应地中断期望调度操作以执行主通道操作,例如,而非等待从命令流前端20接收到与下一预通道操作有关的命令。在这种情况下,如果期望调度操作被中断,则可以使片段着色器端点20发布两个背靠背预通道的集合,以重新开始期望调度操作。图72示出用于调度的动态控制的对应工作流程,使得片段着色器端点80尝试执行如图71中所示的交错操作,但也能够在确定这样做可能更有效时中断期望调度操作。
如图72所示,并且如上面关于图6所描述的,响应于从命令流前端20接收到对应命令,由片段着色器端点80生成用于执行给定图块的相应的预通道和主通道操作的处理任务。因此,如上所述,命令流前端20将帧中的所有图块的所有任务/图块发送到片段着色器端点80,片段着色器端点80对应地将任务/图块分解成相应的预通道操作和主通道操作,然后将其发布到图形处理流水线,所述图形处理流水线包括基元列表读取器(多边形列表读取器81)、基元分类82/预通道决策单元83、光栅化85、片段着色87等。尽管图72示出简化图形处理流水线,但应理解,此示例中的图形处理流水线大体上可对应于上文所描述的示例中的图形处理流水线中的任一者。
在图72所示的示例中,在需要渲染多个不同图块的渲染作业开始时(步骤700),在实施方式中,片段着色器端点80发布两个背靠背预通道操作的集合,如图71所示。然后,如下执行控制:使用相应的计数器“num_issued_prepass”,其跟踪已经发布了多少预通道操作。如果发布的预通道操作的数量等于2(步骤701-是),则发布针对最旧预通道的主通道操作(步骤702),并且相应地递减计数器“num_issued_prepass”。如果所发布的预通道操作的数量不等于2(步骤701-否),则检查所发布的预通道操作的数量是否等于1(步骤703)。如果甚至不存在可用的单个预通道(步骤701-否),使得预通道操作的数量为零(步骤704-是),则片段着色器端点80被配置成检查新的图块/任务是否可从命令流前端20获得(步骤705),并且当存在可用的图块/任务(步骤705-是)时,发布预通道操作并相应地递增计数器“num_issued_prepass”(步骤706),或者在其他情况下(步骤705-否),等待直到新的图块/任务可用。因此,该循环的效果是,在作业开始时,或者如果片段着色器耗尽预通道操作,则在实施方式中,背靠背地启动两个预通道操作的集合。
然而,如上所述,在一些情况下,可能期望不按顺序发布主通道操作(当一个主通道操作可用于执行时)。因此,如果所发布的预通道操作的数量等于1(步骤703-是),则在该点处检查是否已经存在可从命令流前端20获得的新图块(步骤707)。如果新图块可用(步骤707-是),则调度操作根据图71中所示的通过发布预通道操作的期望调度操作进行(步骤706)。另一方面,如果没有图块可用,并且因此没有准备好发布的预通道操作(步骤707-否),则决定是否等待新图块变得可用,或者是否立即发布未完成的主通道操作。在图72所示的示例中,该决策检查当前的预通道操作是否完成了基元分类(步骤708)。因此,从基元分类82/预通道决策83级向片段着色器端点80提供信号以指示这一点。如果接收到的预通道已经进行了分类(步骤708-是),则发布主通道操作(步骤702)。否则(步骤708-否),使片段着色器端点80等待。在这方面,各种其他布置是可能的。例如,还可以使用超时机制来执行关于是否等待的决定,使得如果在某个时间段内没有新图块可用,则在该点发布主通道。
可重新开始的预通道
因此,本实施方式引入了一种新颖的“预通道”操作,如上所述,该操作促进改进的隐藏表面去除效率。如图7所示,如上所述,为了确保安全的硬件执行,还提供了“回退”操作,使得图形处理器能够根据需要切换到这样的回退操作,以便处理预通道操作无法安全处理的基元。例如,在图7所示的实施方式中,在第一预通道操作遇到不兼容的基元之后,处理切换到回退操作并且在回退操作中继续到图块的结束。然后可以针对要渲染的下一个基元序列(例如,下一个图块)发起新的预通道操作。
然而,在这方面,还可能例如响应于识别到另一兼容基元(或兼容基元序列)而重新开始图块内的预通道操作。这例如在图73中示出。
图73示意性地示出了根据另一实施方式的渲染操作,其中可以在图块内重新开始新颖的“预通道”操作。因此,处理操作通常如上文关于图7所述进行。然而,在该实施方式中,在切换到回退操作之后,图形处理器能够在遇到另一兼容基元的事件中从回退操作切换回到预通道操作。例如,考虑以下基元序列;
#基元1,兼容
#基元2,兼容
#基元3,不兼容
#基元4兼容
#基元5,兼容
#基元6,不兼容
如果根据图7中所示的实施方式处理基元序列,则在到达第一不兼容基元(“#基元3”)之后,图形处理器将切换到回退操作,并且然后继续处理回退操作中的所有剩余基元,尽管事实是下一基元(“#基元4”)实际上与第一预通道操作处理兼容。这意味着可能损失一些隐藏表面去除效率。例如,以上示例非常简单,并且一般来说基元序列可含有许多基元。在这种情况下,在第一不兼容基元之后可能存在相对较长的兼容基元序列,为此可能期望切换回到第一预通道操作,以便允许改进的隐藏表面去除效率。
因此,根据图73中所示的实施方式,在第一不兼容基元已由第三回退操作处理之后,使图形处理器切换回到第一预通道操作以用于下一兼容基元(“#基元4”)。本实施方式中的操作顺序为:
#针对基元1运行预通道
#针对基元2运行预通道
#遇到基元3
#重新绕回到基元1
#针对基元1运行主通道
#针对基元2运行主通道
#遇到基元3
#针对基元3运行回退
#遇到基元4
#切换到预通道操作,将基元4记录为重新开始点
#恢复针对基元4的预通道
#针对基元5运行预通道
#遇到基元6
#针对基元6运行回退
#图块的末尾
因此,如上文所描述,处理开始于第一预通道操作,并且当遇到第一个不兼容基元(“#基元3”)时,停止第一预通道操作,其中基元列表读取器重新绕回到基元序列的开始,并且接着执行对应的主通道操作以完成到目前为止处理的基元(“#基元1”和“#基元2”)的渲染。当第二主通道遇到第一个不兼容基元(“#基元3”)时,然后停止第二主通道,并且运行回退操作以处理不兼容基元。到目前为止,处理与图7实施方式中相同。然后,至少针对序列中的任何其他不兼容基元,该处理在回退操作中继续(步骤7130)。
然而,不是简单地在回退操作中继续到图块的末尾,而是响应于图形处理器在回退操作中识别到存在另一兼容基元(例如,“#基元4”),图形处理器能够切换回第一预通道操作并且从另一兼容基元的位置重新开始预通道操作(步骤7131)。
即,在图73中所示的示例中,在使图形处理器切换到回退操作(响应于预通道操作遇到不兼容基元)之后,图形处理器进一步能够响应于确定基元序列内存在另外的兼容基元而从第三回退操作切换回到第一预通道操作。因此,当可能这样做时,本文描述的技术允许在切换到第三回退操作之后在基元序列内重新开始第一预通道操作。
为了促进图形处理器在这些操作之间的切换,例如并且避免在第一预通道操作停止并且转变到第三回退操作时潜在地引入伪影(反之亦然),图形处理器应当并且在实施方式中确实存储合适的状态或信息,以允许基元序列的处理在这样的切换事件之后相应地继续,例如,并且在实施方式中,以能够在新操作模式中继续处理时使用来自先前操作模式的处理结果的更无缝方式。
例如,并且如下文将进一步解释的,在实施方式中,由第一预通道操作生成的可见性信息(并且用于控制第二主通道操作中的片段的处理)是基于在第一预通道操作期间处理的基元的片段的深度值生成的。因此,第一预通道操作可以并且在实施方式中确实涉及更新用于基元序列的深度缓冲区。在根据本文中所描述的技术的正常操作中,深度缓冲区或基于在第一预通道操作期间生成的深度值的其它可见性信息随后在第二主通道期间被用于控制片段处理。当针对基元序列停止第一预通道操作并且随后将图形处理器切换到第三回退操作以继续处理基元序列时,在实施方式中,第三回退操作也执行深度测试(例如,以正常方式)。
因此,在实施方式中,由中止的第一预通道操作产生的深度缓冲区被携带通过该转变,使得深度缓冲区的内容(反映到目前为止处理的基元的深度缓冲区,即,直到不兼容基元的位置)也可用于第三回退操作。然后,在实施方式中,第三回退操作然后基于由第三回退操作进行的深度测试基元来继续更新深度缓冲区,并且在随后执行切换回第一预通道操作的事件中,在实施方式中,使得在第三回退操作被停止的点处的深度缓冲区的内容在恢复的第一预通道操作期间在生成要由恢复的第一预通道操作处理的后续基元的可见性信息时可用于使用(并且然后被使用),例如并且在实施方式中,以允许在重新开始第一预通道操作时继续改进的隐藏表面去除。
因此,当图形处理器从第一预通道操作模式转变到第三回退操作时,在实施方式中,用于基元序列的深度缓冲区保留,并且由第一预通道操作到目前为止(直到触发转变的不兼容基元的点)对基元的处理生成的深度缓冲区的当前内容然后被用于在第三回退操作期间的深度测试基元(片段)。
对应地,当图形处理器从第三回退操作切换回第一预通道操作时,在实施方式中,深度缓冲区的内容被再次保留并由第一预通道操作用于继续生成针对要由恢复的第一预通道操作处理的基元的序列(或子序列)的可见性信息。
在实施方式中,还在第一预通道操作与第三回退操作之间的这样的转变期间跟踪到目前为止基元序列中的哪些基元已被处理到完成,以便潜在地生成渲染输出数据(即,通过执行第一预通道操作和第二主通道操作两者或通过执行第三回退操作哪些基元已被处理到完成)。在实施方式中,通过跟踪到目前为止哪些基元已被处理完成,这然后允许图形处理器从期望基元重新开始基元序列的处理(使得处理可以有效地快进通过基元序列并且从任意基元恢复)。因此,这可以促进图形处理器在单个基元序列内的操作模式之间的切换,例如,并且在实施方式中,通过避免必须重复已经处理的基元的大量处理。
例如,当重新开始第一预通道操作时,使得存在从第三回退操作切换回第一预通道操作的切换,通过跟踪到目前为止已处理哪些基元,只要深度缓冲区(以及用于重新开始预通道操作的任何其他期望信息)可用,则恢复的第一预通道操作然后可以(并且在实施方式中确实)跳过已经被处理的任何基元的大量处理,使得第一预通道操作有效地从触发第一预通道操作的重新开始的另外的兼容基元的位置恢复处理。
这可以根据需要以各种合适的方式完成。例如,在实施方式中,可以用指示它们是否先前已经以任一方式处理的合适状态来注释基元。在此情况下,仍可在恢复的预通道操作期间处理基元,但在此基础上相对较早地(例如,并且在实施方式中是在恢复的预通道操作开始时)有效地剔除基元,使得在恢复的预通道操作期间不发生基元的大量重复处理。这可以相对较简单地实现,因为它不需要对如何获得基元进行处理的任何改变(例如,可以根据其指定的渲染顺序(例如来自相应的基元列表)以正常方式处理所有基元,但是可以在第一预通道操作期间剔除已经处理过的基元,以避免这种基元的大量重复处理)。因此,该方法可以促进更高效的硬件实现。然而,各种其他布置也是可能的。例如,在其它实施方式中,当在操作模式之间转变时图形处理器可经配置以写出充足信息以允许处理从基元序列中的期望基元重新开始,然后,当第一预通道操作重新开始从期望基元开始时,可以相应地使用该信息。
对从第三回退操作切换到第一预通道操作的控制可以以任何合适且期望的方式执行,但是在实施方式中也基于基元分类,例如,并且在实施方式中,基于与上面关于第三回退操作的触发所描述的相同的基元分类。因此,实施方式中的第三回退操作模式还包括(检查)基元分类的步骤。然而,在一些实施方式中,从第三回退操作模式进行切换是更保守地执行的,并且因此可提供额外逻辑以促进此操作。在这方面,各种布置将是可能的,如下文将解释的。
例如,为了确保安全渲染操作,每当遇到不兼容基元时,图形处理器应(并且在实施方式中确实)切换到第三回退模式。因此,在实施方式中,基元序列中的第一个不兼容基元将触发停止第一预通道操作,并且随后以上述方式通过第三回退操作处理不兼容基元。
在一些实施方式中,每当遇到与第一预通道操作兼容的另外的基元时,图形处理器可对应地尝试从第三回退操作模式切换回到第一预通道操作。即,切换回到第一预通道操作以处理另外的兼容基元的决策可在每基元基础上执行,类似于响应于不兼容基元而停止第一预通道操作的决策。在这种情况下,图形处理器可以继续仅在第三回退操作中处理基元,直到遇到下一个兼容基元,此时图形处理器切换回第一预通道操作。这可以很好地工作,尤其是在不兼容的基元相对较少的典型情况下,使得在每基元基础上的切换可以提供改进,至少在平均情况下是这样。
即使从上述简单示例中也可以理解,在基元序列包括兼容基元和不兼容基元的混合的情况下,这可以导致图形处理器重复地切换状态。在某时,用于切换状态的附加时间和能量可能超过改进的隐藏表面去除的任何益处。因此,在实施方式中,图形处理器可以在触发切换出回退操作之前检查一个或更多个其他条件,而不是在遇到下一个兼容基元(因此在上面的示例中的“#基元4”)时立即切换回预通道操作。
可以根据需要设定这些其他条件,并且可以在这方面应用各种合适的试探法。例如,在上面的示例中,存在两个另外的兼容的基元(“#基元4”和“#基元5”)的序列。如果可以提前识别存在多于一个的另外的兼容基元的序列,则这可能使得更期望切换。因此,可以进行前瞻性检查,以检查基元序列中是否有多余一个的兼容基元的连续序列,并在此基础上做出是否切换(回)的决策。另一可能的试探法将是在触发切换之前等待直到已到达设定数量的另外的兼容基元。这可以很好地工作,因为通常期望相邻基元具有相似的基元性质(使得它们可以以相同的方式被处理)。
图74示出了这一点。因此,在第三回退操作期间,当确定存在另外的兼容基元时(步骤720),接着检查是否满足一个或更多个其它条件以使图形处理器恢复到预通道操作。然后相应地执行另外的处理(步骤722)。因此,如果满足一个或更多个条件(步骤721-是),则图形处理器相应地恢复到预通道操作。否则,如果不满足一个或更多个条件(步骤721-否),则图形处理器在回退操作中继续(至少目前是在回退操作中继续)。
在这方面,各种布置是可能的。
将理解,根据上文呈现的各种实施方式和示例,根据本文描述的技术的要求,可以根据需要以各种合适的方式配置预通道(和主通道)操作。还将理解,可以对预通道(和主通道)操作进行各种其他修改,并且例如,可以有利地组合上述示例和实施方式中的任一个。通常,第一预通道操作和第二主通道操作因此可以根据需要包括任何其他合适的处理操作。
因此已经出于说明和描述的目的呈现了前述详细描述。不旨在穷举或将本文描述的技术限于所公开的精确形式。根据上述教导,许多修改和变化是可能的。选择所描述的实施方式以便最好地解释本文描述的技术的原理及其实际应用,从而使本领域的其他技术人员能够最好地利用在各种实施方式中并且具有适合于预期的特定用途的各种修改的本文描述的技术。该范围旨在由所附权利要求限定。

Claims (20)

1.一种操作图形处理器的方法,所述方法包括:
对于要针对渲染输出进行渲染的基元序列:
执行第一预通道操作,在所述第一预通道操作中,要渲染的所述基元序列中的基元被处理成一个或更多个片段的相应集合,每个片段与所述渲染输出内的一个或更多个采样位置的相应集合相关联,并且其中,作为所述第一预通道操作的部分,所述基元序列中的基元的片段被处理以确定所述基元序列的可见性信息,
其中,所确定的可见性信息包括基元识别信息集合,所述基元识别信息集合针对所述渲染输出内的相应的采样位置存储相应的基元识别符,其中,针对相应的采样位置存储的所述基元识别符指示所述基元序列中的随后应当针对所述采样位置被另外处理的所述基元;以及
此后执行第二主通道操作,在所述第二主通道操作中,由所述第一预通道操作处理过的至少一些基元被再次处理成所述至少一些基元的一个或更多个片段的相应集合,以用于针对所述渲染输出内的相应的采样位置进行处理,其中,在所述第二主通道操作期间对片段的所述处理包括可见性测试的步骤,在所述可见性测试中,对照所述基元识别信息集合中的针对所述片段所相关的采样位置的对应条目来测试与所述片段相关联的基元识别符,以确定是否应当针对所述采样位置另外处理所述片段。
2.根据权利要求1所述的方法,其中,所述基元识别信息集合针对所述渲染输出内的每个采样位置存储相应的基元识别符或指示所述采样位置未被基元覆盖的值。
3.根据权利要求1或2所述的方法,其中,所述基元识别符唯一地识别所述基元序列内的基元。
4.根据权利要求3所述的方法,其中,针对所述基元序列的所述基元识别符在所述基元序列内从特定起始值单调地改变。
5.根据权利要求1或2所述的方法,其中,所述第一预通道操作包括使用针对所述基元序列的深度缓冲区对片段进行深度测试,并且其中,当片段引起对所述深度缓冲区的更新时,与所述片段相关联的所述基元识别符被写入到所述基元识别信息集合中的针对所述片段所相关的所述一个或更多个采样位置的对应的一个或更多个条目。
6.根据权利要求1所述的方法,其中,至少对于在所述第一预通道操作期间被处理过且能够更新所述基元识别信息集合的基元,在所述第二主通道操作期间针对片段执行的对照所述基元识别信息集合的所述可见性测试包括:确定与所述片段相关联的基元识别符是否匹配所述基元识别信息集合中的针对所述片段所相关的所述采样位置的对应条目,以确定是否应当针对所述采样位置另外处理所述片段。
7.根据权利要求1所述的方法,其中,作为所述第二主通道操作的部分,使片段经受多个不同可见性测试的集合中的一者,以对照所述基元识别信息集合来测试所述片段的所述相关联的基元识别符,其中,基于所述基元是否能够在所述第一预通道操作期间生成可见性信息来确定所述多个不同可见性测试的所述集合中的被用于特定片段的所述一者。
8.根据权利要求6或7所述的方法,其中,对于在所述第一预通道操作期间不能生成可见性信息但在所述第二主通道操作期间要被处理的基元,在所述第二主通道操作期间执行的对照所述基元识别信息集合对这样的基元的片段的所述可见性测试包括:确定与所述片段相关联的所述基元的基元识别符值是大于还是小于存储在所述基元识别信息集合中的针对所述片段所相关的所述采样位置的对应条目中的所述基元识别符,以确定是否应当针对所述采样位置另外处理所述片段。
9.根据权利要求8所述的方法,其中,对于在所述第一预通道操作期间不能生成可见性信息并且其相关联的片段在所述第二主通道操作期间的对照所述基元识别信息集合的所述可见性测试中存活的基元,所述存活的片段在所述第二主通道操作期间经受另外的深度测试,其中,所述另外的深度测试包括对照在所述第一预通道操作期间生成的深度缓冲区对所述片段进行深度测试。
10.根据权利要求1或2所述的方法,其中,一旦完成对所述基元序列的所述处理,就丢弃针对所述基元序列的所述基元识别信息集合。
11.一种图形处理器,所述图形处理器被配置成生成渲染输出,所述图形处理器包括光栅化电路和渲染电路,所述光栅化电路能够被操作成将基元光栅化为一个或更多个片段的相应集合,并且所述渲染电路能够被操作成处理所得片段以生成渲染输出数据,其中,所述图形处理器被配置成:
对于要针对渲染输出进行渲染的基元序列:
执行第一预通道操作,在所述第一预通道操作中,通过以下操作处理要渲染的所述基元序列中的基元:
所述光栅化电路将所述基元光栅化为一个或更多个片段的相应集合,每个片段与所述渲染输出内的一个或更多个采样位置的相应集合相关联;以及
作为所述第一预通道操作的部分,片段可见性确定电路处理所述基元序列中的基元的片段,以确定所述基元序列的可见性信息,
其中,所确定的可见性信息包括基元识别信息集合,所述基元识别信息集合针对所述渲染输出内的相应的采样位置存储相应的基元识别符,其中,针对相应的采样位置存储的所述基元识别符指示所述基元序列中的随后应当针对所述采样位置被另外处理的所述基元;以及
此后执行第二主通道操作,在所述第二主通道操作中,通过由所述光栅化电路对所述基元进行光栅化来将由所述第一预通道操作处理过的至少一些基元再次处理成所述至少一些基元的一个或更多个片段的相应集合,以用于针对所述渲染输出内的相应的采样位置进行处理,其中,作为所述第二主通道操作的部分,可见性测试电路通过执行可见性测试来控制对片段的所述另外处理,在所述可见性测试中,对照所述基元识别信息集合中的针对所述片段所相关的一个或更多个采样位置的对应条目来测试与所述片段相关联的基元识别符,以确定是否应当针对所述采样位置另外处理所述片段。
12.根据权利要求11所述的图形处理器,其中,所述基元识别信息集合能够针对所述渲染输出内的每个采样位置存储相应的基元识别符或指示所述采样位置未被基元覆盖的值。
13.根据权利要求11或12所述的图形处理器,其中,每个基元识别符唯一地识别所述基元序列内的基元。
14.根据权利要求13所述的图形处理器,其中,针对所述基元序列的所述基元识别符在所述基元序列内从特定起始值单调地改变。
15.根据权利要求11或12所述的图形处理器,其中,所述图形处理器被配置为:在所述第一预通道操作期间,使用针对所述基元序列的深度缓冲区来执行片段的深度测试,并且其中,当片段引起对所述深度缓冲区的更新时,与所述片段相关联的所述基元识别符被写入到所述基元识别信息集合中的针对所述片段所相关的一个或更多个采样位置的对应的一个或更多个条目。
16.根据权利要求11所述的图形处理器,其中,至少对于在所述第一预通道操作期间被处理过且能够更新所述基元识别信息集合的基元,在所述第二主通道操作期间针对片段执行的对照所述基元识别信息集合的所述可见性测试包括:确定与所述片段相关联的基元识别符是否等于所述基元识别信息集合中的针对所述片段所相关的所述采样位置的对应条目,以确定是否应当针对所述采样位置另外处理所述片段。
17.根据权利要求11所述的图形处理器,其中,作为所述第二主通道操作的部分,使片段经受多个不同可见性测试的集合中的一者,以对照所述基元识别信息集合测试所述片段的所述相关联的基元识别符,其中,基于所述基元是否能够在所述第一预通道操作期间生成可见性信息来确定所述多个不同可见性测试的所述集合中的被用于特定片段的所述一者。
18.根据权利要求16或17所述的图形处理器,其中,对于在所述第一预通道操作期间不能生成可见性信息但在所述第二主通道操作期间要被处理的基元,在所述第二主通道操作期间执行的对照所述基元识别信息集合对这样的基元的片段的所述可见性测试包括:确定与所述片段相关联的基元识别符是大于还是小于存储在所述基元识别信息集合中的针对所述片段所相关的所述采样位置的所述基元识别符,以确定是否应当针对所述采样位置另外处理所述片段。
19.根据权利要求18所述的图形处理器,其中,对于在所述第一预通道操作期间不能生成可见性信息并且其相关联的片段在所述第二主通道操作期间的所述可见性测试中存活的基元,所述图形处理器还被配置成使所述片段在所述第二主通道操作期间经受另外的深度测试,其中,所述另外的深度测试包括对照在所述第一预通道操作期间生成的深度缓冲区对所述片段进行深度测试。
20.根据权利要求11或12所述的图形处理器,其中,所述图形处理器被配置成一旦完成对所述基元序列的所述处理,就丢弃针对所述基元序列的所述基元识别信息集合。
CN202311524507.2A 2022-11-17 2023-11-15 图形处理器 Pending CN118052690A (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
CN118052690A true CN118052690A (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 (3)

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

Family Applications After (1)

Application Number Title Priority Date Filing Date
CN202311527200.8A Pending CN118052693A (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
CN118052692A (zh) 2024-05-17
CN118052693A (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
US7889205B1 (en) Frame buffer based transparency group computation on a GPU without context switching
KR20170015232A (ko) 그래픽 처리 시스템
US11734869B2 (en) Graphics processing
CN115311120A (zh) 图形处理系统
CN118052690A (zh) 图形处理器
US20240169646A1 (en) Graphics processors
US20240169619A1 (en) Graphics processors
US20240169648A1 (en) Graphics processors
US20240169663A1 (en) Graphics Processors
US20240169644A1 (en) Graphics processors
US20240169618A1 (en) Graphics processors
US20240169647A1 (en) Graphics processors
US20240169645A1 (en) Graphics processors
US20240169649A1 (en) Graphics processors
US20240169669A1 (en) Graphics processors
WO2024105396A1 (en) Graphics processors
GB2624425A (en) Graphics processors
GB2624430A (en) Graphics processors
KR20240072942A (ko) 그래픽 프로세서
GB2624429A (en) Graphics processors
GB2624431A (en) Graphics processors
GB2624428A (en) Graphics processors
KR20240072941A (ko) 그래픽 프로세서

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication