共用方式為


多平面重疊硬體需求

支援多平面重疊不需要顯示驅動程式和硬體。 不過,若要提供多平面重疊支援,硬體必須符合下列需求:

  • 硬體必須支援非重疊平面:
    • 一個平面可以涵蓋螢幕的一部分,而另一個平面可以涵蓋螢幕的不同互斥部分。
    • 如果平面未涵蓋螢幕的任何部分,硬體必須掃描該區域的黑色。 硬體可以假設最下層 圖層 順序上有一個以黑色填滿的虛擬平面。
  • 硬體必須支援重疊平面:
    • 硬體必須能夠啟用或停用個別平面的Alpha混合。 (Alpha 混合是一種技術,其中來源位圖中的色彩會與目的地位圖中的色彩結合,以產生新的目的地位圖。)
    • 必須支援使用預先乘法 Alpha 在平面之間混合。
  • 當只有一個輸出目標作用中時,作用中的輸出必須支援多平面重疊。 在複製模式中,如果有多個輸出同時作用中,硬體就不應該報告它支援多平面重疊,除非所有作用中的輸出都支援多平面重疊。
  • 桌面視窗管理員 (DWM) 的交換鏈 (平面 0) 必須能夠與其他重疊平面互動。
  • 所有平面都必須能夠啟用和停用,包括平面 0 (DWM 的交換鏈) 。
  • 所有平面都必須支援來源和目的地裁剪,包括平面 0 (DWM 的交換鏈) 。
  • 至少一個平面必須支援壓縮和延展,與其他可能啟用的平面無關。
  • 支援縮放的平面必須同時支援雙線性篩選和篩選品質,比雙線性更好。
  • 如需詳細資訊,至少一個平面必須支持這些 YUV 格式 (,請參閱 Windows 8.1) 中的 YUV 格式範圍
    • 適用於 YUV 格式的 BT.601 和 BT.709 YUV 到 RGB 矩陣轉換。
    • 標準 (或 Studio) 範圍 YUV 亮度 (16 - 235) 和延伸範圍的 YUV 亮度 (0 - 255) 。
  • 硬體必須處理這些緩存器閂鎖案例:
    • 每個平面的所有屬性 (緩衝區位址、裁剪、縮放等) 必須在垂直回溯期間不可部分完成地張貼。 更新快取器區塊時,它們必須全部以不可部分完成的方式張貼,例如,如果在寫入 20 個與重疊平面相關的 10 個緩存器之後發生 VSync,則它們都不會張貼到下一個 VSync,因為它們無法全部張貼到目前的 Vsync) 。
    • 每個平面都可以與其他平面分開更新。 例如,如果在 VSync 之前更新了平面 0 緩存器,而稍後的平面 1 緩存器會在 VSync 發生時更新,則平面 1 更新可能會等到下一個 VSync,但平面 0 更新應該會及時發生。
    • 在單一目前呼叫期間更新多個平面時,應該會以不可部分完成的方式進行更新。 例如,如果單一存在呼叫正在更新平面 0 並啟用平面 1,除非平面 1 快存器也會張貼在相同的 VSync 上,否則平面 0 快取器不應該張貼在 VSync 上。
  • 轉換、縮放和混合應該依下列順序發生:
    1. 來源配置會根據指定的來源矩形裁剪。 來源矩形保證系結在來源配置的大小內。

    2. 套用水準影像翻轉,若有要求,則會套用垂直影像翻轉。

    3. 根據目的地矩形套用縮放比例、根據裁剪矩形套用裁剪,並在縮放時套用適當的篩選。

    4. 與其他圖層的配置混合。 混合應該從上到下執行 (,或直到以 置順序叫用不透明圖層) 為止。 如果要求Alpha混合,硬體必須接受每圖元Alpha,且色彩值會預先乘以Alpha。 下列虛擬程式代碼會從上到下重複地對目的地作業執行來源, ( ( (Layer[0] over Layer[1]) over Layer[2]) over ¦ Layer[n]) 。 在目的矩形之外,每個圖層都必須視為透明 (0,0,0,0,0) 。

      Color = Color[0]; // Layer 0 is topmost.
      Alpha = Color[0].Alpha;
      for (i = 1; Alpha < 1 && i < LayersToBlend; i++)
      {
          Color += ((1 - Alpha) * Color[i]);
          Alpha += ((1 - Alpha) * Color[i].Alpha);
      }
      Output Color;
      

      只要輸出結果相同,硬體就可以從下到上混合。 在此情況下,應該使用下列混合演算法:

      Color = Color[LayersToBlend-1];  // Bottom-most layer
      Alpha = Color[LayersToBlend-1].Alpha;
      if (LayersToBlend > 1)
      {
          for (i = LayersToBlend - 2; Alpha < 1 && i >= 0; i--)
          {
              Color = Color[i] + ((1 - Color[i].Alpha) * Color;
              Alpha = Color[i].Alpha + (1 - Color[i].Alpha) * Alpha;
          }
      }
      Output Color;
      
    5. 黑色必須顯示在任何圖層的任何目的地矩形未涵蓋的區域。 硬體可以假設有一個概念性的虛擬最下層黑色層,也就是螢幕大小。