图形处理器及其操作方法与流程

文档序号:11234822阅读:353来源:国知局
图形处理器及其操作方法与流程

本申请要求第62/303,889号美国临时申请和第15/420,463号美国专利申请的权益,所述美国临时申请的内容通过引用包含于此。

本发明的实施例总体上涉及在图形处理器中使用纹理高速缓存器的技术。



背景技术:

在图形系统中,纹理一般以压缩格式存储在纹理高速缓存器中。例如,块压缩格式(blockcompressedformat)可将4×4块的像素的颜色和透明度(alpha)压缩成64位(64b;8字节(8b))。在解压缩后,存在每个分量分别具有5位、6位和5位的2b的红色、绿色和蓝色(rgb)分量。因此,该压缩格式实现4的压缩因子(例如,针对4×4块的像素,(2b/像素×16像素)/8b=4)。

压缩格式节省了用于在多级存储器层次之间移动纹理所需的存储器需求和带宽。然而,存在许多与传统纹理高速缓存方法相关联的缺点和限制。



技术实现要素:

根据实施例的一方面,提供一种图形处理器,所述图形处理器包括:第一纹理高速缓存器,被配置为存储压缩的纹元数据;第二纹理高速缓存器,被配置为存储来自于第一纹理高速缓存器的已经解压缩的纹元数据;控制器,被配置为:接收针对一组像素的纹元数据的请求,针对请求的纹元数据调度对第一纹理高速缓存器或第二纹理高速缓存器的访问。

在一个实施例中,控制器还被配置为:确定第二纹理高速缓存器中是否存在针对请求的纹元数据的高速缓存命中或高速缓存未命中;响应于确定高速缓存未命中,针对请求的纹元数据而访问第一纹理高速缓存器;响应于确定高速缓存命中,针对请求的纹元数据而访问第二纹理高速缓存器。

在一个实施例中,数据基于在一组访问中出现的位置模式被组织到第二纹理高速缓存器中。

在一个实施例中,第二纹理高速缓存器具有被分组到高速缓存行中的纹元数据,其中,以莫顿次序组织与纹元的邻近的二维块对应的高速缓存行。

在一个实施例中,控制器还被配置为将所述请求分割成至少一个无冲突存储器访问的序列。

在一个实施例中,所述至少一个无冲突存储器访问不具有标签冲突或数据存储体冲突。

在一个实施例中,控制器还被配置为:基于每个存储体双字的数量和不同的高速缓存行的数量中的至少一个,组合满足一组约束的纹元请求。

在一个实施例中,控制器还被配置为:找到源于所述一组像素中的每个像素的纹元请求所需的高速缓存行地址;组合满足来自每个存储体不多于一个双字和不多于四个不同的高速缓存行的约束的纹元请求。

在一个实施例中,第二纹理高速缓存器具有4路堆积的标签查找和16路堆积的数据存储。

在一个实施例中,第二纹理高速缓存器中的纹元的布局被选择,以保证纹元覆盖区中的四元组纹元在不同的存储体上。

根据实施例的另一方面,提供一种操作图形处理器的方法,所述方法包括:将压缩的纹元数据存储在第一纹理高速缓存器中;将来自于第一纹理高速缓存器的已经解压缩的纹元数据存储在第二纹理高速缓存器中:接收针对一组像素的纹元数据的请求,针对请求的纹元数据调度对第一纹理高速缓存器或第二纹理高速缓存器的访问。

在一个实施例中,调度的步骤包括:确定第二纹理高速缓存器中是否存在针对请求的纹元数据的高速缓存命中或高速缓存未命中;响应于确定高速缓存未命中,针对请求的纹元数据访问第一纹理高速缓存器;响应于确定高速缓存命中,针对请求的纹元数据访问第二纹理高速缓存器。

在一个实施例中,所述方法还包括:将第二纹理高速缓存器中的纹元数据组织成区块,其中,在区块内以莫顿次序组织高速缓存行,使得纹元的邻近的二维块需要小于预定义数量的不同的高速缓存行和标签查找。

在一个实施例中,所述方法还包括:将所述请求分割成一组无冲突的访问的组。

在一个实施例中,无冲突的访问的组不具有标签冲突或数据存储体冲突。

在一个实施例中,所述方法还包括:基于每个存储体双字的数量和不同的高速缓存行的数量中的至少一个,组合满足一组约束的纹元请求。

在一个实施例中,组合纹元请求的步骤包括:组合满足来自每个存储体不多于一个的双字和不多于四个的不同的高速缓存行的约束的纹元请求。

在一个实施例中,第二纹理高速缓存器具有4路堆积的标签查找和16路堆积的数据存储。

在一个实施例中,第二纹理高速缓存器中的纹元的布局被选择,以保证纹元覆盖区中的四元组纹元在不同的存储体上。

在一个实施例中,基于在一组访问中出现的位置模式,将数据组织到第二纹理高速缓存器中。

附图说明

图1a是根据本发明的实施例的包括纹理高速缓存架构的图形处理系统的框图。

图1b更加详细地示出根据本发明的实施例的图1a的纹理高速缓存架构。

图1c示出图1a的支持astc编解码器的纹理高速缓存架构的实施例。

图2示出根据实施例的操作图形处理器的方法。

图3示出根据实施例的操作图形处理器的方法。

图4示出根据实施例的高速缓存数据和标签映射的示例。

图5示出根据实施例的具有无冲突访问的高速缓存数据和标签映射的示例。

图6示出根据实施例的四元组(quad)的3×3覆盖区(footprint)的高速缓存访问的示例。

图7示出根据实施例的四元组的2×2覆盖区的高速缓存访问的示例。

图8示出根据实施例的纹理高速缓存架构的子块的示例。

图9示出根据实施例的astc纹元覆盖区模式的示例。

图10示出根据实施例的用于组合纹元请求的地址产生控制的示例。

图11示出根据实施例的astc块大小和纹理高速缓存行边界的示例。

图12示出访问的序列下的astc块大小和纹理高速缓存边界的示例。

具体实施方式

图1a是示出根据实施例的图形系统100的框图。在一个实施例中,纹理高速缓存器单元110是图形处理器(gpu)106的部分。在一个实施例中,纹理高速缓存器单元110包括纹理高速缓存架构,下面将关于图1b对纹理高速缓存架构进行更加详细地描述。

在一个实施例中,gpu106可包括图形硬件,并实现包括例如一个或多个着色器核(shadercore)的图形管线(graphicspipeline)。外部图形存储器112可被提供用于存储额外的纹理数据。在一个实施例中,中央处理器(cpu)101和相关联的系统存储器102可包括用于驱动器软件104的计算机程序指令。总线可用于将cpu101通信地连接到gpu106,将系统存储器102连接到cpu100,并将gpu106连接到外部图形存储器112。

图1b更加详细地示出纹理高速缓存架构108的实施例。0级纹理高速缓存器(tc0)被提供用于未压缩的纹理数据(例如,纹元数据(texeldata))。在一个实施例中,tc0高速缓存器保持被组织成64b高速缓存行(cacheline)的解压缩的纹元,其中,由于整个高速缓存行存储在16个数据存储体上,每个4b段被存储在单独的数据存储体中。然而,将理解,可使用其他的高速缓存行大小和段大小。1级纹理高速缓存器(l1c)被提供用于压缩的纹理数据(例如,纹元数据)。

纹理解压缩器(td)布置在tc0和l1c之间。第一缓冲器和第二缓冲器被提供用于缓冲数据。虽然可以以不同的方式来实现缓冲器时,但是,在一个实施例中,这些缓冲器被实现为流先进先出(fifo),其中,流fifo包括第一缓冲器是第一fifo(流fifo1)并且第二缓冲器是第二fifo(流fifo2)的实现方式。流fifo1缓冲从l1c提供给到td的压缩的数据。流fifo2缓冲从td提供给tc0解压缩的数据。在一个实施例中,虽然流fifo使用总是利用新到来的条目替换最旧的条目的fifio替换方案,但是流fifo允许对任意条目的读取访问,而不是如普通fifo那样仅允许对最旧的条目的读取访问。

在一个实施例中,纹理地址单元(图1b中的虚线框所示)产生对四元组(四个像素的组)的一组访问,并将它传递到以地址产生控制器(agc)开始的纹理高速缓存架构108的前端180。在一个实施例中,agc将访问聚合成一组最小数量的无冲突标签访问和数据存储体访问。在一个实施例中,agc随后在tags单元中查找标签,其中,tags单元将未命中(miss)传递到地址计算单元。地址计算单元依次产生用于访问l1c高速缓存器中的压缩的纹理数据的地址。

在一个实施例中,在tc0高速缓存器中的高速缓存未命中的事件中,agc支持产生地址和标签(来自tags单元)的使用,以使用地址计算单元从l1c高速缓存器访问压缩的纹理数据。然后,压缩的纹理数据被缓冲在流fifo1中,在td中被解压缩,被缓冲在流fifo2中,然后被提供到tc0高速缓存器。

在一个实施例中,tc0高速缓存器提供解压缩的纹理数据的再次使用。响应于高速缓存命中,tc0高速缓存器的输出可例如被纹理滤波器(图1b中虚线框所示)使用,以计算像素的纹理。此外,如下面更加详细描述的,在一个实施例中,到fifo1和fifo2的读取指针可被控制来提高纹元数据的再次使用。在一个实施例中,控制块190或其他控制特征可,例如,被提供用于协调td的操作以及第一缓冲器(例如,fifo1)和/或第二缓冲器(例如,fifo2)的读取指针。

在一个实施例中,纹理高速缓存器单元110接受针对四元组(2×2像素组)的纹元数据的请求,并针对四元组中的每个有源像素(activepixel)产生滤波的纹元,这可包含在每个周期对于总共16个纹元针对每个像素访问4个纹元。

在一个实施例中,图形系统100具有在纹理内重组数据的灵活性。在一个实施例中,驱动器104将纹理数据重组,以最好地适合期望的请求模式(pattern)。由于着色器核为高度多线程来利用在图形应用中存在的自然的并行性,所以它们可以是延迟容忍的(latencytolerant)。此外,每个周期到达纹理高速缓存器的多个请求可以是相关的,因为它们对应于对单个四元组做出的纹元请求。

在一个实施例中,tc0高速缓存器中的数据的组织基于通用数据访问模式,以允许具有最小数量的数据存储体和标签查找的一组纹元访问的结果处理。在一个实施例中,基于在一组访问中存在的位置模式,数据被组织到tc0高速缓存器中,以提高tc0高速缓存器的高速缓存性能。例如,数据可以以混乱模式(swizzledpattern)存储在构成tc0纹理高速缓存器的数据存储的数据存储体中。此外,可能将被一起访问的数据可被一起组合到高速缓存行中,以减少不同的高速缓存行的数量和因此所需的不同的标签查找的数量。这里公开的示例的高速缓存架构支持每周期仅需要多达4次标签查找的操作,并且仅利用16个数据存储体。然而,将理解,在可选的实施例中可利用其他数量的标签查找和数据存储体。

参照图1c,额外地或可选地,实施例促进利用可变大小的块的纹理压缩方案(诸如,自适应可伸缩纹理压缩(astc)编解码器)。在一个实施例中,这可包括聚合器(cls)模块和控制块192,其中,聚合器(cls)模块用于聚合来自不同大小的块的解压缩的数据,控制块192具有用于控制cls、解压缩器和到缓冲器的读取指针的控制特征和用于支持可变大小的块(诸如,astc的可变大小的块)的使用的控制特征,将在下面进行更加详细地描述。

在较老的纹理压缩方案中,每个压缩块包含固定的二次幂个纹元,并以固定的块大小被存储。例如,先前描述的纹理压缩方案将4×4块的2b纹元压缩成8b,产生4的常数压缩因子。在每一维中的纹元的二次幂压缩大小和二次幂块大小的情况下,在2d纹理中包含texel(u,v)的压缩块的起始地址的计算仅包括对纹理的u、v和基地址的特定的移位操作。此外,在一个实施例中,解压缩的tc0中的高速缓存行包含单个或少量的二次幂压缩块的全部。在一个实施例中,压缩块不被分割成解压缩的高速缓存器中的多个高速缓存行。

astc纹理压缩方案可将范围从4×4纹元到12×12纹元的可变大小的块压缩成16b,以实现对取决于所需的质量的压缩因子的范围的支持。在这样的可变大小的块的情况下,地址计算可变得更加复杂。例如,7×5块可造成除以7的除法,以计算包含期望的纹元的压缩块的存储器地址。这样的除法可消耗有效区和功率。

在一个实施例中,tc0高速缓存器在未压缩域进行操作,其中,在未压缩域中使用纹元的未压缩的(u,v)坐标来标识纹元地址。响应于tc0高速缓存器中的未命中,在地址计算单元中计算未命中的未压缩高速缓存行的压缩块地址。

在一个实施例中,fifo1被改变大小以提高性能。当从l1c请求astc或其他压缩块时,l1c返回包含一组两个或更多个压缩块(例如,多个块的高速缓存行。例如,如果astc压缩块是16b并且高速缓存行是64b,则l1c返回四个压缩块。这些块中的一个或多个被保持在fifo1中。在纹理请求中给定访问的位置,当小的时间窗(temporalwindow)驻存在fifo1中时,td可在该小的时间窗内需要这些块中的一些。在这样的情况下,td可在没有向l1c做出另一请求的情况下直接从fifo1得到它,而在其他情况下它将不得不这么做,因此节省了访问l1c所需的功率并且潜在地提高性能。

在一个实施例中,fifo2可被改变大小以提高性能。当块被td解压缩时,td产生解压缩的纹元。但是,块中很多纹元可不被立即需要用于填充当前高速缓存行中的纹元。然而,可能存在来自tc0的需要这些纹元的其他高速缓存行未命中请求。在一个实施例中,解压缩的纹元可被存放在流fifo2中。如果的确需要一些纹元来满足随后的tc0高速缓存行填充,则从流fifo2得到它们,因而避免td对全部的压缩块的另一解压缩。

在一个实施例中,fifo1和fifo2的流fifo使用先进先出替换策略,消除对额外的替换策略管理状态的需要。在一个实施例中,流fifo还具有表示在全部的先前引用被处理后fifo的未来状态的标签。在一个实施例中,流fifo的一个方面为:流fifo在纹理地址流中得到短期空间位置。在一个实施例中,控制硬件检测fifo1中所需的压缩块或fifo2中的纹元组出现,并且计算分别从fifo1或fifo2访问它们的读取指针。也就是说,读取指针被控制为使用第一读取指针选择第一缓冲器内的单独的条目并且使用第二读取指针选择第二缓冲器内的单独的条目。控制读取指针的能力允许与访问l1c或td中的块的解压缩有关的潜在节省。

图2是示出根据实施例的方法的流程图。将压缩的纹元数据存储在第一纹理高速缓存器(例如,l1c高速缓存器)中(205)。将解压缩的纹元数据存储在第二纹理高速缓存器(例如,tc0高速缓存器)中(210)。接收针对一组像素的纹元数据的请求(215)。针对请求的纹元数据,将访问调度到第一纹理高速缓存器或第二纹理高速缓存器(220)。

图3是示出根据实施例的用于强调缓冲的方面的方法的流程图。接收针对第一组像素的纹元数据的第一请求(305)。从第一纹理高速缓存器(例如,l1c高速缓存器)获取请求的压缩的纹元数据(310)。在第一缓冲器中缓冲获取的压缩的纹元数据(315)。例如,第一缓冲器可包括fifo1。将第一缓冲器的输出提供给纹理解压缩器,以将一个或多个块的压缩的纹元数据进行解压缩(320)。在第二缓冲器中缓冲产生的解压缩的纹元数据(325)。例如,第二缓冲器可包括fifo2。将第二缓冲器的输出提供给第二纹理高速缓存器(例如,tc0)(330)。在一些实施例中,由第一缓冲器存储的一个或多个块的压缩的纹元数据除了请求的纹元数据还包括第二纹元数据。在一些实施例中,存储在第二缓冲器中的一个或多个未压缩的纹元组除了请求的纹元数据还包括第三未压缩的纹元数据。该第三纹元数据被用于组成由tc0高速缓存器在以后的处理中所请求的未压缩的高速缓存行的纹元数据的部分。

图4示出根据实施例的tc0高速缓存器中的高速缓存数据和标签映射。在一个实施例中,在与针对代表示出的4个像素(p0、p1、p2和p3)的2d纹理的16个请求对应的每个周期处理16个请求,其中,该16个请求被映射到属于四元组的纹元空间。例如,每个像素与四个请求关联,该四个请求对应于纹元空间中的单位正方形的角,因此在坐标(u,v)、坐标(u+1,v)、坐标(u,v+l)和坐标(u+l,v+1))。通过在tc0级布置高速缓存行内的数据以在纹元空间包含正方形(或近似正方形)区域,针对特定像素的这四个请求位于针对大部分的高速缓存行内,多个1b/2b请求甚至可以在很多情况下在双字(4b)内同位。

图4示出如何在以0…9、a…f的16进制编号的16个存储体中布局纹元数据的示例。一组16个纹元(0…9、a…f)被包含在具有标签存储中的单个标签的一高速缓存行中。纹元的4×4正方形集合(被示出为包含十六进制数字0…9、a…f的正方形)被映射到编号为cl0至cl15的各个高速缓存行。为了示出的目的,纹元内的数字表示保持数据的存储体。在这个示例中,高速缓存行的标签包含在tb<编号>所指示的标签存储体中。为了示出的目的,具有粗体轮廓线的纹元正方形示出用于计算像素的滤波的纹理值的纹元(例如,针对像素p0的cl0tb0中的纹元0、1、2和3;针对像素p1的cl4tb0中的纹元a和b以及cl5tb1中的纹元0和1;针对像素p2的cl2tb2中的纹元6、7、c和d;针对像素p3的cl3tb3中的纹元c、d、f和f)。

图4示出在纹元数据大小是4b时如何将高速缓存行映射到四个标签存储体(tb0、tb1、tb2和tb3)的示例。在此情况下,纹理是大小均为4b的纹元的二维(2d)阵列。在一个实施例中,驱动器和纹理解压缩器如图所示地进行协调以布局数据。每个高速缓存行的16个正方形中的每一个表示一个纹元,纹元内的数字表示保持数据的存储体。注意,在一个实施例中,与利用一维或其他维的位置的传统布局不同,可以以z次序(z-order)或莫顿次序(morton-order)来布局数据,以利用二维的位置。z次序(也称为莫顿次序)是映射多维数据同时保持数据点的位置的函数。

标记的正方形(p0、p1、p2、p3)指示来自纹理请求的四元组的四个像素映射到纹元空间中的位置。注意,虽然它们倾向于被映射到纹元空间中的正方形,但是它们也可被映射到纹元空间中的任何区域。接近每个像素的具有粗体轮廓线的框中的纹元正方形指示用于执行双线性滤波或加权平均以计算滤波的纹理值的纹元。

在图4的这个示例中,每个像素使用非重叠的四个纹元,因此需要从高速缓存器获取总共16个纹元。这可表示罕见的极端情况,但一般被选择来示出tc0高速缓存器的操作。

在一个实施例中,tc0高速缓存器的操作可根据高速缓存器实现方式考虑对纹元访问的一个或多个约束。在一个实施例中,tc0高速缓存器被配置为在数据访问期间从每个存储体访问至多一个单独的纹元。然而,在图4的示例中,每个像素需要从特定存储体访问纹元数据。例如,像素p2和p3访问被映射到存储体c和d的纹元,使得在数据访问期间从每个存储体访问的至多一个单独的纹元的约束的情况下,针对像素p2和p3的访问在至少两个周期发生。可能的约束的另一示例是对tc0高速缓存器的可对标签存储体做出不多于一个标签访问的约束。

可由agc考虑对纹元访问的任何约束,以组织纹元访问的序列。在一个实施例中,图1b中示出的agc用于将四元组的访问分成多组,使得每组访问可在没有数据存储体冲突或标签存储体冲突的情况(如果应用了那个约束)下被执行。在一个示例中,由于针对图4的像素p0和p2的访问包含无冲突的高速缓存行cl0和cl2的标签存储体tb0和tb2以及无冲突的p0的数据存储体(0、1、2、4)和p2的数据存储体(6、7、c、d),agc可在一个周期中调度针对图4的p0和p2的访问。类似地,针对p1和p3的访问仅包含针对像素p1和p3的无冲突的标签存储体tb0、tb1和tb3以及无冲突的数据存储体(a、b、0、1)和(c、d、e、f)。

虽然四元组的四个像素可映射到纹元空间的任意位置,但是它们可在纹元空间倾向于靠近。尤其,使用适当地mip映射(mip-mapped)的表面,纹元空间中的四元组的像素之间的距离针对双线性采样倾向于小于1.5,针对三线性采样的较高/较低mip级分别倾向于小于l.0/2.0。

图5示出根据实施例的对16个纹元的无冲突访问。图5表示访问代表单个四元组的16个纹元的场景,其中,可在单个周期访问全部的16个纹元。当四元组的像素被映射到纹元空间中的位置之间在纹元空间中水平和垂直分离时,覆盖区(或布局)是用加粗轮廓线示出的一组4×4的纹元。正方形p0、p1、p2和p3表示像素在纹元空间中的位置,可看出针对全部四个像素的一组四个邻近的纹元的并集是随后被称为纹元覆盖区(texelfootprint)的一组4×4的纹元(具有加粗轮廓线)。

在图5的情形中,纹元覆盖区中的纹元分布在四个高速缓存行上,并且这些高速缓存行依次映射到四个不同的标签存储体。因此,可在没有存储体冲突的情况下并行访问标签。尤其,加粗的纹元正方形的编号全都不同;没有两个加粗的正方形具有指示它们映射到相同的数据存储体的相同的编号。因此,可以以无冲突方式访问全部的16个纹元。通常,不管4×4纹元覆盖区的位置如何,全部的16个纹元将被映射到不同的存储体,这些纹元还映射到至多四个高速缓存行,其中,该至多四个高速缓存行映射到不同的标签存储体。因此,不管4×4纹元覆盖区的位置如何,存在无冲突访问。针对这种情况,agc查看纹元覆盖区,并在这样的情况下将全部的标签访问和数据存储体访问调度到单个周期。

图6示出在执行双线性滤波时的用于合适地mip映射的纹理的纹元覆盖区的实施例。当纹元空间中的间距大约是1.5个纹元时,像素倾向于共享相同的纹元,因此,纹元覆盖区通常是如图6中所示的3×3。在这种情况下,具有加粗的轮廓线的9个纹元具有不同的编号,指示在覆盖区中没有两个纹元映射到相同的存储体。此外,全部的9个纹元属于被映射到不同的标签存储体的两个高速缓存行中的一个高速缓存行。与之前相同,不管3×3覆盖区的位置如何而应用这些观察。

在一些情况下,像素可能在纹元空间中被扭曲。例如,纹元覆盖区可能是斜的,或者另外不是水平/垂直对齐(align)。即使在这样的情况下,假设内部像素间距小于1.5个纹元,也可以以无冲突访问方式访问全部的纹元。

图7示出根据实施例的四元组的最小的2×2覆盖区。图7示出在像素映射到纹元空间中的如此小的区域使得纹元覆盖区被减小为最小的2×2覆盖区(即,具有加粗的轮廓线的四个纹元)时的纹元覆盖区。例如,这可发生在进行三线性滤波时的更高(较不详细的)mip级。可使用被映射到不同的存储体的四个纹元以无冲突方式处理该覆盖区,并且全部的四个纹元可属于单个高速缓存行。

相应地,在一个示例实施例中,tc0高速缓存器支持每周期4次标签查找。每个64b的tc0高速缓存行被映射到均为32b宽的16个存储体。每个存储体具有单个读取端口。如果四元组的请求需要对每个存储体进行多于一次的访问或者需要多于四次的标签查找,则请求被分割在多个周期,从而在每个周期满足这些约束。

此外,为了向很多种情况提供好的性能,在一个实施例中,驱动器组织存储器中的纹理数据,硬件解压缩器还布置tc0高速缓存行中的数据以最小化数据存储体冲突和标签查找。在一个实施例中,纹理数据被组织成区块,其中,在区块内,通过驱动器以莫顿(z)次序组织高速缓存行,使得纹元的邻近的正方形块需要最小数量(即,低于预定义数量)的不同的高速缓存行和标签查找表。因此,在一个实施例中,只要代表四元组的四个像素的纹理请求映射到区块内的2×2块的高速缓存行,就不再需要多于四次的标签查找。

在一个实施例中,使用64b的tc0高速缓存行大小,普通2b/纹元纹理中的每个高速缓存行保持8×4块的纹元。因此,2×2块的高速缓存行保持16×8块的纹元。四元组的纹元覆盖区可以是3×3纹元块。使用合适的mip映射,最大期望的纹元覆盖区是在纹元空间中具有2个纹元的内部像素距离的以45度定向的四元组。在16×8的纹元包含在2×2块的高速缓存行中的情况下,这样的纹元覆盖区是(2√2+1=)3.8×3.8块。因此,针对很多情况可避免存储体冲突。

在一个实施例中,在请求未被合适地mip映射的事件中,原始的纹理请求被分割成多个请求。在通常情况下,纹理高速缓存器以利用这些请求的期望属性传递高带宽和高功率效率二者的高效方式来处理16个请求。

图8示出根据实施例的纹理高速缓存架构的部分的子块。在图6中省略l1c高速缓存器。在一个实施例中,l0数据存储被提供给tc0高速缓存器。在一个实施例中,l0数据存储对应于16个存储体,其中,每个存储体具有32字,每字具有32b。l0数据读取控制块和l0数据写入控制块控制来自l0数据存储的读取数据和写入数据。在一个实施例中,l0交叉开关(crossbar)用于输出纹元数据。l0读取延迟fifo从agc接收存储体地址。l0行和写入控制延迟fifo接收从l0标签存储寻址的行。

在一个实施例中,第一输入801(来自纹理地址(ta)子单元(未在图8中示出))对应于多达16个地址。每个请求针对多达16个纹元,该16个纹元对应于2d纹理中的纹理基地址和16个(u,v)坐标。针对每个请求的纹理基地址由全部的16个纹元共享。每个四元组由四个像素构成,每个像素使用一对坐标coord_u和coord_v访问以单位正方形布置的四个纹元。在每对坐标中,coord_u[i][l]可以是除包围情况(wrappingcase)之外的coord_u[i]+1。针对3d纹理,每个像素访问以单位立方体布置的8个纹元,其中,单位立方体需要用于指定额外的维度的另一坐标coord_w。

在一个实施例中,从状态和输入获得来自ta单元的第一输入数据包上的剩余字段(field)。mip映射的宽度、高度和深度是纹理图像针对该请求在mip级的维度,并且需要mip映射的宽度、高度和深度来从提供的基地址计算偏移。在一个实施例中,纹理格式在具体的纹元大小下描述纹理图像的格式。在一个实施例中,格式的方面被顺流(downstream)td子单元使用。在一个实施例中,两个字段nr_samples和sample_idx用于多次采样的纹理访问。

在一个实施例中,纹元数据输出802由两个16纹元的组构成,其中,每个纹元为32b宽。针对大于32b的纹元大小,二次幂个输出被聚集在一起来发送单个纹元,该16纹元的组经由多个周期间被传递。

箭头803和804示出与l1c高速缓存器的交互。在tc0高速缓存未命中的事件中,向提供高速缓存行的虚拟地址的l1c高速缓存器做出请求。由于虚拟地址是48b,高速缓存行大小的log2是6b,所以这个地址是42b。作为响应,l1c传递64b数据。

在一个实施例中,agc接收用于指定16个纹理数据的总共16个坐标的四元组的四个像素的u、v、w维中的两个坐标位置。agc输出由从数据阵列访问纹理数据所需的多达四个标签请求、数据存储体的地址以及交叉开关控制位组成。

在一个实施例中,agc从纹理地址单元接收16个请求,并在tc0标签存储中产生标签查找。此外,agc产生用于针对16个存储体中的每一个选择四个行地址中的一个并且用于将32b的数据从每个数据存储体路由到输出端口的控制位。对于未命中立即更新标签,并将未命中发送到l1c高速缓存器。延迟数据访问,直到数据从l1c到达。延迟的访问请求被保持在延迟fifo中,并以按次序的方式被处理。可同时读取代表16个纹元的16个存储体。数据被路由到在输出交叉开关处的正确的纹元输出。

在一个实施例中,agc将这16个请求组织成最小数量的组(例如,一组),使得组内的纹元请求不访问多于四个的高速缓存行,从16个数据存储体中的每一个获取不多于一个4b。在一个实施例中,agc每个周期向l0标签存储提供多达四个标签。l0标签存储将多达四个标签写入到lo行和写入控制延迟fifo。在一个实施例中,聚合器(cls)和cls控制器被提供用于支持将解压缩的块聚合为标准形式大小。

在一个实施例中,数据写入控制块从聚合器接受到来的数据,并填充tc0数据阵列。lo数据读取控制块弹出由agc写入到l0fifo中读取数据(rd)以及读出多达四个高速缓存行和从这四个高速缓存行选择多达16个纹元的数据的坐标。tc0将多达16个纹元传递到纹理滤波器。

在一个实施例中,tc0高速缓存器参数是2kb大小、64b行大小、32行、4组以及8路组相联(8-wayset-associative)。在一个实施例中,使用总共40+28=68b的40b基地址和针对2d纹理均为14b的u、v坐标的级联(concatenation)来对tc0高速缓存器进行寻址。但是,3d纹理具有均为11b的三个坐标,因而需要对纹元空间中的40+33=73b的地址宽度的支持。然而,考虑到在区块中最小纹元块是2×2×1,并且在每个轴的区块中的纹元的数量是2的幂,u、v坐标将一直是偶数。没有必要将u、v坐标的最低有效位(lsb)1位存储为标签。这留下71b的标签位。每周期存在总共四个到来的标签,其中,全部的四个到来的标签可指向特定的标签存储体。每个标签存储体具有充足的比较器和其他资源,以支持对多达四个到来的标签进行标签匹配。将每个到来的71b标签地址与全部的8个71b标签进行并行比较。如果匹配,则将5b行地址向下发送到读取标签延迟fifo。

对于未命中,未命中的地址被发送到l1c高速缓存器。在一个实施例中,四个高速缓存行请求中的每一个可未命中高速缓存,导致在一个周期中产生最大的四个未命中。对于未命中,针对那个存储体的相应的data_ram_line_miss位被设置。组中的八行中的一行被选择用于替换,并且使用新的标签重写的它的标签。在一些情况下,可能存在对替换的标签的未决定请求,但是当已经针对这些请求的行地址执行查找时,这意味着在第一次使用之前以及因此在任何未决定请求之后立即仅重写高速缓存行是可能的。使用流高速缓存器结构,即使在已经从数据ram读出相应的数据之前也可重写标签。

在一个实施例中,基于位置的替换策略被采用,以最大化地利用纹理访问中的空间位置。当将输入71b标签与高速缓存器组中的标签进行比较时,还确定差别是否仅在坐标分量的较低位。首先在高序位的未命中标签中选出受害者(victim)。当不存在高序位的未命中标签时,在低序位的未命中标签中选出受害者。在一个实施例中,在相同的优先组中使用随机选择。通过下面的准则检测低序位的未命中。如果基地址存在差别,则它是高序位的未命中。另外,针对切片结构的2d纹理和3d纹理:如果差别仅在每个u、v坐标分量的lsb6个位中,则它是低序位的未命中。针对3d块结构的3d纹理:如果差别仅在每个u、v坐标分量的lsb4个位中,则它是低序位的未命中。否则,它是高序位的未命中。

如在图8中所示,在一个实施例中,流fifo1(lsf用于表示它正在从l1高速缓存器接收数据)保持从l1c传递的可能被压缩的高速缓存行。td将压缩的纹元的块解压缩成解压缩的高速缓存行。流fifo2(dsf用于表示它正在从解压缩器接收数据)保持这些解压缩的高速缓存行。tc0保持被组织到64b高速缓存行中的解压缩的纹元,其中,因为整个高速缓存行被存储在16个数据存储体,每个4b段被存储在单独的数据存储体中。

在一个实施例中,每个解码的rgbaastc纹元占用8字节的空间(浮点,针对每个分量16),允许tc0高速缓存行(64b)保持被组织为具有4列2行的4×2块的8个未压缩的纹元。每个压缩的8bastc块包含5×5压缩的纹元。对于未命中,tc将请求一个4c×2r(4列2行)未压缩的纹元的网格。根据未压缩的网格如何映射到压缩的as'tc网格上,4c×2r网格可映射到多个(1至4)压缩的astc块。

在一个实施例中,cls和关联的控制特征用于产生可被加载到l0数据存储中的未压缩的纹元数据的对齐块。这对于如存在于astc中的非二次幂块大小尺寸是有用的。针对其他压缩方案,解压缩因子是小的二次幂,每个压缩块容易扩展到64b高速缓存行。也就是说,解压缩小的二次幂组的压缩块产生可被直接加载到l0数据存储中的对齐的64b未压缩的纹元数据。在一个实施例中,解压缩器和lsf控制器(dlc)解压缩多个(可变大小)astc块,以在64b行中产生解压缩的4×4纹元块。通过控制读取指针将额外的坐标提供到fifo1和fifo2中。

作为一个示例,考虑:如果在没有合适的坐标和再次使用的情况下解压缩和使用astc块,则会如何浪费功率和带宽。4b的名义上的纹元大小意味着用于l0数据存储中的64b行的4×4块。由于astc非二次幂块不在l0数据存储高速缓存行中的4×4未压缩块上对齐,所以每个这样的块可能需要将多达4块(即6×6)解压缩为总共6×6×4=144个纹元。一个4×4块仅需要这些纹元中的16个。因此,可能丢弃了多达144-16=128个纹元,浪费了解压缩器功率和带宽。此外,在最坏的情况下这四个块可能在4个单独的64b行上,浪费l1c访问功率和带宽。

然而,假设,在纹理访问模式中存在大量的空间位置。因此,在填入l0数据存储中的一个4×4块时未使用的解压缩的纹元将很快被用于填入其他请求的附近的4×4块是可能的。类似地,包括l1高速缓存行的4个astc块可能被再次用于附近的4×4块。因此,高速缓存压缩的l1高速缓存行和解压缩的astc块的两个小的缓冲器(fifo1和fifo2)可有效降低从l1c获取的高速缓存行块的数量和未使用的解压缩的纹元的数量。

在流fifo中,最旧的写入行总是被选择用于替换。因此,写入指针在每次写入时以环绕(wrap-around)方式增加。然而,可在写入的窗内从任何行发生读取。可多次读取行,促使再次使用的利用。返回的l1c高速缓存行被存放在流fifo1中。解压缩器从流fifo1读取16b块(针对非astc可能更大),解压缩它们,并将它们发出到cls。cls收集td输出数据以构造64b高速缓存行,并将它们写入到l0数据存储中。流fifo是旨在消除到l1c的过量请求流量的简单高速缓存结构。

因为可能需要相同的压缩块来在时间邻近地产生多个解压缩的64b块,所以tc在解压缩器的输入使用小的缓冲器。

图8的额外方面包括接收针对标签未命中(被标签未命中串行化器串行化)的标签的标签未命中fifo。选择未命中四元组请求(smqs,selectmissingquadrequest)块选择未命中请求中的一个,将它与来自纹理图像描述符的基地址和关联信息组成一对,并将整个包传递到压缩块地址产生单元(cbag)。具体地,针对每个维度,cbag计算纹元维度的最小值和最大值。针对2d纹理,输出因此是基地址(u_min,u_max)和(v_min,v_max)。在一个实施例中,cbag计算压缩的(存储器)地址空间中的多达4个astc块地址。通常,这个地址计算包含:将每个维度范围除以在那个维度下的astc块大小。例如,使用5×6块,将(u_min,u_max)除以5并且将(v_min,v_max)除以6来得到所需的astc块。接下来,计算这些块中的每一个的地址。输出是一组多达四个的astc块地址,该多达四个的astc块地址的低序位的4b是零(由于astc块大小是24=16b)。

在一个实施例中,纹理解压缩器(dc)每周期可处理贮存在预定的结构之一中的多达四个输出纹元。在一个实施例中,dsf标签查找和lsf标签查找将存储器访问流量分割成多个预定义的纹元覆盖区模式,并且逐个地发送它们。图9示出根据实施例的可由dc处理的astc纹元覆盖区模式的示例。六个不同的示例实例被示出,其中,用于在一个或两个周期处理1个、2个、3个或4个纹元的不同选择被示出。

在一个实施例中,cls由dsf入口(entry)信号控制,依次通过dsf标签查找接收控制位。虽然可从4个纹元四元组产生4×4大小的块,但是这些控制位从9个存储体指定一组多达9个的纹元四元组(针对4b纹元大小情况)。额外的控制位指定这些四元组中的哪部分被路由到l0数据存储中的64b高速缓存行中的哪部分。cls在(例如,从cc)接收到就绪信号时读取指定的四元组、路由数据、并将64b高速缓存行写入到l0数据存储中。

在一个实施例中,来自dsf标签查找的到达的地址在全相联lsf标签查找中进行命中测试。未命中在预先的写入指针被分配入口。未命中被发送到l1c。在一个实施例中,lsf控制fifo用作流fifo和l1c与解压缩器控制(dlc)之间的缓冲器这二者。

图10示出根据实施例的agc处理流程。组织纹元请求的处理遍布于多个步骤(s0、s1、s2、s3、s4),其中,每个步骤试图组合满足一组约束的更大或不同组的请求。在一个实施例中,一组约束包括来自每个存储体不多于一个的双字(dword)和不多于四个的不同的高速缓存行。然而,将理解,其他约束可被使用。在第一步骤s1,检查从每个像素组织的请求,以找到用于这些请求的高速缓存行地址。然后将每个高速缓存行地址链接到四个请求中的每一个请求所需的存储体偏移。该处理在图8中被称为分桶(bucketing)。因此,第一步骤s1产生均具有四个存储桶(bucket)的四个组,每个存储桶包括多达四个纹元请求。在随后的步骤中,每个存储桶可包括更多的纹元请求,假如它们与组中的其他请求不具有存储体冲突的话。在一个实施例中,驱动器软件组织纹元数据,使得与像素关联的请求极不可能具有存储体冲突。然而,在存在存储体冲突的稀有事件中,单独处理相应的像素的请求。

在第二步骤s2,考虑存储桶的配对的两种组合。例如,分桶的p0&p1检查与在两个不同的存储桶组中的像素p0和像素p1关联的全部请求是否可被放到单个存储桶组同时仍满足约束(即,来自存储体不多于一个的双字和不多于四个的不同的高速缓存行)。在第二步骤的最后,我们具有像素被不同配对的两种情况的分桶。

第三步骤s3检查两组配对是否都失败,其中,在两组配对都失败的情况下,我们分桶第三对p0和p3,并且如果该分桶满足约束,则发送针对p0&p3的请求。随后检查p1&p2(未示出)。然而,最常见的情况是情况1和情况2都满足全部的约束,在这种情况下,处理考虑如“分桶p0&p1&p2&p3”所示地分桶全部的四个像素。再次,一种示例情况是:分桶成功,并且可在同一周期处理来自四个像素的请求的全部请求。

图10还示出如步骤s4中所示的诸如必须单独地发送像素p0的请求的其他情况。处理是分层级的,它以单个像素的请求开始,然后建立关于其标签和数据储存体访问要求而兼容的多个像素的配对以及建立关于其标签和数据储存体访问要求而兼容的多个像素的最终的四元组。该处理在全部的四个像素被分桶在一起的通常情况下有效地终止,但针对快速确定其他情况下兼容的子集同样是有用的。

图11示出根据实施例的三种可能的块映射的示例的纹理高速缓存边界和astc块示图。图12示出15×15astc纹理的示例。粗的加粗线1105示出未命中时的tc0中的高速缓存行边界和对dc的请求。细的加粗线1100示出纹理的astc5×5块边界。当未命中时,tc0从td中的astc解码器请求4×2纹元网格。根据高速缓存行未命中,三种类型的请求是可能的。针对类型-0的块,未命中映射在一个astc5×5块内。td将在2个周期(吞吐量的测量未延迟)内传递解码的纹元。针对类型-1的块,未命中映射到两个astc5×5块。td将在2(块b)或3(块a)个周期内将块进行解码。块a在第二astc块(由于它需要将6个纹元进行解码)需要2个周期,在第一astc块需要1个周期(1c×2r)。块b在两个astc块均需要1个周期。类型-2的块未命中映射到4个astc5×5块中。块a和块b二者需要四个周期用于解码。在一个实施例中,需要td将2c×2r、4c×1r(或子集)和1c×2r块进行解码以支持吞吐量。

在示例实施例中,除支持astc之外,流fifo2还可有效支持etc2压缩格式。因此,在一个实施例中,流fifo2包括足够用于存储8个astc解码的纹元或16个etc2解码的纹元的4至128位宽的存储体。在示例实施例中,每个存储体支持通道屏蔽(lanemasking)和写入较高的64b或较低的64b的能力。根据astc解码的纹元的4×2块内的纹元编号,块0保持纹元0和纹元1,块1保持纹元2和纹元3等。在示例实施例中,针对三种类型的块,没有存储体冲突出现。

在示例实施例中,如果存在灵活性的选择,则解码器将4c×1r或1c×2r块进行解码。td将仅针对类型-1的块b的情况才解码2c×2r块。

现在将描述对纹理解压缩器的纹理高速缓存或针对astc纹理的排序的示例。针对类型-0的块,可从td做出对8个纹元的请求以填充高速缓存行。从td单元请求解码存在两种选择。请求可以是对多达2个的4c×lr块的请求或对多达2个的2c×2r块的请求。

在一个实施例中,针对类型-1的块,从两个astc块对未压缩的数据做出请求。它从每个块请求2至4个纹元。在一个实施例中,遵循下面的顺序:

·从左上astc块请求1c×2r或2c×2r或3c×2r。

·在一个实施例中,针对1c×2r请求,流fifo2解压缩器输出支持:单独的纹元到不同的存储体(例如,纹元0被写入到存储体0、纹元4被写入到存储体2,纹元3被写入到存储体1,纹元6被写入到存储体3)的通道遮蔽。

·针对2c×2r的情况,请求分别被写入到存储体0和存储体2,反之亦然。

·从右上astc块请求1c×2r或2c×2r或3c×2r。

·一直遵循请求的z次序。

针对类型2的块,纹理高速缓存器从四个astc块请求数据。在这些情况下,z次序被保持。

从左上astc块请求1c×1r或2c×1r或3c×1r。

·从右上astc块请求1c×1r或2c×1r或3c×1r。

·从左下astc块请求1c×1r或2c×1r或3c×1r。

·从右下astc块请求1c×1r或2c×1r或3c×1r。

在这些情况下,排序完全相同,对流fifo2中的通道遮蔽的支持允许数据被有效地写入。支持3c×2r需要在td上的额外的缓冲,这可能被进一步分割成两个3c×1r请求。

存储器中的未压缩的域地址(domainaddress)与相应的压缩块的地址之间的关系对于用在astc中的非二次幂块大小来说可能是复杂的。对齐的64b块所需的纹元数据可来自多个压缩块。

图12示出表示astc5×5:64b纹元的示例。用细的加粗线1110示出边界。以细的加粗线编号的块是第一行上的00……02与最后一行编号的20……22。高速缓存行包括4个astc块(00,01,10,11)。

纹理高速缓存块是4×264b纹元。用粗的加粗线1105示出块边界。以粗的加粗线编号的块是第一行上的00……03和第一列上的00至50。

第一访问具有如作为0的阴影的块所示的纹元覆盖区,第二访问具有作为1的阴影线的块覆盖区。

从空的高速缓存器/缓冲器开始,第一访问将具有(00,01,10,11)的高速缓存行带到lsf中,解压缩astc细的加粗的块00并存储在dsf,使用未压缩的粗的加粗的块10和20填充tc0。

第二访问针对astc块00在dsf中命中,并在astc块(01,10,11)上的lsf中命中。这节省了astc块00的重复解压缩以及针对包括(01,10,11)的高速缓存行再次访问l1c。

对astc块(01,10,11)执行解压缩。聚合器形成全部的三个附加的解压缩块00,以产生未压缩的粗的加粗的块21。这使用未压缩的粗的加粗的块21来填充tc0。

一个实施例(但是不限制本发明的实施例的应用)是在移动环境中。在移动环境中,存在对经由l2高速缓存器从主存储器将数据传送到gpu的纹理缓存器所需的存储器带宽和功率的约束。将双字(4b)从低功率双倍数据速率随机存取存储器(lpddr)移动到l1高速缓存器的能耗估计是进行浮点运算的大约50倍。因此,这里公开的示例实施例可有助于在移动gpu的纹理单元中实现高压缩因子的压缩格式。

虽然压缩的格式在数据移动开销方面是能效高的,但是与解压缩关联的能耗可能是显著的。例如,在示例的块压缩格式中,解压缩器在两种颜色之间线性插值以产生总共四种颜色。然后解压缩器基于纹元地址选择索引,并使用2b索引选择四种颜色中的一种。插值的能耗可能是显著的。索引的机制引入二级查找。随着趋向于支持各种更加复杂的压缩方案,解压缩和数据路由能耗可占据全部纹理单元功率的重要部分。

为了在多个纹理访问中摊销这些开销中的一些,纹理高速缓存架构的示例实施例在解压缩器和寻址逻辑之间插入0级(tc0)高速缓存器。与以压缩格式保持纹元数据的1级高速缓存器(l1c)不同,tc0高速缓存器保持解压缩的纹元。解压缩的能耗在多个周期中被摊销在多个纹元访问。例如,如果在四个连续的周期中从4×4压缩块访问四个纹元,则tc0高速缓存器在四个周期中保持未压缩的纹元,与在没有解压缩的tc0高速缓存器情况下的四次相比,仅发生一次解压缩开销。

通常有助于用于支持非二次幂的块维度的区域和功耗的另一因素是:当高速缓存行包括具有二次幂的维度(诸如,8×4)的未压缩的纹元的块时,存储器中的压缩块可被定维为非二次幂,诸如,7×5。在这样的情况下,压缩块的边界可不与高速缓存行中的二次幂块的边界对齐。在这个特定的示例中,填充8×4可需要两个7×5块或4个7×5块。因此,纹理解压缩器必须对很多压缩块进行解压缩,并将全部纹元填充在高速缓存行中。示例实施例可用来支持针对非二次幂的块维度的提高的性能。很多相同的压缩块(或同一l1c高速缓存行中的其他块)可能被需要用来将纹元填充在接下来的少量未命中高速缓存行中,并且必须从l1c被反复获取,导致浪费的带宽和功率。保持最近访问的压缩块的流fifo1可用于减少对l1c的访问。如果接下来的少量未命中高速缓存行填充请求需要相同的压缩块,则流fifo1在不需要l1c访问的情况下将它们传递到td。

纹理高速缓存架构的实施例的一个方面是:纹理高速缓存客户端对延迟相对不灵敏。在cpu1级高速缓存器中,并行(或使用一些路预测硬件)完成标签访问和数据访问,以将高速缓存命中延迟减小到大约1至4个周期。由于复杂寻址逻辑包含,例如,细节层次(lod,levelofdetail)计算和纹理滤波运算,所以即使缺少任意1级命中,纹理单元的延迟也可能超过50周期。对于紧随着对不同地址的高速缓存命中的高速缓存未命,cpu高速缓存立刻传递命中高速缓存的数据,而不是等待无关的未命中数据从下一存储器层次级到达。这样的无序(out-of-order)或未命中下的命中(hit-under-miss)数据返回可减少cpu中的单线程的延迟,但是由于着色器核访问的矢量本性和图形管线的整体有序(in-order)本性而不在cpu提供显著的益处。考虑着色器性能对纹理延迟的相对不灵敏性,由于纹理寻址和滤波以及整体图形管线的有序本性导致的大的固定组件对cpu1级高速缓存结构的替代选择是引人注目的。

在一个实施例中,按次序处理发送到纹理高速缓存架构108的全部地址。对于紧随着缓存命中的缓存未命中,延迟针对高速缓存命中的数据的传递,直到用于高速缓存的数据未命中之后。此外,标签阵列中的命中不一定意味着相应的数据出现在高速缓存器中,只有一旦全部的先前引用被处理,相应的数据才将出现在高速缓存中。全部的引用被完全按顺序流过高速缓存器的纹理高速缓存器的这个流行为带来重要的益处和设计简化。在图形管线中,状态和工作是有序的,即,接收的任何状态仅应用于稍后的工作请求。未命中之前的命中的无序处理使得到对数据的状态的应用复杂化。例如,纹理滤波逻辑必须确认在保持较旧的状态应用于未命中的同时将较新的状态应用到命中。在其他高速缓存器中,如果标签比较在主标签阵列上失败,则控制逻辑进一步开始检查在同一高速缓存行上是否存在更早的显著的未命中。在示例实施例中,这个检查在流高速缓存中不是必要的。

在一个实施例中,图形处理器的示例包括:控制器,被配置为接收针对第一组像素的纹元数据的第一请求;第一缓冲器,用于存储响应于第一请求而从第一纹理高速缓存器获取的一个或多个块的压缩的纹元数据,所述一个或多个块的压缩的纹元数据包括至少请求的纹元数据;纹理解压缩器,用于将存储在第一缓冲器中的所述一个或多个块的压缩的纹元数据进行解压缩;第二缓冲器,用于存储解压缩的一个或多个块的压缩的纹元数据并且用于将解压缩的请求的纹元数据作为输出提供给第二纹理高速缓存器;其中,由第一缓冲器存储的所述一个或多个块的压缩的纹元数据除了请求的纹元数据还包括第二纹元数据。在一个实施例中,第一缓冲器可以是第一fifo缓冲器,第二缓冲器可以是第二fifo缓冲器。在一个实施例中,由第一缓冲器存储的一个或多个块的压缩的纹元数据除了请求的纹元数据还可包括第二纹元数据。在一个实施例中,控制器可被配置为接收针对第二组像素的纹元数据的第二请求,第一请求的所述一个或多个块的至少部分对应于第二组像素的至少部分;第一缓冲器被配置为响应于第二请求在没有来自第一高速缓存器的第二获取的情况下将所述一个或多个块的所述部分提供给纹理解压缩器。在一个实施例中,控制器可被配置为接收针对第二组像素的纹元数据的第二请求,第二请求的至少一个纹元对应于根据处理第一请求存储在第二缓冲器中的解压缩的纹元数据;第一缓冲器被配置为响应于第二请求在没有来自第一缓冲器的第二解压缩的情况下将第二请求的所述至少一个纹元提供给第二纹理高速缓存器。在一个实施例中,第一纹理高速缓存器可被配置为存储非二次幂的块大小。在一个实施例中,第二纹理高速缓存器可被配置为存储二次幂的块大小。在一个实施例中,聚合器单元可被包括用于在第二纹理高速缓存器中的存储之前聚合解压缩的纹理数据。在一个实施例中,第一纹理高速缓存器存储根据自适应可伸缩纹理压缩(astc)编解码器的块大小。在一个实施例中,控制器可控制用于在第一缓冲器内选择单独的条目的第一缓冲器的第一读取指针和用于在第二缓冲器内选择单独的条目的第二缓冲器的第二读取指针。

在一个实施例中,操作图形处理器的方法的示例包括:接收针对第一组像素的纹元数据的第一请求;从第一纹理高速缓存器获取请求的压缩的纹元数据;在第一缓冲器缓冲获取的压缩的纹元数据;将第一缓冲器的输出提供给纹理解压缩器,并将一个或多个块的压缩的纹元数据进行解压缩;在第二缓冲器中缓冲解压缩的纹元数据;将第二缓冲器的输出提供给第二纹理高速缓存器;其中,由第一缓冲器存储的所述一个或多个块的压缩的纹元数据除了请求的纹元数据还包括第二纹元数据。在方法的一个实施例中,第一缓冲器是第一fifo缓冲器,第二缓冲器是第二fifo缓冲器。在一个实施例中,由第一缓冲器存储的所述一个或多个块的压缩的纹元数据除了请求的纹元数据还包括第二纹元数据。在一个具体的实施例中,选择到第一缓冲器的读取指针,以再次使用第一缓冲器中的纹元数据来服务针对纹元数据的多于一个的请求。在一个实施例中,选择到第二缓冲器的读取指针,以再次使用第二缓冲器中的纹元数据来服务针对纹元数据的多于一个的请求。一个实施例包括:在没有来自第一纹理高速缓存器的第二获取的情况下,将第一缓冲器中的针对第一请求获取的纹元数据再次用于至少部分地服务针对第二组像素的纹元数据的第二请求。在一个实施例中,第一纹理高速缓存器被配置为存储非二次幂的块大小。在一个实施例中,第二纹理高速缓存器可被配置为存储二次幂块的大小。一个实施例还包括:在第二纹理高速缓存器中的存储之前,聚合从第二缓冲器接收的解压缩的纹元数据。在一个具体的实施例中,聚合来自多个非二次幂的两个块的纹元数据。

在一个实施例中,图形处理器的示例包括:第一纹理高速缓存器,被配置为存储压缩的纹元数据;第二纹理高速缓存器,被配置为存储来自于第一纹理高速缓存器的已经解压缩的纹元数据;控制器,被配置为:接收针对一组像素的纹元数据的请求,并针对所述纹元数据调度对第一纹理高速缓存器或第二纹理高速缓存器的访问。在一个实施例中,控制器还被配置为:确定第二纹理高速缓存器中是否存在针对请求的纹元数据的高速缓存命中或高速缓存未命中;响应于确定高速缓存未命中,针对请求的纹元数据访问第一纹理高速缓存器;响应于确定高速缓存命中,针对请求的纹元数据访问第二纹理高速缓存器。在一个实施例中,数据基于在一组访问中出现的位置模式被组织到第二纹理高速缓存器中。在一个实施例中,第二纹理高速缓存器具有被分组到高速缓存行中的纹元数据,其中,以莫顿次序组织与纹元的邻近的二维块对应的高速缓存行。在一个实施例中,控制器还被配置为将所述请求的一组纹元地址分割成至少一个无冲突存储器访问的序列。在一个实施例中,所述至少一个无冲突存储器访问不具有标签冲突或数据存储体冲突。在一个实施例中,控制器还被配置为:基于每个存储体双字的数量或不同的高速缓存行的数量中的至少一个,组合满足一组约束的纹元请求。在一个实施例中,控制器还被配置为:找到源于所述一组像素中的每个像素的纹元请求所需的高速缓存行地址;组合满足来自每个存储体不多于一个的双字和不多于四个的不同的高速缓存行的约束的纹元请求。在一个实施例中,第二纹理高速缓存器具有4路堆积(4-waybanked)的标签查找和16路堆积的数据存储。在一个实施例中,第二纹理高速缓存器中的纹元的布局被选择,以保证纹元覆盖区中的四元组纹元在不同的存储体上。

在一个实施例中,操作图形处理器的方法的示例包括:将压缩的纹元数据存储在第一纹理高速缓存器中;将来自于第一纹理高速缓存器的已经解压缩的纹元数据存储在第二纹理高速缓存器中:接收针对一组像素的纹元数据的请求,并针对所述纹元数据调度对第一纹理高速缓存器或第二纹理高速缓存器的访问。在一个实施例中,调度的步骤包括:确定第二纹理高速缓存器中是否存在针对请求的纹元数据的高速缓存命中或高速缓存未命中;响应于确定高速缓存未命中,针对请求的纹元数据访问第一纹理高速缓存器;响应于确定高速缓存命中,针对请求的纹元数据访问第二纹理高速缓存器。一个实施例还包括:将第二纹理高速缓存器中的纹元数据组织成区块(tile),其中,在区块内以莫顿次序组织高速缓存行,使得纹元的邻近的二维块需要小于预定义数量的不同的高速缓存行和标签查找。一个实施例还包括:将所述请求的一组纹元地址分割成一组无冲突的访问的组。在一个实施例中,无冲突的访问的组不具有标签冲突或数据存储体冲突。一个实施例还包括:基于每个存储体双字的数量或不同的缓高速存行的数量中的至少一个,组合满足一组约束的纹元请求。在一个实施例中,组合纹元请求的步骤包括:组合满足来自每个存储体不多于一个的双字和不多于四个的不同的高速缓存行的约束的纹元请求。在一个实施例中,第二纹理高速缓存器具有4路堆积(4-waybanked)的标签查找和16路堆积的数据存储。在一个实施例中,第二纹理高速缓存器中的纹元的布局被选择,以保证纹元覆盖区中的四元组纹元在不同的存储体上。在一个实施例中,基于在一组访问中出现的位置模式,将数据组织到第二纹理高速缓存器中。

虽然已经结合具体的实施例对本发明进行了描述,但是将理解,不意在将本发明限制到描述的实施例。相反,意在覆盖可包括在权利要求所限定的本发明的精神和范围内的替换、修改和等同物。可在没有这些具体的细节中的部分或全部的情况下实践实施例。此外,为了避免造成本发明不必要地模糊,可能没有详细描述公知的特征。根据本发明,可使用各种类型的操作系统、编程语言、计算平台和/或计算装置来实现组件、处理步骤和/或数据结构。此外,本领域技术人员将认识到:在不脱离这里公开的本发明构思的范围和精神的情况下,还可使用诸如硬连接装置、现场可编程门阵列(fpga)、专用集成电路(asic)等的装置。还可将本发明容易地实现为存储在计算机可读介质(诸如存储器装置)上的计算机指令的集合。

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