概觀
紋理並排 (Texture tiling),又稱為_紋理混排_ (texture swizzling),是 GPU 定義紋理 mipmap 排列方式以及每個 mipmap 內紋素索引方式的方法。本主題說明 XBOX Series X|S GPU 與 XBOX One (X) GPU 在 mipmap 配置及紋素排序方面的差異。XBOX Series X|S GPU 的混排模式與 XBOX One 世代的 GPU 不同。mip 層級內紋素的排序 (即_混排模式_) 已變更,mip 層級的排序與對齊方式也已變更。 與 XBOX One 世代相同,您可以使用 XG 程式庫來計算紋理 mip 配置與紋素混排模式。XBOX Series X|S 版本的 XG 稱為 XG_XS,可透過針對 xg_xs.h 和 xg_xs.lib 進行編譯與連結,在離線及執行階段使用。此 API 與 XBOX One XG 非常相似,變更之處包括與混排模式 (相對於並排模式) 相關的部分,以及輸出結構中的一些欄位已變更,以反映 XBOX Series X|S GPU 的新屬性。Mipmap 配置
在 XBOX Series X|S GPU 上,mip 層級在記憶體中現在是以反向順序排列,最小的 mip 層級 (mip 尾端) 位於紋理內接近位移 0 的位置,接著是逐漸增大的 mip 層級,而最大的 mip 層級 (mip 0) 位於距離紋理基底位址最遠的位移處。陣列紋理的實作方式也不同,現在是以 mip 鏈結的陣列來實作 (例如,切片 0 的 mip n-0,接著是切片 1 的 mip n-0)。在 XBOX One 世代的 GPU 中,陣列紋理是以陣列的 mip 鏈結來實作 (例如,所有 mip 0 切片,接著是所有 mip 1 切片)。 使用 XG 程式庫的離線紋理處理程式碼,以及任何對 mip 排序與對齊方式有所假設的執行階段紋理串流程式碼,都需要配合新的 XBOX Series X|S 配置進行調整。 Mip 配置是以紋理區塊大小為基礎。混排模式的選擇 (定義如下) 會指定紋理區塊大小。可能的區塊大小有五種:線性、256 位元組、4 KB、64 KB 和可變。根據紋理維度 (1D、2D 或 3D) 以及以位元組為單位的元素大小,每種區塊大小都會定義 mip 高度與寬度的填補維度。將每個 mip 層級填補至區塊大小,表示 mip 位移會對齊至區塊大小。 為避免使用較大區塊大小 (4 KB 和 64 KB) 的 mipmap 紋理耗用過多記憶體,所有小於一個區塊的 mip 層級都會封裝至一個區塊大小的 mip 尾端,該尾端位於紋理配置中的位移 0。mip 尾端中的 mip 層級會以 256 位元組對齊。 對於較小的區塊大小 (線性和 256 位元組),mip 層級會以 256 位元組對齊,差異只在於填補維度。256 位元組區塊模式使用 2D/3D 填補維度,而線性區塊模式一律指定填補高度與深度為 1。 支援「可變」區塊大小的混排模式,但圖形驅動程式預設不會選取。VAR 混排模式的區塊大小在 Anaconda 上為 512 KB,在 Lockhart 上為 128 KB。 下列圖表顯示 48 × 24 的 2D 紋理在具有 6 個 mip 層級時,使用線性、256 位元組和 4 KB 區塊模式的配置。64 KB 的配置與 4 KB 配置類似,只是區塊大小較大 (mip 尾端也相應較大)。



XG 配置結構
XGTextureAddressComputer 物件是 XG 內的主要介面。它提供配置計算與紋素定址方法。輸出配置結構 XG_RESOURCE_LAYOUT 包含一到四個平面 (XG_PLANE_LAYOUT),而每個平面包含一或多個 mip 層級 (XG_MIPLEVEL_LAYOUT)。 計算 XBOX Series X|S 紋理配置時,這三個配置結構的下列成員值得注意。XG_RESOURCE_LAYOUT
- SizeBytes 是影像的總大小,包括所有平面。
- BaseAlignmentBytes 是影像的基底對齊。每個平面可能有自己的對齊值,但 XG_RESOURCE_LAYOUT::BaseAlignmentBytes 是所有平面中的最大對齊值。
- MipLevels 是影像中存在的 mip 層級數目。在大多數情況下,如果是 mipmap 紋理,只有其中一個平面可以包含多個 mip 層級。
XG_PLANE_LAYOUT
- Usage 是平面的用途:主要表面 (樣本或紋素) 為 “DEFAULT”、“DEPTH” 或 “STENCIL”;壓縮中繼資料為 “HTILE”、“FMASK”、“CMASK” 或 “DELTA_COLOR_COMPRESSION”;雙平面多媒體格式影像則為 “LUMA” 或 “CHROMA”。
- SizeBytes 是平面的總大小,包括所有陣列切片。
- SliceSizeBytes 是單一 mip 鏈結的總大小,構成一個陣列切片。
- StandardMipCount 是不屬於 mip 尾端的 mip 層級數目。
- MipTailMipCount 是屬於 mip 尾端的 mip 層級數目。
XG_MIPLEVEL_LAYOUT
- SizeBytes 是此 mip 層級的大小。
- OffsetBytes 是此 mip 層級相對於 mip 鏈結基底的位移。
- 對於 2D (陣列) 紋理,Slice2DSizeBytes 等同於 SizeBytes;對於 3D 紋理,則為一個深度切片的大小。
- PaddedWidthElements、PaddedHeightElements 和 PaddedDepthOrArraySize 是 mip 層級的維度 (以紋素元素為單位),已填補至所選混排模式對應的區塊大小。請記住,BC 壓縮區塊是一個紋素元素,大小為 4 × 4 紋素。
- 如果此 mip 層級屬於 mip 尾端,IsMipTail 為 1;如果不屬於 mip 尾端,則為 0。
XG_MIPLEVEL_LAYOUT 的 XBOX Series X|S 硬體注意事項
- 在具有多個切片的陣列紋理中,SizeBytes 只會反映一個切片的大小。對於體積紋理,SizeBytes 會反映所有「深度切片」的大小,但這些切片在記憶體中可能不連續。
- OffsetBytes 會反映此 mip 層級在第一個陣列切片中的位移。若要計算此 mip 層級在切片 1-n 中的位移,請將 OffsetBytes 加上平面配置的 SliceSizeBytes 乘以切片索引。
- 請注意,對於體積紋理,每個 mip 層級在記憶體中可能不連續。若要判斷體積 mip 層級所佔用的記憶體範圍,請使用 PlaneLayout.SliceSizeBytes * DepthSliceIndex + MipLayout.OffsetBytes 作為每個範圍的起始位移,並使用 StartOffset + MipLayout.SliceSizeBytes * MipLayout.SliceDepthElements 作為每個範圍的結束位移。mip 層級的深度切片數目為 mip 深度除以 MipLayout.SliceDepthElements。
混排模式
與 XBOX One 類似,每個影像描述元、轉譯目標和深度/樣板目標都可以從 32 種不同的紋理並排模式中選取一種,在 XBOX Series X|S 上稱為_混排模式_,在 XBOX One 上則稱為_並排模式_。不過,相似之處僅止於此,因為在 XBOX Series X|S 上建構每種模式的方式與 XBOX One 相當不同。除了線性配置之外,XBOX Series X|S 與 XBOX One 之間沒有共通的紋理並排模式。 XBOX Series X|S GPU 上的每種混排模式都有數個屬性,這些屬性會在混排模式的名稱中標示。- 區塊大小: 並排模式的基本單位大小,以位元組數目指定。區塊大小可以是 256 位元組、4 KB、64 KB、「可變」(512 KB 或 128 KB) 或線性。
- 微並排模式: 區塊內紋素元素的配置。微並排模式包括 “S”、“D”、“R” 和 “Z”。對於某些元素大小,S 與 D 模式是相同的。線性混排模式沒有微並排。
- 管線 XOR 模式: 紋素定址是否在 XOR 混排作業中使用管線位元。XOR 設定包括 “X”、“T” 以及無管線 XOR。所有具有管線 XOR (“X” 或 “T”) 的混排模式,其混排模式都特定於硬體組態 (Anaconda 與 Lockhart),因此離線進行混排時必須特別小心。“X” 管線混排會跨越多個區塊,而 “T” 管線混排則限制在每個區塊內。
