記憶體別名和數據繼承
放置和保留的資源可能會將堆積內的物理記憶體別名。 當堆積設定為共用旗標,或別名資源具有完全定義的記憶體佈局時,配置的資源比預留資源能支援更多數據繼承的情境。
別名
即使不需要數據繼承,也必須在共用相同物理記憶體的兩個資源之間設置別名障礙。 簡單使用模型至少必須表示這類作業所涉及的目的地資源。 如需詳細資訊和進階使用模型,請參閱 CreatePlacedResource。
存取資源之後,除非允許數據繼承,否則與該資源分享物理記憶體的任何資源都會失效。 讀取無效的資源會導致資源的內容未定義。 寫入無效的資源也會導致未定義的資源內容,除非發生下列兩種情況:
- 資源沒有這兩個標誌:D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET或D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL。
- 寫入資料是整個子資源或圖塊的複製或清除操作。 磚初始化僅適用於具有64KB_TILE_UNDEFINED_SWIZZLE和64KB_TILE_STANDARD_SWIZZLE的資源。
當版面配置提供有關紋素數據位置位置的資訊,以及資源處於特定轉換屏障狀態時,重疊無效的範圍會限定為較小的粒度。 但是,無效化無法比資源對齊的粒度更小。
緩衝區對齊粒度為 64KB,且較大的對齊粒度優先。 考慮 4KB 紋理時,這很重要,因為多個 4KB 紋理可以位於 64KB 區域中,而不會彼此重疊。 但別名指向相同 64KB 區域的緩衝區不能和任何這些 4KB 紋理搭配使用。 應用程式無法可靠地防止對緩衝區的存取與 4KB 紋理產生交集,因為 GPU 可在未定義的模式下,允許於 64KB 區域內重排 4KB 紋理數據。
64KB_TILE_UNDEFINED_SWIZZLE、64KB_TILE_STANDARD_SWIZZLE和ROW_MAJOR紋理版面配置會通知應用程式,重疊對齊粒度已失效。 例如:應用程式可以建立具有 2 個陣列切片、單一 mip 層級的 2D 繪圖目標材質,並使用 64KB_TILE_UNDEFINED_SWIZZLE 配置。 假設應用程式理解每個陣列切片佔用 100 個 64KB 的塊狀。 應用程式可以放棄使用陣列切片 0,並將該記憶體重複用於~6MB 的緩衝區、未定義配置的~6MB 紋理等。進一步假設應用程式不再需要陣列切片 1 的第一個圖塊。 然後,應用程式也可以在那裡配置一個 64KB 緩衝器,直到需要再次渲染陣列切片 1 的第一個圖塊。 應用程式必須清除或複製完整的磚,才能再次搭配紋理陣列重複使用第一個磚。
不過,即使是具有已定義版面配置的紋理仍有問題的情況。 紋理資源大小與應用程式本身的計算方式大相徑庭,因為某些配接器架構會為紋理配置額外的記憶體,以減少常見轉譯案例期間的有效頻寬。 該額外記憶體區域的任何失效會導致整個資源失效。 如需詳細資訊,請參閱 GetResourceAllocationInfo。
數據繼承
放置的資源可以實現最大限度的紋理數據繼承,即使記憶體佈局未定義。 應用程式可以透過在共用堆中找到兩個具有相同資源屬性的紋理並將它們設置在相同的位移上,來模擬由共用認可資源啟用的資料繼承功能。 整個資源描述必須相同,包括優化的清晰值和資源生成方法的類型(放置或保留)。 但是,這兩個資源可能有不同的初始轉換屏障狀態。
保留的資源允許每個區塊的數據繼承,但資源過渡屏障狀態通常存在限制。
若要繼承數據,這兩個資源都必須處於相容的資源轉換屏障狀態:
- 對於緩衝區、同時存取紋理和交叉配接器紋理,資源轉換狀態並不重要,而且所有狀態都「相容」。
- 對於未透過64KB_TILE_UNDEFINED_SWIZZLE或64KB_TILE_STANDARD_SWIZZLE繼承先前屬性或其他每個磚數據繼承的保留紋理,包括磚的資源轉換屏障狀態必須處於一般狀態。
- 對於所有其他紋理,其中資源描述完全相符,每個對應子資源配對的資源轉換屏障狀態都必須:
- 處於一般狀態。
- 當狀態具有相同的 GPU 寫入旗標時,請保持相等。
當 GPU 支援標準排列時,緩衝區和標準排列紋理可能會共用相同的記憶體,並在其間繼承數據。 應用程式可以從緩衝區表示中操作紋素,因為標準交錯模式描述了紋素在記憶體中的配置方式。 CPU 可見的旋轉模式相當於緩衝區中看到的 GPU 可見旋轉模式。
相關主題