共用方式為


記憶體別名和資料繼承

放置和保留的資源可能會將堆積內的實體記憶體別名。 當堆積已設定共用旗標,或別名資源具有完整定義的記憶體配置時,放置的資源會啟用比保留資源更多的資料繼承案例。

別名

即使不需要資料繼承,也必須在共用相同實體記憶體的兩個資源之間發出別名屏障。 簡單使用模型至少必須表示這類作業所涉及的目的地資源。 如需詳細資訊和進階使用模型,請參閱 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 層級和64KB_TILE_UNDEFINED_SWIZZLE版面配置的 2D 轉譯目標紋理陣列。 假設應用程式瞭解每個陣列配量佔用 100 64KB 磚。 應用程式可以使用陣列配量 0 來放棄,並針對 ~6MB 緩衝區、具有未定義配置的 ~6MB 紋理等重複使用該記憶體。進一步假設應用程式不再需要陣列配量 1 的第一個磚。 然後,應用程式也可以在那裡找到 64KB 緩衝區,直到轉譯需要陣列配量 1 的第一個磚。 應用程式必須清除或複製完整的磚,才能再次搭配紋理陣列重複使用第一個磚。

不過,即使是具有已定義版面配置的紋理仍有問題的情況。 紋理資源大小與應用程式本身的計算方式大相徑庭,因為某些配接器架構會為紋理配置額外的記憶體,以減少常見轉譯案例期間的有效頻寬。 該額外記憶體區域的任何失效會導致整個資源失效。 如需詳細資訊,請參閱 GetResourceAllocationInfo

資料繼承

放置的資源會啟用紋理的大部分資料繼承,即使記憶體配置未定義也一定。 應用程式可以模擬共用認可資源啟用的資料繼承功能,方法是在共用堆積中的相同位移找到兩個具有相同資源屬性的紋理。 整個資源描述必須相同,包括優化的清楚值和資源建立方法的類型(放置或保留)。 但是,這兩個資源可能有不同的初始轉換屏障狀態。

保留的資源會啟用每個磚資料繼承;但資源轉換屏障狀態通常存在限制。

若要繼承資料,這兩個資源都必須處於相容的資源轉換屏障狀態:

  • 對於緩衝區、同時存取紋理和交叉配接器紋理,資源轉換狀態並不重要,而且所有狀態都「相容」。
  • 對於未透過64KB_TILE_UNDEFINED_SWIZZLE或64KB_TILE_STANDARD_SWIZZLE繼承先前屬性或其他每個磚資料繼承的保留紋理,包括磚的資源轉換屏障狀態必須處於一般狀態。
  • 對於所有其他紋理,其中資源描述完全相符,每個對應子資源配對的資源轉換屏障狀態都必須:
    • 處於一般狀態。
    • 當狀態具有相同的 GPU 寫入旗標時,請相同。

當 GPU 支援標準旋轉時,緩衝區和標準旋轉紋理可能會別名為相同的記憶體,並繼承它們之間的資料。 應用程式可以從緩衝區表示操作紋素,因為標準旋轉模式描述紋素在記憶體中的配置方式。 CPU 可見的旋轉模式相當於緩衝區中看到的 GPU 可見旋轉模式。

堆積內的子位置