CN115943421A - 单通道的渲染和后处理滤波 - Google Patents
单通道的渲染和后处理滤波 Download PDFInfo
- Publication number
- CN115943421A CN115943421A CN202080102321.6A CN202080102321A CN115943421A CN 115943421 A CN115943421 A CN 115943421A CN 202080102321 A CN202080102321 A CN 202080102321A CN 115943421 A CN115943421 A CN 115943421A
- Authority
- CN
- China
- Prior art keywords
- tile
- tiles
- rendering
- memory
- filtering
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T1/00—General purpose image data processing
- G06T1/60—Memory management
Landscapes
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Image Processing (AREA)
- Image Generation (AREA)
Abstract
本文描述的是一种图形处理***(1400),用于接收包括多个像素的输入图像,该***用于将输入图像划分为多个图块,每个图块包括输入图像的像素的子集,该***包括:存储器(503、1402),用于存储图块组(702、901、1105),该图块组是输入图像的多个图块的子集;以及处理器(1401),其中,处理器用于,对于图块组(702、901、1105)中的至少一个图块,执行包括以下步骤的处理通道:渲染图块;根据图块组(702、901、1105)中的至少一个其他图块对图块滤波;以及在存储器(503、1402)中存储经渲染和滤波的图块。与传统的两通道方法相比,这可能会带来更少的存储器带宽消耗,对外部存储器带宽的影响更小。
Description
技术领域
本发明涉及图像的渲染和后处理滤波,例如用于移动图形处理单元(graphicsprocessing unit,GPU)中的游戏渲染。
背景技术
用于游戏渲染的后处理滤波涉及对渲染结果应用空间滤波操作,滤波区域包括其他周围像素。例如,滤波可以应用于帧缓冲区中的图像。
游戏引擎,例如Unreal、Unity和CryEngine,通常会将3D场景渲染到帧缓冲区中,然后立即对经渲染的图像应用一些后处理滤波器,以实现一些特殊的视觉效果(例如用于辉光效果的高斯模糊滤波器,或图像锐化滤波器),或应用抗锯齿滤波器,例如快速近似抗锯齿(Fast Approximate Anti-Aliasing,FXAA),详见https://en.wikipedia.org/wiki/Fast_approximate_anti-aliasing。
FXAA忽略多边形和线条边缘,并通过使用针对渲染帧的每个像素运行的像素着色器程序简单地分析屏幕上的像素。但是,其还需要访问3x3周围像素的局部邻域。如果其发现那些创建人工边缘的像素,则会将它们平滑掉。FXAA可以平滑屏幕上所有像素的边缘,包括那些在阿尔法混合纹理中的边缘,以及由先前通道的像素着色器效果产生的边缘,这些边缘对多重采样抗锯齿(Multi-Sample Anti-Aliasing,MSAA)免疫,但现在可以通过FXAA解决.
FXAA可以在桌面GPU上以非常快的速度运行,通常只需一两毫秒。由于桌面GPU具有高带宽专用视频存储器,因此用3D渲染通道生成图像,然后再用单独的2D后处理通道以滤波经渲染的图像,这并不是问题。但是,对于没有这种专用视频存储器的移动设备的GPU,通常情况并非如此。
这些后处理滤波程序不仅需要访问当前处理的像素,还需要访问具有滤波尺寸为3x3、5x5甚至更大的局部邻域范围内的一些相邻像素。图1示出了应用于图像的3x3滤波操作,其中,从DDR读取局部邻域中的9个像素以滤波当前像素,如101所示。
这可能会导致没有专用视频存储器的移动设备的GPU出现带宽问题,因为执行3D渲染和将中间帧缓冲区输出到DDR(double data rate memory,双倍数据速率存储器)过程中涉及两个渲染通道,然后是例如FXAA的后处理通道(具有3x3像素占用空间),其中,每个像素必须从DDR多次读取到GPU中以执行滤波操作。
现代移动设备的GPU通常使用基于图块的渲染,其中,一次将一个图块的像素渲染到片上图块缓冲存储器中,这比片外***存储器要快得多。因此,无法在单通道渲染或其(在Vulkan API的术语中的)多个子通道内访问周围像素。因此,出于后处理的目的,启动了第二个单独通道,如图2所示。
因此,现代游戏引擎通常使用两个通道来执行一个渲染,之后是一个后处理滤波通道,即,两个单独的渲染通道与DDR一起作为它们的数据连接。第一个通道将经渲染的帧缓冲区写入***存储器,然后第二个通道将其再次读入GPU以执行滤波。这种方法虽然灵活,但会消耗大量的***存储器带宽(尤其是读取带宽),从延迟和功耗两方面来说,这在移动设备上是非常昂贵的。因此,这种方法对于基于图块的移动设备的GPU并不友好。
EXT_shader_pixel_local_storage的OpenGL ES扩展也无济于事,因为它只允许访问存储在当前像素位置的值,但不允许访问局部邻域中的周围像素。
此外,基于图块的移动设备的GPU的另一个困难是,要使用大于1x1的滤波范围来对当前像素滤波,所需的周围像素甚至可能位于当前正在渲染的图块之外,并且可能位于其他可能尚未渲染的图块中,如图3所示。
总之,在基于图块的移动设备的GPU上执行3D渲染通道(以生成图像),之后用单独的2D后处理通道(以滤波经渲染的图像)的问题是***存储器中的经渲染的中间帧缓冲区需要被访问多次(对于3x3滤波器,需要写入一次并读取九次)以执行滤波。当访问片上***的***存储器中经渲染的中间帧缓冲区时,这可能会导致读取和写入带宽的延迟和功耗方面的高成本。特别是,对于任何实际的滤波器尺寸,例如3x3、5x5、7x7等,读取带宽都非常大。就每秒帧数而言,这也可能导致较低的渲染速度。
移动设备需要游戏的实时渲染性能,其具有高帧率和用户交互的低延迟,同时要求低功耗以延长电池寿命,同时还要求低散热以使用户握持舒适。
因此需要开发一种克服这些问题的方法。
发明内容
第一方面,提供了一种图形处理***,用于接收包括多个像素的输入图像,该***用于将输入图像划分为多个图块,每个图块包括输入图像的像素的子集,该***包括:存储器,用于存储图块组,该图块组是输入图像的多个图块的子集;以及处理器,其中,处理器用于,对于该图块组中的至少一个图块,执行包括以下步骤的处理通道:渲染图块;根据该图块组中的至少一个其他图块对该图块滤波;以及在存储器中存储经渲染和滤波的图块。
因此,通过在存储器中保留少量固定数量的数据,即,将整个帧图像的一小个子集存储在存储器中,将渲染通道和滤波通道组合成单个处理通道。因此,中间帧缓冲区不需要进入外部***存储器。与传统的两通道方法相比,这可能会导致更少的存储器带宽消耗,对外部存储器带宽的影响更小。
处理通道可以是包括上述渲染和滤波阶段的处理管线。从管线输出的经渲染和滤波的图块可以存储在存储器中。
存储器可以是片上存储器。存储器可以是高速缓存。该高速缓存可以是***级缓存或静态片上存储器。存储器可以与外部***存储器分开。将图块子集存储在高速缓存中可以减少渲染和滤波图块时的带宽消耗。
该图块组可以包括预定固定数量的图块。存储器可以为每个处理通道存储预定的固定数量的图块。
该***可以用于实现滑动窗口算法,从而针对处理器执行的每个处理通道保持该图块组中的固定数量的图块。滑动窗口调度算法可以利用少量固定数量的像素图块作为存储在片上存储器中的工作组,因此,当对最近渲染的图块组中的这些当前活动图块应用滤波操作时,在特定时间,只有(正在或即将要滤波的一些当前图块的)非常必要的邻近图块保留在片上存储器中。
该图块组可以包括至少一个未经滤波的图块。该图块组可以包括至少一个已经经渲染和滤波的图块。因此,该图块组可以包括当前正在滤波的图块的相邻图块。
***还可以包括调度器,用于以垂直或水平扫描线顺序对输入图像的图块的处理执行调度。这可能是调度图块的便捷方式。锯齿形顺序也可用于在较大的超级图块中调度小图块,然后使用扫描线顺序来调度大的超级图块。也可以使用这些不同调度顺序的任何其他可能组合。
该图块组可以包括输入图像的固定图块列数。该列数可以是3。这可以使得使用滑动窗口算法一次扫描图像的三列图块。
该图块组可以包括K个图块,其中,K至少为2*(NTC+1),并且其中,NTC是最终图像每列的图块数量。这可以使得将足够数量的图块存储在片上存储器中,从而可以在不需要访问DDR的情况下执行当前图块的滤波。K可以大于2*(NTC+1)。
可以同时执行该图块组中两个不同图块的渲染和滤波。这可以使得更快地渲染图像。
该***可以用于为每个处理通道存储不同的图块组。每个不同的图块组可包括预定固定数量的图块。
该处理器可以用于随后将经渲染和滤波的图像写入***存储器中的帧缓冲区。这可以使得显示最终图像。
该***可以由移动图形处理单元(移动设备的图形处理单元)实现。在移动设备中实现该***可能有助于实现游戏的实时渲染性能,其具有高帧率和用户交互的低延迟,同时具有低功耗从而延长电池寿命,同时还具有低散热使得用户握持舒适。
第二方面,提供了一种用于在图像处理***中处理包括多个像素的输入图像的方法,该***用于接收输入图像并将输入图像划分为多个图块,每个图块包括输入图像的像素的子集,该***包括存储器,用于存储图块组,该图块组是输入图像的多个图块的子集,该方法包括,在处理通道中,对于图块组中的至少一个图块:渲染该图块;根据该图块组中的至少一个其他图块过滤该图块;以及在存储器中存储经渲染和滤波的图块。
在该方法中,通过在片上存储器中保留少量固定数量的数据,将渲染通道和滤波通道组合成单个通道。将整个帧图像的一小个子集存储在片上存储器中。因此,中间帧缓冲区不需要进入外部***存储器。与传统的两通道方法相比,这可能会带来更少的存储器带宽消耗,对外部存储器带宽的影响更小。
该处理通道可以是包括上述渲染和滤波阶段的处理管线。从管线输出的经渲染和滤波的图块可以存储在存储器中。
该存储器可以是片上存储器。存储器可以是高速缓存。该高速缓存可以是***级缓存或静态片上存储器。存储器可以与外部***存储器分开。将图块子集存储在高速缓存中可以减少渲染和过滤图块时的带宽消耗。
第三方面,提供了一种计算机程序,当由计算机执行时,使计算机执行上述方法。该计算机程序可以提供在非暂时性计算机可读存储介质上。
附图说明
本发明现将参照附图以实例加以说明。
在附图中:
图1示意性地示出3x3滤波操作。
图2示意性地示出在移动GPU上处理图像所涉及的两个通道:第一个通道用于进行3D渲染到DDR中,以及第二个通道用于对从DDR读取的(数据)进行后处理滤波。
图3示意性地示出,对于2x2滤波,为了恰当的滤波,需要(获取)来自相邻图块的周围像素。
图4示出了一个渲染管线,其中,渲染通道和滤波通道都可以在处理器的仅一个单独通道内完成。
图5示出了高速缓存通常没有足够的存储空间来保存特定渲染应用的整个帧缓冲区。
图6示出了对图像得一个图块中的像素的滤波。
图7示出了在高速缓存中将固定存储大小的三列图块分配为活动工作组,以及如何为这三列图块(通过每次从左向右滑动一列)执行滑动窗口算法。
图8示出了将3D几何场景渲染到帧缓冲区的各个阶段。基于图块的移动GPU一般有两个阶段:用于几何处理的装箱阶段,和用于光栅化和像素着色的渲染阶段。
图9(a)到9(d)示出了使用第一滑动窗口算法的渲染和滤波过程的前四次迭代。
图10示出了用于第一滑动窗口渲染和滤波算法的示例性伪代码。
图11(a)到11(d)示出了使用第二滑动窗口算法的渲染和滤波过程的前四次迭代。
图12示出了用于第二滑动窗口渲染和滤波算法的示例性伪代码。
图13示出了用于处理输入图像的方法的示例的流程图。
图14示出了图形处理***的示例。
具体实施方式
在本文中,渲染是指生成可见图像的任何形式,例如,用于将图像显示在计算机屏幕上、打印或投影。
在示例性实施例中,描述了用于基于图块的移动设备的GPU(移动GPU)的两种滑动窗口算法,以便通过在存储器中保留少量固定数量的数据,例如缓冲模式下的高速缓存(high speed cache,HSC),而将3D渲染通道和空间滤波通道(例如,FXAA)组合成单个通道。
如图4所示,渲染通道和后处理滤波通道都可以在沿着GPU管线的一个渲染通道内执行。图4中的管线中所示的阶段是几何数据提交401、顶点着色器(vertex shader,VS)402、像素着色器(pixel shader,PS)403、渲染目标404和后处理过程405。渲染404和后处理滤波405在沿着GPU管线的单个通道中执行。
因此,中间帧缓冲区不需要进入***存储器。这可以节省大量数据带宽,而对外部存储器带宽的影响要小得多。这对于游戏引擎使用的各种渲染技术非常有用,在游戏引擎领域需要将后处理滤波应用于经渲染的帧缓冲区。
对于传统的基于图块的渲染器,例如,在移动GPU上,如果后续渲染操作在同一个像素图块内,并且如果只访问当前正在渲染的图块中的像素数据,则先前渲染操作的图块渲染结果可以有效地保留在片上。然而,在传统实现方式中,访问其他像素位置将需要当前图块之外的数据,这会破坏基于图块的渲染机制。
在Vulkan API中,渲染通道可以包含多个子通道,一个子通道可以访问该图块之前子通道的图块的渲染结果,这些结果在输出到外部***存储器之前仍保留在移动GPU的片上存储器中。这些多个子通道共享相同的图块排列,因此一个子通道可以访问之前一个子通道的结果,一次访问一个图块。但是,不允许访问(空间滤波所需的)其他周围图块的像素,因为其他图块可能已被移出片上存储器或可能暂时尚未被渲染。
如下文将更详细描述的,在本文描述的实现方式中,可以利用片上***(System-on-Chip,SoC)上的高速缓存(high-speed caches,HSC)来帮助滤波过程,以避免访问***存储器中的中间帧缓冲区(即,DDR)所需要的存储器带宽。
SoC上的HSC(可能是***级缓存,或静态片上存储器)价格昂贵,并且通常存储空间大小非常小。其也被多个应用程序共享。结果如图5所示,HSC通常没有足够的存储器空间来保存特定渲染应用程序的整个帧缓冲区。在图5中,经渲染的图像在501处显示,经滤波的图像在502处显示。DDR在504处显示。HSC 503太小,无法容纳一整帧。
这是因为在例如智能手机和平板电脑等现代移动设备上,由于高分辨率显示器(例如,4K或8K)和HDR像素格式(例如,16位或32位每色通道)的流行,帧缓冲区所需的存储空间大小变得越来越大。这意味着在图像的渲染过程中,***只能在HSC帧缓冲区中存储非常小子集的图块,而不是整个图像。
经渲染的中间帧缓冲区数据由滤波像素着色器或计算着色器(为每个单个像素位置执行一个GPU线程)读取,当处理每个单独像素和过滤(滤波)一组图块像素时,其仅访问周围像素的一小部分邻域,例如图6中图像600的图块601。因此,只需要访问当前图块周围的八个附加图块。这些图块与当前图块601一起显示在框602内。图像边界处的图块的周围图块(相邻)可能位于图像边界之外。然而,这对滤波来说不是问题,因为这些离群像素可以被钳制到图像边缘的像素,或者简单地被钳制为零。
如果在对当前图块601滤波时,可以将这八个周围的图块暂时保留在HSC中,那么这两个通道可以组合成单个通道,而中间帧缓冲区不需要进入***存储器。
在本文描述的两个示例性实施例中,实现了用于基于图块的移动GPU的两种滑动窗口解决方案,以便通过使用缓冲模式在HSC中保持少量固定数量的图块数据,而将3D渲染通道和空间滤波通道组合成单个通道。
对于帧缓冲区,在任何时刻固定数量的少量的图块作为HSC中的工作组(workingset,WS)被保存。工作组中的图块包括预定的固定数量的图块。
滑动窗口算法被执行以在WS中保持固定数量的活动图块,其中,WS中至少有一个图块(可能有多个这样的图块)可以用于滤波(即,已经被渲染),并且该图块的周围图块也在WS中。因此,WS图块包括至少一个未经滤波的图块和至少一个已经渲染和滤波的图块。***用于为每个处理通道存储不同的图块组。
GPU硬件按照垂直或水平扫描线顺序对基于图块的渲染顺序(一个接一个图块)进行调度。如下文将更详细描述的,***可以使用调度算法来允许调度两个作业(渲染和滤波)以协作和同步的方式在一个GPU上运行,以便将最小数量的图块存储在WS中。
在以下描述中,为简单起见,将假设GPU硬件以垂直扫描线顺序渲染图块。然而,也可以以水平扫描线顺序渲染图块。
现在将描述第一示例滑动窗口解决方案。
在此示例中,固定存储大小的三列图块被分配为HSC中的活动WS。通过从左到右一次滑动一列,将滑动窗口算法应用于这三列图块。在优选实施例中,以垂直扫描线顺序渲染和过滤(滤波)列中的图块。
如图7所示,701指示的浅灰色图块是已经经渲染和滤波的图块,并且已经被移出WS。702处显示的较暗的图块是当前存储在WS中的三列图块,其中,中间列可以进行滤波,因为其周围的所有图块都在WS中。703指示的白色图块是未经渲染且当前不在WS中的图块。
在优选实施例中,使用环形缓冲区来管理HSC中的WS的存储器。环形缓冲区包括三个插槽(即,插槽0(slot0)、插槽1(slot1)、插槽2(slot2))。每个插槽存储一列图块,其等于NTC个图块。
如果一个图块有32x32=1024个像素,即,(图块尺寸)TileSize=32个像素,那么它以RGBA8格式存储时,所需要的存储空间大小为4KB。如果(图像高度)imageHT=1080p,则则WS所需要的的存储空间大小为3*34*4KB=408KB。如果ImageHT=720p,并且TileSize=32像素,那么WS所需要的存储空间大小为3*23*4KB=276KB。
为了将3D几何场景渲染到帧缓冲区,基于图块的移动GPU通常具有两个阶段,如图8所示:用于几何处理的装箱阶段,如图所示一般在801,以及用于光栅化和像素着色的渲染阶段,如图所示一般在802。在图块的渲染阶段之后,在图块经渲染后***滤波任务(例如,通过为每个图块启动计算着色器或片段着色器)。
为了方便起见,可以为渲染阶段实施调度算法,以使得以同步方式在GPU上调度两个任务(每个图块的渲染和滤波)。这是为了允许通过使用滑动窗口算法以一定的顺序对每个图块进行渲染和滤波,从而使最小数量的图块存储在WS中,同时正在滤波的图块周围的图块在WS中是可用的。
在一个示例中,调度算法具有如下两个阶段。
在初始化阶段,帧的前三列图块被渲染并且这些经渲染的图块中的每一个被存储到WS的三个插槽中。然后,仅对图块的前两列执行滤波。
在迭代阶段,在每个迭代步骤中,通过沿扫描线方向一次向前滑动一列图块来执行以下算法步骤,这将使WS中的三列向前移动到图像的右侧。
在第一步中,最左边的列(即,slot0=(slot0+1)%3)被释放出WS中的存储空间,并且(具有三列的)WS滑动到右侧以呈现新的波前列图块并将这些新渲染的图块存储到WS的插槽2中。
在第二步中,仅对WS中的中间列(插槽1)图块执行滤波并将结果存储到DDR中,因为(中间列的)所有周围的图块现在都在WS中。
如果到达最后一列,则将其滤波并将结果存储到DDR中然后返回,否则重新开始第一个迭代步骤。
该过程的前四次迭代如图9(a)-9(d)所示。图9(a)显示了初始化阶段之后的WS状态,图9(b)-(d)显示了接下来的三个连续迭代。对于每次迭代,WS中的三列图块在901、903、906和909处以深灰色显示。这些是当前在每次迭代中经渲染或滤波的图块。浅灰色图块904、907和910是完成的图块(当前不在WS中),而白色图块902、905、908和911尚未处理(当前也不在WS中)。
每次滑动窗口迭代后WS的屏幕空间像素偏移量(沿扫描线方向)为:
x_offsetWS=(wavefront-2)*TileSize,
其中(波前)wavefront是WS中最右侧列的图块索引。
该算法的伪代码示例如图10所示。
可以为存储在WS的插槽1中的中间列以一列图块的粒度启动滤波作业,例如,使用一个着色器一起启动的1080x32像素。滤波作业可以由片段着色器或计算着色器定义,其在波前列(即插槽2)的渲染作业完成后延迟调度。
(由片段着色器定义的)渲染作业仍以图块粒度启动。即,沿波前列内的垂直方向一图块接一图块,结果存储到WS的slot2中。
在波前列的所有图块被渲染之后,可以为中间列***滤波作业,从而以交错的模式一列接一列地安排渲染作业和滤波作业。
GPU硬件(hardware,HW)可能需要修改以在滑动窗口算法的每次迭代中实现渲染作业和滤波作业的这种交错调度。在将整列(即,波前列)图块渲染并存储到WS中的插槽2中之后,对存储在WS中的插槽1中的整列图块启动滤波作业。这种调度可以由GPU HW(比驱动程序更有效)通过在渲染新的波前列图块之后***滤波作业来实现。
可以使用循环环形缓冲区来管理HSC中WS的存储器。HSC最好在缓冲模式下使用,这样可以保证预设的环形缓冲区(存储大小为3*NTC图块)永远不会被移出HSC,即,WS的每一位(比特)都将在渲染过程中一直停留在HSC中。
环形缓冲区包括三个插槽,每个插槽存储一列图块,即,NTC个图块。如果(图像高度)ImageHT=1080p,TileSize=32像素,NTC=「1080/32」=34。
每次滑动窗口迭代后,WS中的三列图块沿扫描线方向向图像末端移动一列,同时三个插槽在HSC内如下地循环移动一插槽:
slot0=(slot0+1)%3;
slot1=(slot1+1)%3;
slot2=(slot2+1)%3;
可以如下执行对相邻图块中的相邻像素的访问。当对存储在WS中的中间列图块执行滤波作业时,很容易计算周围图块以及被当前像素的滤波核覆盖范围内的像素的存储地址(在WS中)。因为WS只有三列,所以可以首先使用WS插槽中的图块索引找到所需的相邻图块,然后可以使用图块内像素偏移轻松找到其中所需的像素。
开发人员可以使用该着色器指令编写自定义滤波着色器:
vec4 textureOffset(gsampler2D samplerWS_in_HSC,vec2 pos,ivec2offset),其中pos是当前要滤波的像素位置;offset是当前像素的整数偏移量(例如,对于直径为5像素的滤波器,即,5x5滤波器,沿X和Y的偏移量可以是[-2,-1,0,1,2]);samplerWS_in_HSC是我们在HSC中(在缓冲模式下)具有三列图块的工作组。
编译器计算(在WS中的)地址以从HSC加载相邻像素。可以使用以下三个级别的索引计算在HSC中的缓冲区偏移地址:
·插槽索引(即,环形缓冲区的[0,1,2]):每个插槽指向HSC中的特定列(图块);
·图块行索引:每个指向某个插槽中(沿垂直方向)的一个图块(每个插槽都有一列图块:等于NTC个图块)。
·图块内偏移:即,图块内的XY偏移。在一些实现方式中,可能需要修改GPU驱动程序。可以为应用程序提供API扩展以使用此GPU功能(即,在单通道中的渲染+滤波组合)。开发者只需提供一个定制的滤波着色器。或者,GPU驱动程序可以直接管理所有内容,包括提供滤波着色器,用于某些特定的(后处理)PostProcessing,例如FXAA。然后,开发者只需启用/禁用此功能以将这些非常常见的后处理PostProcessing滤波器之一应用于渲染结果。
在第一个示例性滑动窗口解决方案中,由于存储在HSC中的三列图块的对齐,WS中的图块的存储器寻址很容易计算。这两个(用于渲染和滤波的)作业的HW调度通过交错模式实现非常简单。这两个作业(渲染和滤波)由HW以串行和交错模式调度。结果,一个作业在向前滑动到下一列之前等待另一个作业。在某些实现方式中,这种等待可能会为渲染作业引入管线气泡。
提出了一种替代的第二滑动窗口解决方案来解决在某些实现方式中由于必须相互等待的两个作业的交错调度而可能遇到的管线气泡问题。
在这个替代实现方式中,使用了一种更复杂的调度算法,其通过使用二进制信号量机制来同步这两个作业,使得渲染作业不需要等待滤波作业,从而允许在GPU上以并行方式而不是以串行和交错方式调度这两个作业(渲染和滤波)。在一些实现方式中,可以使用一些HW修改来实现所描述的二进制信号量信号发送机制,如下文将更详细描述的。
在第二种滑动窗口实现方式中,仍然为HSC中的WS分配了固定数量的图块的存储空间大小。代替三列图块,K个图块始终(在缓冲模式下)存储在HSC中,其中,K是预设值,其最好至少为2*(NTC+1),其中,NTC是最终图像每一列上的图块数量。
优选地,使用环形缓冲区来管理这K个图块的存储以便存储WS。环形缓冲区只管理K个插槽,其中,每个插槽只存储一个像素图块。在滑动窗口迭代期间,WS可以随着更多的图块添加到其中而变得更大,但它不应大于K个图块,否则环形缓冲区将会溢出。
滑动窗口算法沿垂直扫描线顺序一次滑动一个图块,可用于调度渲染作业和滤波作业。在此实现方式中,在每个迭代步骤中仅滑动一个图块,而不是在每个迭代中滑动一列图块,如第一个示例中所示。
图11(a)-11(d)示出了四个连续的迭代步骤,其中WS已被分配了HSC中的存储大小的K个图块的存储空间。图块1101、1102、1103和1104(以下称为每次迭代的“当前图块”)和框1105、1106、1107和1108内的周围灰色图块当前在WS中并且在当前迭代步骤中正在被处理(经渲染或滤波),WS左侧的浅灰色图块是完成的图块(当前不在WS中),而WS右侧的白色图块尚未被触及,在未来的迭代步骤中将滑动进入WS中(当前也不在WS中)。
在第二个滑动窗口算法的每个迭代步骤中,在环形缓冲区中跟踪三个图块插槽索引,如下所示:
插槽0(slot0):指向波前图块,即,WS中的第一个灰色图块。它也是最近渲染的图块,以垂直扫描线顺序向前移动。
插槽1(slot1):指向(以深灰色显示的)“当前”,这是唯一准备好滤波的图块;
插槽2(slot2):指向尾部图块,即,WS中的最后一个灰色图块。
每当一个新的波前图块(即,插槽0)完成其渲染工作时,可以执行检查以确定当前图块(即,插槽1)是否可以开始执行其滤波工作。例如,当其到波前图块的滞后距离大于(NTC+1)时,它可能会进行滤波。否则,当前图块的滤波作业会在向前滑动到下一个图块之前等待。这是为了确保当前图块在执行其滤波作业之前,其周围的所有图块都已在WS中可用。
因此,第二个滑动窗口算法是一种更复杂的硬件调度算法,它可以通过使用二进制信号量信号发送机制,以并发方式而不是串行方式调度两个作业(渲染和滤波)。渲染作业可以向滤波作业发送信号以指示滤波作业对当前图块(即,WS中的插槽1)执行滤波是安全的(因为需要滤波的所有图块都存在于WS中)。同时,渲染作业可以(通过向前滑动到下一个图块,以垂直扫描线顺序渲染一个图块)按照自己的渲染节奏不断前进,而无需停止并等待滤波作业。同时,滤波作业等待来自渲染作业的新信号量信号,其指示滤波当前图块是安全的。之后,它可能会执行滤波操作,然后向前滑动到插槽1中的下一个图块。
请注意,(在波前图块处的)渲染作业不需要等待,而滤波作业确实需要等待(从它到波前图块)一定的滞后距离才能向前滑动。
当前图块完成滤波并滑动到下一个图块后,可以进行检查以确定尾部图块与当前图块的距离是否大于(NTC+1)。如果是这样,则尾部图块可以被移出WS并且它的插槽索引可以向前滑动以指向下一个图块。
通常,由于游戏引擎使用的复杂着色方程(例如基于物理的渲染),渲染图块比滤波图块要慢。因此,在这个例子中,WS中的有效图块的数量(通常可以等于slot0-slot2+1,即,波前图块和尾部图块之间的图块索引距离)不大于K。在一种实现方式中,K是为环形缓冲区预设分配的存储空间大小。在这个例子中,如果上述条件不成立(即,如果WS中的图块数量大于K),则环形缓冲区可能已满并且可能溢出(即,当(slot0+1)等于slot2)。如果发生这种情况,可能是K的预设值太小,可能需要在HSC甚至***存储器中分配额外的存储空间,以容纳更大的环形缓冲区。为了避免使用额外的存储,GPU硬件调度器可能会为滤波作业分配更多的计算单元(着色器核),以使其运行更快,从而能够赶上渲染作业的节奏,并且(插槽0和插槽2之间的)滞后距离不会大于预设的K,因此环形缓冲区不会溢出。为了避免这种情况,优选地,K应该大于2*(NTC+1)。slot0-slot1通常等于NTC+1,slot1-slot2通常也等于NTC+1,如图11的1107和1108所示。因此,K最好至少为2*(NTC+1)+1以避免环形缓冲区变满和溢出。
第二种算法的示例性伪代码如图12所示,其中,两个作业(渲染和滤波)在同一个GPU上同时运行,并由硬件通过使用二进制信号量信号机制以同步方式进行调度。
使用这种信号量机制,只要波前图块(插槽0)和当前图块(插槽1)之间的插槽索引距离(在环形缓冲区中)大于(NTC+1),渲染作业就会向滤波作业发送信号量信号。同时,滤波作业等待来自渲染作业的新信号量信号,其指示滤波当前图块是安全的(因为所有所需的相邻图块都存在于WS中),并且在接收到信号后,可以对当前图块滤波,然后***向前滑动到下一个图块进行滤波。
因此,在第二示例性解决方案中,在HSC中维持固定预设数量K个图块作为环形缓冲区,其中K应该优选地至少为2*(NTC+1),以存储WS中的所有图块。由于HSC中存储着由K个图块构成的池,HSC中的存储对齐仍然很容易,因此存储空间中以存储大小为一个图块的粒度对齐。环形缓冲区的存储大小很小且固定:在任何时候,最多K个图块存储在HSC中。
很容易处理WS中的图块并访问相邻图块中的相邻像素进行滤波。当对当前图块执行滤波作业时,很容易计算对当前像素的滤波操作的所覆盖的周围图块和像素(在WS中)的存储地址。WS的存储空间是通过使用带有K个图块的环形缓冲区来管理的,其中,每个图块在WS中都有一个插槽索引。因此,首先可以使用该相邻图块与当前图块之间(在WS中)的插槽索引距离找到所需的相邻图块,然后可以使用图块内像素偏移量找到该图块内所需的像素。
例如,WS中的当前图块(即,插槽1)的八个相邻图块的插槽索引可以计算如下:
·其左上角相邻图块的插槽索引可以计算为:slot1-(NTC+1);
·其左侧相邻图块的插槽索引可以计算为:slot1-NTC;
·其左下角相邻图块的插槽索引可以计算为:slot1-(NTC-1);
·其顶部相邻图块的插槽索引应该为:slot1-1;
·其底部相邻图块的插槽索引应该为:slot1+1;
·其右上角相邻图块的插槽索引可以计算为:slot1+(NTC-1);
·其右侧相邻图块的插槽索引可以计算为:slot1+NTC;
·其右下角相邻图块的插槽索引可以计算为:slot1+(NTC+1);
这两个作业(渲染和滤波)的HW调度允许以并行方式调度这两个作业。因此,渲染作业可以通过一次向前滑动一个图块来按照自己的节奏不断前进,而无需等待滤波作业。因此,这不会引入渲染管线气泡,因此渲染作业可以连续运行一个又一个图块而不会停止。
例如,滤波作业可以是片段着色器或计算着色器。这两种操作都是可能的,因为滤波作业以图块的粒度执行。
本文所述的渲染解决方案的主要优点如下所述。
(渲染后的)中间帧缓冲区不需要进入***存储器。对于7x7滤波器(滤波程序),这可以节省高达49x的读取带宽,并节省1x的整个帧的写入带宽。
对于3x3滤波核(滤波程序),节省的大致带宽(bandwidth,BW)如下:
·保存在读取BW中:每帧高达9x1080x1920像素;
·保存在写入BW中:每帧1x1080x1920像素;
·在60FPS时,BW节省高达每秒10x2Mx60像素,例如,RGBA16F像素格式为1200Mx8Byte=96GB/S。这是一个巨大的带宽节省。
滤波核可以大到(2*TileSize+1)x(2*TileSize+1)。例如,如果TileSize=32,则滤波程序大小可以从3x3到65x65。
渲染一帧后,游戏引擎可以将许多不同的后处理滤波程序应用于经渲染的帧缓冲区。此处描述的解决方案可以至少支持以下后处理滤波程序,而无需将中间帧缓冲区存储到外部***存储器:Nvidia的FXAA:3x3,辉光效果滤波程序:7x7,高斯模糊滤波程序:3x3、5x5、7x7、超分辨率滤波程序:7x7,AMD的CAS滤波程序:3x3以及4x4,色差,景深:根据到焦点的距离应用模糊效果,运动模糊:使用可变模糊大小根据其运动模糊对象,双立体滤波:4x4,以及更多空间滤波程序,或应用于经渲染的帧缓冲区的任何其他后处理,这些后处理使用相邻像素的值来计算当前像素的新值。
除了两个GPU作业(渲染和滤波)的基于图块tile的调度,还可以使用其他像素块(超级图块supertiles,或图块的层次结构hierarchyoftiles)的粒度作为作业调度的单位,并且这种粒度也可以用于环形缓冲区存储空间插槽管理。
还可以使用其他类似的滑动窗口算法,其利用少量固定数量的像素图块作为存储在HSC中的WS,以便当对(WS中)最近经渲染的这些当前活动图块应用滤波操作时,在特定时间,只有(当前正在滤波的一些图块的)必要的相邻图块缓存在HSC中。
可以使用其他图块调度顺序。如上所述,可以使用垂直和水平扫描线顺序。锯齿形顺序也可用于在大的超级图块中调度小图块(例如,四个图块),然后使用扫描线顺序来调度大超图块(big-supertiles)。也可以使用这些不同调度顺序的任何其他可能的组合。
图13示出了一个流程图,详细说明了一种用于在图像处理***处处理包括多个像素的输入图像的方法,***用于接收输入图像并将输入图像划分为多个图块,每个图块包括输入图像的像素的子集,该***包括:存储器,用于存储图块组,图块组是输入图像的多个图块的子集。方法包括,在处理通道中,对于图块组中的至少一个图块执行如下步骤1301-1303。在步骤1301,该方法包括渲染图块。在步骤1302,该方法包括根据一组的至少一个其他图块对该图块滤波。在步骤1303,该方法包括在存储器中存储经渲染和滤波的图块。
图14是用于执行本文所述的方法的***1400的示意表示。***1400可以在诸如笔记本电脑、平板电脑、智能电话、TV等设备或将在其中处理图形数据的任何其他设备上实现。该***优选地由移动GPU实现。
***1400包括用于处理数据的图形处理器1401。例如,处理器1401可以为GPU。可替换地,处理器1401可以实现为在诸如GPU或中央处理单元(Central Processing Unit,CPU)等的可编程设备上运行的计算机程序。***1400包括被布置成与图形处理器1401通信的片上存储器1402。***可以包括多于一个的处理器和多于一个的存储器。存储器可以存储可由处理器执行的数据。处理器可以用于根据以非暂时性形式存储在机器可读存储介质上的计算机程序进行操作。计算机程序可以存储用于使处理器以本文描述的方式执行其方法的指令。处理器还可以将数据写入外部***存储器(图14中未示出)。
总之,上面描述了用于移动GPU的渲染管线,其通过HSC在单通道为基于图块的移动GPU实现渲染和后处理滤波。
通过在缓冲模式下的高速缓存(例如,***级缓存或静态片上存储器)上保留少量固定数量的数据,将3D渲染通道和空间滤波通道(例如,FXAA)组合成单通道。该方法利用移动GPU上的HSC存储器的优势来存储整个帧图像的一小个子集。因此,中间帧缓冲区不需要进入外部***存储器。与传统的双通道方法相比,这可能会导致更少的存储器带宽消耗,对外部存储器带宽的影响更小。
所描述的滑动窗口调度算法利用少量固定数量的像素图块作为存储在HSC中的工作组,以便当对WS中最近渲染的这些当前活动图块应用滤波操作时,在特定时间,只有(正在或即将要滤波的)必要的周围图块保留在HSC中。
如上所述,在第一描述的示例中,三列图块作为环形缓冲区被保存在HSC中。通过一次向前滑动一列新的图块,渲染作业和滤波作业以串行模式保持。调度粒度是每个迭代步骤中的一列图块。在第二个所描述的示例中,在HSC中保存K个图块(其中K至少为2*(NTC+1))作为环形缓冲区。图块被逐一渲染,例如以垂直扫描线顺序,而无需等待。跟踪三个插槽索引以分别追逐波前图块、当前图块和尾部图块。信号量机制用于同步渲染作业和滤波作业,使渲染作业无需等待滤波作业。调度粒度是每个迭代步骤的一个图块。
所提出的解决方案只需要处理器的单个渲染通道即可完成渲染和对帧缓冲区的后处理滤波。这些解决方案可以扩展为支持许多不同的后处理,这些后处理应用于经渲染的帧缓冲区,其使用一些相邻像素的信息来计算当前像素(例如FXAA)的新值,或者使用一些传统的空间滤波器(例如高斯蓝色滤波器),内核大小为(2*TileSize+1)x(2*TileSize+1),这意味着如果TileSize=32,滤波器大小可以从3x3到65x65。
对于十分常见的滤波器(例如FXAA)的特定API扩展(例如,Vulkan和GLES),可以直接在GPU驱动中实现,以便用户可以简单地启用该功能,并且驱动程序将设置所有其他相关内容。通用扩展可用于所有其他用户定义的滤波操作。用户可以提供自己定制的滤波着色器,供GPU编译并用于滤波工作。
因此,所述***可以通过在缓冲模式下的HSC中使用只需要存储少量固定数量的数据(整个帧的子集)的滑动窗口算法,将3D渲染通道和后处理滤波通道组合成移动GPU上沿图形管线的单个渲染通道,从而访问***存储器中的中间帧缓冲区,从而实现减少存储器带宽(读写)的目标。该方法可以通过避免中间帧缓冲区进入***存储器来减少所需的存储带宽量。这可能会导致更快的帧速率和更少的功耗。无需将每个图块的边缘像素和角像素执行繁琐且冗余的复制、寻址和存储到其八个相邻图块。DRAM的分页不是问题,因为在一个图块经滤波并需要写入DDR之后,可以利用HW的特殊端口将图块写入DRAM。
申请人在此独立地公开了本文所述的每个单独的特征以及这些特征中两个或更多个的任何组合,在一定程度上,不论这些特征或特征的组合能否解决任何本申请公开的问题,根据本领域技术人员的公知常识,基于本说明书,这些特征或特征的组合作为整体能够执行。这些特征或特征的组合不构成对权利要求的范围的限制。申请人指出本发明的各方面可以包括任何这样的单独特征或特征组合。鉴于前面的描述,对于本领域技术人员显而易见的是,可以在本发明的范围内进行各种修改。
Claims (15)
1.一种图形处理***(1400),用于接收包括多个像素的输入图像,所述***用于将所述输入图像划分为多个图块,每个图块包括所述输入图像的像素的子集,所述***包括:
存储器(503、1402),用于存储图块组(702、901、1105),所述图块组是所述输入图像的多个图块的子集;以及
处理器(1401),其中,所述处理器用于,对于所述图块组(702、901、1105)中的至少一个图块,执行包括以下步骤的处理通道:
渲染所述图块;
根据所述图块组(702、901、1105)中的至少一个其他图块对所述图块滤波;以及
在所述存储器(503、1402)中存储经渲染和滤波的图块。
2.根据权利要求1所述的***,其中,所述存储器是高速缓存(503),所述高速缓存是***级缓存或静态片上存储器。
3.根据权利要求1或2所述的***,其中,所述图块组包括预定固定数量的图块。
4.根据权利要求3所述的***,其中,所述***用于实现滑动窗口算法以针对所述处理器执行的每个处理通道保存所述图块组中固定数量的图块。
5.根据前述权利要求中任一项所述的***,其中,所述图块组包括至少一个未经滤波的图块和至少一个已经渲染和滤波的图块。
6.根据前述权利要求中任一项所述的***,其中,所述***还包括调度器,用于以垂直或水平扫描线顺序对所述输入图像的图块的处理进行调度。
7.根据前述权利要求中任一项所述的***,其中,所述图块组包括所述输入图像的固定列数的图块。
8.根据权利要求7所述的***,其中,所述列数为3。
9.根据权利要求1至6中任一项所述的***,其中,所述图块组包括K个图块,其中,K至少为2*(NTC+1),并且其中,NTC是最终图像每列的图块数量。
10.根据前述权利要求中任一项所述的***,其中,所述图块组中的两个不同图块的渲染和滤波是同时执行的。
11.根据前述权利要求中任一项所述的***,其中,所述***用于为每个处理通道存储不同的图块组。
12.根据前述权利要求中任一项所述的***,其中,所述处理器用于随后将经渲染和滤波的图像写入***存储器(504)中的帧缓冲区。
13.根据前述权利要求中任一项所述的***,其中,所述***由移动图形处理单元实现。
14.一种用于在图像处理***(1400)处处理包括多个像素的输入图像的方法,所述***用于接收所述输入图像并将所述输入图像划分为多个图块,每个图块包括所述输入图像的像素的子集,所述***包括存储器(503、1402),用于存储图块组(702、901、1105),所述图块组是所述输入图像的多个图块的子集,所述方法包括,在处理通道中,对于所述图块组(702、901、1105)中的至少一个图块:
渲染(1301)所述图块;
根据所述图块组(702、901、1105)中的至少一个其他图块对(1302)所述图块滤波;以及
在所述存储器(503、1402)中存储(1303)经渲染和滤波的所述图块。
15.一种计算机程序,当由计算机执行时,使所述计算机执行权利要求14所述的方法。
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
PCT/EP2020/075929 WO2022058012A1 (en) | 2020-09-17 | 2020-09-17 | Rendering and post-processing filtering in a single pass |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115943421A true CN115943421A (zh) | 2023-04-07 |
Family
ID=72560594
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202080102321.6A Pending CN115943421A (zh) | 2020-09-17 | 2020-09-17 | 单通道的渲染和后处理滤波 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN115943421A (zh) |
WO (1) | WO2022058012A1 (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115908102A (zh) * | 2022-08-23 | 2023-04-04 | 芯动微电子科技(珠海)有限公司 | 图形处理方法及*** |
CN115147579B (zh) * | 2022-09-01 | 2022-12-13 | 芯动微电子科技(珠海)有限公司 | 一种扩展图块边界的分块渲染模式图形处理方法及*** |
CN115660935B (zh) * | 2022-10-08 | 2024-03-01 | 芯动微电子科技(珠海)有限公司 | 一种分块渲染模式图形处理方法及*** |
CN115330986B (zh) * | 2022-10-13 | 2023-02-03 | 芯动微电子科技(珠海)有限公司 | 一种分块渲染模式图形处理方法及*** |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6940511B2 (en) * | 2002-06-07 | 2005-09-06 | Telefonaktiebolaget L M Ericsson (Publ) | Graphics texture processing methods, apparatus and computer program products using texture compression, block overlapping and/or texture filtering |
US20080094406A1 (en) * | 2004-08-11 | 2008-04-24 | Koninklijke Philips Electronics, N.V. | Stripe-Based Image Data Storage |
-
2020
- 2020-09-17 CN CN202080102321.6A patent/CN115943421A/zh active Pending
- 2020-09-17 WO PCT/EP2020/075929 patent/WO2022058012A1/en active Application Filing
Also Published As
Publication number | Publication date |
---|---|
WO2022058012A1 (en) | 2022-03-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10957078B2 (en) | Enhanced anti-aliasing by varying sample patterns spatially and/or temporally | |
US10120187B2 (en) | Sub-frame scanout for latency reduction in virtual reality applications | |
US10229529B2 (en) | System, method and computer program product for implementing anti-aliasing operations using a programmable sample pattern table | |
US10535114B2 (en) | Controlling multi-pass rendering sequences in a cache tiling architecture | |
TWI616846B (zh) | 利用以空間及/或時間方式改變取樣圖案之增強型消鋸齒的一種圖形子系統、電腦實施方法及電腦裝置 | |
CN115943421A (zh) | 单通道的渲染和后处理滤波 | |
EP3286738B1 (en) | Apparatus and method for non-uniform frame buffer rasterization | |
EP3129958B1 (en) | Method for efficient re-rendering objects to vary viewports and under varying rendering and rasterization parameters | |
US9612839B2 (en) | Higher accuracy Z-culling in a tile-based architecture | |
US9734548B2 (en) | Caching of adaptively sized cache tiles in a unified L2 cache with surface compression | |
US7629978B1 (en) | Multichip rendering with state control | |
US9230363B2 (en) | System, method, and computer program product for using compression with programmable sample locations | |
US20110261063A1 (en) | System and Method for Managing the Computation of Graphics Shading Operations | |
US7605825B1 (en) | Fast zoom-adaptable anti-aliasing of lines using a graphics processing unit | |
US9720842B2 (en) | Adaptive multilevel binning to improve hierarchical caching | |
US10453168B2 (en) | Techniques for maintaining atomicity and ordering for pixel shader operations | |
US10430989B2 (en) | Multi-pass rendering in a screen space pipeline | |
CN103003839A (zh) | 反锯齿样本的拆分存储 | |
US10607390B2 (en) | Techniques for tiling compute work with graphics work | |
US9536341B1 (en) | Distributing primitives to multiple rasterizers | |
US10019776B2 (en) | Techniques for maintaining atomicity and ordering for pixel shader operations | |
US11880924B2 (en) | Synchronization free cross pass binning through subpass interleaving | |
US20240104685A1 (en) | Device and method of implementing subpass interleaving of tiled image rendering | |
GB2621195A (en) | Complex rendering using tile buffers |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |