● 从无到有的Texture cache
和显存不同,由于显卡最初的工作并不涉及材质工作,所以纹理缓存的历史远没有显存来的悠久。甚至直到显卡开始具备材质处理能力时,由于要求相对较低,纹理缓存也没有在第一时间出现。
第一代出现“实体”Texture cache的产品——RIVA TNT
纹理缓存在刚出现时并不受人重视,其处境甚至可以说有些凄凉。由于需求不大,最初的纹理缓存甚至连属于自己的实体都没有得到,人们只是显存中划分的一小块独立区域,这片区域通常被分配在显存前端方便读写,TMU将需要快速缓冲的材质数据有限存放在这一小片区域中。这个甚至只能称得上是buffer的小区域,就是最初的纹理缓存。
随着需求的不断增加,图形需求带来的纹理尺寸增长是非常迅速的,与此同时,诸如mip-mapping以及Generating Lightmaps之类的复杂纹理和操作也被更多的使用在了图形效果的表达过程中。这些要求让TMU获得一套更加快速有效的缓冲系统的愿望变的迫切起来,于是,第一代“实体化”的纹理缓存便出现了。
RIVA TNT白皮书中明确了Texture cache的存在
第一次透露出拥有独立纹理缓存信息的GPU是NV3,也就是我们所熟悉的RIVA TNT。遗憾的是由于公开信息的不足,我们已经无从得知出现在NV3中Texture cache的确切数量了,我们甚至不能确定他究竟是独立ram还是共享DRAM,这从侧面也反映出了当时对纹理缓存重视度的严重不足。其后NVIDIA曾经再次在NV15时代宣称其拥有独立于VRAM之外的纹理缓存,但具体信息依旧不明。到NV20时代,纹理缓存的存在渐渐被大众所接受和关注,但依旧同NV15一样确切数量无从考证,人们只能通过对NV2A的研究,将NV2X的Texture cache数量推定在了128K。其后的诸多GPU构架中都曾多次提到Texture cache,但对大小问题始终焉语不详。截止到NV40为止,整个GPU体系的纹理缓存一直处于半神秘状态,而且仅有一级,我们可以将其称为L1 Texture cache。
相对于L1,L2 Texture cache的出现则要高调的多。伴随着DirectX 9.0C的出现,Vertex Texture的出现对L2 Texture cache提出了实际的需求,在VertexShader单元外围布置L2 Texture cache成了显卡完整支持DirectX 9.0C的重要标志之一。NVIDIA在NV40中首次引入了L2 Texture cache,大小为128K,到G70时增加至288K。ATI则在R520中加入了完整的L2 Texture cache,并在R600中将其提升至256K。
别看纹理缓存的作用表面跟CPU的多级cache相当,都是数据的临时告诉缓冲空间,甚至也分L1/L2两级,它最初的实际功能与操作方式却和原教旨的多级cache存在极大的区别,甚至可以说完全不同的。可以说最初的纹理缓存,只能用一片混乱来形容。