一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

对小图元执行着色器占用的方法与流程

2022-02-25 20:32:14 来源:中国专利 TAG:

对小图元执行着色器占用的方法
1.相关申请数据
2.本技术要求2020年8月3日提交的美国临时申请序列号63/060,653的权益,该申请通过引用结合于此。
技术领域
3.本公开涉及图形处理单元(gpu),并且更具体地,涉及用于对小图元(primitive)执行着色器(shader)占用的方法。


背景技术:

4.现代gpu包括可编程、高度并行的计算引擎的集合和各种固定功能单元的汇集。固定功能单元可以包括纹理地址生成和过滤单元、图元剪切单元、剔除单元、视口变换单元、组合(binning)单元、光栅化设置和光栅化单元、深度比较单元、混合单元和/或其他单元。gpu可用于图形密集型操作和/或计算密集型工作负载。
5.图形数据可以以流水线方式流经gpu,执行一个或多个应用编程接口(api)(如opengl-es、vulkan、directx等)中概述的步骤。因此,gpu可以符合指定的标准,这些标准可以针对纹理坐标和纹理地址生成。更具体地,在流水线中的像素着色阶段期间,着色器程序可以发出纹理请求并接收过滤后的纹理数据。
6.在一些模式中,对于每个像素,可以在x和y维度的每一个中执行方向导数计算,以相对于覆盖的像素(或采样)间隔来确定被访问的纹理的缩小或放大。在本公开的上下文中,术语“采样”和术语“像素”可以互换使用,因为可以理解,在像素级或子像素采样级(sub-pixel sample level)执行相同的操作。通常,这里将参考像素而不是采样。
7.计算方向导数可以在两个维度的每个维度中使用至少两个数据值。因此,像素着色器可以对2
×
2四边形(quad)(即四个像素的块)进行操作,作为它们的最小工作量。输入图元可以是三维(3d)图元在二维(2d)图像空间上的投影,并且被光栅化以确定像素覆盖。图元可以是由三个(x,y)坐标对定义的三角形。不管由给定输入图元形成的实际覆盖如何,提供给并行处理器着色器子系统的工作都可以是这些2
×
2四边形的汇集,如果这些四边形中的许多仅被部分填充(即,部分覆盖),这可能导致很大的低效率。
8.降低这种低效率的一种方法可以涉及识别部分覆盖的情况,并将覆盖从一个相邻(adjacent)图元转移到另一个图元的四边形。虽然这种方法可以减少发送到着色器的四边形的总数,从而有助于减少总能耗,但这种方法是以损失一些图像质量为代价的。四边形的合并可以使用应用和设置的某些启发式阈值(heuristic threshold)来控制其应用,从而试图避免由于将覆盖从一个图元归于相邻图元而导致的不希望的视觉伪像(artifact),并且作为近似,使用该相邻图元的属性数据。然而,这种四边形合并方法仍然有损耗。


技术实现要素:

9.本公开的各种实施例包括gpu,其包括一个或多个着色器核心和着色器线程束打
包器单元(shader warp packer unit)。着色器线程束打包器单元可被配置为接收与第一部分覆盖的四边形相关联的第一图元,以及与第二部分覆盖的四边形相关联的第二图元。着色器线程束打包器单元可被配置为确定第一部分覆盖的四边形和第二部分覆盖的四边形具有不重叠覆盖。着色器线程束打包器单元可被配置为将第一部分覆盖的四边形和第二部分覆盖的四边形打包成打包的四边形。着色器线程束打包器单元可被配置为将打包的四边形发送到一个或多个着色器核心。在一些实施例中,第一部分覆盖的四边形和第二部分覆盖的四边形在空间上彼此不相交。术语不相交可以意味着不重叠。一个或多个着色器核心可以被配置为接收和处理打包的四边形,而不丢失相对于一个或多个着色器核心单独处理第一部分覆盖的四边形和第二部分覆盖的四边形的信息。
10.一种用于使用gpu对小图元执行着色器占用的方法。该方法可以包括由着色器线程束打包器单元接收与第一部分覆盖的四边形相关联的第一图元,以及与第二部分覆盖的四边形相关联的第二图元。该方法可以包括由着色器线程束打包器单元确定第一部分覆盖的四边形和第二部分覆盖的四边形具有不重叠覆盖。该方法可以包括由着色器线程束打包器单元将第一部分覆盖的四边形和第二部分覆盖的四边形打包成打包的四边形。该方法可以包括由着色器线程束打包器单元将打包的四边形发送到一个或多个着色器核心。在一些实施例中,第一部分覆盖的四边形和第二部分覆盖的四边形在空间上彼此不相交。术语不相交可以意味着不重叠。该方法可以包括由一个或多个着色器核心接收和处理打包的四边形,而不丢失相对于单独处理第一部分覆盖的四边形和第二部分覆盖的四边形的一个或多个着色器核心的信息。
附图说明
11.参考附图,从以下详细描述中,本公开的前述和附加特征和优点将变得更加明显,其中:
12.图1a示出了根据一些实施例的包括动态分支像素着色器线程束打包器(warp packer)单元的gpu的框图。
13.图1b示出了根据一些实施例的包括图1a的动态分支像素着色器线程束打包器单元的gpu。
14.图1c示出了根据一些实施例的包括具有图1a的动态分支像素着色器线程束打包器单元的gpu的移动个人计算机。
15.图1d示出了根据一些实施例的包括具有图1a的动态分支像素着色器线程束打包器单元的gpu的平板计算机。
16.图1e示出了根据一些实施例的包括具有图1a的动态分支像素着色器线程束打包器单元的gpu的智能电话。
17.图2是示出根据一些实施例的2
×
2四边形的框图。
18.图3是示出根据一些实施例的部分覆盖的2
×
2四边形中的图元的框图。
19.图4是示出根据一些实施例的另一部分覆盖的2
×
2四边形中的另一图元的框图。
20.图5是示出根据一些实施例的打包的2
×
2四边形的框图。
21.图6是示出根据一些实施例的另一打包的2
×
2四边形的框图。
22.图7是与相对于(x,y)处的像素表示的临近(neighboring)像素的重心因子计算相
关联的图。
23.图8是示出根据一些实施例的用于对小图元执行着色器占用的技术的流程图。
24.图9是示出根据一些实施例的用于对小图元执行着色器占用的另一种技术的流程图。
具体实施方式
25.现在将详细参考这里公开的实施例,其示例在附图中示出。在以下详细描述中,阐述了许多具体细节,以使得能够彻底理解本发明构思。然而,应该理解,本领域普通技术人员可以在没有这些具体细节的情况下实践本发明构思。在其他情况下,没有详细描述众所周知的方法、过程、组件、电路和网络,以免不必要地使实施例的各个方面模糊。
26.应当理解,尽管术语第一、第二等在这里可以用来描述各种元件,但是这些元件不应该被这些术语所限制。这些术语仅用于区分一种元素与另一种元素。例如,第一像素可以被称为第二像素,并且类似地,第二像素可以被称为第一像素,而不脱离本发明构思的范围。
27.这里在描述本发明构思时使用的术语仅仅是为了描述特定的实施例,而不是为了限制本发明构思。如在本发明构思和所附权利要求的描述中所使用的,单数形式“一”、“一个”和“该”也旨在包括复数形式,除非上下文清楚地指示出其他形式。还应当理解,这里使用的术语“和/或”是指并包括一个或多个相关列出项目的任何和所有可能的组合。还应当理解,当在本说明书中使用时,术语“包括”和/或“包含”指定所述特征、整体、步骤、操作、元件和/或组件的存在,但不排除一个或多个其他特征、整体、步骤、操作、元件、组件和/或它们的组合的存在或添加。附图的组件和特征不一定按比例绘制。
28.本文公开的一些实施例可以包括用于对相对较小的图元执行着色器占用的技术。在将多个图元的覆盖放入同一2
×
2四边形(quad)的情况下,附加信息可以与四边形中的每个像素一起打包,从而允许方向导数计算可能需要的计算。该技术可以包括来自潜在分离的图元的四边形以及辅助信息的完全打包,该辅助信息可以用于产生原本会因丢失2
×
2四边形中的“助手”(helper)像素或“h”像素而产生的信息,从而提高处理效率。
29.本文公开的一些实施例提高了gpu内图形密集型操作的效率,这可能涉及在gpu内使用可编程单元和/或固定功能单元。这里公开的实施例可以不将覆盖从一个图元转移到另一个图元,而是可以提供这样的机制,其中来自两个或更多个图元的覆盖可以存在于同一四边形中,而不会损失任何精度。此外,不需要相关联的启发式阈值来保持图像质量。对于具有来自多于一个传入图元的覆盖的四边形内的像素,可能存在附加信息,并且可能发生计算。因此,可以提高小图元处理效率。此外,可以增加小多边形和微多边形的使用,从而导致更高的几何复杂度和保真度,如当用于图形密集型游戏应用时。
30.图1a示出了根据一些实施例的包括动态分支像素着色器线程束打包器单元105的gpu100的框图。图1b示出了根据一些实施例的包括图1a的动态分支像素着色器线程束打包器单元105的gpu100。图1c示出了根据一些实施例的包括具有图1a的动态分支像素着色器线程束打包器单元105的gpu 100的移动个人计算机180a。图1d示出了根据一些实施例的包括具有图1a的动态分支像素着色器线程束打包器单元105的gpu100平板计算机180b。图1e示出了根据一些实施例的包括具有图1a的动态分支像素着色器线程束打包器单元105的
gpu 100的智能电话180c。现在参考图1a至图1e。
31.动态分支像素着色器线程束打包器单元105可对相对较小的图元(例如,130、135)执行着色器占用。在一些实施例中,如四边形115和四边形120的2
×
2四边形可以各自仅被部分填充(即,部分覆盖)。应当理解,虽然这里通常参考2
×
2四边形,但是在不脱离所描述的发明构思的情况下,可以使用其他尺寸的四边形。小图元130仅部分填充2
×
2四边形115。小图元135仅部分填充2
×
2四边形120。动态分支像素着色器线程束打包器单元105可将两个或两个以上图元(例如,130、135)打包到同一2
×
2四边形140中。在多个图元的覆盖被放置到同一2
×
2四边形140中的情况下,附加属性信息(例如,145)可以与2
×
2四边形140中的每个像素(例如,150)一起被打包和/或存储,从而允许计算方向导数(例如,160、165、192)可能需要的信息。该技术可以包括来自潜在分离的图元(例如,130、135)的2
×
2四边形以及属性信息(例如,145)的完全打包,其中该属性信息可以用于产生原本会因丢失2
×
2四边形中的h像素而产生的信息,从而提高处理效率。
32.本文公开的一些实施例提高了gpu 100内图形密集型操作的效率,这可能涉及使用可编程单元和/或固定功能单元,如gpu100内的一个或多个着色器核心110。这里公开的实施例可以不将覆盖从一个图元(例如,130)转移到另一个图元(例如,135),而是可以提供这样的机制,其中来自两个或更多个图元(例如,130,135)的覆盖可以存在于同一2
×
2四边形140中,而不会损失任何精度。对于2
×
2四边形140内的像素(例如,150),可以存在附加的属性信息(例如,145),并且可以发生计算,该2
×
2四边形140可以具有来自多于一个传入图元(例如,130,135)的覆盖。因此,可以提高小图元处理效率。此外,可以增加小多边形和微多边形的使用,从而导致更高的几何复杂度和保真度,如当用于图形密集型游戏应用时。
33.当来自两个图元(例如,130,135)的2
×
2四边形(例如,115,120)不具有重叠的覆盖时,则动态分支像素着色器线程束打包器单元105可以合并来自两个不同图元(例如,130,135)的2
×
2四边形(例如,115,120),并将它们放置在同一2
×
2四边形140内。这导致更好的线程束占用。动态分支像素着色器线程束打包器单元105可包括滞后(hysteresis)窗口155,滞后窗口155可从各种图元(例如,130、135)收集不重叠的四边形(例如,115、120)。例如,在滞后窗口155内,遇到的各种图元(例如,130、135)可以被机会性地(opportunistically)组合到单个相同的2
×
2四边形140中,用于在一个或多个着色器核心110中处理,如下文进一步描述的。作为共享的四边形处理的候选但落在滞后窗口155之外的图元可以使用传统技术来处理,但是不会获得提高着色器效率的益处。可能不需要不重叠覆盖质量。换句话说,第一部分覆盖的四边形115和第二部分覆盖的四边形120可以具有重叠覆盖,尽管代价是在一个或多个着色器核心110中处理像素的同时进行一些附加的数据缓冲。
34.动态分支着色器线程束打包器单元105可接收一个或多个图元(例如,130、135),并确定至少两个部分覆盖的2
×
2四边形(例如,115、120)是否不具有重叠覆盖。根据本文公开的实施例,至少两个部分覆盖的2
×
2四边形(例如,115,120)可以在相同位置或不同位置。空间接近不是必需的。换句话说,部分覆盖的2
×
2四边形(例如,115,120)不需要彼此相邻,并且即使部分覆盖的2
×
2四边形(例如,115,120)不在相同或相似的位置,本文公开的实施例也可以同样有效。动态分支着色器线程束打包器单元105可将至少两个部分覆盖的2
×
2四边形(例如,115、120)打包成打包的2
×
2四边形(例如,140)。动态分支着色器线程束
打包器单元105可以将打包的2
×
2四边形(例如,140)发送到一个或多个着色器核心110进行处理。
35.此外,可以修改编译器以生成代码序列170来支持动态分支混合模式。动态分支着色器线程束打包器单元105可以基于代码序列170使用一个或多个通道(lane)125来计算方向导数(例如,160、165、192)。例如,一个或多个通道125可以是一个或多个计算线程。一个或多个通道125可以例如由多线程和/或多核微处理器来处理。编译器可以生成代码序列170来支持跨通道方向导数计算(例如,160)和/或同通道方向导数计算(例如,165)。
36.多个像素可以堆积在相同通道中。例如,与h像素相关联的工作可以被映射到与覆盖的像素相同的通道上。在一些实施例中,h像素数据可以堆积到活动像素上。例如,一个(1)或三个(3)h像素可以堆积到活动像素上。编译器可以生成用于在同通道内计算方向导数的代码以及用于跨通道计算的代码。方向导数(例如,160、165、192)可以在跨通道操作或同通道操作中计算。编译器可以为这两种方法生成代码。可以在运行时使用一个或多个标志114来选择特定的操作模式(即,同通道或跨通道),标志114可以由动态分支着色器线程束打包器单元105生成并发送,作为线程束打包的一部分。例如,一个或多个标志114可以是二进制标志。
37.动态分支着色器线程束打包器单元105可以将打包的线程束191传递给一个或多个着色器核心110,打包的线程束191包括覆盖图190,覆盖图190具有线程束中的2
×
2四边形(例如,140)中的每一个的覆盖。线程束可以具有二次幂的宽度,如16、32和64,等等。动态分支着色器线程束打包器单元105可以向一个或多个着色器核心110提供一个或多个标志114。一个或多个标志114可用于在一个或多个着色器核心110中控制(例如,提供动态分支)用于给定像素(例如,150)的代码,并且因此对于给定的2
×
2四边形(例如,140),集中在四个线程上。取决于四边形的覆盖和存在(或不存在)的h像素,一个或多个标志114可用于控制关于方向导数(例如,160、165、192)的计算而采用的分支。换句话说,编译器可以为在每个像素中或跨像素计算方向导数(例如,160、165、192)的不同场景生成代码段170,并且可以按照附加属性信息145的指示在这些情况中动态地选择分支,该附加属性信息145可以与来自动态分支着色器线程束打包器单元105的2
×
2四边形(例如,140)一起传递。
38.响应于由动态分支着色器线程束打包器单元105提供的控制,一个或多个着色器核心(例如,110)和/或通道125中的每一个可以确定是在同通道(例如,165)还是跨通道(例如,160)中计算水平方向导数或垂直方向导数或两者。该确定可以基于2
×
2四边形140中的水平或垂直像素邻居是否存在,和/或基于动态分支像素着色器线程束打包器单元105可用的信息。因此,动态分支像素着色器线程束打包器单元105可以生成两个位掩码(bitmask)(例如,175、180),每个方向一个。换句话说,动态分支像素着色器线程束打包器单元105可以生成用于垂直方向的位掩码175和用于水平方向的位掩码180。动态分支像素着色器线程束打包器单元105可以使用来自图元的四边形覆盖的知识来做出该确定。位掩码(例如,175、180)中的每一个可以包括每个像素1位。
39.图元可以以2
×
2四边形的倍数被光栅化。一个或多个2
×
2四边形可以一起打包到像素着色器线程束中,其可以被发送到一个或多个着色器核心110以供执行。计算方向导数(例如,160、165、192)可以在两个维度的每一个维度中使用至少两个数据值。因此,2
×
2四边形中的像素可用于计算方向导数。该方向导数在计算特定细节层次(level-of-detail,
lod)时可能是有用的,lod可以以多种方式来使用,包括确定纹理的mip层次。
40.在一些实施例中,2
×
2四边形也可以通过利用2
×
2四边形中的像素之间的空间局部性(spatial locality)来帮助减少纹理流量(texture traffic)。因此,即使当并非2
×
2四边形内的所有像素都被占用时,gpu 100也可以将2
×
2四边形调度到一个或多个像素着色器核心110中。不可见但仅用于计算方向导数的像素(例如,160、165、192)可被称为h像素。当大部分图元较大时,完全填充的大部分2
×
2四边形也较大。换句话说,当大多数图元不大时,这里公开的实施例更重要。在一些实施例中,大可以被定义为覆盖几十个或几百个2
×
2四边形。图元越大,部分覆盖的2
×
2四边形与完全覆盖的(由该图元覆盖的)2
×
2四边形相比的比例越小。
41.然而,当帧以微多边形为主时(例如,当图元占用少于2
×
2四边形的像素时),则2
×
2四边形中缺乏完全覆盖可能导致gpu着色器代码利用效率低下。对于小的(但不是微型的)多边形也可能是这样。即使图元(其通常是三角形)覆盖了两个或几个2
×
2四边形,由于是三角形而不是矩形图元,仍可能有很大比例的部分覆盖的2
×
2四边形。这里公开的实施例对于小型和微型图元都是有利的。
42.为了解决这个性能问题,动态分支像素着色器线程束(warp)打包器单元105可以独立地调度像素。这可以通过将x和y方向上的临近像素的属性分配给同一像素来实现。方向导数(例如,160、165、192)可以在同通道操作中而不是在跨通道操作中被完全计算。在使用重心因子来内插属性(例如,在每个采样)的架构中,这可以通过在2
×
2四边形的水平和垂直方向上复制临近像素的重心因子185来实现。换句话说,每个像素现在可以包含重心因子185的三个集合:i)一个用于它自己;ii)一个用于沿水平方向的临近像素;以及iii)一个用于沿垂直方向的临近像素。重心因子185可用于计算方向导数(例如,160、165、192)的属性。这种技术可能增加寄存器压力,因为每个通道都可能存储四个附加值。然而,对于重心因子185的每个集合,仅存储其中两个就足够了,而第三个值可以通过从一(1)中减去两个重心因子185之和来计算。
43.当用于计算方向导数(例如,160、165、192)的像素(例如,150)是图元的覆盖的一部分时,则动态分支像素着色器线程束打包器单元105不需要复制该像素的重心因子(例如,185),并且动态分支像素着色器线程束打包器单元105可以使用跨通道操作来计算方向导数(例如,160)。当用于计算方向导数的像素(例如,150)不是图元的覆盖的一部分时,则动态分支像素着色器线程束打包器单元105可以使用单通道操作来计算方向导数(例如,165)。在这种情况下,重心因子185、一个或多个标志114和/或具有2
×
2四边形140的覆盖图190的打包的线程束191可以被发送到一个或多个着色器核心110。一个或多个着色器核心110可以使用覆盖图190来确定水平和/或垂直导数是在同通道操作中还是在跨通道操作中计算。一个或多个着色器核心110可以采用动态分支来使用这些路径中的任一个。替代地或附加地,可以提供进入着色器程序的单独的代码入口点,如果它节省了与执行动态分支指令相关联的延迟和能量,则这可能是优选的。换句话说,动态分支可以通过使着色器程序响应于覆盖图190和/或其他参数从不同的入口点开始,而在着色器程序外部“执行”。
44.代替发送重心因子185,偏微分192可以被发送到一个或多个着色器核心110,如下面进一步描述的。gpu 100可以包括存储方向导数的存储器116。存储器116可以是易失性或非易失性存储器或其他合适的存储设备。
45.gpu 100可以包括一个或多个纹理单元195。lod的计算可以在一个或多个着色器核心110中或者在一个或多个纹理单元195中执行。当lod在一个或多个着色器核心110之外实现并且在一个或多个纹理单元195中执行时,则附加属性数据(例如,145)可以从一个或多个着色器核心110发送到一个或多个纹理单元195和/或对一个或多个纹理单元195进行的微小修改。一个或多个着色器核心110可以知道采样指令和/或可能发生的纹理操作,因此可以访问其他纹理坐标信息以提供给一个或多个纹理单元195。
46.gpu 100可以包括一个或多个插值单元198。属性(例如,145)的插值可以使用重心因子185来完成和/或可以由一个或多个插值单元198使用平面方程来执行。在这种情况下,对一个或多个插值单元198的附加修改可以对h像素执行属性插值。此外,一个或多个插值单元198可以使用指示哪些h像素可以存在以及哪些属性可以与每个h像素相关联的图199。
47.图2是示出根据一些实施例的2
×
2四边形200的框图。2
×
2四边形200可以包括四个像素205a、205b、205c和205d。像素中每一个可以具有中心点(例如,215)。像素中每一个可以具有像素号(例如,210)。
48.图3是示出根据一些实施例的部分覆盖的2
×
2四边形115中的图元130的框图。图4是示出根据一些实施例的另一部分覆盖的2
×
2四边形120中的图元135的框图。现在参考图1a、图3和图4。
[0049]2×
2四边形115可以基于到达的图元的覆盖来填充。图元130和135可以各自为同一2
×
2四边形140提供覆盖。图元130和135可以各自包括三个顶点(例如,305、405)。传统上,2
×
2四边形115和2
×
2四边形120都需要被单独发送到一个或多个着色器核心110。2
×
2四边形115将被发送,其具有由图元130覆盖的两个上部像素、以及用于方向导数计算的两个h像素(例如,310)。2
×
2四边形120将单独被发送,其具有由图元135覆盖的一个下部像素、以及用于方向导数计算的三个h像素(例如,410)。因此,尽管在2
×
2四边形115和120中仅覆盖了三个像素,但是在一个或多个着色器核心110中总共将分配八(8)个线程——每个2
×
2四边形的每个像素一个线程。
[0050]
图5是示出根据一些实施例的打包的2
×
2四边形140的框图。根据本文公开的实施例,当覆盖属于另一相邻图元(例如,130、135)时,不需要使用h像素。例如,如图5所示,图元130和135存在于2
×
2四边形140中,因此只有图元130能够与相关联的h像素310一起具有足够的覆盖,以提供方向导数计算。然而,图元135在2
×
2四边形140中仅具有单个像素(即,205d)的覆盖,并且没有相关联的h像素。对应于图元135的覆盖的像素205d可以被标记为需要两个h像素的附加属性信息(例如,145)和/或由一个或多个着色器核心110进行的属性评估。
[0051]
通常,图元(例如,130、135)中的每一个将需要将所有四(4)个像素被发送到一个或多个着色器核心110,总共八(8)个像素。使用这里公开的实施例,只有三(3)或四(4)个像素可以被发送到一个或多个着色器核心110,而不是八(8)个像素,同时仍然能实现完全无损的结果。
[0052]
图6是示出根据一些实施例的另一打包的2
×
2四边形600的框图。在该示例实施例中,有三个图元(例如,130、135和615),它们在同一2
×
2四边形600中存在覆盖,并且图元(例如,130、135和615)在2
×
2四边形600中可能没有足够的像素用于跨通道执行的方向导数计算。因此,可以对一个或多个相邻像素执行基于与2
×
2四边形600的每个像素相关联的
属性信息145的至少一些附加属性计算。位掩码(例如,175、180)可以用于为2
×
2四边形600中的像素中每一个指示对于给定图元(例如,130、135和615)哪些临近像素存在或不存在。这使得一个或多个着色器核心110和/或一个或多个纹理单元195能够基于位掩码(例如,175、180)和/或基于附加属性信息(例如,145)来计算方向导数。
[0053]
因此,对于在2
×
2四边形600中具有水平相邻覆盖的图元130,水平方向导数计算可以使用传统技术来计算,而垂直方向导数可以使用这里公开的实施例来计算。如上所述,结果是更密集的打包,而当存在相同图元的临近像素可用于方向导数计算时,在给定像素上没有不必要的附加工作。只有当覆盖的像素或助手像素不可用时,才可能存在附加工作的过载,后者是由于特定像素位置被同一2
×
2四边形中具有覆盖的另一图元所占据。
[0054]
传统上,图元(例如,130、135和615)中的每一个将需要将所有四(4)个像素被发送到一个或多个着色器核心110,总共十二(12)个像素。使用本文公开的实施例,仅四(4)个像素可以被发送到一个或多个着色器核心110,而不是十二(12)个像素,同时仍然能实现完全无损的结果。
[0055]
gpu的一些应用编程接口(application programming interface,api)有特定的规则,这些规则是关于应该和不应该对可能存在于不具有完整图元覆盖的四边形中的h像素执行的操作。具体来说,例如,api可以指定h像素不应执行任何副作用,如读取、写入或对存储器的原子访问。这些api还可以指定h像素不应该向渲染目标写入任何数据,有时被一些api称为“附件”。根据在此公开的实施例,这种api限制没有问题,甚至可能是方便的,因为它们减轻了编译器关于也不存在垂直和/或水平h像素或实际像素的四边形中的像素所需的附加代码的负担。
[0056]
可以提供属性的重心评估。无论是否调用本文公开的实施例,对于发送到一个或多个着色器核心110进行处理的每个像素,在前端变换之后,应用提供的属性可以被内插到像素的位置。这可以采取内插重心坐标对并将其用作在像素位置中的每一个处评估图元属性中的每一个的基础的形式。在一些实施例中,该属性的评估可以被扩充以包括像素的属性的评估以及一个或两个紧邻像素的属性的评估,以用作方向导数纹理输入。
[0057]
现在参考图1a至图7。
[0058]
代替发送重心因子185,偏微分192可以被发送到一个或多个着色器核心110,其可以用于计算方向导数(例如,160、165、192)。例如,方向导数(例如,160,165,192)可以如下确定:
[0059]
(x0,yo)、(x1,y1)、(x2,y2)可以是屏幕空间中的图元的三个顶点(例如,305,405,

)。a可以是图元(例如,130,135)的总面积。
[0060]
设u、v、w为图元(例如,130,135)内的点的三个重心因子185,这样u v w=1.0。
[0061]
一个或多个着色器核心110和/或一个或多个纹理单元195可以使用以下关系来计算水平和垂直像素邻居的重心因子185:
[0062][0063]
[0064][0065][0066][0067][0068][0069][0070]
偏微分192可以被提供给一个或多个着色器核心110,并且一个或多个着色器核心110和/或一个或多个纹理单元195可以计算临近像素的重心因子185以计算方向导数(例如,160、165、192)。
[0071]
或者,偏微分192可以用于直接计算方向导数(例如,160、165、192)。例如,一个值的计算如下所示。相同的技术可以应用于所有属性。从下面的推导中显而易见,方向导数(例如,160、165、192)可以使用两次乘法和一次加法来计算,假设(t
0-t2)和(t
1-t2)已经被计算。
[0072][0073]
发送重心因子185和偏微分192在寄存器(例如,四个寄存器)方面可能招致相同的成本。在前一种情况下,方向导数(例如,160、165、192)的计算可能导致两次减法、两次乘法和一次加法的成本,假设(t
0-t2)和(t
1-t2)已经被计算。后者可能只涉及两次乘法和一次加法,因为偏微分192可能已经可用。
[0074]
图7是与相对于(x,y)处的像素表示的临近(neighbor)像素的重心因子计算相关联的图。这些数字可以用下列等式表达:
[0075][0076]
[0077]
在一些实施例中,下表1示出了相对于(x,y)处的像素表达的临近像素的重心因子计算:
[0078]
表1
[0079][0080][0081]
假设(s,t)是需要插值的属性。为了在某个像素位置(x,y)内插这些属性,在三个顶点的每一个处由(s0,t0)、(s1,t1)、(s2,t2)给出的每个属性的值可以与该像素的重心因子组合如下。
[0082]sx,y
=s0·ux,y
s1·vx,y
s2·
(1-u
x,y-v
x,y
)
[0083]
t
x,y
=t0·ux,y
t1·vx,y
t2·
(1-u
x,y-v
x,y
)
[0084]
将上述等式与表1中的表达式相结合,临近像素的属性计算可以表达如下。
[0085][0086]
在一些实施例中,下表2示出了给定三角形(即,图元)的三个角处的值的方向导数计算:
[0087]
表2
[0088][0089]
值可能已经对于gpu的重心插值(barycentric interpolation,bci)单元可用。这种预先存在的数据可以被复制到向量寄存器文件,然后上述计算可以减少到四(4)次乘法和四(4)次加法(或减法)。
[0090]
即使上述四个值不可用,bci也可以将的值复制到寄存器中,然后运算的数量可以减少到四(4)次乘法和八(8)次加法(或减法)。两种选择都可能涉及分配附加的四个寄存器来存储附加的值。
[0091]
在具有多个小三角形的情况下,基于这里公开的实施例的实现,可以实现相当大的性能改进。对于微多边形(即,仅覆盖单个采样的那些),这里公开的实施例可以使着色器速率更符合图元设置速率。这里公开的实施例不需要对gpu流水线进行大规模的重新设计。可以在像素打包逻辑中进行一些改变,并且可以向像素着色器的着色器核心提供一些附加的软件可访问数据。这里公开的技术是完全无损的。与传统技术不同,视觉或数字结果没有变化,因此在应用这些技术时不需要启发式,这在美学上是可以接受的。此外,这里公开的实施例对于应用来说可以是完全透明的。换句话说,运行在gpu 100上的应用不需要被改变来获得这里公开的实施例的益处。当多个图元的覆盖被打包在同一四边形中时,给定线程束的总延迟可能会增加,但这更多地被其他节省所抵消。
[0092]
可能存在盈亏平衡点,在该点处使用显式线程最好地计算h像素的计算。有几个因子会影响禁用这里公开的实施例。因子中的一些包括如下。首先,用于内插属性的附加指令的总和大于由一个或多个着色器核心110执行的指令的总数的阈值。本质上,内插附加属性的成本可能相对较高,因此打包更多的线程不会有利于整体性能。其次,方向导数所需的纹理访问数量可能超过某个阈值。在这种情况下,禁用这里公开的实施例可能更好,替代地使用传统技术来执行计算。然而,趋势是朝向更复杂的像素着色器,每个线程需要更多的计算。编译器可以静态地分析着色器程序,以确定是否值得将多个图元打包到四边形中,并且如果是,则设置标志或某个其他状态变量来实现这里公开的实施例。换句话说,当所公开的技术的开销超过益处时,关闭所公开的技术可能是有益的。像素可以被标记为h像素,它可以用来指示这些通道需要在哪里打开,以及这些通道需要在哪里关闭,以避免无效的工作。
[0093]
图8是示出根据一些实施例的用于对小图元执行着色器占用的技术的流程图800。在805,着色器线程束打包器单元可以接收与第一部分覆盖的四边形相关联的第一图元以及与第二部分覆盖的四边形相关联的第二图元。在810,着色器线程束打包器单元可以确定第一部分覆盖的四边形和第二部分覆盖的四边形具有不重叠的覆盖。在815,着色器线程束打包器单元可以将第一部分覆盖的四边形和第二部分覆盖的四边形打包到打包的四边形中,即使第一部分覆盖的四边形和第二部分覆盖的四边形在空间上不相交。术语不相交
(disjoint)可以隐含不重叠。在820,着色器线程束打包器单元可以将打包的四边形发送到一个或多个着色器核心。
[0094]
图9是示出根据一些实施例的用于对小图元执行着色器占用的另一种技术的流程图900。在905,着色器线程束打包器单元或一个或多个着色器核心可以基于至少一个运行时标志在第一操作模式或第二操作模式之间进行选择。在910,着色器线程束打包器单元或一个或多个着色器核心可以存储与打包的四边形的至少一个像素相关联的属性信息。在915,在第一操作模式中,可以基于存储的属性信息在单通道操作中计算方向导数。在920,在第二操作模式中,可以基于存储的属性信息在跨通道操作中计算方向导数。
[0095]
应当理解,图8和图9的步骤不需要按照所示的顺序执行,并且可以存在中间步骤。
[0096]
在一些实施例中,gpu包括一个或多个着色器核心。gpu可包括着色器线程束打包器单元,其被配置为接收与第一部分覆盖的四边形相关联的第一图元以及与第二部分覆盖的四边形相关联的第二图元。在一些实施例中,着色器线程束打包器单元被配置为确定第一部分覆盖的四边形和第二部分覆盖的四边形具有不重叠的覆盖。在一些实施例中,着色器线程束打包器单元被配置为将第一部分覆盖的四边形和第二部分覆盖的四边形打包到打包的四边形。在一些实施例中,着色器线程束打包器单元被配置为将打包的四边形发送到一个或多个着色器核心。在一些实施例中,第一部分覆盖的四边形和第二部分覆盖的四边形在空间上彼此不相交。术语不相交可以意味着不重叠。
[0097]
在一些实施例中,一个或多个着色器核心被配置为接收和处理打包的四边形,而不丢失与一个或多个着色器核心单独处理第一部分覆盖的四边形和第二部分覆盖的四边形相关的信息。在一些实施例中,着色器线程束打包器单元被配置为将来自打包的四边形的零个或更多个像素分配给单通道用于单通道操作。例如,单个“覆盖”像素可以被分配给通道,然后零个、一个或两个h像素可以被分配给同一通道。在一些实施例中,着色器线程束打包器单元被配置为使(一个或多个)着色器核心在单通道操作中计算方向导数。在一些实施例中,一个或多个着色器核心被配置为在单通道操作中计算方向导数。
[0098]
gpu可包括第一操作模式,其中i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一被配置为在单通道操作中计算方向导数。gpu可包括第二操作模式,其中i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一被配置为在跨通道操作中计算第二方向导数。
[0099]
在一些实施例中,i)着色器线程束打包器单元或ii)一个或多个着色器核心中的至少之一被配置为基于至少一个运行时标志来选择第一操作模式或第二操作模式中的至少之一。在一些实施例中,着色器线程束打包器单元被配置为存储与打包的四边形的至少一个像素相关联的属性信息。在一些实施例中,i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一被配置为基于属性信息计算方向导数。在一些实施例中,i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一被配置为基于一个或多个重心因子来计算方向导数。在一些实施例中,i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一被配置为基于一个或多个偏微分来计算方向导数。
[0100]
在一些实施例中,i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一被配置为根据以下内容来计算x方向上的第一方向导数:
以及i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一被配置为根据以下内容来计算y方向上的第二方向导数:在一些实施例中,a是第一图元或第二图元中的至少之一的面积。在一些实施例中,x0、y0、x1、y1、x2和y2是第一图元或第二图元中的至少之一的顶点的坐标。在一些实施例中,t0、t1和t2分别是三个顶点(x0,y0)、(x1,y1)和(x2,y2)中每一个处的“t”属性的值。对于到达光栅化器和然后打包器的每个图元,可能有零个或更多个属性要跨图元进行插值。值“s”和“t”可以表示两个这样的图元属性,并且可以写成(s,t)来表示图元中某个特定像素处的纹理坐标,该坐标是在三个顶点中的每个顶点处从(s,t)值插值而来的。gpu 100可以包括被配置为存储第一方向导数和第二方向导数的存储器。
[0101]
一些实施例包括一种用于使用gpu对小图元执行着色器占用的方法。该方法可以包括由着色器线程束打包器单元接收与第一部分覆盖的四边形相关联的第一图元以及与第二部分覆盖的四边形相关联的第二图元。该方法可以包括由着色器线程束打包器单元确定第一部分覆盖的四边形和第二部分覆盖的四边形具有不重叠的覆盖。可以不要求不重叠的覆盖质量。换句话说,第一部分覆盖的四边形和第二部分覆盖的四边形可以具有重叠的覆盖,尽管代价是在一个或多个着色器核心中处理像素的同时进行一些附加的数据缓冲。该方法可以包括由着色器线程束打包器单元将第一部分覆盖的四边形和第二部分覆盖的四边形打包到打包的四边形中。该方法可以包括由着色器线程束打包器单元将打包的四边形发送到一个或多个着色器核心。在一些实施例中,第一部分覆盖的四边形和第二部分覆盖的四边形在空间上彼此不相交。
[0102]
该方法可以包括由一个或多个着色器核心接收和处理打包的四边形,而不丢失与一个或多个着色器核心单独处理第一部分覆盖的四边形和第二部分覆盖的四边形相关的信息。该方法可以包括将来自打包的四边形的零个或更多个像素分配给单通道用于单通道操作。例如,单个“覆盖”像素可以被分配给通道,然后零个、一个或两个h像素可以被分配给同一通道。该方法可以包括在单通道操作中计算方向导数。该方法可以包括在第一操作模式中,由i)一个或多个纹理单元或者ii)一个或多个着色器核心中的至少之一单通道操作中计算方向导数。该方法可以包括在第二操作模式中,由i)一个或多个纹理单元或者ii)一个或多个着色器核心中的至少之一在跨通道操作中计算第二方向导数。该方法可以包括由i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一,基于至少一个运行时标志来选择第一操作模式或第二操作模式中的至少之一。
[0103]
该方法可以包括由着色器线程束打包器单元存储与打包的四边形的至少一个像素相关联的属性信息。该方法可以包括由i)一个或多个纹理单元,或ii)一个或多个着色器核心中的至少之一,基于属性信息计算方向导数。
[0104]
该方法可以包括由i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一,根据下式计算x方向上的第一方向导数:
以及由i)一个或多个纹理单元或ii)一个或多个着色器核心中的至少之一,根据下式计算y方向上的第二方向导数:在一些实施例中,其中a是第一图元或第二图元中的至少之一的总面积。在一些实施例中,x0、y0、x1、y1、x2和y2是第一图元或第二图元中的至少之一的顶点的坐标。
[0105]
结合本文公开的实施例描述的方法或算法和功能的块或步骤可以直接体现在硬件、由处理器执行的软件模块或两者的组合中。模块可以包括硬件、软件、固件或其任意组合。如果以软件实现,这些功能可以作为有形的、非暂时性的计算机可读介质上的一个或多个指令或代码来存储或传输。软件模块可以驻留在随机存取存储器(ram)、闪存、只读存储器(rom)、电可编程rom(eprom)、电可擦除可编程rom(eeprom)、寄存器、硬盘、可移动磁盘、cd rom或本领域已知的任何其他形式的存储介质中。
[0106]
下面的讨论旨在提供一个或多个合适的机器的简要概括描述,在这些机器中可以实现本发明构思的某些方面。典型地,一个或多个机器包括系统总线,处理器、存储器(例如ram、rom或其他状态保持介质)、存储设备、视频接口和输入/输出接口端口连接到该系统总线。一个或多个机器可以至少部分地由来自诸如键盘、鼠标等传统输入设备的输入以及从另一个机器接收的指令、与虚拟现实(vr)环境的交互、生物反馈或其他输入信号来控制。如这里所使用的,术语“机器”旨在广泛地包含单个机器、虚拟机或通信耦合的机器、虚拟机或一起操作的设备的系统。示例性机器包括计算设备,如个人计算机、工作站、服务器、便携式计算机、手持设备、电话、平板电脑等,以及运输设备,如私人或公共交通工具,例如汽车、火车、出租车等。
[0107]
一个或多个机器可以包括嵌入式控制器,如可编程或不可编程逻辑器件或阵列、asic、嵌入式计算机、卡等。一个或多个机器可以利用到一个或多个远程机器的一个或多个连接,如通过网络接口、调制解调器或其他通信耦合。机器可以通过物理和/或逻辑网络(如内联网、互联网、局域网、广域网等)互连。本领域技术人员将理解,网络通信可以利用各种有线和/或无线短程或远程载波和协议,包括射频(rf)、卫星、微波、电气和电子工程师协会(ieee)545.11、光、红外、电缆、激光等。
[0108]
本公开的实施例可以通过参考或结合包括功能、过程、数据结构、应用程序等的相关数据来描述,当被机器访问时,导致机器执行任务或定义抽象数据类型或低级硬件上下文。相关联的数据可以存储在例如易失性和/或非易失性存储器(例如,ram、rom等)中,或者存储在其他存储设备及其相关联的存储介质中,包括硬盘驱动器、软盘、光存储器、磁带、闪存、记忆棒、数字视频盘、生物存储器等。相关联的数据可以以分组、串行数据、并行数据、传播信号等的形式在传输环境(包括物理和/或逻辑网络)上传送,并且可以以压缩或加密的格式使用。相关数据可在分布式环境中使用,并本地地存储和/或远程地存储,用于机器访问。
[0109]
已经参照图示的实施例描述和图示了本公开的原理,应当认识到,在不脱离这些原理的情况下,图示的实施例可以在布置和细节上进行修改,并且可以以任何期望的方式进行组合。尽管前面的讨论集中在特定的实施例上,但是也可以考虑其他配置。具体而言,
即使在此使用了如“根据本发明构思的实施例”等表达,这些短语通常是指实施例的可能性,而不是旨在将本发明构思限制于特定的实施例配置。如这里所使用的,这些术语可以指可组合到其他实施例中的相同或不同的实施例。
[0110]
本公开的实施例可以包括包含可由一个或多个处理器执行的指令的非暂时性机器可读介质,该指令包含用于执行这里描述的发明构思的元素的指令。
[0111]
前述说明性实施例不应被解释为限制其发明构思。虽然已经描述了几个实施例,但是本领域技术人员将容易理解,在本质上不脱离本公开的新颖教导和优点的情况下,对这些实施例的许多修改是可能的。因此,所有这些修改都旨在包括在如权利要求所限定的本公开的范围内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献