一种基于双Buffer架构下的纹理贴图硬件加速器
本公开以2019年6月10日递交的、申请号为201910495890.0且名称为“一种基于双Buffer架构下的纹理贴图硬件加速器”的专利文件为优先权文件,其全部内容通过引用结合在本公开中。
技术领域
本公开涉及GPU芯片设计技术领域,具体为一种基于双Buffer架构下的纹理贴图硬件加速器。
背景技术
纹理贴图操作在GPU的应用非常广泛,不仅可以作为GPGPU通用计算领域内的计算单元,同时作为图形渲染管线对纹理数据fetch、sample的执行者。所以纹理贴图单元性能的好坏直接影响了图形处理器内部执行效率,在通用计算领域直接影响了数据lookup、transfer的快慢,所以设计高效的纹理贴图单元在GPU设计中尤为关键。
发明内容
本公开的目的在于提供一种基于双Buffer架构下的纹理贴图硬件加速器,以解决上述背景技术中提出的图形处理器内部执行效率差,在通用计算领域直接影响了数据Lookup、transfer的快慢的问题。
为实现上述目的,本公开提供如下技术方案:一种基于双Buffer架构下的纹理贴图硬件加速器,包括:
Image U0单元:对image基本信息进行存储,当使能mipmap纹理时,通过target以及不同map层作为地址,存储对应image的mode、width、height、depth、border、inte_format、format、type、base;当使能layer层时,通过target以及不同的layer层作为地址,存储对应层的mode、width、height、depth、border、inte_format、format、type、base值,当使能cubemap时,将mipmap层的一个地址进行细分为6个,分别代表0,1,2,3,4,5不同的face信息,当使能layer层没有map层信息时,不同layer层的mode、width、height、depth、border、inte_format、format、type相同,base不同;当使能layer并使能map层时的mode、width、height、depth、border、inte_format、format、type相同,base不同;支持1D、2D、3D、rectangle、cubemap、1D_ARRAY、2D_ARRAY、cubemap_array、2D_multisample、2D_multisample、2D_multisample_array模式下的寄存器配置;
LOD U1单元:完成对不同滤波模式下的level值计算,结合访问target地址得到访问image单元的地址;在计算level值之前,首先需要通过target和base_level值为level0读取image单元,获得image的基本信息作为后续level计算时的参考,然后level值的计算考虑两种情况:当使能lod时,如果image为layer模式,此时,不同层的width、height信息相等,无论滤波模式为mag_filter还是min_filter,都取整取最靠近base_level方向的一个level值为level0读取image信息的offset,而filter_type大小与请求的滤波大小相匹配;当使能lod时,如果image为mipmap模式,此时,不同层的width、height、depth不相等,考虑mag_filter在near和linear模式下取整取最靠近base_level值读取image信息的offset,考虑min_filter模式下near、linear、near_mipmap_near、linear_mipmap_near取最不靠近base_level值为level0读取image的offset,而filter_type分别和请求的滤波模式相匹配,考虑min_filter在near_mipmap_linear、linear_mipmap_linear模式下取整取临近的两层作为读取image信息的offset,ratio_l为lod值减去level值的小数部分,此时称为lod的整数部分为level0,level0加1为level1,如果lod值为min_lod,此时level0与level1相 同,所以取fiter_type分别为near_mipmap_near和linear_mipmap_near滤波;同理,当使能偏导数作为lod时,按照raster传递过来的图元类型primitive、dux、duy、dvx、dvy、dwx、dwy、delt_x、delt_y,分为polygon/point和line两种情况,分别计算得到polygon/point和line的lod,如果image为layer模式,此时,不同层的width、height信息相等,无论滤波模式为mag_filter还是min_filter,都取整取最靠近base_level方向的一个level值为level0读取image信息的offset,而filter_type大小与请求的滤波大小相匹配;如果image为mipmap模式,此时,不同层的width、height、depth不相等,考虑mag_filter在near和linear模式下取整取最靠近base_level值读取image信息的offset,考虑min_filter模式下near、linear、near_mipmap_near、linear_mipmap_near取最不靠近base_level值为level0读取image的offset,而filter_type分别和请求的滤波模式相匹配,考虑min_filter在near_mipmap_linear、linear_mipmap_linear模式下取整取临近的两层作为读取image信息的offset,ratio_l为lod值减去level值的小数部分,此时称为lod的整数部分为level0,level0加1为level1,如果lod值为min_lod,此时level0与level1相同,所以取fiter_type分别为near_mipmap_near和linear_mipmap_near滤波。如果使能了level0和level1,则考虑为trilinear滤波方式,有以下滤波方式:trilinear isotropic(near_mipmap_linear、linear_mipmap_linear)、trilinear anisotropic;如果只有level0有效,有以下滤波方式:point isotropic(near、near_mipmap_near)、bilinear isotropic(linear、linear_mipmap_near)、bilinear anisotropic;
CoordinateU2单元:完成对fetch、sampler模式下的s、t、r、q的坐标、地址转换;当使能cubemap_array时,此时的Q坐标不为0,表示layer行号,s、t、r分别表示x,y,z方向上的大小,通过映射关系得到平面坐标内的s、t坐标;当使能rectangle模式,此时的s、t坐标不需要进行解归一化处理;如果s、t、r坐标超出了各自的表示范围,采用不同的wrap模式对坐标进行约束;当使能level0和level1时,从image单元得到level0和level1各自的width、height、depth值,分别与s、t、r相乘,得到解归一化后的纹理坐标u0,v0,w0和u1,v1,w1,当只有level0有效时,从image单元得到level0的width、height、depth值,分别与s、t、r相乘,得到解归一化后的纹理坐标u0,v0,w0;此时的ratio_u0、ratio_v0、ratio_w0分别为u0、v0、w0的小数部分,ratio_u1、ratio_v1、ratio_w1分别为u1、v1、w1的小数部分,inte_u0,inte_v0,inte_w0分别为u0、v0、w0的整数部分,inte_u1,inte_v1,inte_w1分别为u1、v1、w1的整数部分;执行wrap操作时,如果image内容中的borde值有值,并且此时地址已经溢出,此时disable请求纹素,并使能border_color值作为最终pixel阶段的输入;
Coordinate controller U3单元:当使能level0和level1时,filter_type为point模式时,mode为1D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferu1的数据为inte_u1;mode为2D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferv0的数据为inte_v0;写入coordinate bufferu1的数据为inte_u1,写入coordinate bufferv1的整数部分为inte_v1;mode为3D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferv0的数据为inte_v0,写入coordinate bufferw0的数据为inte_w0,写入coordinate bufferu1的数据为inte_u1,写入coordinate bufferv1的数据为inte_v1,写入coordinatew1的数据为inte_w1;filter_type为linear模式时,mode为1D时,写入coordinate bufferu1的数据为inte_u1,写入coordinate bufferu1的数据为inte_u1+1;写入coordinate bufferu0的数据为inte_u0,写入 coordinate bufferu0的数据为inte_u0+1;mode为2D时,写入coordinate bufferu0、coordinate bufferv0的数据依次为:(inte_u0,inte_v0)、(inte_u0+1,inte_v0)、(inte_u0,inte_v0+1)、(inte_u0+1,inte_v0+1);写入coordinate bufferu1、coordinate bufferv1的数据依次为:(inte_u1,inte_v1)、(inte_u1+1,inte_v1)、(inte_u1,inte_v1+1)、(inte_u1+1,inte_v1+1);mode为3D时,写入coordinate bufferu0、coordinate bufferv0、coordinate bufferw0的数据依次为:(inte_u0,inte_v0,inte_w0)、(inte_u0+1,inte_v0,inte_w0)、(inte_u0,inte_v0+1,inte_w0)、(inte_u0+1,inte_v0+1,inte_w0)、(inte_u0,inte_v0,inte_w0+1)、(inte_u0+1,inte_v0,inte_w0+1)、(inte_u0,inte_v0+1,inte_w0+1)、(inte_u0+1,inte_v0+1,inte_w0+1);写入coordinate bufferu1、coordinate bufferv1、coordinate bufferw1的数据依次为:(inte_u1,inte_v1,inte_w1)、(inte_u1+1,inte_v1,inte_w1)、(inte_u1,inte_v1+1,inte_w1)、(inte_u1+1,inte_v1+1,inte_w1)、(inte_u1,inte_v1,inte_w1+1)、(inte_u1+1,inte_v1,inte_w1+1)、(inte_u1,inte_v1+1,inte_w1+1)、(inte_u1+1,inte_v1+1,inte_w1+1);当使能level0时,filter_type为point模式时,mode为1D时,写入coordinate bufferu0的数据为inte_u0;mode为2D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferv0的数据为inte_v0;mode为3D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferv0的数据为inte_v0,写入coordinate bufferw0的数据为inte_w0;filter_type为linear模式时,mode为1D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferu0的数据为inte_u0+1;mode为2D时,写入coordinate bufferu0、coordinate bufferv0的数据依次为:(inte_u0,inte_v0)、(inte_u0+1,inte_v0)、(inte_u0,inte_v0+1)、(inte_u0+1,inte_v0+1);mode为3D时,写入coordinate bufferu0、coordinate bufferv0、coordinate bufferw0的数据依次为:(inte_u0,inte_v0,inte_w0)、(inte_u0+1,inte_v0,inte_w0)、(inte_u0,inte_v0+1,inte_w0)、(inte_u0+1,inte_v0+1,inte_w0)、(inte_u0,inte_v0,inte_w0+1)、(inte_u0+1,inte_v0,inte_w0+1)、(inte_u0,inte_v0+1,inte_w0+1)、(inte_u0+1,inte_v0+1,inte_w0+1)。
address controller U4单元:首先完成纹理坐标到纹理偏移地址的计算;对于level0有效时,mode为1D,在地址计算没有溢出时的偏移量为size*u0;mode为2D,在地址计算没有溢出时的偏移量为size*(width0*u0+v0);mode为3D,在地址计算没有溢出时的偏移量为size*(width0*u0+v0)+w0*width0*height0;得到最终访问texel cache的地址为base0+偏移量。然后根据偏移量的末尾与4字节对齐方式,得到不同inte_format条件下的地址个数,并将末尾数据保存于offset0buffer中;由于level1无效,所以请求texel cache时,按照双buffer操作方式,奇数个地址请求texel cache地址访问cache0,偶数个地址请求访问cache1,实现地址的并行性访问。对于level0和level1均有效时,mode为1D,在地址计算没有溢出时的偏移量为size*u0,size*u1;mode为2D,在地址计算没有溢出时的偏移量为size*(width0*u0+v0),size*(width1*u1+v1);mode为3D,在地址计算没有溢出时的偏移量为size*(width0*u0+v0)+w0*width0*height0,size*(width1*u1+v1)+w1*width1*height1。得到最终访问texel cache的地址为base0+level0偏移量,base1+level1偏移量。此时,并行请求cache0和cache1。
可选地,所述LOD U1单元包括两个直接相连cache,完成对不同texel所在cache行的索引以及cache line的store、replace操作;当level0和level1同时有效时,并行完成对cache0和cache1 的读操作请求,当只有level0有效时,cache0中存储odd cache line,cache1中存储even cache line。
可选地,所述CoordinateU2单元包括:
data controllerU0单元:当level0和level1同时有效时,分别按照不同的inte_format,结合off0和off1,从一个cache line中完成数据的拼接任务,得到与纹理地址对应的纹理数据,并将各自数据同时写入到data buffer0和data buffer1中,并且data buffer0、data buffer1分别存放各自level的数据;当只有level0有效时,同理,从cache0和cache1中分别读出各自cache line的数据根据不同的inte_format以及off0,得到odd data和even data,按照双方式写入data buffer0和data buffer1,此时data buffer0和data buffer1中存放的是同一个level的纹素数据;
filterU1单元:首先完成截位运算,针对不同的inte_format,截位出不同位宽的r、g、b、a值,然后采用独立方式分别进行滤波计算,位宽的截取方法按照不同的inte_format执行;当level0和level1均有效,此时filter_type的滤波方式有NAF(non-anisotropic)(near_mipmap_linear isotropic、linear_mipmap_linear isotropic)、BAF(bilinear-anisotropic)(无效)、TAF(trilinear-anisotropic),当level0有效,level1无效时,此时filter_type的滤波方式有NAF(non-anisotropic)(near、near_mipmap_near、linear_mipmap_near)、BAF(bilinear anisotropic)、TAF(trilinear-anisotropic)(无效);当level0和level1同时有效,而filter_type为TAF(near_mipmap_linear)时,无论mode为1D、2D、3D,均同时从data buffer0、data buffer1中同时读取一个数据data0和data1,得到滤波结果为data0*(1.0-ratio_l)+data1*ratio_l;如果滤波方式为TAF(linear_mipmap_linear),mode为1D时,首先从data buffer0、data buffer1中同时依次读取2个数据,分别为data0、data1和data2、data3,滤波中间结果为data0*(1.0-ratio_u0)+data2*ratio_u0、data1*(1.0-ratio_u1)+data3*ratio_u1,得到滤波最终结果为(data0*(1.0-ratio_u0)+(data2*ratio_u0)*(1.0-ratio_l)+(data1*1.0-ratio_u1)+(data3*ratio_u1)*ratio_l;mode为2D,从data buffer0、data buffer1中同时依次读取4个数据data0、data1、data2、data3以及data4、data5、data6、data7,那么首先通过前4个数据data0、data2、data4、data6得到滤波的中间结果为data0*(1.0-ratio_u0)+data2*ratio_u0、data4*(1.0-ratio_u1)+data6*ratio_u1;然后再通过后4个数据data1、data3、data5、data7得到滤波的中间结果为data1*(1.0-ratio_u0)+data3*ratio_u0、data5*(1.0-ratio_u1)+data7*ratio_u1,最后分别得到level0和level1的最终结果为(data0*(1.0-ratio_u0)+data1*ratio_u0)*(1.0-ratio_v0)+(data2*(1.0-ratio_u0)+data3*ratio_u0*ratio_v0、(data4*(1.0-ratio_u1)+data5*ratio_u1)*(1.0-ratio_v1)+(data6*(1.0-ratio_u1)+data7*ratio_u1)*ratio_v1,最后的滤波结果为((data0*(1.0-ratio_u0)+data1*ratio_u0)*(1.0-ratio_v0)+(data2*(1.0-ratio_u0)+data3*ratio_u0)*ratio_v0)*(1.0-ratio_l)+((data4*(1.0-ratio_u1)+data5*ratio_u1)*(1.0-ratio_v1)+(data6*(1.0-ratio_u1)+data7*ratio_u1)*ratio_v1)*ratio_l;mode为3D时,从data buffer0、data buffer1同时依次读取8个数据,分别为data0、data1、data2、data3、data4、data5、data6、data7和data8、data9、data10、data11、data12、data13、data14、data15;首先通过前8个数据data0、data1、data2、data3、data8、data9、data10、data11得到滤波中间结果分别为:((data0* (1.0-ratio_u0)+data2*ratio_u0)*(1.0-ratio_v0)+((data1*(1.0-ratio_u0)+data3*ratio_u0)*ratio_v0、((data8*(1.0-ratio_u1)+data9*ratio_u1)*(1.0-ratio_v1)+((data10*(1.0-ratio_u1)+data11*ratio_u1)*ratio_v1,然后再通过后8个数据data4、data5、data6、data7、data12、data13、data14、data15得到滤波中间结果分别为:((data4*(1.0-ratio_u0)+data5*ratio_u0)*(1.0-ratio_v0)+((data6*(1.0-ratio_u0)+data7*ratio_u0)*ratio_v0、((data12*(1.0-ratio_u1)+data13*ratio_u1)*(1.0-ratio_v1)+((data14*(1.0-ratio_u1)+data15*ratio_u1)*ratio_v1;最后得到滤波的最终结果为:((((data0*(1.0-ratio_u0)+data2*ratio_u0)*(1.0-ratio_v0)+((data1*(1.0-ratio_u0)+data3*ratio_u0)*ratio_v0)*(1.0-ratio_w0)+(((data4*(1.0-ratio_u0)+data5*ratio_u0)*(1.0-ratio_v0)+((data6*(1.0-ratio_u0)+data7*ratio_u0)*ratio_v0)*ratio_w0)*(1.0-ratio_l)+((((data8*(1.0-ratio_u1)+data9*ratio_u1)*(1.0-ratio_v1)+((data10*(1.0-ratio_u1)+data11*ratio_u1)*ratio_v1)*(1.0-ratio_w1)+(((data12*(1.0-ratio_u1)+data13*ratio_u1)*(1.0-ratio_v1)+((data14*(1.0-ratio_u1)+data15*ratio_u1)*ratio_v1)*ratio_w1)*ratio_l,当使能了anisotropic时,此时对data buffer0、data buffer1中的数据分别进行anisotropic计算后得到data0、data1的中间滤波结果,那么最终的滤波结果为data0*(1.0-ratio_l)+data1*ratio_l;当只有level0有效,而filter_type为near、near_mipmap_near时,无论mode为1D、2D、3D,均同时从data buffer0、data buffer1中同时读取一个数据data0和data1,对data0、data1格式进行转换之后直接输出,不经过滤波;如果滤波方式为BAF,当mode为1D时,首先从data buffer0、data buffer1中同时依次读取1个数据,分别为data0、data1,最终的滤波结果为data0*(1.0-ratio_u0)+data2*ratio_u0;当mode为2D,从data buffer0、data buffer1中同时依次读取2个数据data0、data1、data2、data3,那么首先通过前2个数据data0、data2、得到滤波的中间结果为data0*(1.0-ratio_u0)+data2*ratio_u0;然后再通过后2个数据data1、data3得到滤波的中间结果为data1*(1.0-ratio_u0)+data3*ratio_u0,最后得到滤波的最终结果为(data0*(1.0-ratio_u0)+data2*ratio_u0)*(1.0-ratio_l)+(data1*(1.0-ratio_u0)+data3*ratio_u0)*ratio_l;mode为3D时,从data buffer0、data buffer1同时依次读取4个数据,分别为data0、data1、data2、data3和data4、data5、data6、data7。首先通过前4个数据data0、data1、data4、data5得到滤波中间结果为:(data0*(1.0-ratio_u0)+data1*ratio_u0)*(1.0-ratio_v0)+(data4*(1.0-ratio_u0)+data5*ratio_u0)*ratio_v0,然后再通过后4个数据data2、data3、data6、data7得到滤波中间结果分别为:(data2*(1.0-ratio_u0)+data3*ratio_u0)*(1.0-ratio_v0)+(data6*(1.0-ratio_u0)+data7*ratio_u0)*ratio_v0;最后得到滤波的最终结果为:((data0*(1.0-ratio_u0)+data1*ratio_u0)*(1.0-ratio_v0)+(data4*(1.0-ratio_u0)+data5*ratio_u0)*ratio_v0)*(1.0-ratio_w0)+((data2*(1.0-ratio_u0)+data3*ratio_u0)*(1.0-ratio_v0)+(data6*(1.0-ratio_u0)+data7*ratio_u0)*ratio_v0)*ratio_w0。当执行滤波操作后,按照不同的inte_format格式,对filter的输出结果为texel_r、texel_g、texel_b、texel_a进行赋值操作,如果format为color,当inte_format只有其中的r有值,此时texel_r为滤波结果,texel_g、texel_b均为0,texel_a为1;如果format为depth、stencil,此时在不执行滤波的添加下,将结果赋值到texel_r、texel_g分量,texel_b、texel_a分量为0;
pixel单元U2:当使能border_color时,采用border_color数据作为pixel阶段的输入数据,当 没有使能swizzle操作时,pixel_r、pixel_g、pixel_b、pixel_a与border_color中的border_color_r、border_color_g、border_color_b、border_color_a相等,如果使能了swizzle操作,则按照swizzle模式分别对各自通道数据进行转换操作,最终并行输出4路颜色分量pixel_r、pixel_g、pixel_b、pixel_a。
可选地,支持Color、depth、stencil、depth_stencil模式下的FP32、FP16、FP11、FP10、INT32数据类型。
可选地,还支持RGB/BGR format下不同整形、浮点类型type、RGBA/BGRA format下不同整形、浮点类型type的转换。
可选地,还支持depth、stencil、depth_stencil对深度纹理的比较以及stencil index计算
与现有技术相比,本实用新型的有益效果是:
该发明采用双Buffer可以提高纹理索引地址的计算效率,当同时存在两层数据需要计算时,可以同时平行开始计算;当使能一层数据需要计算时,将采用奇偶方式并行地索引纹素以保证数据并行计算,从而缩短了纹素数据的索引时间,并且提高了纹素计算效率;
采用双Buffer可以提高纹素数据计算效率,当同时存在两层数据需要计算时,可以分别按照两个各自的管线读出纹素以实现平行计算;当使能一层数据需要计算时,将采用双Buffer方式并行访问,从而可以提高并行访问效率,降低纹素计算时间;
当使能mipmap纹理时,如果出现计算lod为设置的max_level,可以使能其中的一个buffer管线地址、数据计算,trilinear为bilinear滤波方式,从而降低了计算复杂度,并且降低硬件计算功耗;
当存在border值,并且wrap操作后的(U,V)坐标溢出时,采用border_color用户设置数据,避免地址和数据计算,从而节省纹理访问时间,降低纹理贴图计算功耗。
附图说明
图1是本公开实施例中提供的基于双Buffer架构下的纹理贴图硬件加速器设计图;
图2是本公开实施例中提供的2D纹理坐标在bilienar模式下的纹理坐标取值图;
图3是本公开实施例中提供的3D纹理坐标在bilinear模式下的映射关系图;
图4是本公开实施例中提供的双操作中纹理地址与cache line的对应关系图;
图5是本公开实施例中提供的1D bilinear模式下的计算模型图;
图6是本公开实施例中提供的2Dbilinear模式下的计算模型图;
图7是本公开实施例中提供的3Dbilinear模式下的计算模型图;
图8是本公开实施例中提供的1D bilinear模式下的计算模型图;
图9是本公开实施例中提供的2Dbilinear模式下的计算模型图;
图10是本公开实施例中提供的3Dbilinear模式下的计算模型图。
具体实施方式
下面将结合本公开实施例中的附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
请参阅图1-10,本公开提供一种基于双Buffer架构下的纹理贴图硬件加速器设计可以很好地解决纹理地址计算和数据计算过程中的时间过程纹理,并且降低纹理贴图中对color、depth、stencil不同 模式下的滤波处理。如图1所示:一种基于双Buffer架构下的纹理贴图硬件加速器设计包括:address calculationU0单元:image单元U0:对image基本信息进行存储,当使能mipmap纹理时,通过target以及不同map层作为地址,存储对应image的mode、width、height、depth、border、inte_format、format、type、base;当使能layer层时,通过target以及不同的layer层作为地址,存储对应层的mode、width、height、depth、border、inte_format、format、type、base值,当使能cubemap时,将mipmap层的一个地址进行细分为6个,分别代表0,1,2,3,4,5不同的face信息。当使能layer层没有map层信息时,不同layer层的mode、width、height、depth、border、inte_format、format、type相同,base不同;当使能layer并使能map层时的mode、width、height、depth、border、inte_format、format、type相同,base不同;支持1D、2D、3D、rectangle、cubemap、1D_ARRAY、2D_ARRAY、cubemap_array、2D_multisample、2D_multisample、2D_multisample_array模式下的寄存器配置;
LOD U1单元:完成对不同滤波模式下的level值计算,结合访问target地址得到访问image单元的地址;在计算level值之前,首先需要通过target和base_level值为level0读取image单元,获得image的基本信息作为后续level计算时的参考。然后,level值的计算考虑两种情况:当使能lod时,如果image为layer模式,此时,不同层的width、height信息相等,无论滤波模式为mag_filter还是min_filter,都取整取最靠近base_level方向的一个level值为level0读取image信息的offset,而filter_type大小与请求的滤波大小相匹配;当使能lod时,如果image为mipmap模式,此时,不同层的width、height、depth不相等,考虑mag_filter在near和linear模式下取整取最靠近base_level值读取image信息的offset,考虑min_filter模式下near、linear、near_mipmap_near、linear_mipmap_near取最不靠近base_level值为level0读取image的offset,而filter_type分别和请求的滤波模式相匹配,考虑min_filter在near_mipmap_linear、linear_mipmap_linear模式下取整取临近的两层作为读取image信息的offset,ratio_l为lod值减去level值的小数部分,此时称为lod的整数部分为level0,level0加1为level1,如果lod值为min_lod,此时level0与level1相同,所以取fiter_type分别为near_mipmap_near和linear_mipmap_near滤波。同理,当使能偏导数作为lod时,按照raster传递过来的图元类型primitive、dux、duy、dvx、dvy、dwx、dwy、delt_x、delt_y,分为polygon/point和line两种情况,分别计算得到polygon/point和line的lod,如果image为layer模式,此时,不同层的width、height信息相等,无论滤波模式为mag_filter还是min_filter,都取整取最靠近base_level方向的一个level值为level0读取image信息的offset,而filter_type大小与请求的滤波大小相匹配;如果image为mipmap模式,此时,不同层的width、height、depth不相等,考虑mag_filter在near和linear模式下取整取最靠近base_level值读取image信息的offset,考虑min_filter模式下near、linear、near_mipmap_near、linear_mipmap_near取最不靠近base_level值为level0读取image的offset,而filter_type分别和请求的滤波模式相匹配,考虑min_filter在near_mipmap_linear、linear_mipmap_linear模式下取整取临近的两层作为读取image信息的offset,ratio_l为lod值减去level值的小数部分,此时称为lod的整数部分为level0,level0加1为level1,如果lod值为min_lod,此时level0与level1相同,所以取fiter_type分别为near_mipmap_near和linear_mipmap_near滤波。如果使能了level0和level1,则考虑为trilinear滤波方式,有以下滤波方式:trilinear isotropic(near_mipmap_linear、linear_mipmap_linear)、trilinear anisotropic;如果只有level0有效,有以下滤波方式:point isotropic(near、 near_mipmap_near)、bilinear isotropic(linear、linear_mipmap_near)、bilinear anisotropic。
CoordinateU2单元:完成对fetch、sampler模式下的s、t、r、q的坐标、地址转换。当使能cubemap_array时,此时的Q坐标不为0,表示layer行号,s、t、r分别表示x,y,z方向上的大小,通过映射关系得到平面坐标内的s、t坐标;当使能rectangle模式,此时的s、t坐标不需要进行解归一化处理;如果s、t、r坐标超出了各自的表示范围,采用不同的wrap模式对坐标进行约束;当使能level0和level1时,从image单元得到level0和level1各自的width、height、depth值,分别与s、t、r相乘,得到解归一化后的纹理坐标u0,v0,w0和u1,v1,w1,当只有level0有效时,从image单元得到level0的width、height、depth值,分别与s、t、r相乘,得到解归一化后的纹理坐标u0,v0,w0;此时的ratio_u0、ratio_v0、ratio_w0分别为u0、v0、w0的小数部分,ratio_u1、ratio_v1、ratio_w1分别为u1、v1、w1的小数部分,inte_u0,inte_v0,inte_w0分别为u0、v0、w0的整数部分,inte_u1,inte_v1,inte_w1分别为u1、v1、w1的整数部分。执行wrap操作时,如果image内容中的border有效,并且此时地址已经溢出,此时disable请求纹素,并使能border_color值作为最终pixel阶段的输入;
Coordinate controller U3单元:当使能level0和level1时,filter_type为point模式时,mode为1D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferu1的数据为inte_u1;mode为2D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferv0的数据为inte_v0;写入coordinate bufferu1的数据为inte_u1,写入coordinate bufferv1的整数部分为inte_v1;mode为3D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferv0的数据为inte_v0,写入coordinate bufferw0的数据为inte_w0,写入coordinate bufferu1的数据为inte_u1,写入coordinate bufferv1的数据为inte_v1,写入coordinatew1的数据为inte_w1;filter_type为linear模式时,mode为1D时,写入coordinate bufferu1的数据为inte_u1,写入coordinate bufferu1的数据为inte_u1+1;写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferu0的数据为inte_u0+1;mode为2D时,取周围的4个点坐标,如下图2所示,写入coordinate bufferu0、coordinate bufferv0的数据依次为:(inte_u0,inte_v0)、(inte_u0+1,inte_v0)、(inte_u0,inte_v0+1)、(inte_u0+1,inte_v0+1);写入coordinate bufferu1、coordinate bufferv1的数据依次为:(inte_u1,inte_v1)、(inte_u1+1,inte_v1)、(inte_u1,inte_v1+1)、(inte_u1+1,inte_v1+1);mode为3D时,去周围8个点坐标,如下图3所示,写入coordinate bufferu0、coordinate bufferv0、coordinate bufferw0的数据依次为:(inte_u0,inte_v0,inte_w0)、(inte_u0+1,inte_v0,inte_w0)、(inte_u0,inte_v0+1,inte_w0)、(inte_u0+1,inte_v0+1,inte_w0)、(inte_u0,inte_v0,inte_w0+1)、(inte_u0+1,inte_v0,inte_w0+1)、(inte_u0,inte_v0+1,inte_w0+1)、(inte_u0+1,inte_v0+1,inte_w0+1);写入coordinate bufferu1、coordinate bufferv1、coordinate bufferw1的数据依次为:(inte_u1,inte_v1,inte_w1)、(inte_u1+1,inte_v1,inte_w1)、(inte_u1,inte_v1+1,inte_w1)、(inte_u1+1,inte_v1+1,inte_w1)、(inte_u1,inte_v1,inte_w1+1)、(inte_u1+1,inte_v1,inte_w1+1)、(inte_u1,inte_v1+1,inte_w1+1)、(inte_u1+1,inte_v1+1,inte_w1+1);当使能level0时,filter_type为point模式时,mode为1D时,写入coordinate bufferu0的数据为inte_u0;mode为2D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferv0的数据为inte_v0;mode为3D时,写入coordinate bufferu0的数据为inte_u0,写入 coordinate bufferv0的数据为inte_v0,写入coordinate bufferw0的数据为inte_w0;filter_type为linear模式时,mode为1D时,写入coordinate bufferu0的数据为inte_u0,写入coordinate bufferu0的数据为inte_u0+1;mode为2D时,写入coordinate bufferu0、coordinate bufferv0的数据依次为:(inte_u0,inte_v0)、(inte_u0+1,inte_v0)、(inte_u0,inte_v0+1)、(inte_u0+1,inte_v0+1);mode为3D时,写入coordinate bufferu0、coordinate bufferv0、coordinate bufferw0的数据依次为:(inte_u0,inte_v0,inte_w0)、(inte_u0+1,inte_v0,inte_w0)、(inte_u0,inte_v0+1,inte_w0)、(inte_u0+1,inte_v0+1,inte_w0)、(inte_u0,inte_v0,inte_w0+1)、(inte_u0+1,inte_v0,inte_w0+1)、(inte_u0,inte_v0+1,inte_w0+1)、(inte_u0+1,inte_v0+1,inte_w0+1)。
address controller U4单元:首先完成纹理坐标到纹理偏移地址的计算;对于level0有效时,mode为1D,在地址计算没有溢出时的偏移量为size*u0;mode为2D,在地址计算没有溢出时的偏移量为size*(width0*u0+v0);mode为3D,在地址计算没有溢出时的偏移量为size*(width0*u0+v0)+w0*width0*height0;得到最终访问texel cache的地址为base0+偏移量。然后根据偏移量的末尾与4字节对齐方式,得到不同inte_format条件下的地址个数,并将末尾数据保存于offset0buffer中;由于level1无效,所以请求texel cache时,按照双buffer操作方式,奇数个地址请求texel cache地址访问cache0,偶数个地址请求访问cache1,实现地址的并行性访问。对于level0和level1均有效时,mode为1D,在地址计算没有溢出时的偏移量为size*u0,size*u1;mode为2D,在地址计算没有溢出时的偏移量为size*(width0*u0+v0),size*(width1*u1+v1);mode为3D,在地址计算没有溢出时的偏移量为size*(width0*u0+v0)+w0*width0*height0,size*(width1*u1+v1)+w1*width1*height1。得到最终访问texel cache的地址为base0+level0偏移量,base1+level1偏移量。此时,并行请求cache0和cache1。texel cache U1单元包括两个直接相连cache,完成对不同texel所在cache行的索引以及cache line的store、replace操作。当level0和level1同时有效时,并行完成对cache0和cache1的读操作请求,当只有level0有效时,cache0中存储odd cache line,cache1中存储even cache line。data calculationU2单元包括:data controllerU0:与address controller单元相似,当level0和level1同时有效时,分别按照不同的inte_format,结合off0和off1,从一个cache line中完成数据的拼接任务,得到与纹理地址对应的纹理数据,并将各自数据同时写入到data buffer0和data buffer1中,并且data buffer0、data buffer1分别存放各自level的数据;当只有level0有效时,同理,从cache0和cache1中分别读出各自cache line的数据根据不同的inte_format以及off0,得到odd data和even data,按照双方式写入data buffer0和data buffer1,此时data buffer0和data buffer1中存放的是同一个level的纹素数据,如图4所示,按照顺时针方向完成对cache的读取操作。filter单元U1:首先完成截位运算,针对不同的inte_format,截位出不同位宽的r、g、b、a值,然后采用独立方式分别进行滤波计算,位宽的截取方法按照不同的inte_format执行。filter单元支持的OGL标准下的inte_format为color的有:r8_norm、r8_snorm、r8I、r8UI、r3_g3_b2_norm(大、小端)、rgba2_norm、rgba4(大、小端)、rgb5_a1_norm(大、小端)、rgb4_norm、rgb5_norm、rgb565_norm(大、小端)、r16_norm、r16_snorm、r16f、r16UI、r16I、rg8_norm、rg8_snorm、rg8UI、rg8I、srgb8(非线性)、rgb8I、rgb8UI、rgb8_snorm、rgb8_norm、rgb10_norm、rgb10_a2_norm(大、小端)、rgb10_a2UI(大、小端)、srgb8_a8_norm(大、小端)、r11f_g11f_b10f、rgb9_e5(共享)、rgba8_norm (大、小端)、rgba8_snorm(大、小端)、rgba8UI(大、小端)、rgba8I(大、小端)、rg16、rg16_snorm、rg16I、rg16UI、rg16f、r32I、r32UI、r32f;filter单元支持的inte_format为depth和stencil的有:depth16、depth24、depth32、depth32f、stencil_index1、stencil_index4、stencil_index8、stencil_index16、depth24_stencil8、depth32f_stencil8。针对integer数据类型(有符号和无符号)两种、float数据类型(normalized、unnormalized、非线性、共享数据类型)四种情况,在执行滤波运算之前均需要将snorm、norm、srgb、rgbae在不同的filter_type下完成滤波计算。当level0和level1均有效,此时filter_type的滤波方式有NAF(non-anisotropic)(near_mipmap_linear isotropic、linear_mipmap_linear isotropic)、BAF(bilinear-anisotropic)(无效)、TAF(trilinear-anisotropic),当level0有效,level1无效时,此时filter_type的滤波方式有NAF(non-anisotropic)(near、near_mipmap_near、linear_mipmap_near)、BAF(bilinear anisotropic)、TAF(trilinear-anisotropic)(无效)。当level0和level1同时有效,而filter_type为TAF(near_mipmap_linear)时,无论mode为1D、2D、3D,均同时从data buffer0、data buffer1中同时读取一个数据data0和data1,得到滤波结果为data0*(1.0-ratio_l)+data1*ratio_l;如果滤波方式为TAF(linear_mipmap_linear),mode为1D时,首先从data buffer0、data buffer1中同时依次读取2个数据,分别为data0、data1和data2、data3,滤波中间结果为data0*(1.0-ratio_u0)+data2*ratio_u0、data1*(1.0-ratio_u1)+data3*ratio_u1,得到滤波最终结果为(data0*(1.0-ratio_u0)+data2*ratio_u0)*(1.0-ratio_l)+(data1*(1.0-ratio_u1)+data3*ratio_u1)*ratio_l,如图8所示;mode为2D,从data buffer0、data buffer1中同时依次读取4个数据data0、data1、data2、data3以及data4、data5、data6、data7,那么首先通过前4个数据data0、data2、data4、data6得到滤波的中间结果为data0*(1.0-ratio_u0)+data2*ratio_u0、data4*(1.0-ratio_u1)+data6*ratio_u1;然后再通过后4个数据data1、data3、data5、data7得到滤波的中间结果为data1*(1.0-ratio_u0)+data3*ratio_u0、data5*(1.0-ratio_u1)+data7*ratio_u1,最后分别得到level0和level1的最终结果为(data0*(1.0-ratio_u0)+data1*ratio_u0)*(1.0-ratio_v0)+(data2*(1.0-ratio_u0)+data3*ratio_u0)*ratio_v0、(data4*(1.0-ratio_u1)+data5*ratio_u1)*(1.0-ratio_v1)+(data6*(1.0-ratio_u1)+data7*ratio_u1)*ratio_v1,最后的滤波结果为((data0*(1.0-ratio_u0)+data1*ratio_u0)*(1.0-ratio_v0)+(data2*(1.0-ratio_u0)+data3*ratio_u0)*ratio_v0)*(1.0-ratio_l)+((data4*(1.0-ratio_u1)+data5*ratio_u1)*(1.0-ratio_v1)+(data6*(1.0-ratio_u1)+data7*ratio_u1)*ratio_v1)*ratio_l,如图9所示;mode为3D时,从data buffer0、data buffer1同时依次读取8个数据,分别为data0、data1、data2、data3、data4、data5、data6、data7和data8、data9、data10、data11、data12、data13、data14、data15。首先通过前8个数据data0、data1、data2、data3、data8、data9、data10、data11得到滤波中间结果分别为:((data0*(1.0-ratio_u0)+data2*ratio_u0)*(1.0-ratio_v0)+((data1*(1.0-ratio_u0)+data3*ratio_u0)*ratio_v0、((data8*(1.0-ratio_u1)+data9*ratio_u1)*(1.0-ratio_v1)+((data10*(1.0-ratio_u1)+data11*ratio_u1)*ratio_v1,然后再通过后8个数据data4、data5、data6、data7、data12、data13、data14、data15得到滤波中间结果分别为:((data4*(1.0-ratio_u0)+data5*ratio_u0)* (1.0-ratio_v0)+((data6*(1.0-ratio_u0)+data7*ratio_u0)*ratio_v0、((data12*(1.0-ratio_u1)+data13*ratio_u1)*(1.0-ratio_v1)+((data14*(1.0-ratio_u1)+data15*ratio_u1)*ratio_v1;最后得到滤波的最终结果为:((((data0*(1.0-ratio_u0)+data2*ratio_u0)*(1.0-ratio_v0)+((data1*(1.0-ratio_u0)+data3*ratio_u0)*ratio_v0)*(1.0-ratio_w0)+(((data4*(1.0-ratio_u0)+data5*ratio_u0)*(1.0-ratio_v0)+((data6*(1.0-ratio_u0)+data7*ratio_u0)*ratio_v0)*ratio_w0)*(1.0-ratio_l)+((((data8*(1.0-ratio_u1)+data9*ratio_u1)*(1.0-ratio_v1)+((data10*(1.0-ratio_u1)+data11*ratio_u1)*ratio_v1)*(1.0-ratio_w1)+(((data12*(1.0-ratio_u1)+data13*ratio_u1)*(1.0-ratio_v1)+((data14*(1.0-ratio_u1)+data15*ratio_u1)*ratio_v1)*ratio_w1)*ratio_l,如图10所示,当使能了anisotropic时,此时对data buffer0、data buffer1中的数据分别进行anisotropic计算后得到data0、data1的中间滤波结果,那么最终的滤波结果为data0*(1.0-ratio_l)+data1*ratio_l;当只有level0有效,而filter_type为near、near_mipmap_near时,无论mode为1D、2D、3D,均同时从data buffer0、data buffer1中同时读取一个数据data0和data1,对data0、data1格式进行转换之后直接输出,不经过滤波;如果滤波方式为BAF,当mode为1D时,首先从data buffer0、data buffer1中同时依次读取1个数据,分别为data0、data1,最终的滤波结果为data0*(1.0-ratio_u0)+data2*ratio_u0;当mode为2D,从data buffer0、data buffer1中同时依次读取2个数据data0、data1、data2、data3,那么首先通过前2个数据data0、data2、得到滤波的中间结果为data0*(1.0-ratio_u0)+data2*ratio_u0,如下图5所示;然后再通过后2个数据data1、data3得到滤波的中间结果为data1*(1.0-ratio_u0)+data3*ratio_u0,最后得到滤波的最终结果为(data0*(1.0-ratio_u0)+data2*ratio_u0)*(1.0-ratio_l)+(data1*(1.0-ratio_u0)+data3*ratio_u0)*ratio_l,如下图6所示;mode为3D时,从data buffer0、data buffer1同时依次读取4个数据,分别为data0、data1、data2、data3和data4、data5、data6、data7。首先通过前4个数据data0、data1、data4、data5得到滤波中间结果为:(data0*(1.0-ratio_u0)+data1*ratio_u0)*(1.0-ratio_v0)+(data4*(1.0-ratio_u0)+data5*ratio_u0)*ratio_v0,然后再通过后4个数据data2、data3、data6、data7得到滤波中间结果分别为:(data2*(1.0-ratio_u0)+data3*ratio_u0)*(1.0-ratio_v0)+(data6*(1.0-ratio_u0)+data7*ratio_u0)*ratio_v0;最后得到滤波的最终结果为:((data0*(1.0-ratio_u0)+data1*ratio_u0)*(1.0-ratio_v0)+(data4*(1.0-ratio_u0)+data5*ratio_u0)*ratio_v0)*(1.0-ratio_w0)+((data2*(1.0-ratio_u0)+data3*ratio_u0)*(1.0-ratio_v0)+(data6*(1.0-ratio_u0)+data7*ratio_u0)*ratio_v0)*ratio_w0,如下图7所示。当执行滤波操作后,按照不同的inte_format格式,对filter的输出结果为texel_r、texel_g、texel_b、texel_a进行赋值操作,如果format为color,当inte_format只有其中的r有值,此时texel_r为滤波结果,texel_g、texel_b均为0,texel_a为1;如果format为depth、stencil,此时在不执行滤波的添加下,将结果赋值到texel_r、texel_g分量,texel_b、texel_a分量为0。pixel单元U2:当使能border_color时,采用border_color数据作为pixel阶段的输入数据,当没有使能swizzle操作时,pixel_r、pixel_g、pixel_b、pixel_a与border_color中的border_color_r、border_color_g、border_color_b、border_color_a相等,如果使能了swizzle操作,则按照swizzle模式分别对各自通道数据进行转换操作,最终并行输出4路颜色分量pixel_r、pixel_g、pixel_b、pixel_a。
虽然在上文中已经参考实施例对本公开进行了描述,然而在不脱离本公开的范围的情况下,可以对其进行各种改进并且可以用等效物替换其中的部件。尤其是,只要不存在结构冲突,本公开所披露的实施例中的各项特征均可通过任意方式相互结合起来使用,在本说明书中未对这些组合的情况进行穷举性的描述仅仅是出于省略篇幅和节约资源的考虑。因此,本公开并不局限于文中公开的特定实施例,而是包括落入权利要求的范围内的所有技术方案。