图形处理系统的利记博彩app

文档序号:11135235阅读:380来源:国知局
图形处理系统的制造方法与工艺

本发明涉及图形处理系统,特别地,涉及包括一个或更多个可编程处理阶段(“着色器”)的图形处理系统的操作。



背景技术:

图形处理通常是以流水线的方式来执行的,具有对数据进行操作以生成最终渲染输出(例如显示的帧)的一个或更多个流水线阶段。现在,很多图形处理流水线包括一个或更多个可编程处理阶段,通常被称为“着色器(shader)”。例如,图形处理流水线可以包括几何着色器、顶点着色器和片段(fragment)(像素)着色器中的一个或更多个,并且通常为全部的上述着色器。这些着色器是这样的可编程处理阶段:其对输入数据值执行着色器程序以生成期望的一组输出数据(例如,在片段着色的情况下适当地进行着色(shade)和渲染的片段数据),用于通过图形流水线的其余部分进行的处理和/或用于输出。图形处理流水线的着色器可以共享可编程处理电路,或者它们各自可以是不同的可编程处理单元。

因此,图形处理单元(GPU)着色器核心是这样的处理单元:其通过运行针对要生成的图形输出中的每个图形项目的小程序来执行图形处理,上述图形输出诸如是渲染目标,例如,帧(“项目”在这方面通常是顶点或采样位置(例如,在片段着色器的情况下))。这通常使得具有高并行度,这是由于典型的渲染输出(例如,帧)特征在于具有相当大数量的顶点和片段,这些顶点和片段中的每一个可以独立地进行处理。

在图形着色器操作中,每个“项目”将借助于执行线程来进行处理,该执行线程将执行针对讨论中的图形“项目”的讨论中的着色器。

提高着色器执行效率的已知方式是将执行线程(在每个线程对应于例如一个顶点或一个采样位置的情况下)分组成“成组”或者“成束”的线程,在这种情况下,一组的线程以一致步调运行,一次一个指令。这样,能够在该组中的全部线程之间共享指令取出和调度资源。(用于这种线程组的其它术语包括“warps”和“wavefronts”。为了方便起见,将在本文中使用术语“线程组”,但是除非另有说明,该术语旨在包含全部的等同术语和布置。)

在片段着色器的情况下(对渲染输出的基元中的每个采样位置执行一次的着色器),线程组通常包含一个或更多个“四元组(quads)”,其中“四元组”是采样位置的2x2分组。按照这种方式将采样位置组织成每四元组有利于在片段着色器中完成的部分操作,诸如取决于这种采样点增量的采样点增量计算和操作,诸如利用分级细化(mipmapping)的纹理查找。

申请人已经意识到在这种布置中,在基元的边缘处,2x2采样位置四元组可以跨越基元的边缘,采样位置中的一部分在基元内部,而其它采样位置则在外部。在这种情况下,仍将针对四元组中的全部四个采样位置开始线程,但是事实上仅被基元覆盖的那些采样位置将是“活动”线程。

然而,对于对应于在基元外部的采样位置的线程(为了方便起见,在本文中其将被称为“非活动”和/或“辅助”线程),仍然需要部分片段着色处理。这是因为例如,需要针对这种非活动(“辅助”)线程的片段着色结果中的一部分作为对诸如采样位置增量类型计算这样的片段着色操作中的一部分的输入。(然后,通过这种辅助线程计算出的结果在片段着色器结束时被丢弃(因为它们不另被需要))。

图1例示了这种情况。

图1示意性地示出要生成的图形输出的采样位置102的阵列101,其中采样位置的各个2x2分组被组织成将共同进行处理的“四元组”103。

当基元被栅格化时,栅格化器将识别至少部分地被基元覆盖的这些采样位置四元组(分组),并且发出用于对每个至少部分地被覆盖的四元组(采样位置的分组(组))进行渲染的图形片段。然后,每个这种片段将作为线程组(warp)通过片段着色器进行处理,每个被覆盖的采样位置是该组(warp)中的“活动”线程,并且任何未被覆盖的采样位置是非活动(“辅助”)线程。

图1示出覆盖采样位置的阵列的示例性基元104。从图1中可以看出,当采样位置四元组105针对基元103进行处理时,2x2四元组105内的采样位置中的三个采样位置将是“活动的”(即,表示基元3内部的采样位置),而四元组104中的第四个采样位置106由于其落在基元103的边缘的外部将是“非活动的”。因此,当针对四元组104执行片段着色器程序时,针对未被覆盖的采样位置106的线程组内部的线程将作为“辅助”线程被执行和处理。

申请人相信,线程组的处理特别是在图形处理流水线的着色器中的处理仍然有改进的空间。



技术实现要素:

根据本发明的第一方面,提供有一种操作图形处理流水线的方法,该图形处理流水线包括执行指令以进行着色操作的可编程着色阶段,其中,执行线程能够一起被分组为线程组,在所述线程组中,分组的线程以一致步调、一次一个指令地来执行,所述方法包括以下步骤:

连同线程组合并事件指示一起向所述着色器阶段发出用于通过所述着色器阶段执行以对执行线程进行处理用于生成渲染输出的着色器程序,所述线程组合并事件指示表示所述着色器程序执行中的如下的点,即,在该点处,能够将线程组中的并非全部线程都是活动的所述线程组进行合并;

所述图形处理流水线:

识别要通过所述着色阶段进行处理的一组两个或更多个线程组,对于所述两个或更多个线程组,所述线程组中的并非全部线程都是活动的,并且所述两个或更多个线程组能够被合并为单个线程组;以及

所述着色阶段:

针对所识别的线程组执行所述着色器程序,针对所识别的线程组执行所述着色器程序包括以下步骤:

当所识别的线程组已经到达所述线程组合并事件指示时,将所述线程组合并为包含来自所述线程组中的每一个线程组的活动线程的单个线程组;以及

在所述合并事件指示点之后,针对经合并的线程组执行所述着色器程序中的进一步的指令。

根据本发明的第二方面,提供有一种数据处理系统,该数据处理系统包括:

图形处理流水线,该图形处理流水线包括执行指令以进行着色操作的可编程着色阶段,其中,执行线程能够一起被分组为线程组,在所述线程组中,分组的线程以一致步调、一次一个指令地来执行;以及

编译器,该编译器对针对所述着色阶段的程序进行编译以生成用于通过所述着色阶段执行的指令;

其中,所述编译器被配置为:

连同线程组合并事件指示一起向所述着色器阶段发出用于通过所述着色器阶段执行以对执行线程进行处理用于生成渲染输出的着色器程序,所述线程组合并事件指示表示所述着色器程序执行中的如下的点,即,在该点处,能够将线程组中的并非全部线程都是活动的所述线程组进行合并;

所述图形处理流水线被配置为:

识别要通过所述着色阶段进行处理的各个组的两个或更多个线程组,对于所述两个或更多个线程组,所述线程组中的并非全部线程都是活动的,并且所述两个或更多个线程组能够被合并为相应的单个线程组;以及

所述着色阶段被配置为:

执行针对所识别的线程组的所述着色器,所述执行针对所识别的线程组的所述着色器包括以下步骤:

当相应的所识别的一组可合并的线程组中的线程组已经到达所述线程组合并事件指示时,将所述线程组合并为包含来自所述线程组中的每一个线程组的活动线程的单个线程组;以及

在所述合并事件指示点之后,针对经合并的线程组执行所述着色器程序中的进一步的指令。

本发明涉及执行线程可以一起被分组到线程组(“warp”)中的图形处理流水线中着色器程序的执行。在本发明中,具有部分“非活动”(“辅助”)线程的线程组被识别,然后“合并事件”指示被用来触发将这些线程组合并为单个线程组,用于在着色器执行期间的包含所述线程组的所述活动线程的执行。如下面将进一步讨论的,这然后具有减少在线程组仅具有部分“活动”线程(例如,与所覆盖的采样位置相关的线程)的线程组的情况下所需要的整体处理的效果。

申请人已经意识到,在这方面,如上述讨论的,尽管当执行片段着色器程序时,必须要例如执行针对非活动(未被覆盖的)“辅助线程”的那个程序,例如用于生成对采样位置增量类型计算的输入的目的,但是这些计算也可以仅在靠近所述片段着色器程序的开始时发生(和/或能够被仅布置为发生)。这意味着一旦已经执行了非活动“辅助”线程所需要的计算,则这些非活动“辅助”线程有可能被终止。“辅助线程”的这种提早终止本身将有利于节省电力。

然而,申请人已经进一步意识到,即使“辅助线程”以这种方式被终止,其本身也将不会允许线程组作为一个整体被终止(即,即使“辅助线程”不执行任何计算,该“辅助线程”仍将占据线程组执行路径,并且因此不必要地占据执行周期,即使其不再需要进行处理)。这对于具有大量小基元和长着色器程序的工作负载(其例如是在现代游戏中经常出现的工作负载)来说,可能变得特别浪费。

本发明通过识别和指示着色器程序中的线程组合并事件机会来对此进行说明,在此之后,具有非互动“辅助”线程的线程组被合并为包含原始“稀疏地”活动线程组的“活动”线程的单个线程组。这然后有效地避免原始线程组的非活动“辅助”线程占据执行周期。

本发明所考虑的线程组可以是任何合适且需要的尺寸。在优选实施方式中,每个线程组包含四个线程(即,存在为四的warp宽度)。在这种情况下,每个线程组(warp)优选地对应于2x2采样位置“四元组”。然而,如果需要的话,诸如使用更宽的线程组(warp)的其它安排将是可能的。

图形处理流水线的可编程着色阶段能够包括图形处理流水线的任何合适且需要的可编程着色阶段(“着色器”)。然而,可以设想的是本申请将具有对片段着色操作的特殊应用,因此在优选实施方式中,可编程着色阶段作为(正作为)可编程片段着色阶段(片段着色器)进行操作。可编程着色阶段可以仅作为片段着色器进行操作,但是将要理解的是在这方面,可编程着色阶段通常能够(且优选地能够)运行除了仅片段着色器以外的着色器,即,使得可以存在可以例如在不同的时间适当地进行编程的图形处理流水线的一个或更多个可编程阶段,以用作片段着色器(以执行片段着色操作)并且用作其它形式(类型)的着色器。

相应地,向(可编程)着色阶段发出的着色器程序可以是用于通过可编程着色阶段执行的任何合适且需要的着色器程序,但是在特定的优选实施方式中是片段着色器程序(用于执行片段着色操作的程序)(并且能够包括用于通过可编程着色阶段执行的任何合适且需要的片段着色器程序)。

正被生成的渲染输出能够是图形处理流水线的任何合适且需要的渲染输出。在一个优选实施方式中,渲染输出是要进行显示的帧(图像),但是本发明也同样适用于其它形式的渲染输出,诸如纹理(在渲染到纹理操作中)等。

着色器程序中包括的线程组合并事件指示能够采用能够指示(并且能够被着色器使用来识别)使线程组合并的机会的任何合适且需要的形式。

在一个优选实施方式中,提供线程组合并指示作为着色器程序中的指令或其一部分。例如,能够提供线程组合并指示作为包括在着色器程序中的特定指令(“合并”指令)。还将能够借助于着色器程序中的修改程序或者针对着色器程序中的指令来指示线程组合并事件机会。

在其它实施方式中,线程组合并事件指示没有作为着色器程序中的指令或作为其一部分被包括,但是相反地按照能够指示着色器程序中的线程组合并事件点(诸如与着色器代码本身分开指出的分界点)的某些其它方式来指示。在这种情况下,合并事件点能够被指示为例如已经被执行的着色器程序的特定数量的指令,和/或在执行着色器的同时达到特定的程序计数器值。

能够以任何合适且需要的方式在着色器程序中或者与着色器程序相关地、并且通过整体数据处理系统的任何合适且需要的元件来提供线程组合并事件指示。

在特别优选实施方式中,通过图形处理流水线的编译器(着色编译器)来提供线程组合并事件指示。因此编译器优选地例如,在合适的点处将线程组合并事件指令嵌入到例如片段、着色器程序中,或者将线程组合并事件修改程序添加到着色器程序的指令中,或相反地生成针对线程组合并事件指示的分界点的指示。使编译器提供线程组合并事件指示具有如下优势:编译器能够对着色器程序进行评估,以确定是否能够在着色器程序执行中包括线程组合并事件指示。

在特定优选实施方式中,编译器例如通过对要求图形处理的主处理器的应用来对所提供的着色器程序代码进行分析,确定线程组合并事件在着色器程序执行中的某个点处是否可能,并且如果可能的话,则在着色器程序中的合适的点处并且针对该点提供线程组合并事件指示(例如,通过在该点处将特定指令嵌入到着色器程序中,或者以其它方式),以指示线程组合并事件机会。

在特定优选实施方式中,编译器还可以操作(在这种情况下是可能的)以对着色器程序中的操作进行重新排序,以便例如提供在着色器程序执行中包括线程组合并事件的机会,和/或以便允许在着色器程序的执行中更加有效地包括并使用线程组合并事件机会。

在这方面,编译器优选地进行操作以将诸如纹理查找的需要针对非活动线程的结果的任何着色器程序操作放在线程组合并事件指示点之前。相应地,编译器优选地将不需要针对线程组中的非活动(辅助)线程来执行的诸如算术运算的任何着色器程序操作放在着色器程序执行中的线程组合并事件点之后。

编译器可以例如,并且在优选实施方式中确实可以在包括图形处理流水线的整体数据处理系统的主处理器上运行(图形处理流水线然后在诸如图形处理器的与主处理器相关联的另一处理器上(使得编译器和编译代码在整体数据图形处理系统内部的单独的处理器上运行))。然而,其它安排将是可能的,诸如编译器在与编译代码相同的处理器上运行,或者编译器(完全)在单独的处理器上运行,诸如程序在单独的系统上进行预编译并且以编译的形式分布。

能够针对要通过图形处理流水线执行的每个和每一着色器程序来考虑(并且在一个实施方式中)按照本发明的方式识别并提供要执行的着色器程序中的线程组合并事件机会的操作。还将能够尝试识别并提供仅针对特定类别或类型的着色器程序但是不针对其它类别或类型的着色器程序的线程组合并事件机会(例如,在着色器程序的类型不大可能提供有用的线程组合并事件机会的情况下)。

在优选实施方式中,按照本发明的方式识别并提供线程组合并事件机会的操作是针对要执行的片段着色器程序来进行的(并且优选地是针对要通过图形处理流水线执行的每个和每一片段着色器程序来进行的)。

(然而,例如在编译器确定合适的合并事件点不存在或者在所讨论的着色器程序中可能不是那么有用的情况下,不必每个和每一(例如片段)着色器程序都必须具有线程组合并事件指示和包括在其中的点。)

如有需要,还将能够在着色器程序中包括多个线程组合并事件点。这在例如大部分着色器程序被包含在IF块中时可能是有用的,使得在着色器程序执行中将一个合并点放在IF块的中间并且将第二个合并点放在紧接着IF块的末端之后可能是合适的。在这种情况下,在合并事件能够发生之前,线程组中的全部活动线程优选不得不到达合并点中的至少一个。

本发明还延伸至编译器本身。

因此,根据本发明的另一方面,提供有一种编译器,该编译器对程序进行编译以生成用于图形处理流水线的着色阶段的指令,该图形处理流水线执行指令以执行着色操作,并且其中,其中,执行线程能够一起被分组为线程组,在所述线程组中,分组的线程以一致步调、一次一个指令地来执行;

其中,所述编译器被配置为,针对要通过着色器阶段执行的着色器程序执行以下步骤:

确定在所述着色器程序的执行内是否存在如下的点,即,在该点处,能够将各自具有非活动线程的两个或更多个线程组进行合并;以及

当确定在所述着色器程序执行中存在能够将具有非活动线程的两个或更多个线程组进行合并的点时,在所述着色器程序中包括或者为所述着色器程序提供线程组合并事件指示,所述线程组合并事件指示表示所述着色器程序执行中能够将各自具有非活动线程的两个或更多个线程组进行合并的点。

因此,根据本发明的另一方面,提供有一种对程序进行编译以生成用于图形处理流水线的着色阶段的指令的方法,该图形处理流水线执行指令以执行着色操作,并且其中,执行线程能够一起被分组为线程组,在所述线程组中,分组的线程以一致步调、一次一个指令地来执行;

针对要通过着色器阶段执行的着色器程序,所述方法包括以下步骤:

确定在所述着色器程序的执行内是否存在如下的点,即,在该点处,能够将各自具有非活动线程的两个或更多个线程组进行合并;以及

当确定在所述着色器程序执行中存在能够将具有非活动线程的两个或更多个线程组进行合并的点时,在所述着色器程序中包括或者为所述着色器程序提供线程组合并事件指示,所述线程组合并事件指示表示所述着色器程序执行中能够将各自具有非活动线程的两个或更多个线程组进行合并的点。

本发明还延伸至能够响应于针对正在被着色阶段执行的着色器程序的线程组合并指示来将线程组进行合并的图形处理流水线的着色器阶段。

因此,根据本发明的另一方面,提供有一种图形处理流水线的着色器阶段,该着色器阶段执行指令以执行着色操作,并且其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行,所述着色器阶段被配置为:

当执行着色器程序的指令时,响应于指示所述着色器程序执行中的可以将与所述着色器程序相关联的两个或更多个线程组进行合并的点的线程组合并事件指示:

确定是否存在正在执行所述着色器程序的并且能够被合并为单个线程组的两个或更多个线程组;以及

当存在可以被合并为单个线程组的两个或更多个线程组时,将所述线程组合并为包含来自所述线程组中的每一个的活动线程的单个线程组;以及

在合并事件指示之后,针对经合并的线程组执行所述着色器程序中的进一步的指令。

根据本发明的另一方面,提供有一种操作图形处理流水线的着色器阶段的方法,该着色器阶段执行指令以执行着色器操作,并且其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行;

所述方法包括所述着色器阶段,当执行着色器程序的指令时,响应于指示所述着色器程序执行中的可以将与所述着色器程序相关联的两个或更多个线程组进行合并的点的线程组合并事件指示:

确定是否存在正在执行所述着色器程序的并且能够被合并为单个线程组的两个或更多个线程组;以及

当存在可以被合并为单个线程组的两个或更多个线程组时,将所述线程组合并为包含来自所述线程组中的每一个的活动线程的单个线程组;以及

在合并事件指示之后,针对经合并的线程组执行所述着色器程序中的进一步的指令。

如本领域技术人员所理解的,本发明的这些方面能够并且优选地确实包括本文酌情所公开的本发明的优选和可选特征的任何一个或多个或者全部。因此,例如,着色器程序优选是片段着色器程序,并且相应地,着色器阶段优选是(操作为)图形处理流水线的片段着色器阶段。

能够通过图形处理流水线和其元件以任何合适的且需要的方式来执行线程组中的并非全部线程都是活动的并且可以被合并为单个线程组的一组(多组)的两个或更多个线程组的识别。这例如可以取决于着色器程序和正在执行的着色器阶段。

在优选实施方式中,至少在着色器程序是匹片段着色器程序的情况下(并且因此可编程着色阶段用作片段着色阶段(片段着色器)),图形处理流水线的栅格化器识别线程组中的并非全部线程都是活动的、可以被合并为单个线程组的该一组或多组的两个或更多个线程组,例如并且优选地,当该栅格化器对基元进行栅格化以生成片段(例如采样位置的四元组(或其它分组))用于渲染时。

如上所述,图形处理流水线的栅格化器将对要针对所生成的渲染输出的采样位置进行渲染的基元进行测试,并且生成要针对被所述的基元覆盖的(或者包括被所述的基元覆盖的至少一个采样位置的)每个采样位置(或者相应组的采样位置(例如,采样位置的每个2x2四元组))进行渲染的片段。

然后,由栅格化器生成的用于对基元进行渲染的片段被发送到图形处理流水线的其余部分(包括片段着色阶段),用于处理。每个片段因此将对应于并且被用来对一组采样位置进行渲染(每组采样位置包括一个采样位置或多个采样位置,这取决于片段是否代表各个采样位置或者多组(例如四元组)的多个采样位置)。

然后,在片段着色阶段,每个片段(即,片段所代表的一组采样位置)将作为相应的线程组(warp)进行处理,该线程组中的并且针对该线程组的每个线程(并因此执行路径)对应于片段所代表的一组采样位置中的给定采样位置。针对片段的一组采样位置中的被覆盖的采样位置因此将是线程组的活动线程,并且未被覆盖的采样位置将是线程组(warp)的非活动(“辅助”)线程。

要(可能地)进行合并的一组线程组中的全部线程组应当,并且优选地确实应当运行(执行)同一着色器程序。只要满足这个要求,就不需要(可能地)要进行合并的一组线程组中的线程组以任何特殊方式另外进行关联。

然而,如有需要,可以设置其它要求。例如,要进行合并的线程组可能属于同一绘制调用(并且在优选实施方式中这是已经在做的)。类似地,要(可能地)进行合并的一组线程组中的线程组可能与同一图形基元相关。然而,这不是必需的,并且在优选实施方式中,要(可能地)进行合并的一组线程组中的线程组能够与不同基元相关。允许不同基元中的线程组进行合并能够是有利的,特别是在平均基元尺寸是一个采样位置四元组或更小的情况下是有利的。

被包括在要(可能地)进行合并的一组线程组中的线程组应当各具有至少一个非活动线程(例如,未被覆盖的采样点),但是如有需要另外也能够进行选择。

在一个优选实施方式中,可以被合并为单个线程组的该组(并且每组)的线程组仅包含两个线程组(即,可以被合并为单个线程组的成对的线程组被识别)。然而,如有需要,还将能够识别可以被合并为单个线程组的多组三个或更多个线程组(warp)。

要(可能地)进行合并的线程组应当,并且优选地确实应当在单个线程组能够包含的不超过最大数量的活动线程之间进行合计(然后这允许针对线程组的全部的活动线程被合并为单个线程组)。在优选实施方式中,将进行组合以提供“完全”合并的、单个线程组的线程组优选地被识别为合并候选。

在优选实施方式中,具有不重叠的活动线程(即,活动线程存在于不同的线程组(warp)路径中)的线程组被识别为能够被合并为单个线程组的线程组。

在一个优选实施方式中,仅具有不重叠的活动线程(即,活动线程存在于不同的线程组(warp)路径中)的线程组被识别为能够被合并为单个线程组的线程组。

然而,在特定优选实施方式的,能够(例如,并且优选地栅格化器能够)(例如,通过将线程组水平地或垂直地相对应的2x2四元组进行翻转)将线程的分配(例如,采样位置)重新映射到针对线程组的线程组路径,以便(尝试)将针对在其初始配置中具有重叠的活动线程(路径)的线程组的重叠去除,以允许这种线程组然后(可能地)进行合并。

因此,在特定优选实施方式中,例如栅格化器能够将例如线程组所代表的采样位置的分配重新映射到线程组执行(warp)路径,以便例如,并且优选地,能够将不同线程组之间的活动线程执行(warp)路径重叠去除。

在这种情况下,在优选实施方式中,针对被重新映射的线程组的重新映射(重新定位)以某种方式被跟踪或者被记录,以便允许(例如,片段)着色操作仍保证正确地计算在“重新映射的”线程组上执行的任何着色操作,并且允许针对重新映射的线程组的最终结果在需要时(例如,当它们被提交至输出时)“不被映射”。

在优选实施方式中,例如当生成片段用于通过栅格化器进行渲染时,和/或当基元正在被栅格化时,和/或当正在生成所述的渲染输出时,重复识别能够进行合并的多组线程组的过程。因此,优选地识别可以被合并为单个线程组的多对(或其它组)的线程组。最优选地,例如当栅格化器进行操作以对基元进行栅格化用于渲染时,该栅格化器进行操作以识别可以被合并为相应的单个线程组的多对(或其它组)的线程组。

能够被合并为相应的单个线程组的所识别的线程组优选地被指示为图形处理流水线的着色器阶段,使得该着色器阶段能够识别当线程组到达着色器程序执行中的线程组合并事件指示点时已经被识别(关联)为“合并”候选的线程组。这可以按照任何合适的且所需的方式来完成。例如,并且优选地,当栅格化器向片段着色器发出线程组时,该栅格化器能够向片段着色器阶段发出信号以通知那些线程组能够被合并在一起。

按照能够实现上述的一种方式,栅格化器保持局部线程组的(例如,小)队列作为其输出。当栅格化器生成新局部线程组时,该栅格化器然后将该新局部线程组对队列中的局部线程组进行匹配(将该新局部线程组与队列中的局部线程组进行比较),试图找到能够与其合并的更早的线程组。如果成功(即,如果在队列中找到合适的更早线程组),则能够将两个线程组一起向片段着色器发出。如果失败,则将该新局部线程组嵌入到队列中。有可能该队列变满,在这种情况下,未被合并的局部线程组能够被传递到片段着色器中。

本发明还延伸至识别可以被合并为单个线程组的线程组的图形处理流水线的栅格化器的操作。

因此,根据本发明的另一方面,提供有一种操作图形处理流水线的栅格化器的方法,所述栅格化器对图形基元进行栅格化以被渲染到图形片段中用于渲染,每个图形片段代表要生成的渲染输出的一组多个采样位置;

所述方法包括所述栅格化器:

识别针对包括未被基元覆盖的采样位置的该基元的片段并且确定这些片段中的任何片段是否能够被合并以形成代表所述片段的全部被覆盖的采样点的单个片段;以及

当确定包括未被覆盖的采样位置的两个或更多个片段能够被合并以形成代表所述片段的全部被覆盖的采样点的单个片段时,向所述图形处理流水线的片段着色阶段发信号,所述图形处理流水线是这样的图形处理流水线:包括未被覆盖的采样位置的两个或更多个片段能够被合并以形成代表所述片段的全部被覆盖的采样点的单个片段。

根据本发明的另一方面,提供有一种用于图形处理流水线的栅格化器,所述栅格化器对图形基元进行栅格化以被渲染到图形片段中用于渲染,每个图形片段代表要生成的渲染输出的一组多个采样位置;

其中,所述栅格化器被配置为:

识别针对包括未被基元覆盖的采样位置的该基元的片段并且确定这些片段中的任何片段是否能够被合并以形成代表所述片段的全部被覆盖的采样点的单个片段;以及

当确定包括未被覆盖的采样位置的两个或更多个片段能够被合并以形成代表所述片段的全部被覆盖的采样点的单个片段时,向所述图形处理流水线的片段着色阶段发信号,所述图形处理流水线是这样的图形处理流水线:包括未被覆盖的采样位置的两个或更多个片段能够被合并以形成代表所述片段的全部被覆盖的采样点的单个片段。

如本领域技术人员所理解的,本发明的这些方面能够并且优选地确实包括本文酌情所公开的本发明的优选和可选特征的任何一个或多个或者全部。

在优选实施方式中,已经被识别为能够被合并为单个线程组的一组(并且优选地每组)的线程组的线程组被连续地向着色阶段发出(但是这不是必需的并且其它安排将是可能的)。

类似地,在特定优选实施方式中,可能与彼此进行合并为单个线程组的任何线程组优选地向着色器阶段发出,用于按照适于并符合图形处理流水线中的线程组的处理的任何限制的方式来执行。因此,例如,在存在线程组可用的多个不同的寄存器和存储器组的情况下,可能与彼此进行合并的任何线程组优选地向着色器阶段发出,以用于按照线程组将共享同一存储器组和/或一组寄存器等的方式来执行。

申请人已经进一步意识到,并非要执行的全部线程组都将能够(可能地)与另一线程组或多个组进行合并(例如,因为线程组(例如,四元组)中的全部线程都是活动的或者不存在线程组能够与其进行合并的另一合适的线程组)。

因此,在优选实施方式中,如果要向着色器阶段发出的线程组被识别(例如,通过栅格化器)为无法(可能地)与另一线程组进行合并,则该线程组优选被指示为无法进行合并(作为单个线程组进行处理)。这种指示能够例如包括简单地省略掉线程组能够与另一线程组进行合并的任何指示。

一旦线程组已经向例如片段、着色阶段发出,该着色阶段就将执行针对所述线程组的着色器程序。然后,当可以被合并为单个线程组的所识别的线程组已经到达线程组合并事件指示时,这些线程组被合并为包含来自每个的线程组的活动线程的单个线程组。

这可以根据需要来实现,但是在优选实施方式中,当要进行合并的一组线程组中的第一线程组到达着色器程序执行中的线程组合并点(例如,到达线程组合并指令)时,针对该线程组的着色器程序执行被停止直至要与该线程组进行合并的其它线程组或多个组也已经到达着色器程序执行中的线程组合并点。然后,一旦要进行合并的全部(例如两个)线程组都已经到达着色器程序执行中的线程组合并点,线程组就被合并为包含来自每个的线程组的活动线程的单个线程组。

能够根据需要来执行将线程组合并为包含来自每个的线程组的活动线程的单个线程组。优选地来自每个warp组的活动线程被映射到经合并的单个线程组(warp)的相应线程组(warp)路径。在优选实施方式中,要进行合并的一组线程组中的其中一个线程组被保留作为包含来自每个的线程组的活动线程的单个线程组,然后终止要进行合并的一组线程组中的其它线程组或多个组。

在线程组合并事件之后,被合并的线程组作为(优选地)共享单个(活动)程序计数器的一个共享线程组(warp)前进。

在着色器程序的执行中,优选地尚未被终止的任何非活动线程在线程组被合并时被终止。(在优选实施方式中,一旦已经执行了线程组中的任何非活动“辅助”线程所要求的操作,则它们就被终止。)

一旦关联线程组已经被合并为单个线程组,就针对合并后的线程组执行着色器程序中的进一步指令。在优选实施方式中,在着色器程序中在合并事件指示点之后的其余指令的执行(合适地)针对合并后的线程组来完成。

如上所述,可以存在不能与其它线程组进行合并的线程组。在优选实施方式中,当这种“不可合并的”线程组到达着色器程序执行中的线程组合并事件指示点时,该线程组合并事件指示被忽略(不起作用),并且简单地继续执行针对线程组本身的着色器程序(即,着色器程序中的在合并事件指示点之后的指令针对线程组本身来执行)。换句话说,针对未被识别为能够与另一线程组进行合并的任何线程组,线程组合并事件指示优选将对针对线程组的着色器程序的执行不起作用。

通过针对线程组的着色阶段执行的着色器程序通常将执行从相应寄存器中读取并且向相应寄存器写入数据的一系列指令。在优选实施方式中,从中读取数据并向其写入数据的寄存器当执行针对线程组的着色器程序时以特定的方式进行布置,如下文中讨论的,这将有助于促进线程组合并操作。

因此,在特定优选实施方式中,被分配以被着色器程序使用的(当着色器程序正在被执行时)寄存器被分成两个子集,一组是在物理上由要被合并为单个线程组的一组线程组中的线程组共享的“公共”寄存器,优选地从针对线程组的着色器程序的执行开始,并且一组是对于该组中的每个线程组来说分别是本地的(且专属的)并且对于要进行合并的该组线程组中的其它线程组或多个组来说是不可访问的多组寄存器的“私人”寄存器(即,该组中的每个线程组将具有其自身的仅其自身能够访问的一组“私人”寄存器)。

将寄存器划分成“公共”子集和“私人”子集能够按照任何合适的且需要的方式来完成。在一个优选实施方式中,寄存器指数截止被用来按照这种方式对寄存器进行划分,在该截止之下的全部寄存器是“公共”寄存器,并且在该截止之上的全部寄存器是“私人”寄存器(反之亦然)。寄存器指数截止可以例如,并且优选地,由编译器来指定。如有需要,用于将寄存器划分成“公共”子集和“私人”子集的其它布置还可以或者替代地被使用,诸如具有寄存器的硬编码划分,或者指示哪些寄存器进入哪个子集的位图。

然后,针对线程组的公共寄存器和私人寄存器优选地按照如下的方式来使用和处理。

首先,在着色器程序执行中在线程组合并点之前,线程组优选地能够自由地从针对该线程组的私人寄存器读取和向针对该线程组的私人寄存器写入该组的全部线程(路径)(即,针对“真实的”(活动)线程和“辅助”(非活动)线程)。

相应地,在着色器程序执行中在线程组合并点之前,线程组能够优选地仅向针对用于活动线程的该组线程组(针对包含“真实的”(活动)线程的路径)的“公共”寄存器进行写入。

类似地,在着色器程序执行中在线程组合并点之前,通过线程组来对公共寄存器进行读取优选地受到限制。例如,线程组优选地根本无法读取公共寄存器,或者仅能读取针对包含“真实的”线程的这些路径(针对线程组的活动线程)的公共寄存器,和/或线程组仅读取包含“真实的”(活动)线程中的实际值,包含“辅助”(非活动)线程的路径接收默认值(例如,全部为零)。

这有助于防止在线程组合并事件之前在线程组之间的通信。

在线程组已经被合并之后(已经执行了合并事件),在特定优选实施方式中,针对曾被合并的线程组的“私人”寄存器的内容是无效的(并且因此仅针对曾被合并的线程组的公共寄存器被认为具有有效值)。

对私人寄存器空间的访问能够相应地针对合并后的单个线程组完全被阻断。然而,在优选实施方式中,针对合并后的单个线程组来分配新的一组私人寄存器。这可以根据需要例如通过如下方式来完成:将其中一个线程组的私人寄存器映射到单个、合并后的线程组的寄存器空间中,或者在合并事件之后将新的一组私人寄存器映射到针对合并后的线程组的寄存器空间中,或者将两个线程组的私人寄存器进行组合以给出更大的针对合并后的、单个线程组的私人寄存器空间。

在着色器程序包括多个线程组合并事件点的情况下,被合并的私人寄存器可以,并且优选地确实仅在最后一个合并点之后变得可用。

对应于针对线程组的公共寄存器和私人寄存器的上述布置,在特定优选实施方式中,在着色器程序执行中在合并事件点之前执行要求使用非活动(“辅助”)线程的任何指令,并且优选地使用针对所讨论的线程组的私人寄存器。

因此,执行交叉采样点计算(诸如像素增量、mipmap纹理查找)的任何指令优选在线程组合并事件点之前出现并且使用私人寄存器作为其输入,和/或结果可能是输入到交叉采样点计算中的输入的任何指令优选地在合并事件点之前出现并且将其结果写入私人寄存器。

相应地,在优选实施方式中,需要跨越线程组合并事件而保存的来自合并事件点之前的任何数据项(即,在合并事件之后要针对合并后的、单个线程组可用)(在合并事件之前)被存储在公共寄存器中。

这意味着可以安全地假设的是,在线程组合并事件之后,不再需要线程组的私人寄存器的内容,使得这些私人寄存器然后能够被无效掉和/或作为针对合并后的线程组的私人寄存器来重新使用。

着色器程序操作(代码)优选地通过对着色器程序代码进行编译的编译器来优选地进行组织(构造),以实现该目的。

针对在着色器程序的执行期间要(可能地)进行合并的线程组的寄存器的上述细分和处理有利于被执行的线程组的合并,无需实际上在物理上移动寄存器之间的任何数据用于合并操作。

在需要使线程组的部分寄存器溢出以进行堆积的情况下(这可以例如当利用非常大的数据工作集来运行片段着色器时发生),能够按照上述针对寄存器所讨论的方式再次使用两个堆栈,一个“私人”、一个“公共”。然而,这不是必需的,并且在又一优选实施方式中,在这种情况下使用单个堆栈,但是该单个堆栈在合并事件处被无效掉。为了便于这种操作,着色器程序优选地被配置为(例如,通过编译器)使得堆栈在合并事件的时候为空。(如果这在将作为线程组合并事件点有用的着色器程序中的任何一个点处都无法得到保证,则优选地生成不具有任何线程组合并事件点的着色器程序。)

上文描述了在着色器程序操作期间将多个线程组合并为单个线程组的操作。申请人已经意识到,逆向操作(即,使单个线程组“分离”成多个线程组)也能够是有用的。

例如,存在诸如样本频率着色的这样的一些图形处理操作,其中,多个(例如,四个)采样点针对要生成的渲染输出内部的每个采样位置进行处理。在这种情况下,针对给定采样位置的每组采样点能够作为一个线程组(warp)进行处理(即,使得将存在针对要进行处理的渲染输出的每个采样位置的一个线程组)。然而,申请人已经意识到,在这些操作中,以及存在需要进行的每采样点计算中,能够存在需要针对给定采样位置的每个采样点而等同地进行的一些计算,并且事实上能够根据采样位置来进行。这些每采样位置计算将不需要针对每个采样位置的完整的线程组,而单个线程组(路径)能够执行针对给定采样位置的计算。

在这种情况下,申请人已经意识到,例如单个线程组(warp)能够被用来执行针对一组多个采样位置的每采样位置计算,多个各线程组然后被用来执行针对采样位置的每采样点计算。因此,如果片段着色器程序例如被配置为或者能够被配置为使得首先执行每采样位置操作,则对于针对给定的一组采样位置的片段着色器执行来说,在正在执行每采样位置计算的同时,利用单个线程组开始将是可能的,然后该线程组被分割(“分离”)成多个线程组以执行每采样点操作(计算)。

因此,根据本发明的另一方面,提供有一种操作图形处理流水线的方法,该图形处理流水线包括执行指令以进行着色操作的可编程着色阶段,其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行,所述方法包括以下步骤:

连同线程组划分事件指示一起向着色器阶段发出用于通过所述着色器阶段执行以对执行线程进行处理用于生成渲染输出的着色器程序,所述线程组划分事件指示表示在所述着色器程序执行中单个线程组要被划分成多个单独的线程组的点;以及

所述着色阶段:

执行针对线程组的所述着色器程序,所述执行针对线程组的所述着色器程序包括以下步骤:

当所述线程组到达所述线程组划分事件指示时,将所述单个线程组划分成多个单独的线程组;以及

在划分事件指示点之后,针对所述多个单独的线程组执行所述着色器程序中的进一步的指令。

根据本发明的另一方面,提供有一种数据处理系统,该数据处理系统包括:

图形处理流水线,该图形处理流水线包括执行指令以进行着色操作的可编程着色阶段,其中,执行线程能够一起被分组为线程组,在所述线程组中,分组的线程以一致步调、一次一个指令地来执行;以及

编译器,该编译器对针对所述着色阶段的程序进行编译以生成用于通过所述着色阶段执行的指令;

其中,所述编译器被配置为:

连同线程组划分事件指示一起向着色器阶段发出用于通过所述着色器阶段执行以对执行线程进行处理用于生成渲染输出的着色器程序,所述线程组划分事件指示表示在所述着色器程序执行中线程组要被划分成多个单独的线程组的点;以及

所述着色阶段被配置为:

执行针对线程组的所述着色器程序,所述执行针对线程组的所述着色器程序包括以下步骤:

当线程组到达所述线程组划分事件指示时,将所述单个线程组划分成多个单独的线程组;以及

在划分事件指示点之后,针对所述多个单独的线程组执行所述着色器程序中的进一步的指令。

在本发明的这些方面中,在着色器程序执行中的某个点之后,正在进行处理的线程组被划分成多个单独的线程组。然后这允许例如需要针对采样位置的每个采样点而等同地进行的每采样位置计算作为单个线程组进行处理,然后一旦所述单个线程组已经被划分成多个单独的线程组,就执行所述每采样点计算。这避免了例如消耗实际上并不需要的用于针对采样点的计算的处理资源(诸如执行周期)的需要。

如本领域技术人员所理解的,本发明的这些方面能够并且优选地确实包括本文酌情所公开的本发明的优选和可选特征的任何一个或多个或者全部。

因此,例如,着色器程序优选是片段着色器程序,并且相应地,着色器阶段优选是(操作为)图形处理流水线的片段着色器阶段。

因此,例如线程组能够是任何合适的其需要的尺寸。在优选实施方式中,每个初始的单个线程组包含四个线程(即,存在为四的warp宽度)。在划分事件之后的线程组优选包含与初始的单个线程组相同数量的线程(所以例如是4个线程)。

类似地,包括在着色器程序中的线程组划分事件指示优选地按照上述的其中一种方式来提供(因此作为着色器程序中的指令或者其一部分,借助于着色器程序中的指令的修改程序或者对该指令的修改程序,或者通过能够指示着色器程序中的线程组划分事件点(诸如与着色器程序代码本身分离地指定的分界点)的某种其它方式)。

线程组划分事件指示再次优选地由用于图形处理流水线的编译器(着色器编译器)来提供。

在特定优选实施方式中,编译器例如通过对要求图形处理的主处理器的应用来对所提供的着色器程序代码进行分析,确定线程组划分事件在着色器程序执行中的某个点处是否可能,并且如果可能的话,则在着色器程序中的合适的点处并且针对该点提供线程组划分事件指示(例如,通过在该点处将特定指令嵌入到着色器程序中,或者以其它方式),以指示线程组划分事件点。

在特定优选实施方式中,编译器还可以操作(在这种情况下是可能的)以对着色器程序中的操作进行重新排序,以便例如提供在着色器程序执行中包括线程组划分事件的机会,和/或以便允许在着色器程序的执行中更加有效地包括并使用线程组划分事件。

在这方面,编译器优选地进行操作以将执行每采样位置计算的任何着色器程序操作布置在线程组划分事件指示点之前。相应地,编译器优选将执行根据采样点计算的任何着色器程序操作布置在着色器程序执行中的线程组划分事件点之后。

本发明的这些方面再次延伸至编译器操作本身。

因此,根据本发明的另一方面,提供有一种编译器,该编译器对程序进行编译以生成用于图形处理流水线的着色阶段的指令,该图形处理流水线执行指令以执行着色操作,并且其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行;

其中,所述编译器被配置为,针对要通过着色器阶段执行的着色器程序:

确定所述着色器程序是否包括必须针对要执行的线程来单独执行的操作和能够针对要执行的多组线程来共同执行的操作;以及

当确定所述着色器程序包括必须针对要执行的线程来单独执行的操作和能够针对要执行的多组线程来共同执行的操作时,在所述着色器程序中包括或者为所述着色器程序提供指示在所述着色器程序执行中线程组应当被划分成多个单独的线程组的点的线程组划分事件指示,所述线程组划分点在所述着色器程序中在能够针对要执行的多组线程来共同执行的操作之后,并且在所述着色器程序中在必须针对要执行的线程来单独执行的操作中的一个或更多个(并且优选地全部)操作之前。

因此,根据本发明的另一方面,提供有一种对程序进行编译以生成用于图形处理流水线的着色阶段的指令的方法,该图形处理流水线执行指令以执行着色操作,并且其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行;

针对要通过着色器阶段执行的着色器程序,所述方法包括以下步骤:

确定所述着色器程序是否包括必须针对要执行的线程来单独执行的操作和能够针对要执行的多组线程来共同执行的操作;以及

当确定所述着色器程序包括必须针对要执行的线程来单独执行的操作和能够针对要执行的多组线程来共同执行的操作时,在所述着色器程序中包括或者为所述着色器程序提供指示在所述着色器程序执行中线程组应当被划分成多个单独的线程组的点的线程组划分事件指示,所述线程组划分点在所述着色器程序中在能够针对要执行的多组线程来共同执行的操作之后,并且在所述着色器程序中在必须针对要执行的线程来单独执行的操作中的一个或更多个(并且优选地全部)操作之前。

本发明的这些方面相应地还延伸至能够响应于针对正在被着色器阶段执行的着色器程序的线程组划分指示来划分线程组的图形处理流水线的着色器阶段。

因此,根据本发明的另一方面,提供有一种图形处理流水线的着色器阶段,该着色器阶段执行指令以执行着色操作,并且其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行,所述着色阶段被配置为:

当执行着色器程序的指令时,响应于指示所述着色器程序执行中的如下的点的线程组划分事件指示,即,在该点处,线程组应当被划分成与所述着色器程序相关联的多个单独的线程组:

将线程组划分成多个单独的线程组;以及

在划分事件指示之后,针对所述多个单独的线程组执行所述着色器程序中的进一步的指令。

根据本发明的另一方面,提供有一种操作图形处理流水线的着色器阶段的方法,该着色器阶段执行指令以执行着色操作,并且其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行;

所述方法包括所述着色器阶段,当执行着色器程序的指令时,响应于指示所述着色器程序执行中的如下的点的线程组划分事件指示,即,在该点处,线程组应当被划分成与所述着色器程序相关联的多个单独的线程组:

将线程组划分成多个单独的线程组;以及

在划分事件指示之后,针对所述多个单独的线程组执行所述着色器程序中的进一步的指令。

如本领域技术人员所理解的,本发明的这些方面能够并且优选地确实包括本文酌情所公开的本发明的优选和可选特征的任何一个或多个或者全部。因此,例如,着色器程序优选是片段着色器程序,并且相应地,着色器阶段优选是(操作为)图形处理流水线的片段着色器阶段。

在本发明的这些方面和实施方式中,一旦线程组已经被向着色阶段发出,该着色阶段就将执行针对所述线程组的着色器程序。然后,当(优选地当每个)线程组到达线程组划分事件指示时,线程组被划分成多个单独的线程组。如有需要,能够在着色器程序中包括超过一个的线程组划分事件点(和指示)。在这种情况下,所划分的线程组当其到达着色器程序执行中的后面的划分点时可以再次被划分。

能够根据需要选择初始的单个线程组被划分成的线程组的数量,并且可以,例如并且优选地,取决于着色器所支持的线程组的大小和要针对每个采样位置考虑的采样点的数量。

因此,例如并且优选地,初始的单个线程组能够被划分成多个单独的线程组,每个线程组代表来自初始的单个线程组的其中一个线程(路径)。这可以在例如每个采样位置具有与着色器程序中的线程组能够包含的线程的数量相对应的与该采样位置相关联的多个采样点的情况下是合适的。在这种情况下,(优选地每个)初始的线程组将被划分成和初始的线程组中的线程一样多的单独的线程组。

另选地或者另外,能够使用同一线程组对来自不同采样位置的采样点进行处理。例如,针对初始的单个线程组所代表的采样位置中的每一个采样位置的相应的采样点位置的采样点能够在所述初始的单个线程组已经被划分之后作为相应的线程组来进行处理。在这种情况下,初始的线程组将被划分成多个单独的线程组,每个线程组代表(例如并且优选地)来自针对来自初始的单个线程组的线程(路径)中的每一个线程(路径)的各个采样点位置中的一个采样点位置的采样点。因此,在这种情况下,(优选地每个)初始的线程组将被(并且优选地被)划分成与根据要进行处理的采样位置的采样点一样多的单独的线程组。

在线程组划分事件之后,针对经划分后的线程组(多个单独的线程组)来执行着色器程序中的进一步指令。在优选实施方式中,在着色器程序中在划分事件指示点之后的其余指令的执行(合适地)针对多个单独的线程组来完成。

在本发明的这些方面和实施方式的优选实施方式中,从中读取数据并向其写入数据的寄存器当执行针对线程组的着色器程序时以特定的方式进行布置,因为这将再次有助于促进线程组划分操作。

因此,在特定优选实施方式中,在着色器程序的执行期间使用的寄存器再次被划分成两个子集,一组是优选从着色器程序的执行开始在物理上由初始的单个线程组和在要从该单个线程组中划分出的一组线程组中的线程组共享的“公共”寄存器,并且一组是对于每个线程组来说跟别是本地的(且专属的)并且对于其它线程组或多个组来说是不可访问的多组寄存器的“私人”寄存器(即,每个线程组(初始的单个线程组和该单个线程组划分成的一组线程组中的线程组)将具有仅其自身能够访问的其自身的一组“私人”寄存器)。

在这些布置中,在着色器程序执行中在线程组划分点之前,初始的“单个”线程组优选将针对(多个)线程组的公共寄存器用于其计算(并且因此能够优选自由地从针对该(多个)线程组的公共寄存器读取并且向针对该(多个)线程组的公共寄存器写入该组的全部线程(路径))。

因此,在初始的单个线程组已经被划分之后(划分事件已经执行),针对曾被划分的公共寄存器优选作为(多个)只读寄存器来进行处理(以便保存每采样位置值),并且在线程组划分事件之后执行的计算优选地(并且优选地仅)使用针对所讨论的线程组的私人寄存器。

着色器程序操作(代码)优选地通过对着色器程序代码进行编译的编译器来优选地进行组织(构造),以实现该目的。相应地,能够在开始着色器程序执行之前针对线程组保留合适的私人寄存器和公共寄存器。

针对在着色器程序的执行期间要进行划分的线程组的寄存器的上述细分和处理有利于被执行的线程组的划分,而无需实际上物理地在寄存器之间移动任何数据用于划分操作。

如有需要,将有可能在给定的着色器程序中包括线程组合并事件机会和线程组划分事件两者。然而,申请人相信在大多数情况下,在给定的着色器程序中包括这些事件中的一个或另一个,而不是两者,将是合适的。

从上述内容中将理解,在本发明的线程组合并操作和线程组划分操作两者中,一个重要的特征是线程和线程组使用的寄存器被设置成“私人”寄存器和“公共”寄存器。可以相信的是,当正在执行着色器程序时被线程组使用的寄存器的这种设置在其自身而言是新颖且有利的。

因此,根据本发明的又一方面,提供有一种分配寄存器的方法,所述寄存器供线程组在执行指令以进行图形处理流水线中的处理操作时使用,该图形处理流水线包括执行指令以进行着色操作的可编程着色阶段,并且其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行,所述方法包括以下步骤:

针对在着色器程序的执行期间要由所述图形处理流水线的可编程着色阶段来执行所述着色器程序的线程组,提供以下组件以供使用:

要与要执行所述着色器程序的其它线程组共享的公共寄存器或多个公共寄存器;以及

对所述线程组来说是本地的(专属的)并且对要执行所述着色器程序的其它线程组来说不可访问的私人寄存器或多个私人寄存器。

根据本发明的又一方面,提供有一种图形处理流水线,所述图形处理流水线包括:

一个或更多个可编程着色阶段,所述一个或更多个可编程着色阶段执行指令以进行着色操作,其中,执行线程可以一起被分组为线程组,在线程组中,分组的线程以一致步调、一次一个指令地来执行;以及

多个寄存器,所述多个寄存器供线程组在执行指令以进行处理操作时使用;其中:

在使用中设置所述多个寄存器,以便针对在着色器程序的执行期间要由所述图形处理流水线的可编程着色阶段来执行所述着色器程序的线程组,提供以下组件以供使用:

要与要执行所述着色器程序的其它线程组共享的公共寄存器或多个公共寄存器;以及

对所述线程组来说是本地的(专属的)并且对要执行所述着色器程序的其它线程组来说不可访问的私人寄存器或多个私人寄存器。

如本领域技术人员所理解的,本发明的这些方面能够并且优选地确实包括本文酌情所公开的本发明的优选和可选特征的任何一个或多个或者全部。

因此,例如,将寄存器细分成公共寄存器和私人寄存器优选地按照上述的其中一种方式来执行。

相应地,着色器程序执行优选将针对线程组的公共寄存器或多个公共寄存器用于特定(优选所选择的)操作,并且优选将针对线程组的私人寄存器或多个私人寄存器用于其它(优选所选择的)操作。

类似地,在特定优选实施方式中,将公共寄存器和私人寄存器用于线程组的着色器程序操作优选地基于已经到达的着色器程序内的点而发生变化和/或进行选择。

图形处理流水线的片段着色器能够根据需要并且以任何合适的方式来实现,并且能够视情况而定来执行任何需要的且合适的片段着色功能。其可以例如对基元或多个基元进行渲染以生成一组渲染输出值,例如表示用于显示的帧。这些输出值然后可以被导出到外部存储器用于存储和使用,诸如被导出到显示器的帧缓存。

如有需要且根据需要,和片段着色器一样,图形处理流水线的(多个)可编程处理阶段可以用作(操作为)(图形处理流水线可以包括)其它着色器阶段(着色器),诸如顶点着色器、几何着色器等。

图形处理流水线的每个可编程处理阶段(执行单元)可以包括任何合适的可编程硬件元件,诸如可编程处理电路。每个可编程处理阶段可以作为单独的电路元件被提供到处理流水线的其它可编程阶段,或者可编程处理阶段可以共享其部分或全部的可编程处理电路(然后不同地进行编程以用作所需的可编程处理阶段)。

和任何可编程处理(着色)阶段一样,图形处理流水线还可以包含任何其它的合适且需要的处理阶段,在这些处理阶段中,图形处理流水线可以包含诸如栅格化器、早期深度(或者早期深度和模板)测试仪、后期深度(或深度和模板)测试仪、混合器、块元缓存、写出单元等。

本发明能够被用于图形处理流水线可以被用来生成的全部形式的输出,例如用于显示的帧、渲染到纹理输出等。来自图形处理的输出(例如,片段着色的数据值)优选被导出到外部(例如,主)存储器用于存储和使用,诸如被导出到显示器的帧缓存。

在一些实施方式中,所述图形处理流水线包括和/或与存储本文描述的所述数据和/或存储用于执行本文描述的过程的一个或更多个存储器和/或存储设备进行通信。图形处理流水线还可以与主微处理器进行通信,和/或利用显示器用于基于由图形处理器生成的数据来显示图像。

本发明适用于任何合适的形式或配置的图形处理器。其特别适用于基于块元的图形处理器和图形处理系统。因此在优选实施方式中,图形处理系统和图形处理流水线分别是基于块元的系统和流水线。

在特别优选的实施方式中,本发明的各种功能在生成并输出例如被写出到用于显示设备的帧缓存的经渲染的片段数据的单个图形处理平台上执行。

本发明能够在任何合适的系统,例如合适配置的基于微处理器的系统中实现。在优选实施方式中,本发明在计算机和/或基于微处理器的系统中实现。

本发明的各种功能能够以任何合适且期望的方式来执行。例如,如所期望的,本发明的功能能够在硬件或软件中实现。因此,例如,除非另有说明,本发明的各种功能元件、阶段和“手段”可以包括能够被操作为执行各种功能等的合适的处理器或多个处理器、控制器或多个控制器、功能单元、电路、处理逻辑器、微处理器装置等,例如能够被编程为以期望的方式运行的适当专用的硬件元件和/或可编程硬件元件。

这里应当注意的是,如本领域技术人员将要理解的,本发明的各种功能等可以在给定的处理器上重复和/或执行。同样地,如果需要的话,各种处理阶段可以共享处理电路等。

关于执行上述的特定功能所需的任何硬件,数据处理系统和流水线另外能够包括数据处理流水线所包括的通常的功能单元中的任何一个或更多个或者全部等。

本领域技术人员还将理解,视情况而定,本发明的全部所述的方面和实施方式都能够并且优选地确实包括本文所述的优选的和可选的特征中的任何一个或多个或者全部。

根据本发明的方法可以至少部分地利用软件,例如计算机程序,来实现。因此可见,当从其他方面来看时,本发明提供:计算机软件,当安装在数据处理装置上时,该计算机软件具体适用于执行本文所述的方法的;计算机程序元件,其包括当该程序元件在数据处理装置上运行时用于执行本文所述的方法的计算机软件代码部分;以及计算机程序,当该程序在数据处理系统上运行时,该计算机程序包括适用于执行本文所述的方法或多种方法的全部步骤的代码装置。数据处理器可以是微处理器系统、可编程FPGA(现场可编程门阵列)等。

本发明还延伸至包括如下软件的计算机软件载体,即,当该软件被用来操作图形处理器时,包括数据处理装置的渲染器或微处理器系统促进与所述数据处理装置和所述处理器、渲染器或系统的连接,以执行本发明的方法的步骤。这种计算机软件载体可以是诸如ROM芯片、CD ROM、RAM、闪速存储器或磁盘的物理存储介质,或者可以是诸如通过电线的电子信号、光学信号或例如对卫星等的无线电信号这样的信号。

将要进一步理解的是,并非本发明的方法的全部步骤都需要由计算机软件来执行,因此从更宽泛的方面来看,本发明提供用于执行本文所列出的方法的步骤中的至少一个的计算机软件和安装在计算机软件载体上的这种软件。

因此本发明可以被合适地体现为计算机程序产品,与计算机系统一起使用。这种实施可以包括要么是固定在有形非瞬时性介质上的一系列计算机可读指令,该有形非瞬时性介质例如有计算机可读介质,例如磁盘、CD-ROM、ROM、RAM、闪速存储器或硬盘。这种实施还可以包括通过有形介质或者无形地利用无线技术经由调制解调器或其它接口装置可以向计算机系统传输的一系统计算机可读指令,该有形介质包括但不限制于光学或模拟通信线路,该无线技术包括但不限制于微波、红外或其它传输技术。一系列的计算机可读指令体现本文之前所述的全部或部分的功能。

本领域技术人员将理解,这种计算机可读指令能够以许多编程语言的形式来编写,与很多计算机架构或操作系统一起使用。进一步地,这种指令可以利用当前或未来的包括但不限制于半导体、磁性的或光学的任何存储技术来存储,或者可以利用当前或未来包括但不限制于光学、红外或微波的任何通信技术来进行发送。可以想到,这种计算机程序产品可以利用另外的印刷或电子文档,例如利用计算机系统在例如系统ROM或固定磁盘上预加载的压缩打包软件,作为可去除介质进行分发,或者通过网络例如因特网或万维网从服务器或电子公告板进行分发。

附图说明

将通过仅示例的方式并参照附图描述本发明的多个优选实施方式,在附图中:

图1示意性地示出与采样点的网格重叠的基元;

图2示出示例性计算机图形处理系统;

图3示意性地示出能够按照本发明的方式进行操作的图形处理流水线;

图4示意性地示出对着色器程序进行编译以用于通过图形处理流水线来执行;

图5示意性地示出本发明的第一实施方式;

图6A和图6B示意性地示出在本发明的第一实施方式中寄存器的使用;

图7示意性地示出在本发明的第一实施方式中编译器的操作;

图8示意性地示出本发明的第二实施方式;

图9A和图9B示意性地示出在本发明的第二实施方式中寄存器的使用;

图10示意性地示出在本发明的第二实施方式中编译器的操作。

具体实施方式

相同的参考标记在附图中合适的地方被用于相同的部件。

下面将在用于显示的计算机图形的处理的上下文中来描述本发明的多个优选实施方式。

图2示出典型的计算机图形处理系统。

应用2(诸如在主处理器1上执行的游戏)将要求图形处理操作由关联图形处理单元(图形处理流水线)3来执行。为此,该应用将生成被用于图形处理流水线3的正在主处理器1上运行的驱动器4解读的API(应用编程接口)调用,以对图形处理器3生成合适的命令以生成应用2所需的图形输出。为了促进这一过程,将响应于来自在主系统1上运行的应用2的命令向图形处理器3提供一组“命令”,用于图形输出(例如,以生成要进行显示的帧)。

图3更加详细地示出该实施方式的图形处理流水线3。

图3中所示的图形处理流水线3是基于块元的渲染器,并且如本领域中已知的,将因此产生渲染输出数据阵列的块元,诸如要生成的输出帧。

(在基于块元的渲染中,渲染输出(例如要显示的帧)被划分成多个更小的子区域,通常被称为“块元”,而不是整个渲染输出(例如,如在即时模式渲染中一气呵成地有效地进行处理的帧)。每个块元(子区域)被分别(通常一个接着一个地)渲染,然后经渲染的块元(子区域)被重新组合以提供完整的渲染输出,例如用于显示的帧。在这种设置中,渲染输出通常被划分成规则大小和形状的子区域(块元)(其例如通常是正方形或长方形),但是这不是最重要的。)

如本领域中已知的,渲染输出数据阵列通常可以是用于在诸如屏幕或打印机的显示设备上显示的输出帧,但是例如还可以包括用于在后面的渲染中使用的中间数据(还被已知为“渲染到纹理(render to texture)”输出)等。

(当要显示计算机图形图像时,其通常首先被限定为一系列基元(多边形),然后所述基元被划分(被栅格化)成图形片段,接下来用于图形渲染。在正常的图形渲染操作中,渲染器将修改与每个片段相关联的(例如)颜色(红色、绿色和蓝色,RGB)和透明度(阿尔法,α)数据,使得能够正确地显示片段。一旦片段已经完全遍历了渲染器,则其关联数据值就被存储在存储器中,准备用于输出例如用于显示。)

图3示出与本实施方式的操作相关的图形处理流水线3的主要元件和流水线阶段。如本领域技术人员将要理解的,可以存在未在图3中例示的图形处理流水线的其它元件。这里还应当注意,图3仅仅是示意性的,并且例如实际上所述的功能单元和流水线阶段可以共享重要的硬件电路,即使在图3中它们被示意性地示出为单独的阶段。还将理解,如图3中所示的图形处理流水线的阶段、元件和单元等中的每个阶段、元件和单元可以根据需要来实现,并且因此将包括例如合适的电路和/或处理逻辑等,用于执行必要的操作和功能。

如图3中所示,图形处理流水线3包括多个阶段,该多个阶段包括顶点着色器20、外壳着色器21、曲面细分器22、域着色器23、几何着色器24、栅格化阶段25、早期Z(深度)和模板测试阶段26、以片段着色阶段的形式的渲染器27、后期Z(深度)和模板测试阶段28、混合阶段29、块元缓存30以及降采样和写出(多重采样分辨)阶段31。

顶点着色器20采用针对要生成的输出而限定的与顶点相关联的输入数据值等,并且对这些数据值进行处理以生成一组相应的“顶点着色的”输出数据值,以供图形处理流水线3的后续阶段使用。顶点着色例如对输入数据进行修改,以将要进行渲染的图像的照明效果考虑在内。

外壳着色器21执行对多组补丁控制点的操作并且生成已知为补丁常数的附加数据,曲面细分阶段22将几何图形细分以创建外壳的更高阶的表示,域着色器23执行对通过曲面细分阶段输出的顶点的操作(与顶点着色器相似),并且几何着色器24处理诸如三角形、点或线的全部基元。响应于向图形处理流水线3提供的命令和顶点数据,这些阶段和顶点着色器21一起有效地执行全部的必要片段前端操作,诸如转换操作和照明操作,并且执行基元设置来设置要进行渲染的基元。

图形处理流水线3的栅格化阶段25进行操作以将组成渲染输出(例如要进行显示的图像)的基元栅格化成各个图形片段以用于处理。为此,栅格化器25接收图形基元以用于渲染,将基元栅格化成采样点并且生成具有合适位置(代表合适的采样位置)的图形片段,用于对基元进行渲染。

由栅格化器生成的片段然后进一步被发送到流水线的其余部分用于处理。

早期Z/模板测试阶段26对其从栅格化器25接收的片段执行Z(深度)测试,以看看在这个阶段是否能够丢弃(剔除)任何片段。为此,早期Z/模板测试阶段26将从栅格化器25发出的片段的(与片段相关联的)深度值与已经进行渲染的片段的深度值进行比较(这些深度值被存储在作为块元缓存30的一部分的深度(Z)缓存中),以确定新片段是否将被已经进行渲染的片段排除在外。同时,执行早期模板测试。

经过片段早期Z和模板测试阶段26的片段然后被发送到片段着色阶段27。片段着色阶段27对经过早期Z和模板测试的片段执行合适的片段处理操作,以便处理片段以生成合适的经渲染的片段数据。

该片段处理可以包括任何合适的且需要的片段着色处理,诸如对片段执行片段着色器程序、向片段施加纹理、向片段施加雾化操作或其它操作等,以生成合适的片段数据。在该实施方式中,片段着色阶段27是着色器流水线的形式(可编程片段着色器)。

然后还存在“后期”片段Z和模板测试阶段28,其尤其是对经着色的片段执行流水线末端深度测试,以确定在最终的图像中实际上是否能看到经渲染的片段。该深度测试使用针对存储在块元缓存30中的Z缓存中的片段的位置的Z缓存值,以如本领域中已知的,通过将从片段着色阶段27发出的片段的(与片段相关联的)深度值与已经进行渲染的片段的深度值(如存储在深度缓存中的)进行比较,确定针对新片段的片段数据是否应当替换已经进行渲染的片段的片段数据。该后期片段深度和模板测试阶段28还对片段执行任何必要的“后期”阿尔法和/或模板测试。

如有需要,经过后期片段测试阶段28的片段然后利用已经被存储在混合器29中的块元缓存30中的片段来进行任何必要的混合操作。对片段来说必要的任何其它剩余操作,诸如抖动等(未示出),也在这个阶段执行。

最后,(经混合的)输出片段数据(值)被写入到块元缓存30,这些输出片段数据(值)能够从该块元缓存30例如被输出到帧缓存用于显示。针对输出片段的深度值也被恰当地写入块元缓存30内部的Z缓存。(块元缓存存储颜色缓存和深度缓存,所述颜色缓存和深度缓存针对这些缓存所代表的每个采样点(实质上针对正在进行处理的块元的每个采样点)分别存储合适的颜色等或者Z值。这些缓存存储代表整体渲染输出(例如,要显示的图像)的一部分(块元)的片段数据的阵列,缓存中的相应组的样本值对应于整体渲染输出的相应的像素(例如,每个2x2组的样本值可以对应于输出像素,其中4x多重采样正在被使用)。

提供块元缓存作为被定位在图形处理流水线(芯片)上(对图形处理流水线来说是本地的)的RAM的一部分。

来自块元缓存30的数据被输入到降采样(多重采样分辨)写出单元31,并且从其输出(写回)到外部存储器输出缓存,诸如显示设备的帧缓存(未示出)。(显示设备能够包括例如包括像素的阵列的显示器,诸如计算机监控器或打印机。)

降采样和写出单元31将存储在块元缓存30中的片段数据降采样成针对输出缓存(设备)的合适的分辨率(即,使得生成与输出设备的像素相对应的像素数据的阵列),以生成输出值(像素)用于输出到输出缓存。

一旦渲染输出的块元已经进行处理并且其数据被导出到主存储器(例如,被导出到主存储器中的帧缓存(未示出))用于存储,则下一个块元接着进行处理,诸如此类,直至足够的块元已经进行处理以生成全部渲染输出(例如,要显示的帧(图像))。然后重复该处理用于下一渲染输出(例如帧)等。

针对图形处理流水线3的其它布置也将当然是可能的。

上文描述了图2中所示的图形处理系统的操作的某些特征。下面将描述根据本发明的实施方式的图2中所示的图形处理系统的操作的其它特征。

如从图3中可以看出的,图形处理流水线3包括多个可编程处理或“着色器”阶段,即顶点着色器20、外壳着色器21、域着色器23、几何着色器24和片段着色器27。这些可编程着色器阶段执行相应的着色器程序,所述着色器程序具有一个或更多个输入变量、生成多组输出变量并且通过应用来提供。

为此,应用2提供使用诸如GLSL、HLSL、OpenCL等的高级着色器可编程语言来实现的着色器程序。然后,这些着色器程序通过着色器语言编译器被转化成二进制代码,用于目标图形处理流水线3。如本领域中已知的,这可以包括创建编译器内部的程序的一个或更多个中间表示。(编译器例如可以是驱动器4的一部分,存在特殊API调用以使得该编译器运行。因此,编译器执行能够被看作是响应于由应用生成的API调用通过驱动器来完成的绘制调用准备的一部分。)

图4对此进行了例示,并且示出通过应用2用高级着色器编程语言40向驱动器4提供的着色器程序,然后该驱动器4将着色器程序编译41成二进制代码42以用于图形处理流水线3。

如上所述,图形处理流水线中的每个着色器是这样的处理单元,其通过运行针对要生成的图形输出中的每个图形项目的小程序来执行图形处理(“项目”在这方面通常是顶点、片段或像素)。该实施方式涉及以下情况:要通过着色器执行的执行线程(在每个线程对应于一个图形项目的情况下)已经被组织成要以一致步调、一次一个指令地运行的“一组”或“一束”线程。

下面将特别地参照图形处理流水线的片段着色器27的操作来描述本发明的实施方式。

在片段着色器27中,正在被执行的片段着色器程序针对要进行处理的每个采样位置(或点)运行一次,针对每个采样位置产生一个执行线程。通常地,采样位置(并且因此其相应的执行线程)被组织成并且作为多组的多个采样位置(并且因此线程)来进行处理。在该实施方式中,采样位置被组织成2x2“四元组”,并且相应地作为包含四个线程的线程组在片段着色器中进行处理,每个线程对应于“四元组”的采样位置中的一个。然后,代表给定的采样位置四元组的该组线程通过片段着色器以一致步调、一次一个指令地运行。

图5示出通过片段着色器27执行的线程组在片段着色器程序的执行期间被合并的本发明的第一实施方式。这具有如下效果:不需要针对片段着色器程序的部分来执行的线程不会不必要地占据执行路径和周期。

如图5中所示,要进行渲染的(每个)基元50(通过针对表示渲染输出的采样点52的阵列测试基元50)被栅格化51,以生成与相应的2x2采样位置“四元组”相对应的合适的片段。

栅格化器51还进行操作以识别针对如下的基元的多对片段,即,针对该基元,并非片段中的全部采样位置都被基元50覆盖(并且因此并非片段着色器中的相应线程组中的全部线程都将是活动的)。

在本实施方式中,栅格化器识别具有非重叠的被覆盖采样位置的多对片段(即,这将产生具有非重叠活动线程的线程组(即,活动线程将存在于不同的线程组(warp)路径中)。(然而,如有需要,将能够识别可以被合并的多组三个或更多个片段(线程组(warp))。

如有需要,栅格化器还能被配置为能够将采样位置的分配重新映射到针对线程组的线程组路径(例如,通过将线程组水平地或垂直地相对应的2x2四元组进行翻转),以便(尝试)将针对在其初始配置中具有重叠的被覆盖采样位置(活动线程)(路径)的片段(线程组)的重叠去除,以允许这种线程组然后(可能地)进行合并。

然后,当栅格化器向片段着色器发出片段时,该栅格化器以信号方式向该片段着色器发出能够被合并在一起的所识别的片段对(线程组),使得片段着色器能够识别如下的线程组,即,当所述线程组到达着色器程序执行中的线程组合并事件点时,这些线程组已经被识别(关联)为“合并”候选。

(如果要向片段着色器发出的片段被栅格化器识别为无法(可能地)与另一片段进行合并,则该片段被指示为无法进行合并(作为单个线程组进行处理))。

图5示出与相应的采样位置四元组相对应的两个示例性“可合并”片段54、55。可以看出,对于两个片段(四元组)54、55来说,并非全部的采样位置都被基于50覆盖(因此片段是“稀疏的(sparse)”),并且针对所述片段的被覆盖的采样位置不重叠。

当片段54、55到达片段着色器27时,创建56相应的执行线程用于由片段着色器27来执行以对片段54、55进行处理。如图5中所示,在片段54的情况下,产生包括三个活动(“真实的”)线程和一个非活动、“辅助”线程的线程组57。相应地,对于片段55来说,产生包含三个辅助线程和一个活动线程的线程组58。

然后,片段着色阶段执行针对线程组的片段着色器程序。

首先,执行59片段着色器程序的使用线程组57、58的辅助线程的第一部分。片段着色器程序的这一部分执行需要对于线程组中的非活动(辅助)线程(诸如纹理查看)的结果的片段着色器程序操作。

然后,在片段着色器程序中存在进行操作以使得线程组57、58的活动线程被合并到单个的、组合的线程组61中的合并指令60。

为此,当要进行合并的一对线程组57、58中的第一线程组到达着色器程序执行中的线程组合并指令时,针对该线程组的着色器程序执行被停止直至要与该线程组进行合并的另一个线程组也已经到达着色器程序执行中的线程组合并指令。然后,线程组57、58被合并到包含来自线程组57、58中的每一个线程组的活动线程的单个线程组61中。

线程组57、58通过将来自每个线程组的活动线程映射到合并后的单个线程组61的相应路径而被合并为包含来自线程组中的每一个线程组的活动线程的单个线程组61。经合并的线程组然后作为具有单个(活动)程序计数器的一个共享线程组61来进行处理。

紧接着该线程组合并器,片段着色器程序的其余程序步骤针对合并后的线程组61来被执行62。片段着色器程序的这一部分执行不需要针对线程组的非活动(辅助)线程而被执行的诸如算术运算的操作。

(如果“不可合并的”线程组到达着色器程序执行中的线程组合并指令,则线程组合并事件指令被忽略(不起作用),并且片段着色器程序简单地继续针对线程组本身来执行。)

这针对由栅格化器51发出的每个片段来重复。

图5示出片段着色器程序的执行。为了便于图5中所示的操作,片段着色器程序读取并写入数据的寄存器如图6A和图6B中所示地进行布置,以便于图5中所示的线程组的合并。图6A示出在线程组被合并之前的寄存器布置,图6B示出在线程组被合并之后的寄存器布置。

如图6A和图6B中所示,被片段着色器程序使用的寄存器被划分成两个子集,一组70是在物理上由要被合并为单个线程组的一对线程组中的线程组共享的“公共”寄存器,以及各个组71、72是对于该对中的每个线程组来说分别是专属的并且对于要进行合并的该对线程组中的另一个线程组来说是不可访问的“私人”寄存器。

在该实施方式中,使用寄存器指数截止来将寄存器划分成“公共”子集和“私人”子集,在该截止之下的全部寄存器是“公共”寄存器,在该截止之上的全部寄存器是“私人”寄存器。该寄存器指数截止是由编译器指定的。如有需要,用于将寄存器划分成“公共”子集和“私人”子集的其它布置还可以或者替代地被使用,诸如具有寄存器的硬编码划分,或者指示哪些寄存器进入哪个子集的位图。

针对线程组的公共寄存器和私人寄存器按照如下的方式来使用和处理。

首先,在着色器程序执行中在线程组合并指令60之前,线程组能够自由地从针对该线程组的私人寄存器读取和向针对该线程组的私人寄存器写入该组的全部线程(路径)(即,针对“真实的”(活动)线程和“辅助”(非活动)线程)。

相应地,在着色器程序执行中在线程组合并指令之前,线程组仅能够针对其活动线程(针对包含“真实的”(活动线程)的路径)向针对一组线程组的“公共”寄存器写入,并且线程组仅能够针对包含“真实的”线程(针对线程组的活动线程)读取针对其路径的公共寄存器。

在线程组已经被合并之后(已经执行了合并指令),针对曾被合并的线程组的“私人”寄存器的内容是无效的(并且因此仅针对曾被合并的线程组的公共寄存器被认为具有有效值),并且为合并后的单个线程组分配一组新的私人寄存器(如图6B中所示)。在该实施方式中,通过将其中一个线程组57的私人寄存器71映射到单个的合并后的线程组61的寄存器空间中来为合并后的单个线程组分配一组新的私人寄存器,但是如有需要,其它布置也将是可能的。

当执行针对线程组57、58的片段着色器程序时,在着色器程序执行中在合并事件点之前执行要求使用非活动(“辅助”)线程的任何操作,并且使用针对所述的线程组的私人寄存器。

相应地,需要跨越线程组合并事件而保存的来自合并事件点之前的任何数据项(即,在合并事件之后要针对合并后的、单个线程组需要是可用的)(在合并事件之前)被存储在公共寄存器中。

片段着色器程序操作(代码)通过对片段着色器程序代码进行编译的编译器来进行配置,以实现该目的。当编译器对片段着色器程序进行编译时,该编译器还包括在该片段着色器程序中的合适的点处的合并指令60。图7从这方面例示了编译器的操作。

如图7中所示,编译器接收80利用高级源语言的片段着色器程序,并且对该程序进行解析81和处理82。然后,编译器识别使用非活动(辅助)线程的程序操作83以及仅要求活动线程的程序操作84,并且在编译后的片段着色器程序中对这些操作合适地进行分组(使用非活动(辅助)线程的程序操作在仅要求活动线程的程序操作之前)。

然后,编译器在片段着色器程序中在合适的点处(即,在要求使用片段着色器程序中的非活动(辅助)线程的全部操作之后并且在仅要求活动线程的这些程序操作之前)嵌入85线程组合并指令。

然后,这样进行布置的片段着色器程序被编码86成合适的二进制代码以用于图形处理流水线,并且被发送到图形处理流水线以用于执行。

在该实施方式中,在片段着色器程序中提供线程组合并事件作为片段着色器程序中的指令或其一部分。然而,其它布置将是可能的,例如借助于片段着色器程序中的指令的修改程序或者对该指令的修改程序,或者通过诸如与片段着色器程序代码本身分离地指定的截止点这样的某种其它方式来指示线程组合并事件。

图8至图10示出本发明的第二实施方式,在该第二实施方式中,线程组在片段着色器程序执行期间被划分(分离)成多个单独的线程组。

这在诸如样本频率着色的图形处理操作中能够是有用的,在这些图形处理操作中,多个(例如四个)采样点针对要生成的渲染输出内的每个采样位置被处理,但是也存在需要进行的每采样点计算,针对给定的采样位置,能够存在对每个采样点需要等同地进行的某些计算。

图8示意性地示出本发明的该第二实施方式中的操作,在该第二实施方式中,通过片段着色器27执行的线程组在片段着色器程序的执行期间被划分(分离)。

如图8中所示,要进行渲染的(每个)基元50(通过针对表示渲染输出的采样点52的阵列来测试基元50)被再次栅格化51,以生成与相应的2x2采样位置“四元组”相对应的合适的片段53。

然而,如图8中所示,在这种情况下,渲染输出的每个采样位置具有与其相关联的两个采样点90(通过片段着色器针对其进行处理)。

栅格化器识别阵列52的这些采样位置,以及被基元50覆盖的针对每个采样位置的相应的采样点,并且针对包括被覆盖的采样点的每个2x2采样位置四元组生成片段。

图8示出与部分被覆盖的采样位置四元组相对应的示例性片段91。

当片段91到达片段着色器27时,创建56相应的执行线程以用于由片段着色器27来执行以对片段91所代表的采样位置进行处理。如图8中所示,在片段91的情况下,创建包括对应于片段91所代表的采样位置的三个活动(“真实的”)线程和一个非活动、“辅助”线程的线程组92。

然后,片段着色阶段执行针对线程组92的片段着色器程序。

首先,执行93片段着色器程序的第一部分,该第一部分执行每采样位置计算(即,不取决于由采样位置所代表的渲染输出区域内的位置(点)的计算)。

然后,在片段着色器程序中存在划分指令94,该划分指令94进行操作以将线程组92划分成两个单独的线程组95、96,每个线程组代表针对片段91(并且因此线程组92)所代表的采样位置的一组采样点。

紧接着该线程组划分,片段着色器程序的其余程序步骤针对两个线程组95、96被执行97。片段着色器程序的这一部分执行进行每采样点计算(即,取决于由所考虑的采样位置所代表的渲染输出区域内的位置(点)的计算)的操作。

这针对由栅格化器51发出的每个片段来重复。

应当注意的是,在这方面,虽然图8中所示的线程组92、95和96包含活动线程和非活动线程双方(根据此,采样位置和四元组的相应的采样点被基元50覆盖),但是在该实施方式中能够是这样的情况(并且确实可以通常的情况):每个线程组(即,初始的单个线程组和在线程组划分事件之后的多个单独的线程组两者)将全部包含活动线程(即,全部的线程组(warp)路径将始终是活动的)。

图8示出在该实施方式中片段着色器程序的执行。为了便于图8中所示的操作,片段着色器程序读取并写入数据的寄存器如图9A和图9B中所示地进行布置,以便于图8中所示的线程组的划分。图9A示出在线程组被划分之前的寄存器布置,图9B示出在线程组已经被划分之后的寄存器布置。

如图9A和图9B中所示,被片段着色器程序使用的寄存器再次被划分成两个子集,一组70是在物理上由线程组共享的“公共”寄存器(在线程组被划分之前和之后都是),以及各个组71、72是对于该对所划分的线程组中的每个线程组来说分别是专属的并且对于另一个线程组来说是不可访问的“私人”寄存器。这些寄存器被分配(保留),以用于由线程组在着色器程序执行开始时使用。

在该实施方式中,在着色器程序执行中在线程组划分点94之前,初始的“单个”线程组92将针对线程组的公共寄存器70用于其每采样位置计算(并且因此能够自由地从针对线程组的公共寄存器读取并且向针对线程组的公共寄存器写入该组的全部线程(路径))。

因此,在初始的单个线程组92已经被划分之后(划分事件94已经执行),针对线程组的公共寄存器70作为只读寄存器进行处理(以便保存所计算的每采样位置值),并且在线程组划分事件94之后执行的计算使用针对所讨论的线程组95、96的私人寄存器71、72。

片段着色器程序操作(代码)通过对片段着色器程序代码进行编译的编译器来再次进行配置,以实现该目的。当编译器对片段着色器程序进行编译时,该编译器还包括在该片段着色器程序中的合适的点处的划分指令94。图10从这方面例示了编译器的操作。

如图10中所示,编译器接收80利用高级源语言的片段着色器程序,并且对该程序进行解析81和处理82。然后,该编译器确定线程组划分事件在片段着色器程序执行中的某个点处是否可能,并且如果可能的话,则识别作为“每采样位置”110的程序操作和作为“每采样点”(在采样位置内)111的程序操作,并且在编译后的片段着色器程序中对这些操作合适地进行分组(作为“每采样位置”110的程序操作被布置在作为“每采样点”(在采样位置内)111的程序操作之前)。

然后,编译器在片段着色器程序中在合适的点处嵌入112线程组划分指令(即,在作为“每采样位置”110的全部操作之后并且在作为“每采样点”(在采样位置内)111的程序操作之前)。

然后,这样进行布置的片段着色器程序被编码86成合适的二进制代码87以用于图形处理流水线,并且被发送到图形处理流水线以用于执行。

在该实施方式中,在片段着色器程序中再次提供线程组划分事件作为片段着色器程序中的指令或其一部分。然而,其它布置将再次是可能的,例如借助于片段着色器程序中的指令的修改程序或者对该指令的修改程序,或者通过诸如与片段着色器程序代码本身分离地指定的截止点的某种其它方式来指示线程组划分事件。在适当的情况下,还将可能将上述两种实施方式进行组合,即,以具有在其执行期间既包括合并点又包括划分点的片段着色器程序,在这种情况下片段着色器程序要执行的操作使其便利。

从上文中可以看出,本发明在其优选实施方式中至少提供用于执行图形处理系统中的着色器程序的更加有效的机制。在本发明的优选实施方式中,通过识别并包括将正在执行着色器程序的线程组进行合并和/或划分的时机以促进着色器程序的更加有效的执行,来实现上述目的。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1