Share via


重複對應的磚存取限制

本節描述具有重複對應之磚存取限制。

複製具有重迭來源和目的地的並排資源

如果複製* 作業的來源和目的地區域中的磚在複製區域中有重複的對應,即使這兩個資源都不是並排資源,而且 Copy* 作業支援重迭複本,則 Copy* 作業的行為會正常 (,就像來源在移至目的地) 之前複製到暫存位置一樣。 但如果重疊不明顯 (例如來源和目的地資源不同,但給定表面上的共用對應或對應重複),則不會定義共用磚上複製作業的結果。

複製至目的地區域中具有重複磚的並排資源

除非資料本身相同,否則複製到目的地區域中具有重複磚的並排資源會產生未定義的結果;不同的磚可能會以不同的順序寫入磚。

UAV 對重複磚對應的存取

假設磚資源上的未排序存取檢視 (UAV) 在其區域中有重複的磚對應,或是系結至管線的其他資源。 若由不同執行緒則執行,則不會定義這些重複磚的存取順序,就像任何 UAV 記憶體存取的順序通常都未排序。

磚對應變更或內容從對應外部更新後轉譯

如果磚化資源的磚對應已變更,或對應磚集區圖格中的內容已透過另一個並排資源對應的變更, 而磚化資源將會透過轉譯目標檢視或深度樣板檢視來轉譯,應用程式必須使用固定函數 Clear API) 清除 (,或使用 Copy*/Update* API 完全複製已轉譯 (對應或未) 的區域內變更的磚。 在這些情況下,應用程式無法清除或複製會導致特定轉譯目標檢視或深度樣板檢視的硬體優化結構過時,而且會導致某些硬體上的垃圾轉譯結果,而且在不同硬體之間不一致。 硬體所使用的這些隱藏的最佳化資料結構可能對個別對應而言為本機項目,而不會對其他記憶體相同的對應顯示。

ID3D11DeviceCoNtext1::ClearView作業支援使用矩形清除轉譯目標檢視。 對於支援並排資源的硬體, ClearView 也必須支援清除具有矩形的深度樣板檢視,而只有深度表面 (,而不需要樣板) 。 這項作業可讓應用程式只清除表面的必要區域。

如果應用程式需要在已變更對應的磚資源中保留區域的現有記憶體內容,該應用程式必須解決清楚的需求。 應用程式可以先儲存磚對應已變更 (的內容,例如,藉由使用 ID3D11DeviceCoNtext2::CopyTiles) 、發出必要的清除命令,然後將內容複寫回,藉此完成此工作。 雖然這可完成為遞增轉譯保存表面內容的工作,但缺點是表面的後續轉譯效能可能效能降低,因為轉譯最佳化可能遺失。

如果磚同時對應到多個並排資源,而且磚內容會由任何方式操作, (轉譯、複製等等,透過其中一個並排資源) ,如果相同的磚是透過任何其他並排資源轉譯,則必須先清除磚,如先前所述。

轉譯至在轉譯區域以外共用的磚

假設圖格資源中的區域正在轉譯為 ,而轉譯區域所參考的磚集區磚也會從轉譯區域外部對應至 , (包括透過其他並排顯示資源,同時或未) 。 透過其他對應檢視時,轉譯至這些磚的資料並不保證會正確顯示,即使基礎記憶體配置相容也一樣。 這是因為某些硬體所使用的最佳化資料結構對可轉譯表面的個別對應而言可能為本機,但不會對記憶體位置相同的其他對應顯示。 您可以從轉譯對應複製到所有其他可能存取之記憶體相同的對應 (或者若不再需要舊的內容,即可清除該記憶體或將其他資料複製到其中) 來因應這項限制。 雖然這項因應措施看起來很冗餘,但可讓所有其他記憶體相同的對應正確了解如何存取其內容,且至少因為只有單一實體記憶體備份保持不變而節省記憶體。 此外,當您使用共用對應 (的不同磚資源之間切換時,除非唯讀取) ,否則您必須在參數之間呼叫 ID3D11DeviceCoNtext2::TiledResourceBarrier API。

轉譯至在轉譯區域以內共用的磚

如果將磚資源中的區域轉譯為 ,而且轉譯區域內有多個磚對應至相同的磚集區位置,則這些磚上未定義轉譯結果。

跨磚資源分享磚的資料相容性

假設多個並排資源對應至相同的磚集區位置,且每個資源都用來存取相同的資料。 只有在避免發生硬體優化結構問題的其他規則、對 ID3D11DeviceCoNtext2::TiledResourceBarrier 的適當呼叫,以及並排資源彼此相容時,此案例才有效。 後者會以磚資源分享磚不相容的意義來說明後者。 存取重複磚對應之間相同資料的不相容情況是使用不同的表面維度或格式,或是資源上轉譯目標或深度樣板繫結旗標呈現的差異。 若您後續透過來自不相容資源的對應進行讀取或轉譯,則使用一種對應寫入記憶體會產生未定義的結果。 若另一個資源共用對應首先使用新資料初始化 (回收記憶體作為其他用途),則後續讀取或轉譯作業會運作正常,因為資料不會在不相容的解譯間洩出。 但是,當您在存取不相容的對應之間切換時,您必須呼叫 TiledResourceBarrier API,如下所示。

如果在任何資源共用對應上彼此都未設定轉譯目標或深度樣板繫結旗標,則限制大為降低。 只要格式及表面類型 (例如 Texture2D) 相同,即可共用磚。 不同格式相容的情況包括 BC* 表面,以及每個元件格式的對等大小未壓縮 32 位或 16 位,例如 BC6H 和 R32G32B32A32。 每個元素格式有許多 32 位的別名可以搭配 R32_* 以及 (R10G10B10A2_*、R8G8B8A8_*、B8G8R8A8_*、B8G8R8X8_*、R16G16_*) ;非並排資源一律允許此作業。

如果格式相容且磚會填入純色,則壓縮與非壓縮磚之間的共用會運作良好。

最後,如果資源共用磚對應之間唯一的共同點是其皆不具轉譯目標或深度樣板繫結旗標,則僅可安全地共用填入 0 的記憶體;對應會顯示為任何 0 針對給定資源格式定義的解碼目標 (通常僅為 0)。

磚式資源的管線存取