本節所述的 API 會使用並排顯示的資源和磚集區。
將磚集區中的磚指派給資源
ID3D11DeviceContext2::UpdateTileMappings 和 ID3D11DeviceContext2::CopyTileMappings API作和查詢磚對應。 更新呼叫只會影響呼叫中所識別的磚,而其他呼叫則保留為先前定義的磚。
磚集區中的任何指定磚都可以對應至資源中的多個位置,甚至是多個資源。 此對應包含資源中的磚,其具有實作選擇的配置(Mipmap 封裝),其中多個 Mipmap 會封裝成單一磚。 catch 是,如果數據是透過一個對應寫入磚,但透過不同設定的對應讀取,則結果為未定義。 不過,謹慎使用此彈性仍對應用程式很有用,例如在不會同時使用的資源之間共用磚,其中磚的內容一律會透過與後續讀取相同的資源對應進行初始化。 同樣地,對應以保存多個具有相同表面維度之多個不同資源的封裝Mipmap的圖格將會正常運作-這兩個對應中數據會以相同方式顯示。
資源磚指派的變更可以隨時在立即或延後的內容中進行。
查詢資源並排支援
若要查詢資源並排,請使用 ID3D11Device2::GetResourceTiling。
如需其他資源並排支援,請使用 ID3D11Device2::CheckMultisampleQualityLevels1。
複製並排顯示的數據
Direct3D 中行動數據的任何方法都會使用並排顯示的資源,就好像它們並未並排顯示一樣,不同之處在於卸除對未對應的區域寫入,並從未對應的區域讀取會產生 0。 如果複製作業牽涉到寫入相同的記憶體位置多次,因為目的地資源中的多個位置會對應至相同的磚記憶體,則產生對多對應磚的寫入是非決定性且不可重複的。 也就是說,無論硬體執行複本的順序為何,存取都會發生。
Direct3D 11.2 引進了這些其他複製方式的方法:
- 在磚資源中的磚之間複製 (以 64KB 磚粒度為單位)和圖形處理單位 (GPU) 記憶體 (或預備資源) 中的緩衝區之間複製 - ID3D11DeviceContext2::CopyTiles
- 從應用程式提供的記憶體複製到磚資源中的磚 - ID3D11DeviceContext2::UpdateTiles
這些方法會視需要 swizzle/deswizzle,並在呼叫端承諾目的地記憶體未由正式發行前小眾測試版的 GPU 工作參考時,允許D3D11_TILE_COPY_NO_OVERWRITE旗標。
複製中涉及的圖格不能包含包含已封裝Mipmap的磚,或是具有未定義結果的磚。 若要將數據傳輸到硬體套件到某個磚的 mipmap,您必須針對整個 Mip 鏈結使用標準(非磚專用)複製/更新 API 或 ID3D11DeviceContext::GenerateMips。
GenerateMips上的附注: 在具有部分對應磚的資源上使用 ID3D11DeviceContext::GenerateMips,將會產生結果,只要遵循讀取和寫入規則,NULL 套用至硬體和顯示驅動程式會用來 GenerateMips。 因此,除非應用程式在產生階段對其他mips的影響,否則,除非有某種方式,使用NULL 對應的區域,否則應用程式不會對應用程式所關心的介面部分產生任何影響,否則它並不特別有用。
例如,從暫存介面或應用程式記憶體複製磚數據,就是上傳可能已從磁碟串流處理之磚的方式。 串流關閉磁碟時的變化是將某種壓縮的數據上傳至 GPU 記憶體,然後在 GPU 上譯碼。 譯碼目標可以是 GPU 記憶體中的緩衝區資源,CopyTiles 然後複製到實際的並排資源。 這個複製步驟可讓 GPU 在不知道旋轉模式時進行旋轉。 如果磚化資源本身是緩衝區資源(例如,相對於紋理),則不需要閃爍。
複製中非並排緩衝區資源端圖格的記憶體配置只是 64KB 圖格內的記憶體線性,硬體和顯示驅動程式會在傳輸至磚資源或從並排顯示資源時適當地在每個磚上旋轉/還原wizzle。 針對多重取樣反鋸齒(MSAA)表面,每個像素的樣本會以樣本索引順序周遊,再移至下一個圖元。 對於在右側部分填滿的磚(對於寬度不是圖元的磚寬度倍數的表面),向下移動數據列的間距/步幅是圖格滿時會容納在磚上之數位圖元的位元組大小。 因此,記憶體中每個像素數據列之間可能會有一個間距。 為了簡化規格,小於磚的Mipmap不會在線性配置中封裝在一起。 這似乎是記憶體空間的浪費,但如所述,透過 copyTiles 或 UpdateTiles不允許硬體套件在一起複製。 應用程式只能使用一般 UpdateSubresource*() 或 CopySubresource*() API 個別複製小型 Mips,不過在 CopySubresource*() 的情況下,這表示線性記憶體必須與並排資源相同維度 - CopySubresource*() 無法從緩衝區資源複製到 Texture2D 例如。
如果已定義硬體標準 swizzle,可以新增旗標,以指出緩衝區中的數據會以該格式解譯(傳輸時不需要擷取),不過上傳數據的替代方法在該情況下也可能有意義,例如允許應用程式直接存取磚集區內存。
複製作業可以在即時或延後的內容上完成。
調整磚集區的大小
若要調整磚集區的大小,請使用 ID3D11DeviceContext2::ResizeTilePool。
並排資源屏障
若要指定多個磚資源之間的數據存取順序條件約束,請使用 ID3D11DeviceContext2::TiledResourceBarrier。
相關主題