モノトーンの伝説日記

Apex Legends, Splatoon, Programming, and so on...

Desktop Window Manager によって管理される DirectComposition の歴史

 DWM の DComp について調べていたらもうそれが結構地獄でした。

 Windows NT 6.2 時代に必要に応じて作られたものの,紆余曲折あり断片化と言った感じ。現状では歴史的経緯により Windows Runtime がメインになっている模様。

1. DirectComposition とは?

 DWM レイヤーによって直接的に管理合成されるレイヤーが開発者サイドに公開されたもの。Apple に詳しい人なら Core Animation を思い浮かべると良いです。そんな感じの API です。

 そもそも Windows Vista では

  • GDI コンテンツ (DirectDraw)
  • MIL コンテンツ (かつては WinFX と言われていた WPF のベース技術)
  • DXGI Swap Chain (DirectX 10 から)

の合成がメインだったわけですが,DirectDraw はソフトウェアによる描画でした。

 Windows 7 では DirectDraw こそハードウェア実行できるようになったものの,特に開発者が直接使えるものはありませんでした。

 そして Windows 8 時代。「より直接アニメーションなどを DWM 上で管理すればもっとハードウェアを効率よく使えるしそうしようぜ。」的な感じで,Microsoft design style (当時: Metro style) のために作られたんでしょう。歴史はそこから始まります。

2. DirectComposition の歴史

2.1 IDCompositionDevice

 Windows 8 で追加されたものです。まさに UI レイヤーを直接 DWM 上で扱うためのレイヤーと言ってもいいでしょう。

docs.microsoft.com

 特に目立ったことはありません。

2.2 IDCompositionDevice2 と IDCompositionDesktopDevice

 Windows 8.1 で何故か IDCompositionDevice の一部が切り出されたインターフェースです。Store apps で扱えるように公開する方針でもあったのでしょうか?

 少なくとも,意図的にそうとしか思えないですね。HWND 系(デスクトップ関連)が別インターフェースに切り離されています。

docs.microsoft.com

docs.microsoft.com

2.3 IDCompositionDevice3

 こちらも Windows 8.1 で追加されたもの。IDCompositionDevice2 で追加すればいい,と考える人もいるでしょう。おそらく,2.2 のインターフェース郡を Windows 8 に backport できるようにこのような設計にしたのだと思います。単純に platform update とか適応すれば,2.2 の機能自体は Windows 8 で実装されていますからね。

docs.microsoft.com

2.4 Windows.UI.Composition (実質 IDCompositionDevice4)

docs.microsoft.com

 実質と書いてあるのは名前が違うから。

 Compositor という名前になっています。

docs.microsoft.com

 ようやく,UWP から使えるようになりました。

2.4.1 CreateBackdropBrush

 いわゆる CSS の backdrop-filter に相当するやつです。アクリル素材の UI を作るのに背景にブラー落とし込んだりするために使います。

 これが Windows 10 RS1 (build 14393) 以降

2.4.2 CreateHostBackdropBrush

 DWM の背面レイヤーをソースにできるやつですね。実装が間に合わなかったのか,これだけ 1 つ後のバージョンからの搭載です。

 Windows 10 RS2 (build 15063) 以降

 WinUI 3 のサポートはこの機能が必要不可欠なため最低バージョンは RS2 に設定されています。

3. DirectComposition API の今後

 大幅に拡張されることは今後ないと思います。そもそも Windows 10 自体は Project Reunion で過去のプラットフォームをサポートするために OS と機能を分離するアップデート方針をとっていこうとしています (Android Support Library 的な考えですね)。

 ただ,WinUI 3 自体に新規 API を実装するってことはありそうです。エフェクト類とか。

まとめ

 アクリル効果を WPF 向けに使いたい……! って思って DirectComposition について調べていたらこんな感じに。実際 Windows 8 時代の DComp でも DirectComposition の背景レイヤーを WPF のレイヤードウィンドウの合成ぐらいはできるっぽいです。ただしデスクトップに干渉してエフェクトをかける機能がない。

 Windows.UI.Composition を使うと,その辺りは問題なく実装できますが,デスクトップアプリでも UWP 版の Win2D に依存していてビルドパイプラインに手動で手を加えないといけなかったりなどちょっといろいろ問題があって WPF で独自の背景を描くプロジェクトはこれで一旦終わろうと思います。

 WinUI 3 にもまだ背景アクリルは実装していませんし,そこでこのような状況が改善されたらまた描くかもしれません。そのときの自分に対して思い出すために資料を書いた,そんなところです。

 オレオレ UI Framework は DirectComposition を使って描くととても描画がいい感じになると思います。思ったより簡単で Tree 上に Visual を構築していくシステムを持っていて,まんま Apple 系の CALayer って感じで実装できるイメージです。

 一応 Win32 で COM-based な DComp 使った実装は一応世の中の役に立てばいいかなと思うので,MIT ライセンスでシェアしておきます。これをみた人の少しでも役に立てれば。

github.com