Win32 API 日本語リファレンス
ホームGraphics.Dxgi › DXGI_SWAP_EFFECT

DXGI_SWAP_EFFECT

列挙型
基底型i4

メンバー 4

名前10進16進説明
DXGI_SWAP_EFFECT_DISCARD00x0

このフラグは、ビットブロック転送 (bitblt) モデルを指定し、IDXGISwapChain1::Present1 を呼び出した後に DXGI がバックバッファーの内容を破棄することを指定します。 このフラグは、複数のバックバッファーを持つスワップチェーンで有効ですが、アプリケーションが読み取りおよび書き込みアクセスできるのはバッファー 0 のみです。 このフラグを使用すると、ディスプレイドライバーがそのスワップチェーンに最も効率的な表示手法を選択できるようになります。

Direct3D 12: この列挙値はサポートされません。D3D12 アプリは DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_DISCARD を使用しなければなりません。

注意 全画面排他モードと全画面 UWP には違いがあります。Direct3D 11 アプリケーションを Windows PC 上の UWP に移植する場合、スワップチェーンの作成時に DXGI_SWAP_EFFECT_DISCARD を使用しても UWP では Win32 と同じようには動作せず、その使用は GPU のパフォーマンスに悪影響を及ぼす可能性があることに注意してください。

これは、UWP アプリケーションでは (他のスワップモードが設定されていても) FLIP スワップモードが強制されるためです。これにより、従来の bitblt モデルで行われていたメモリコピーに要する 計算時間が削減されます。

推奨されるアプローチは、UWP 内で DX11 の Discard スワップチェーンを手動でフリップモデルに変換し、可能な限り DXGI_SWAP_EFFECT_DISCARD ではなく DXGI_SWAP_EFFECT_FLIP_DISCARD を使用することです。 以下の例を参照してください。また、詳細についてはこの記事を参照してください。

DXGI_SWAP_EFFECT_SEQUENTIAL10x1

このフラグは、bitblt モデルを指定し、IDXGISwapChain1::Present1 を呼び出した後に DXGI がバックバッファーの内容を保持することを指定します。 このオプションを使用すると、スワップチェーンの内容が最初のバッファー (バッファー 0) から最後のバッファーへ順番に表示されます。 このフラグはマルチサンプリングと併用できません。

Direct3D 12: この列挙値はサポートされません。D3D12 アプリは DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_DISCARD を使用しなければなりません。

注意 最良のパフォーマンスを得るには、DXGI_SWAP_EFFECT_SEQUENTIAL ではなく DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL を使用してください。詳細についてはこの記事を参照してください。
DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL30x3

このフラグは、フリップ表示モデルを指定し、IDXGISwapChain1::Present1 を呼び出した後に DXGI がバックバッファーの内容を保持することを指定します。このフラグはマルチサンプリングと併用できません。

Direct3D 11: この列挙値は Windows 8 以降でサポートされます。

DXGI_SWAP_EFFECT_FLIP_DISCARD40x4

このフラグは、フリップ表示モデルを指定し、IDXGISwapChain1::Present1 を呼び出した後に DXGI がバックバッファーの内容を破棄することを指定します。 このフラグはマルチサンプリングおよび部分的な表示 (partial presentation) と併用できません。 DXGI 1.4 の機能強化を参照してください。

Direct3D 11: この列挙値は Windows 10 以降でサポートされます。 このフラグは複数のバックバッファーを持つスワップチェーンで有効ですが、アプリケーションが読み取りおよび書き込みアクセスできるのはバッファー 0 のみです。

注意 Windows ストアアプリは DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_DISCARD を使用しなければなりません。

公式ドキュメント

IDXGISwapChain1::Present1 の呼び出し後に、表示サーフェス内のピクセルを処理する方法のオプションです。

解説(Remarks)

この列挙型は DXGI_SWAP_CHAIN_DESC 構造体および DXGI_SWAP_CHAIN_DESC1 構造体で使用されます。

D3D12 では DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD のみがサポートされ、bitblt モデルはサポートされません。そのため、D3D12 ではバックバッファーのマルチサンプリングはサポートされず、ID3D12GraphicsCommandList::ResolveSubresource または ID3D12GraphicsCommandList1::ResolveSubresourceRegion を使用して、アプリ内で手動によりマルチサンプリングを行う必要があります。

DXGI_SWAP_EFFECT_SEQUENTIAL または DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL でマルチサンプリングを使用するには、別のレンダーターゲットでマルチサンプリングを行う必要があります。たとえば、値を設定した D3D11_TEXTURE2D_DESC 構造体 (BindFlags メンバーに D3D11_BIND_RENDER_TARGET を設定し、SampleDesc メンバーにマルチサンプリングのパラメーターを設定したもの) を指定して ID3D11Device::CreateTexture2D を呼び出し、マルチサンプリングされたテクスチャを作成します。次に ID3D11Device::CreateRenderTargetView を呼び出してそのテクスチャのレンダーターゲットビューを作成し、シーンをそのテクスチャにレンダリングします。最後に ID3D11DeviceContext::ResolveSubresource を呼び出して、マルチサンプリングされたテクスチャをマルチサンプリングされていないスワップチェーンに解決します。

表示モデル間の主な違いは、バックバッファーの内容が合成のためにデスクトップ ウィンドウ マネージャー (DWM) にどのように渡されるかという点です。DXGI_SWAP_EFFECT_DISCARD および DXGI_SWAP_EFFECT_SEQUENTIAL の値で使用される bitblt モデルでは、IDXGISwapChain1::Present1 を呼び出すたびに、バックバッファーの内容がリダイレクト サーフェスにコピーされます。DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL の値で使用されるフリップモデルでは、すべてのバックバッファーが DWM と共有されます。そのため、DWM は追加のコピー操作なしに、それらのバックバッファーから直接合成を行えます。 一般に、フリップモデルの方が効率的なモデルです。また、フリップモデルは拡張された表示統計情報など、より多くの機能を提供します。

DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD の違いは、DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL では各バックバッファーの内容が IDXGISwapChain::Present の呼び出しをまたいで保持されることを DXGI が保証するのに対し、DXGI_SWAP_EFFECT_FLIP_DISCARD ではこの保証が提供されない点です。コンポジターは、特定のシナリオでは DirectFlip を使用でき、アプリケーションのバックバッファーをディスプレイ全体のバックバッファーとして使用することで、アプリケーションのバックバッファーを最終的なデスクトップのバックバッファーにコピーするコストを省きます。DXGI_SWAP_EFFECT_FLIP_SEQUENTIALDXGI_SWAP_EFFECT_FLIP_DISCARD では、アプリケーションが画面上で唯一表示されている項目である場合に、この最適化が行われます。ただし、フリップモデルが DXGI_SWAP_EFFECT_FLIP_DISCARD であれば、アプリケーションが画面上で唯一表示されている項目でない場合でも、コンポジターがアプリケーションのバックバッファーに他のコンテンツを描画することで、シナリオによってはこの最適化を実行できます。

フリップモデルのスワップチェーン (DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL) に対して、SyncInterval パラメーターに 0 を指定して IDXGISwapChain1::Present1 を呼び出した場合、IDXGISwapChain1::Present1 の動作は、Direct3D 9ExIDirect3DDevice9Ex::PresentExD3DSWAPEFFECT_FLIPEX および D3DPRESENT_FORCEIMMEDIATE と共に使用した場合と同じです。つまり、ランタイムは以前にキューに入れられたフレームではなく次のフレームを表示するだけでなく、以前にキューに入れられたフレームに残っている時間も終了させます。

フリップモデルの方が効率的であるかどうかにかかわらず、GDI と DirectX の表示を混在させる方法は bitblt モデルのみであるため、アプリケーションが bitblt モデルを選択することもあります。フリップモデルでは、アプリケーションは DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE を指定してスワップチェーンを作成し、バックバッファーに対して明示的に GetDC を使用する必要があります。フリップモデルのスワップチェーンで IDXGISwapChain1::Present1 の呼び出しが最初に成功した後は、そのスワップチェーンに関連付けられた HWND で GDI が動作しなくなります。これはスワップチェーンを破棄した後も同様です。この制限は ScrollWindowEx のようなメソッドにも及びます。

HDR のスワップチェーン バッファー形式および色空間を表示するには、フリップモデルが必要です。そうでない場合、それらは SDR (0-1 の範囲の sRGB) で合成 (およびクリップ) されます。

フリップモデルのスワップチェーンと表示の最適化の詳細については、「フリップモデル、ダーティ矩形、スクロール領域による表示の強化」を参照してください。

UWP でスワップチェーンを作成するには、DX11 テンプレートの新しいインスタンスを作成し、D3D12 サンプルDeviceResources::CreateWindowSizeDependentResources の実装を参照してください。

DXGI_SWAP_CHAIN_DESC1 swapChainDesc = {0};

       swapChainDesc.Width = lround(m_d3dRenderTargetSize.Width);    // Match the size of the window.
       swapChainDesc.Height = lround(m_d3dRenderTargetSize.Height);
       swapChainDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;            // This is the most common swap chain format.
       swapChainDesc.Stereo = false;
       swapChainDesc.SampleDesc.Count = 1;                           // Don't use multi-sampling.
       swapChainDesc.SampleDesc.Quality = 0;
       swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
       swapChainDesc.BufferCount = 2;                                // Use double-buffering to minimize latency.
       swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_DISCARD;     // All Windows Store apps must use a flip effect.
       swapChainDesc.Flags = 2048;
       swapChainDesc.Scaling = scaling;
       swapChainDesc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;

       // This sequence obtains the DXGI factory that was used to create the Direct3D device above.
       ComPtr<IDXGIDevice3> dxgiDevice;
       DX::ThrowIfFailed(m_d3dDevice.As(&dxgiDevice));

       ComPtr<IDXGIAdapter> dxgiAdapter;
       DX::ThrowIfFailed(dxgiDevice->GetAdapter(&dxgiAdapter));

       ComPtr<IDXGIFactory4> dxgiFactory;
       DX::ThrowIfFailed(dxgiAdapter->GetParent(IID_PPV_ARGS(&dxgiFactory)));

       ComPtr<IDXGISwapChain1> swapChain;
       DX::ThrowIfFailed(
              dxgiFactory->CreateSwapChainForCoreWindow(
                     m_d3dDevice.Get(),
                     reinterpret_cast<IUnknown*>(m_window.Get()),
                     &swapChainDesc,
                     nullptr,
                     &swapChain
                     )
              );
出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

各言語での定義

列挙メンバーの定義。HSP タブは #define global(値は16進)。

typedef enum DXGI_SWAP_EFFECT : int {
    DXGI_SWAP_EFFECT_DISCARD = 0,
    DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
    DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
    DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
} DXGI_SWAP_EFFECT;
public enum DXGI_SWAP_EFFECT : int
{
    DXGI_SWAP_EFFECT_DISCARD = 0,
    DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
    DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
    DXGI_SWAP_EFFECT_FLIP_DISCARD = 4,
}
Public Enum DXGI_SWAP_EFFECT As Integer
    DXGI_SWAP_EFFECT_DISCARD = 0
    DXGI_SWAP_EFFECT_SEQUENTIAL = 1
    DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3
    DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
End Enum
import enum

class DXGI_SWAP_EFFECT(enum.IntEnum):
    DXGI_SWAP_EFFECT_DISCARD = 0
    DXGI_SWAP_EFFECT_SEQUENTIAL = 1
    DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3
    DXGI_SWAP_EFFECT_FLIP_DISCARD = 4
// DXGI_SWAP_EFFECT
pub const DXGI_SWAP_EFFECT_DISCARD: i32 = 0;
pub const DXGI_SWAP_EFFECT_SEQUENTIAL: i32 = 1;
pub const DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL: i32 = 3;
pub const DXGI_SWAP_EFFECT_FLIP_DISCARD: i32 = 4;
// DXGI_SWAP_EFFECT
const (
	DXGI_SWAP_EFFECT_DISCARD int32 = 0
	DXGI_SWAP_EFFECT_SEQUENTIAL int32 = 1
	DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL int32 = 3
	DXGI_SWAP_EFFECT_FLIP_DISCARD int32 = 4
)
const
  DXGI_SWAP_EFFECT_DISCARD = 0;
  DXGI_SWAP_EFFECT_SEQUENTIAL = 1;
  DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3;
  DXGI_SWAP_EFFECT_FLIP_DISCARD = 4;
// DXGI_SWAP_EFFECT
pub const DXGI_SWAP_EFFECT_DISCARD: i32 = 0;
pub const DXGI_SWAP_EFFECT_SEQUENTIAL: i32 = 1;
pub const DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL: i32 = 3;
pub const DXGI_SWAP_EFFECT_FLIP_DISCARD: i32 = 4;
const
  DXGI_SWAP_EFFECT_DISCARD* = 0
  DXGI_SWAP_EFFECT_SEQUENTIAL* = 1
  DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL* = 3
  DXGI_SWAP_EFFECT_FLIP_DISCARD* = 4
enum DXGI_SWAP_EFFECT : int {
    DXGI_SWAP_EFFECT_DISCARD = 0,
    DXGI_SWAP_EFFECT_SEQUENTIAL = 1,
    DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL = 3,
    DXGI_SWAP_EFFECT_FLIP_DISCARD = 4,
}
#define global DXGI_SWAP_EFFECT_DISCARD         0x0
#define global DXGI_SWAP_EFFECT_SEQUENTIAL      0x1
#define global DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL 0x3
#define global DXGI_SWAP_EFFECT_FLIP_DISCARD    0x4