Desktop Window Manager

Desktop Window Managerは、Windows Vista以降のMicrosoft Windows系オペレーティングシステムで用いられるデスクトップ描画システムである。Windows VistaおよびWindows 7ではWindows Aeroテーマ使用時などに限られていたが、Windows 8からはクラシックテーマが廃止され、常にDWMを使用するようになった。

1. DWMが有効になる条件
--------------

Windows VistaおよびWindows 7では、WindowsテーマとしてのWindows AeroまたはWindows Vistaスタンダード・Windows 7スタンダードの選択時に用いられる。Windows 8以降ではすべての場合においてDWMが使用される。

Windows VistaおよびWindows 7において、DWMの実行には少なくともDirect3D 9.0Exとシェーダーモデル 2.0に対応したグラフィックスハードウェア 、そしてWindows Display Driver Model  対応のデバイスドライバーが必要である。Windows 8以降では、WDDM準拠のグラフィックスドライバーが存在しない場合、ソフトウェア  でDWMの処理が行われる。

DWMはWindows Vista Starter エディションには搭載されていない。Windows Vista Home Basic エディションには DWM が搭載されているが、透明なガラス効果やフリップ3Dなど一部の機能は無効にされている。また、Windows Server 2008およびServer 2008 R2でも、対応GPUを用いて、「デスクトップ エクスペリエンス」機能を有効にすることでDWMが使用可能となる。

2. アーキテクチャ
----------

section=1 Windows VistaつまりWDDM 1.0世代のDWMの下では、アプリケーションソフトウェアの描画出力は直接ビデオメモリに送られず、システム メモリのオフスクリーンバッファに保持される。そして、各アプリケーションのウィンドウの内容をDWMが最終的に合成して出力する。なお、macOSのQuartz Compositorも同様の仕組みを用いている。DWMがすべてのアプリケーションの描画内容を保持するため、透明効果のような複数のアプリケーション ウィンドウに跨る効果が容易に適用できる。DWMではDirect3D 9.0Exを通してGPUを利用し、オフスクリーンバッファから画面への描画に用いる過程にCPUを用いない仕組みとなっている。ただし、アプリケーションがオフスクリーンバッファへ描画する段階では、Graphics Device InterfaceのようなDWMと密な連携を持たない描画技術を用いる場合、オフスクリーンバッファへCPUを用いてビットマップとして描画することになる。Windows Presentation FoundationのようなDWM対応の描画技術では、DWM互換の形式の内部データを直接生成する。いずれにせよ、ウィンドウの内容はDirect3Dのテクスチャへ変換される。

Windows 7つまりWDDM 1.1ではDWMのメモリ管理機構が改良され、各アプリケーションのウィンドウ描画結果のコピーをシステムメモリに保持しなくなり、ワーキングメモリの消費を低減させた。また、Windows 7のデスクトップ描画にはDirect3D 10.1 APIが使用されている。

デスクトップは全画面のDirect3Dサーフェイスとなっている。2次元の矩形を表現する2つの三角形のメッシュからなっており、デスクトップの画面全体を表すテクスチャがそこに投影される。ウィンドウの遷移は、シェーダープログラムでメッシュの変形として実装されている。Windows Vistaでは、この遷移はDWM内蔵のものしか利用できない。マイクロソフトの開発者であるGreg Schechterは、将来的にプラグイン方式で独自の効果を適用できるようにするかもしれないと示唆している。DWMはプライマリのデスクトップ オブジェクトのみを3Dサーフェイスとして扱う。ユーザーアカウント制御のセキュア デスクトップを含む他のデスクトップ オブジェクトでは使用できない。

すべてのアプリケーションの描画がオフスクリーンバッファへ行われるようになった結果、他のアプリケーションが描画した内容を取り込めるようになった。オフスクリーンバッファはアプリケーションが絶えず更新するため、取り込んだ描画内容も動的に変化し続ける。これによって、ライブ サムネイル プレビューやWindowsフリップ3Dが実現されている。DWMはサムネイルを取得するAPIを公開している。サムネイルの大きさは固定されておらず、好きな大きさに拡大・縮小した画像を取得できる。Windowsフリップ3DはサムネイルAPIを用いてウィンドウの内容をビットマップ画像として取得し、2D長方形のテクスチャに変換し、カスタム シェーダーによって3Dメッシュへ変換して、3D上で回転のする動作を実現している。

DWMはMedia Integration Layerを用いている。これは、WPFと共同で使用するネイティブ コードで、各ウィンドウを合成ツリーの中の合成ノードとして扱い、最終的なデスクトップ画面を描画するシステムである。最終的な出力を行う際、複数のウィンドウから出力するピクセルの色を決定する場合もある。つまり、ピクセル毎の透明効果が実装されている。DWMはそれを実現するためにカスタム シェーダーを使用している。これらのシェーダーは、ウィンドウ枠のぼかし効果などにDWMが使っているほか、アプリケーション内部の描画でも任意で使用可能である。

MILは合成ツリーのキャッシュという形態による保持モードのグラフィック機構である。ウィンドウの移動に伴う再描画・リフレッシュはアプリケーションの関与無しにDWMとMILが制御している。その際、ウィンドウの内容はオフスクリーンバッファのものを用いるため、以前のようにWM_PAINTを投げてアプリケーションに再描画を求めなくなっている。これにより、DWMはダブル バッファによってウィンドウ移動時のちらつきを排除し、変化のない領域は再描画しないなどの最適化も行われている。合成処理が複数モニターの環境に対応しているため、DWMも複数モニターに対応している。

3. リダイレクション
-----------

DWM非対応の描画技術では、出力をDWMのオフスクリーンバッファへ転送しなければならない。Windowsでは、GDIもしくはDirect3Dが描画に用いられるが、共にDWMへ転送する機構が用意されている。

WindowsでUIの描画に最もよく用いられているGDIは、各アプリケーションはウィンドウが表示される状態になったときに通知を受け、自身で描画するという形態をとっている。DWMのない状態では、VRAM上のバッファへ描画することになる。DWMの下では、ウィンドウと同じ大きさのバッファがシステム メモリ上に確保され、GDIでの描画はそこへ行われるようになる。さらに、VRAM上にDirect3Dサーフェイスが確保され、システム メモリのバッファの内容がそこへDirect3D形式へ変換しながら転送されるようになっている。システム メモリのバッファとVRAM上の内容は常に同期されるようになっている。システム メモリへのGDI描画には一切のハードウェア アクセラレーションが行われない。GDIの制限により、ウィンドウが最小化している間、バッファの内容は更新できない。その間、DWMは最小化直前のバッファの内容を保持し続ける。

3Dサーフェイスへ書き込むDirectXアプリケーションの場合、Windows VistaのDirectXの実装がDWMとサーフェイスを共有するようWDDMを用いており、DWMはアプリケーションのサーフェイスを直接、展開する。WPFアプリケーションでも同様に共有のサーフェイスへ書き込む。GDIとDirect3Dのような複数の描画技術を1つのウィンドウで用いることは不可能だが、1つのメイン ウィンドウ内に存在する複数の子ウィンドウ同士の間ではそれぞれ別のものを使用できる。その場合、GDIとDirect3Dの間で描画順序の保証はない。システム メモリのGDIビットマップが既にVRAM上のサーフェイスに変換されたかどうか保証できないためである。これを禁じたため、GDIとDirectXを1つのウィンドウで混合して用いるウィンドウを持つアプリケーションが実行中の場合、DWMは一時的に停止する。

4. ハードウェア要件
-----------

DWMは次の要件を満たすハードウェアを必要とする。

Windows Display Driver Model対応
DirectX 9対応
32ビットカラーモード
Windows Driver Kit内のWindows Aero適応テストの通過

5. 脚注
-----

6. 関連項目
-------

Windows Display Driver Model
Windows Aero
DirectX
Direct3D
Direct2D
Graphics Device Interface
Windows Presentation Foundation
Quartz Compositor - macOSのウィンドウ合成システム。

7. 外部リンク
--------

[1]
[2]
[3]