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

ID3D12Device

COM
IID189819f1-1db6-4b57-be54-1821339b85f7継承元ID3D12Object自前メソッド開始 vtbl7

公式ドキュメント

仮想アダプターを表します。コマンドアロケーター、コマンドリスト、コマンドキュー、フェンス、リソース、パイプラインステートオブジェクト、ヒープ、ルートシグネチャ、サンプラー、および多数のリソースビューを作成するために使用します。

解説(Remarks)

デバイスを作成するには D3D12CreateDevice を使用します。

Windows 10 Anniversary Update では、ID3D12Device1 を通じて追加の機能を利用できます。

D3D1211on12 サンプルでは、ID3D12Device を次のように使用しています。

ヘッダーファイルでの宣言。

// Pipeline objects.
D3D12_VIEWPORT m_viewport;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D12Device> m_device;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D12Resource> m_depthStencil;
ComPtr<ID3D12CommandAllocator> m_commandAllocator;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature >m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12DescriptorHeap> m_cbvSrvHeap;
ComPtr<ID3D12DescriptorHeap> m_dsvHeap;
ComPtr<ID3D12DescriptorHeap> m_samplerHeap;
ComPtr<ID3D12PipelineState> m_pipelineState1;
ComPtr<ID3D12PipelineState> m_pipelineState2;
D3D12_RECT m_scissorRect;

サポートされている機能の確認。

inline UINT8 D3D12GetFormatPlaneCount(
    _In_ ID3D12Device* pDevice,
    DXGI_FORMAT Format
    )
{
    D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = {Format};
    if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo, sizeof(formatInfo))))
    {
        return 0;
    }
    return formatInfo.PlaneCount;
}

D3D12 リファレンスのサンプルコードを参照してください。

メソッド 37

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 7 DWORD GetNodeCount()

このデバイスに関連付けられている物理アダプター (ノード) の数を返します。

戻り値

型: UINT

このデバイスが持つ物理アダプター (ノード) の数。

vtbl 8 HRESULT CreateCommandQueue(D3D12_COMMAND_QUEUE_DESC* pDesc, GUID* riid, void** ppCommandQueue)

コマンドキューを作成します。

pDescD3D12_COMMAND_QUEUE_DESC*inコマンドキューを記述する D3D12_COMMAND_QUEUE_DESC を指定します。
riidGUID*inコマンドキューインターフェイスのグローバル一意識別子 (GUID)。解説 を参照してください。入力パラメーターです。
ppCommandQueuevoid**outコマンドキューの ID3D12CommandQueue インターフェイスへのポインターを受け取るメモリブロックへのポインター。

戻り値

型: HRESULT

コマンドキューを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。その他の戻り値については Direct3D 12 のリターンコードを参照してください。

解説(Remarks)

コマンドキューのインターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。たとえば、__uuidof(ID3D12CommandQueue) はコマンドキューのインターフェイスの GUID を取得します。

D3D12HelloTriangle サンプルでは、ID3D12Device::CreateCommandQueue を次のように使用しています。

D3D12_COMMAND_QUEUE_DESC queueDesc{};
queueDesc.Flags = D3D12_COMMAND_QUEUE_FLAG_NONE;
queueDesc.Type = D3D12_COMMAND_LIST_TYPE_DIRECT;

ThrowIfFailed(m_device->CreateCommandQueue(&queueDesc, IID_PPV_ARGS(&m_commandQueue)));

D3D12 リファレンスのサンプルコードを参照してください。

vtbl 9 HRESULT CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE type, GUID* riid, void** ppCommandAllocator)

コマンドアロケーターオブジェクトを作成します。

typeD3D12_COMMAND_LIST_TYPEin作成するコマンドアロケーターの種類を指定する D3D12_COMMAND_LIST_TYPE 型の値。 コマンドアロケーターの種類は、ダイレクトコマンドリストを記録するもの、またはバンドルを記録するもののいずれかです。
riidGUID*inコマンドアロケーターインターフェイス (ID3D12CommandAllocator) のグローバル一意識別子 (GUID)。 コマンドアロケーターのインターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。 たとえば、__uuidof(ID3D12CommandAllocator) はコマンドアロケーターのインターフェイスの GUID を取得します。
ppCommandAllocatorvoid**outコマンドアロケーターの ID3D12CommandAllocator インターフェイスへのポインターを受け取るメモリブロックへのポインター。

戻り値

型: HRESULT

コマンドアロケーターを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。 その他の戻り値については Direct3D 12 のリターンコードを参照してください。

解説(Remarks)

デバイスはコマンドアロケーターからコマンドリストを作成します。

D3D12Bundles サンプルでは、ID3D12Device::CreateCommandAllocator を次のように使用しています。

ThrowIfFailed(pDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocator)));
ThrowIfFailed(pDevice->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_BUNDLE, IID_PPV_ARGS(&m_bundleAllocator)));

D3D12 リファレンスのサンプルコードを参照してください。

vtbl 10 HRESULT CreateGraphicsPipelineState(D3D12_GRAPHICS_PIPELINE_STATE_DESC* pDesc, GUID* riid, void** ppPipelineState)

グラフィックスパイプラインステートオブジェクトを作成します。

pDescD3D12_GRAPHICS_PIPELINE_STATE_DESC*inグラフィックスパイプラインステートを記述する D3D12_GRAPHICS_PIPELINE_STATE_DESC 構造体へのポインター。
riidGUID*inパイプラインステートインターフェイス (ID3D12PipelineState) のグローバル一意識別子 (GUID)。 パイプラインステートのインターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。 たとえば、__uuidof(ID3D12PipelineState) はパイプラインステートのインターフェイスの GUID を取得します。
ppPipelineStatevoid**outパイプラインステートオブジェクトの ID3D12PipelineState インターフェイスへのポインターを受け取るメモリブロックへのポインター。 パイプラインステートオブジェクトは不変のステートオブジェクトであり、メソッドを持ちません。

戻り値

型: HRESULT

パイプラインステートオブジェクトを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。 その他の戻り値については Direct3D 12 のリターンコードを参照してください。

vtbl 11 HRESULT CreateComputePipelineState(D3D12_COMPUTE_PIPELINE_STATE_DESC* pDesc, GUID* riid, void** ppPipelineState)

コンピュートパイプラインステートオブジェクトを作成します。

pDescD3D12_COMPUTE_PIPELINE_STATE_DESC*inコンピュートパイプラインステートを記述する D3D12_COMPUTE_PIPELINE_STATE_DESC 構造体へのポインター。
riidGUID*inパイプラインステートインターフェイス (ID3D12PipelineState) のグローバル一意識別子 (GUID)。 パイプラインステートのインターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。 たとえば、__uuidof(ID3D12PipelineState) はパイプラインステートのインターフェイスの GUID を取得します。
ppPipelineStatevoid**outパイプラインステートオブジェクトの ID3D12PipelineState インターフェイスへのポインターを受け取るメモリブロックへのポインター。 パイプラインステートオブジェクトは不変のステートオブジェクトであり、メソッドを持ちません。

戻り値

型: HRESULT

パイプラインステートオブジェクトを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。 その他の戻り値については Direct3D 12 のリターンコードを参照してください。

vtbl 12 HRESULT CreateCommandList(DWORD nodeMask, D3D12_COMMAND_LIST_TYPE type, ID3D12CommandAllocator* pCommandAllocator, ID3D12PipelineState* pInitialState, GUID* riid, void** ppCommandList)

コマンドリストを作成します。

nodeMaskDWORDin単一 GPU での動作の場合は 0 を設定します。複数の GPU ノードがある場合は、コマンドリストを作成する対象のノード (デバイスの物理アダプター) を示すビットを設定します。マスクの各ビットが 1 つのノードに対応します。設定できるビットは 1 つだけです。マルチアダプターシステムも参照してください。
typeD3D12_COMMAND_LIST_TYPEin作成するコマンドリストの種類を指定します。
pCommandAllocatorID3D12CommandAllocator*inデバイスがコマンドリストを作成する元となるコマンドアロケーターオブジェクトへのポインター。
pInitialStateID3D12PipelineState*inoptional

コマンドリストの初期パイプラインステートを含むパイプラインステートオブジェクトへの省略可能なポインター。nullptr の場合、ランタイムがダミーの初期パイプラインステートを設定するため、ドライバーが未定義の状態を扱う必要はありません。このオーバーヘッドは小さく、特にコマンドリストでは、コマンドリスト全体の記録コストが初期ステート設定 1 回のコストを大きく上回ります。したがって、初期パイプラインステートの指定が不便な場合は、設定しなくてもコストはほとんどありません。

一方、バンドルの場合は初期ステートパラメーターを設定する方が有利なことがあります (バンドルは全体として小さく、頻繁に再利用される可能性が高いためです)。

riidGUID*inppCommandList で返されるコマンドリストインターフェイスのグローバル一意識別子 (GUID) への参照。
ppCommandListvoid**outコマンドリストの ID3D12CommandList または ID3D12GraphicsCommandList インターフェイスへのポインターを受け取るメモリブロックへのポインター。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は HRESULTエラーコードを返します。

戻り値 説明
E_OUTOFMEMORY コマンドリストを作成するのに十分なメモリがありません。

その他の戻り値については Direct3D 12 のリターンコードを参照してください。

解説(Remarks)

デバイスはコマンドアロケーターからコマンドリストを作成します。

D3D12Bundles サンプルでは、ID3D12Device::CreateCommandList を次のように使用しています。

パイプラインオブジェクトを作成します。

ComPtr<ID3D12CommandAllocator> m_commandAllocator;
ComPtr<ID3D12GraphicsCommandList> m_commandList;

コマンドアロケーターを作成します。

ThrowIfFailed(m_device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocator)));

ダイレクトコマンドリストを作成します。

ThrowIfFailed(m_device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, m_commandAllocator.Get(), nullptr, IID_PPV_ARGS(&m_commandList)));

D3D12 リファレンスのサンプルコードを参照してください。

vtbl 13 HRESULT CheckFeatureSupport(D3D12_FEATURE Feature, void* pFeatureSupportData, DWORD FeatureSupportDataSize)

現在のグラフィックスドライバーがサポートする機能に関する情報を取得します。(ID3D12Device.CheckFeatureSupport)

FeatureD3D12_FEATUREinサポート状況を照会する機能を表す D3D12_FEATURE 列挙型の定数。
pFeatureSupportDatavoid*inoutFeature パラメーターの値に対応するデータ構造体へのポインター。各定数に対応するデータ構造体については D3D12_FEATURE を参照してください。
FeatureSupportDataSizeDWORDinpFeatureSupportData パラメーターが指す構造体のサイズ。

戻り値

型: HRESULT

成功した場合は S_OK を返します。pFeatureSupportData パラメーターにサポートされていないデータ型が渡された場合、または FeatureSupportDataSize パラメーターのサイズの不一致が検出された場合は E_INVALIDARG を返します。

解説(Remarks)

使用例として、レイトレーシングのサポートを確認するには、pFeatureSupportData パラメーターに D3D12_FEATURE_DATA_D3D12_OPTIONS5 構造体を指定します。関数が正常に完了したら、値が設定された D3D12_FEATURE_DATA_D3D12_OPTIONS5 構造体の RaytracingTier フィールド (サポートされるレイトレーシング階層を示します) を参照します。

詳細については、機能の照会を参照してください。

DXGI フォーマットのハードウェアサポート

DXGI フォーマットとハードウェア機能の対応表については、次を参照してください。

D3D1211on12 サンプルでは、ID3D12Device::CheckFeatureSupport を次のように使用しています。

inline UINT8 D3D12GetFormatPlaneCount(
    _In_ ID3D12Device* pDevice,
    DXGI_FORMAT Format
    )
{
    D3D12_FEATURE_DATA_FORMAT_INFO formatInfo = {Format};
    if (FAILED(pDevice->CheckFeatureSupport(D3D12_FEATURE_FORMAT_INFO, &formatInfo, sizeof(formatInfo))))
    {
        return 0;
    }
    return formatInfo.PlaneCount;
}
vtbl 14 HRESULT CreateDescriptorHeap(D3D12_DESCRIPTOR_HEAP_DESC* pDescriptorHeapDesc, GUID* riid, void** ppvHeap)

記述子ヒープオブジェクトを作成します。

pDescriptorHeapDescD3D12_DESCRIPTOR_HEAP_DESC*inヒープを記述する D3D12_DESCRIPTOR_HEAP_DESC 構造体へのポインター。
riidGUID*in記述子ヒープインターフェイスのグローバル一意識別子 (GUID)。解説を参照してください。 入力パラメーターです。
ppvHeapvoid**out記述子ヒープへのポインターを受け取るメモリブロックへのポインター。 ppvHeap には NULL を指定でき、機能テストに使用できます。 ppvHeap が NULL の場合、オブジェクトは作成されず、pDescriptorHeapDesc が有効であれば S_FALSE が返されます。

戻り値

型: HRESULT

記述子ヒープオブジェクトを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。 その他の戻り値については Direct3D 12 のリターンコードを参照してください。

解説(Remarks)

記述子ヒープのインターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。たとえば、__uuidof(ID3D12DescriptorHeap) は記述子ヒープのインターフェイスの GUID を取得します。

D3D12HelloWorld サンプルでは、ID3D12Device::CreateDescriptorHeap を次のように使用しています。

レンダーターゲットビュー (RTV) 記述子ヒープを記述して作成します。

// Create descriptor heaps.
{
    // Describe and create a render target view (RTV) descriptor heap.
    D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {};
    rtvHeapDesc.NumDescriptors = FrameCount;
    rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
    rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
    ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap)));

    m_rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
}

// Create frame resources.
{
    CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart());

    // Create a RTV for each frame.
    for (UINT n = 0; n < FrameCount; n++)
    {
        ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n])));
        m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle);
        rtvHandle.Offset(1, m_rtvDescriptorSize);
    }

D3D12 リファレンスのサンプルコードを参照してください。

vtbl 15 DWORD GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE DescriptorHeapType)

指定した種類の記述子ヒープにおけるハンドルのインクリメントサイズを取得します。この値は通常、記述子配列内のハンドルを正しい量だけ進めるために使用します。

DescriptorHeapTypeD3D12_DESCRIPTOR_HEAP_TYPEinハンドルのインクリメントサイズを取得する対象の記述子ヒープの種類を指定する D3D12_DESCRIPTOR_HEAP_TYPE 型の値。

戻り値

指定した種類の記述子ヒープにおけるハンドルのインクリメントサイズ (必要なパディングを含む) を返します。

解説(Remarks)

このメソッドが返す記述子サイズは、ヘルパー構造体 CD3DX12_CPU_DESCRIPTOR_HANDLE および CD3DX12_GPU_DESCRIPTOR_HANDLE への入力の 1 つとして使用されます。

D3D12PredicationQueries サンプルでは、ID3D12Device::GetDescriptorHandleIncrementSize を次のように使用しています。

リソース用の記述子ヒープを作成します。m_rtvDescriptorSize 変数はレンダーターゲットビューの記述子ハンドルのインクリメントサイズを保持し、コードのフレームリソースの作成のセクションで使用されます。

// Create descriptor heaps.
{
    // Describe and create a render target view (RTV) descriptor heap.
    D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {};
    rtvHeapDesc.NumDescriptors = FrameCount;
    rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
    rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
    ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap)));

    // Describe and create a depth stencil view (DSV) descriptor heap.
    D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {};
    dsvHeapDesc.NumDescriptors = 1;
    dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
    dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
    ThrowIfFailed(m_device->CreateDescriptorHeap(&dsvHeapDesc, IID_PPV_ARGS(&m_dsvHeap)));

    // Describe and create a constant buffer view (CBV) descriptor heap.
    D3D12_DESCRIPTOR_HEAP_DESC cbvHeapDesc = {};
    cbvHeapDesc.NumDescriptors = CbvCountPerFrame * FrameCount;
    cbvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV;
    cbvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE;
    ThrowIfFailed(m_device->CreateDescriptorHeap(&cbvHeapDesc, IID_PPV_ARGS(&m_cbvHeap)));

    // Describe and create a heap for occlusion queries.
    D3D12_QUERY_HEAP_DESC queryHeapDesc = {};
    queryHeapDesc.Count = 1;
    queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_OCCLUSION;
    ThrowIfFailed(m_device->CreateQueryHeap(&queryHeapDesc, IID_PPV_ARGS(&m_queryHeap)));

    m_rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
    m_cbvSrvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
}

// Create frame resources.
{
    CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart());

    // Create a RTV and a command allocator for each frame.
    for (UINT n = 0; n < FrameCount; n++)
    {
        ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n])));
        m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle);
        rtvHandle.Offset(1, m_rtvDescriptorSize);

        ThrowIfFailed(m_device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_PPV_ARGS(&m_commandAllocators[n])));
    }    
}

D3D12 リファレンスのサンプルコードを参照してください。

vtbl 16 HRESULT CreateRootSignature(DWORD nodeMask, void* pBlobWithRootSignature, UINT_PTR blobLengthInBytes, GUID* riid, void** ppvRootSignature)

ルートシグネチャのレイアウトを作成します。

nodeMaskDWORDin単一 GPU での動作の場合は 0 を設定します。複数の GPU ノードがある場合は、ルートシグネチャを適用するノード (デバイスの物理アダプター) を示すビットを設定します。 マスクの各ビットが 1 つのノードに対応します。 マルチアダプターシステムを参照してください。
pBlobWithRootSignaturevoid*inシリアル化されたシグネチャのソースデータへのポインター。
blobLengthInBytesUINT_PTRinpBlobWithRootSignature が指すメモリブロックのサイズ (バイト単位)。
riidGUID*inルートシグネチャインターフェイスのグローバル一意識別子 (GUID)。解説を参照してください。 入力パラメーターです。
ppvRootSignaturevoid**outルートシグネチャへのポインターを受け取るメモリブロックへのポインター。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は Direct3D 12 のリターンコードのいずれかを返します。

pBlobWithRootSignature が指す blob が無効な場合、このメソッドは E_INVALIDARG を返します。

解説(Remarks)

アプリケーションが D3D12_ROOT_SIGNATURE_DESC データ構造体をプログラムで生成する場合は、その D3D12_ROOT_SIGNATURE_DESC へのポインターを D3D12SerializeRootSignature の呼び出しに渡してシリアル化形式を作成する必要があります。 その後、アプリケーションはシリアル化された形式を ID3D12Device::CreateRootSignature の呼び出しの pBlobWithRootSignature に渡します。

ルートシグネチャレイアウトのインターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。 たとえば、__uuidof(ID3D12RootSignature) はルートシグネチャのインターフェイスの GUID を取得します。

D3D12HelloTriangle サンプルでは、ID3D12Device::CreateRootSignature を次のように使用しています。

空のルートシグネチャを作成します。

CD3DX12_ROOT_SIGNATURE_DESC rootSignatureDesc;
rootSignatureDesc.Init(0, nullptr, 0, nullptr, D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);

ComPtr<ID3DBlob> signature;
ComPtr<ID3DBlob> error;
ThrowIfFailed(D3D12SerializeRootSignature(&rootSignatureDesc, D3D_ROOT_SIGNATURE_VERSION_1, &signature, &error));
ThrowIfFailed(m_device->CreateRootSignature(0, signature->GetBufferPointer(), signature->GetBufferSize(), IID_PPV_ARGS(&m_rootSignature)));
vtbl 17 void CreateConstantBufferView(D3D12_CONSTANT_BUFFER_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)

リソースデータにアクセスするための定数バッファービューを作成します。

pDescD3D12_CONSTANT_BUFFER_VIEW_DESC*inoptional定数バッファービューを記述する D3D12_CONSTANT_BUFFER_VIEW_DESC 構造体へのポインター。
DestDescriptorD3D12_CPU_DESCRIPTOR_HANDLEin定数バッファービューを保持するヒープの先頭を表す CPU 記述子ハンドルを指定します。
vtbl 18 void CreateShaderResourceView(ID3D12Resource* pResource, D3D12_SHADER_RESOURCE_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)

リソース内のデータにアクセスするためのシェーダーリソースビューを作成します。(ID3D12Device.CreateShaderResourceView)

pResourceID3D12Resource*inoptional

シェーダーリソースを表す ID3D12Resource オブジェクトへのポインター。

pResourcepDesc の少なくとも一方は指定する必要があります。 pResource に null を指定すると null 記述子が初期化されます。これは D3D11 と同様の null バインド動作 (読み取りは 0、書き込みは破棄) を保証しますが、記述子の種類を判別するために有効な pDesc が必要です。

pDescD3D12_SHADER_RESOURCE_VIEW_DESC*inoptional

シェーダーリソースビューを記述する D3D12_SHADER_RESOURCE_VIEW_DESC 構造体へのポインター。

pDesc に null を指定すると、可能な場合は既定の記述子が初期化されます。この動作は、既定値が補完される D3D11 の null 記述子の動作と同一です。この動作ではリソースのフォーマットと次元 (typeless でない場合) が継承され、バッファーの SRV はバッファー全体を対象とする型付き (raw でも structured でもない) ビューになり、テクスチャの SRV はテクスチャ全体、すべてのミップ、すべての配列スライスを対象とします。すべてのリソースが null 記述子の初期化をサポートするわけではありません。

DestDescriptorD3D12_CPU_DESCRIPTOR_HANDLEinシェーダーリソースビューを表す CPU 記述子ハンドルを指定します。このハンドルは、シェーダーから参照可能な記述子ヒープ、参照不可能な記述子ヒープのいずれにも作成できます。

解説(Remarks)

YUV 4:2:0 ビデオフォーマットの処理

アプリは輝度 (Y) プレーンと色差 (UV) プレーンを別々にマップする必要があります。これは、同じテクスチャに対して CreateShaderResourceView を 2 回呼び出し、1 チャネルのフォーマットと 2 チャネルのフォーマットを渡すことで行います。Y プレーンと互換性のある 1 チャネルのフォーマットを渡すと Y プレーンのみがマップされます。UV プレーン (両方まとめて) と互換性のある 2 チャネルのフォーマットを渡すと、U プレーンと V プレーンが単一のリソースビューとしてマップされます。

YUV 4:2:0 フォーマットの一覧は DXGI_FORMAT にあります。

D3D12nBodyGravity サンプルでは、ID3D12Device::CreateShaderResourceView を次のように使用しています。

1 つの記述に基づいて 2 つのシェーダーリソースビューを記述して作成します。

D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.Format = DXGI_FORMAT_UNKNOWN;
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER;
srvDesc.Buffer.FirstElement = 0;
srvDesc.Buffer.NumElements = ParticleCount;
srvDesc.Buffer.StructureByteStride = sizeof(Particle);
srvDesc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE;

CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle0(m_srvUavHeap->GetCPUDescriptorHandleForHeapStart(), SrvParticlePosVelo0 + index, m_srvUavDescriptorSize);
CD3DX12_CPU_DESCRIPTOR_HANDLE srvHandle1(m_srvUavHeap->GetCPUDescriptorHandleForHeapStart(), SrvParticlePosVelo1 + index, m_srvUavDescriptorSize);
m_device->CreateShaderResourceView(m_particleBuffer0[index].Get(), &srvDesc, srvHandle0);
m_device->CreateShaderResourceView(m_particleBuffer1[index].Get(), &srvDesc, srvHandle1);

D3D12 リファレンスのサンプルコードを参照してください。

vtbl 19 void CreateUnorderedAccessView(ID3D12Resource* pResource, ID3D12Resource* pCounterResource, D3D12_UNORDERED_ACCESS_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)

アンオーダードアクセス用のビューを作成します。

pResourceID3D12Resource*inoptional

アンオーダードアクセスを表す ID3D12Resource オブジェクトへのポインター。

pResourcepDesc の少なくとも一方は指定する必要があります。

pResource に null を指定すると null 記述子が初期化されます。これは Direct3D 11 と同様の null バインド動作 (読み取りは 0、書き込みは破棄) を保証しますが、記述子の種類を判別するために有効な pDesc が必要です。

pCounterResourceID3D12Resource*inoptional

UAV に関連付けられたカウンター (存在する場合) の ID3D12Resource

pCounterResource を指定しない場合、D3D12_BUFFER_UAV 構造体の CounterOffsetInBytes メンバーは 0 でなければなりません。

pCounterResource を指定した場合、UAV にカウンターが関連付けられ、ランタイムは次の要件を検証します。

  • D3D12_BUFFER_UAV 構造体の StructureByteStride メンバーは 0 より大きい必要があります。
  • フォーマットは DXGI_FORMAT_UNKNOWN でなければなりません。
  • D3D12_BUFFER_UAV_FLAG_RAW フラグ (D3D12_BUFFER_UAV_FLAGS 列挙型の定数) を設定してはいけません。
  • 両方のリソース (pResourcepCounterResource) はバッファーでなければなりません。
  • D3D12_BUFFER_UAV 構造体の CounterOffsetInBytes メンバーは **D3D12_UAV_COUNTER_PLACEMENT_ALIGNMENT** (4096) の倍数であり、かつカウンターリソースの範囲内でなければなりません。
  • pResource を NULL にすることはできません。
  • pDesc を NULL にすることはできません。
pDescD3D12_UNORDERED_ACCESS_VIEW_DESC*inoptional

アンオーダードアクセスビューを記述する D3D12_UNORDERED_ACCESS_VIEW_DESC 構造体へのポインター。

pDesc に null を指定すると、可能な場合は既定の記述子が初期化されます。この動作は、既定値が補完される D3D11 の null 記述子の動作と同一です。この動作ではリソースのフォーマットと次元 (typeless でない場合) が継承され、バッファーの UAV はバッファー全体を対象とする型付きのビューになり、テクスチャの UAV は最初のミップとすべての配列スライスを対象とします。すべてのリソースが null 記述子の初期化をサポートするわけではありません。

DestDescriptorD3D12_CPU_DESCRIPTOR_HANDLEinアンオーダードアクセスビューを保持するヒープの先頭を表す CPU 記述子ハンドルを指定します。
vtbl 20 void CreateRenderTargetView(ID3D12Resource* pResource, D3D12_RENDER_TARGET_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)

リソースデータにアクセスするためのレンダーターゲットビューを作成します。(ID3D12Device.CreateRenderTargetView)

pResourceID3D12Resource*inoptional

レンダーターゲットを表す ID3D12Resource オブジェクトへのポインター。

pResourcepDesc の少なくとも一方は指定する必要があります。 pResource に null を指定すると null 記述子が初期化されます。これは D3D11 と同様の null バインド動作 (読み取りは 0、書き込みは破棄) を保証しますが、記述子の種類を判別するために有効な pDesc が必要です。

pDescD3D12_RENDER_TARGET_VIEW_DESC*inoptional

レンダーターゲットビューを記述する D3D12_RENDER_TARGET_VIEW_DESC 構造体へのポインター。

pDesc に null を指定すると、可能な場合は既定の記述子が初期化されます。この動作は、既定値が補完される D3D11 の null 記述子の動作と同一です。この動作ではリソースのフォーマットと次元 (typeless でない場合) が継承され、RTV は最初のミップとすべての配列スライスを対象とします。すべてのリソースが null 記述子の初期化をサポートするわけではありません。

DestDescriptorD3D12_CPU_DESCRIPTOR_HANDLEin新しく作成されるレンダーターゲットビューの配置先を表す CPU 記述子ハンドルを指定します。
vtbl 21 void CreateDepthStencilView(ID3D12Resource* pResource, D3D12_DEPTH_STENCIL_VIEW_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)

リソースデータにアクセスするための深度ステンシルビューを作成します。

pResourceID3D12Resource*inoptional

深度ステンシルを表す ID3D12Resource オブジェクトへのポインター。

pResourcepDesc の少なくとも一方は指定する必要があります。 pResource に null を指定すると null 記述子が初期化されます。これは D3D11 と同様の null バインド動作 (読み取りは 0、書き込みは破棄) を保証しますが、記述子の種類を判別するために有効な pDesc が必要です。

pDescD3D12_DEPTH_STENCIL_VIEW_DESC*inoptional

深度ステンシルビューを記述する D3D12_DEPTH_STENCIL_VIEW_DESC 構造体へのポインター。

pDesc に null を指定すると、可能な場合は既定の記述子が初期化されます。この動作は、既定値が補完される D3D11 の null 記述子の動作と同一です。この動作ではリソースのフォーマットと次元 (typeless でない場合) が継承され、DSV は最初のミップとすべての配列スライスを対象とします。すべてのリソースが null 記述子の初期化をサポートするわけではありません。

DestDescriptorD3D12_CPU_DESCRIPTOR_HANDLEin深度ステンシルビューを保持するヒープの先頭を表す CPU 記述子ハンドルを指定します。
vtbl 22 void CreateSampler(D3D12_SAMPLER_DESC* pDesc, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptor)

テクスチャのサンプリング情報をカプセル化するサンプラーオブジェクトを作成します。

pDescD3D12_SAMPLER_DESC*inサンプラーを記述する D3D12_SAMPLER_DESC 構造体へのポインター。
DestDescriptorD3D12_CPU_DESCRIPTOR_HANDLEinサンプラーを保持するヒープの先頭を表す CPU 記述子ハンドルを指定します。
vtbl 23 void CopyDescriptors(DWORD NumDestDescriptorRanges, D3D12_CPU_DESCRIPTOR_HANDLE* pDestDescriptorRangeStarts, DWORD* pDestDescriptorRangeSizes, DWORD NumSrcDescriptorRanges, D3D12_CPU_DESCRIPTOR_HANDLE* pSrcDescriptorRangeStarts, DWORD* pSrcDescriptorRangeSizes, D3D12_DESCRIPTOR_HEAP_TYPE DescriptorHeapsType)

記述子をコピー元からコピー先へコピーします。(ID3D12Device.CopyDescriptors)

NumDestDescriptorRangesDWORDinコピー先の記述子範囲の数。
pDestDescriptorRangeStartsD3D12_CPU_DESCRIPTOR_HANDLE*in

コピー先となる D3D12_CPU_DESCRIPTOR_HANDLE オブジェクトの配列。

コピー先とコピー元のすべての記述子は、同じ D3D12_DESCRIPTOR_HEAP_TYPE のヒープ内になければなりません。

pDestDescriptorRangeSizesDWORD*inoptionalコピー先の記述子範囲のサイズの配列。
NumSrcDescriptorRangesDWORDinコピー元の記述子範囲の数。
pSrcDescriptorRangeStartsD3D12_CPU_DESCRIPTOR_HANDLE*in

コピー元となる D3D12_CPU_DESCRIPTOR_HANDLE オブジェクトの配列。

重要

pSrcDescriptorRangeStarts パラメーターのすべての要素は、シェーダーから参照できない記述子ヒープ内になければなりません。シェーダーから参照可能な記述子ヒープは WRITE_COMBINE メモリまたは GPU ローカルメモリ上に作成される場合があり、読み取りが極端に低速なためです。アプリケーションが、あるパスやフレームに必要な記述子をローカルの「ストレージ」記述子ヒープから GPU にバインドされる記述子ヒープへコピーする方式で記述子ヒープを管理する場合は、ストレージ用ヒープにはシェーダー不可視のヒープを使用し、必要に応じて GPU から参照可能なヒープへコピーしてください。

pSrcDescriptorRangeSizesDWORD*inoptionalコピー元の記述子範囲のサイズの配列。
DescriptorHeapsTypeD3D12_DESCRIPTOR_HEAP_TYPEin

コピーに使用する記述子ヒープの種類を指定する D3D12_DESCRIPTOR_HEAP_TYPE 型の値。記述子の種類によってサイズが異なる場合があるため、この指定が必要です。

コピー元とコピー先の記述子ヒープは同じ種類でなければなりません。異なる場合はデバッグレイヤーがエラーを出力します。

解説(Remarks)

可能な場合は、このメソッドよりも ID3D12Device::CopyDescriptorsSimple を使用してください。コピーが線形に行われるため、CPU キャッシュミス率が改善する可能性があります。

vtbl 24 void CopyDescriptorsSimple(DWORD NumDescriptors, D3D12_CPU_DESCRIPTOR_HANDLE DestDescriptorRangeStart, D3D12_CPU_DESCRIPTOR_HANDLE SrcDescriptorRangeStart, D3D12_DESCRIPTOR_HEAP_TYPE DescriptorHeapsType)

記述子をコピー元からコピー先へコピーします。(ID3D12Device.CopyDescriptorsSimple)

NumDescriptorsDWORDinコピーする記述子の数。
DestDescriptorRangeStartD3D12_CPU_DESCRIPTOR_HANDLEin

コピー先の記述子の開始位置を示す D3D12_CPU_DESCRIPTOR_HANDLE

コピー先とコピー元の記述子は、同じ D3D12_DESCRIPTOR_HEAP_TYPE のヒープ内になければなりません。

SrcDescriptorRangeStartD3D12_CPU_DESCRIPTOR_HANDLEin

コピー元の記述子の開始位置を示す D3D12_CPU_DESCRIPTOR_HANDLE

重要

SrcDescriptorRangeStart パラメーターは、シェーダーから参照できない記述子ヒープ内になければなりません。シェーダーから参照可能な記述子ヒープは WRITE_COMBINE メモリまたは GPU ローカルメモリ上に作成される場合があり、読み取りが極端に低速なためです。アプリケーションが、あるパスやフレームに必要な記述子をローカルの「ストレージ」記述子ヒープから GPU にバインドされる記述子ヒープへコピーする方式で記述子ヒープを管理する場合は、ストレージ用ヒープにはシェーダー不可視のヒープを使用し、必要に応じて GPU から参照可能なヒープへコピーしてください。

DescriptorHeapsTypeD3D12_DESCRIPTOR_HEAP_TYPEin

コピーに使用する記述子ヒープの種類を指定する D3D12_DESCRIPTOR_HEAP_TYPE 型の値。記述子の種類によってサイズが異なる場合があるため、この指定が必要です。

コピー元とコピー先の記述子ヒープは同じ種類でなければなりません。異なる場合はデバッグレイヤーがエラーを出力します。

解説(Remarks)

可能な場合は、ID3D12Device::CopyDescriptors よりもこのメソッドを使用してください。コピーが線形に行われるため、CPU キャッシュミス率が改善する可能性があります。

vtbl 25 D3D12_RESOURCE_ALLOCATION_INFO GetResourceAllocationInfo(DWORD visibleMask, DWORD numResourceDescs, D3D12_RESOURCE_DESC* pResourceDescs)
visibleMaskDWORDinリソースが可視となるGPUノードを示すビットマスク。単一GPUでは0。
numResourceDescsDWORDinpResourceDescs配列の要素数を指定する。
pResourceDescsD3D12_RESOURCE_DESC*inアロケーション情報を算出する対象リソースの記述子配列を指す。
vtbl 26 D3D12_HEAP_PROPERTIES GetCustomHeapProperties(DWORD nodeMask, D3D12_HEAP_TYPE heapType)
nodeMaskDWORDin対象とするGPUノードを示すビットマスク。単一GPUでは0。
heapTypeD3D12_HEAP_TYPEinプロパティを取得する対象のヒープ種別を示すD3D12_HEAP_TYPE値を指定する。
vtbl 27 HRESULT CreateCommittedResource(D3D12_HEAP_PROPERTIES* pHeapProperties, D3D12_HEAP_FLAGS HeapFlags, D3D12_RESOURCE_DESC* pDesc, D3D12_RESOURCE_STATES InitialResourceState, D3D12_CLEAR_VALUE* pOptimizedClearValue, GUID* riidResource, void** ppvResource)

リソースと暗黙のヒープを同時に作成します。ヒープはリソース全体を格納できる大きさになり、リソースはそのヒープにマップされます。

pHeapPropertiesD3D12_HEAP_PROPERTIES*inリソースのヒープのプロパティを指定する D3D12_HEAP_PROPERTIES 構造体へのポインター。
HeapFlagsD3D12_HEAP_FLAGSinヒープのオプション。D3D12_HEAP_FLAGS 列挙型の定数のビット単位 OR による組み合わせです。
pDescD3D12_RESOURCE_DESC*inリソースを記述する D3D12_RESOURCE_DESC 構造体へのポインター。
InitialResourceStateD3D12_RESOURCE_STATESin

リソースの初期状態。D3D12_RESOURCE_STATES 列挙型の定数のビット単位 OR による組み合わせです。

D3D12_HEAP_TYPE_UPLOAD ヒープと共にリソースを作成する場合、InitialResourceState には D3D12_RESOURCE_STATE_GENERIC_READ を設定する必要があります。

D3D12_HEAP_TYPE_READBACK ヒープと共にリソースを作成する場合、InitialResourceState には D3D12_RESOURCE_STATE_COPY_DEST を設定する必要があります。

pOptimizedClearValueD3D12_CLEAR_VALUE*inoptional

クリアカラーの既定値を記述する D3D12_CLEAR_VALUE 構造体を指定します。

pOptimizedClearValue には、クリア操作が最も効率的になる値を指定します。作成するリソースが D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET または D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL フラグを持つテクスチャの場合は、クリア操作で最も頻繁に使用する値を選んでください。他の値でクリア操作を呼び出すこともできますが、その場合はリソース作成時に渡した値と一致する場合ほど効率的にはなりません。

D3D12_RESOURCE_DIMENSION_BUFFER を使用する場合は、pOptimizedClearValuenullptr を設定する必要があります。

riidResourceGUID*in

ppvResource で返されるリソースインターフェイスのグローバル一意識別子 (GUID) への参照。

riidResource には ID3D12ResourceGUID を指定するのが最も一般的ですが、任意のインターフェイスの GUID を指定できます。リソースオブジェクトがこの GUID のインターフェイスをサポートしていない場合、作成は E_NOINTERFACE で失敗します。

ppvResourcevoid**outoptional

作成されたリソースオブジェクトへの要求されたインターフェイスポインターを受け取るメモリブロックへの省略可能なポインター。

ppvResource には nullptr を指定でき、機能テストに使用できます。ppvResourcenullptr の場合、オブジェクトは作成されず、pDesc が有効であれば S_FALSE が返されます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は HRESULTエラーコードを返します。

戻り値 説明
E_OUTOFMEMORY リソースを作成するのに十分なメモリがありません。

その他の戻り値については Direct3D 12 のリターンコードを参照してください。

解説(Remarks)

このメソッドはリソースとヒープを同時に作成します。ヒープはリソース全体を格納できる大きさになり、リソースはそのヒープにマップされます。作成されるヒープはアプリケーションからヒープオブジェクトを取得できないため、暗黙のヒープ (implicit heap) と呼ばれます。リソースへの最後の参照を解放する前に、アプリケーションは GPU がこのリソースの読み書きを行わなくなっていることを保証しなければなりません。

暗黙のヒープは、このメソッドがアプリケーションに制御を返す前に GPU からアクセス可能な常駐状態になります。常駐性も参照してください。

リソースの GPU 仮想アドレスのマッピングは変更できません。ID3D12CommandQueue::UpdateTileMappings およびボリュームタイルリソースを参照してください。

このメソッドは複数のスレッドから同時に呼び出すことができます。

D3D12Bundles サンプルでは、ID3D12Device::CreateCommittedResource を次のように使用しています。

頂点バッファーを作成します。

auto heapProperties = CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT);
auto resourceDesc = CD3DX12_RESOURCE_DESC::Buffer(SampleAssets::VertexDataSize);
ThrowIfFailed(m_device->CreateCommittedResource(
    &heapProperties,
    D3D12_HEAP_FLAG_NONE,
    &resourceDesc,
    D3D12_RESOURCE_STATE_COPY_DEST,
    nullptr,
    IID_PPV_ARGS(&m_vertexBuffer)));

Direct3D 12 リファレンスのサンプルコードを参照してください。

vtbl 28 HRESULT CreateHeap(D3D12_HEAP_DESC* pDesc, GUID* riid, void** ppvHeap)

配置リソース (placed resource) および予約リソース (reserved resource) で使用できるヒープを作成します。

pDescD3D12_HEAP_DESC*inヒープを記述する定数 D3D12_HEAP_DESC 構造体へのポインター。
riidGUID*in

ppvHeap で返されるヒープインターフェイスのグローバル一意識別子 (GUID) への参照。

riidResource には ID3D12HeapGUID を指定するのが最も一般的ですが、任意のインターフェイスの GUID を指定できます。リソースオブジェクトがこの GUID のインターフェイスをサポートしていない場合、作成は E_NOINTERFACE で失敗します。

ppvHeapvoid**outoptional

作成されたヒープオブジェクトへの要求されたインターフェイスポインターを受け取るメモリブロックへの省略可能なポインター。

ppvHeap には nullptr を指定でき、機能テストに使用できます。ppvHeapnullptr の場合、オブジェクトは作成されず、pDesc が有効であれば S_FALSE が返されます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は HRESULTエラーコードを返します。

戻り値 説明
E_OUTOFMEMORY ヒープを作成するのに十分なメモリがありません。

その他の戻り値については Direct3D 12 のリターンコードを参照してください。

解説(Remarks)

CreateHeap は、配置リソースおよび予約リソースで使用できるヒープを作成します。

ヒープへの最後の参照を解放する前に、アプリケーションは GPU がこのヒープの読み書きを行わなくなっていることを保証しなければなりません。

配置リソースのオブジェクトは、作成先のヒープへの参照を保持します。一方、予約リソースはヒープへの各マッピングについて参照を保持しません。

vtbl 29 HRESULT CreatePlacedResource(ID3D12Heap* pHeap, ULONGLONG HeapOffset, D3D12_RESOURCE_DESC* pDesc, D3D12_RESOURCE_STATES InitialState, D3D12_CLEAR_VALUE* pOptimizedClearValue, GUID* riid, void** ppvResource)

特定のヒープ内に配置されるリソースを作成します。配置リソースは最も軽量なリソースオブジェクトであり、作成と破棄が最も高速です。

pHeapID3D12Heap*inリソースを配置するヒープを表す ID3D12Heap インターフェイスへのポインター。
HeapOffsetULONGLONGinリソースへのオフセット (バイト単位)。HeapOffset はリソースのアラインメントの倍数でなければならず、HeapOffset とリソースサイズの合計はヒープサイズ以下でなければなりません。テクスチャリソースのサイズを把握するには GetResourceAllocationInfo を使用する必要があります。
pDescD3D12_RESOURCE_DESC*inリソースを記述する D3D12_RESOURCE_DESC 構造体へのポインター。
InitialStateD3D12_RESOURCE_STATESin

リソースの初期状態。D3D12_RESOURCE_STATES 列挙型の定数のビット単位 OR による組み合わせです。

D3D12_HEAP_TYPE_UPLOAD ヒープと共にリソースを作成する場合、InitialStateD3D12_RESOURCE_STATE_GENERIC_READ でなければなりません。D3D12_HEAP_TYPE_READBACK ヒープと共にリソースを作成する場合、InitialStateD3D12_RESOURCE_STATE_COPY_DEST でなければなりません。

pOptimizedClearValueD3D12_CLEAR_VALUE*inoptional

クリアカラーの既定値を記述する D3D12_CLEAR_VALUE を指定します。

pOptimizedClearValue には、クリア操作が最も効率的になる値を指定します。作成するリソースが D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET または D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL フラグを持つテクスチャの場合、アプリケーションはクリア操作で最も頻繁に使用する値を選ぶ必要があります。

他の値でクリア操作を呼び出すこともできますが、その場合はリソース作成時に渡した値と一致する場合ほど効率的にはなりません。

D3D12_RESOURCE_DIMENSION_BUFFER と共に使用する場合、pOptimizedClearValue は NULL でなければなりません。

riidGUID*in

リソースインターフェイスのグローバル一意識別子 (GUID)。入力パラメーターです。

リソースのインターフェイスの REFIID (GUID) は、__uuidof マクロを使用して取得できます。たとえば、__uuidof(ID3D12Resource) はリソースのインターフェイスの GUID を取得します。riid には ID3D12Resource の GUID を指定するのが最も一般的ですが、任意のインターフェイスの GUID を指定できます。リソースオブジェクトがこの GUID のインターフェイスをサポートしていない場合、作成は E_NOINTERFACE で失敗します。

ppvResourcevoid**outoptionalリソースへのポインターを受け取るメモリブロックへのポインター。ppvResource には NULL を指定でき、機能テストに使用できます。ppvResource が NULL の場合、オブジェクトは作成されず、pResourceDesc とその他のパラメーターが有効であれば S_FALSE が返されます。

戻り値

型: HRESULT

リソースを作成するのに十分なメモリがない場合、このメソッドは E_OUTOFMEMORY を返します。その他の戻り値については Direct3D 12 のリターンコードを参照してください。

解説(Remarks)

CreatePlacedResource は、予約リソースをヒープ内のオフセットに完全にマップすることに似ていますが、ヒープに関連付けられた仮想アドレス空間も再利用できる点が異なります。

配置リソースはコミットリソースよりも作成と破棄が軽量です。これは、それらの操作でヒープの作成や破棄が発生しないためです。さらに配置リソースは、リソースの作成と破棄よりもさらに軽量なメモリ再利用の手法、すなわちエイリアシングとエイリアシングバリアによる再利用を可能にします。複数の配置リソースが同じヒープ上で同時に重なり合うことができますが、同時に使用できるのは重なり合うリソースのうち 1 つだけです。

配置リソースの使用セマンティクスには、シンプルモデルとアドバンストモデルの 2 つがあります。アプリでアドバンストモデルが必要になることが判明するまでは、シンプルモデルを選ぶことをお勧めします (多様な GPU エコシステム全体でグラフィックスツールのサポートが最大限得られるためです)。

シンプルモデル

このモデルでは、配置リソースはアクティブまたは非アクティブのいずれかの状態にあると考えます。GPU が非アクティブなリソースを読み書きすることは不正です。配置リソースは非アクティブ状態で作成されます。

コマンドリスト上のエイリアシングバリアでリソースをアクティブ化するには、アプリケーションはそのリソースを D3D12_RESOURCE_ALIASING_BARRIER::pResourceAfter に渡します。アクティブ化の際、pResourceBefore は NULL のままで構いません。アクティブ化されたリソースと物理メモリを共有するすべてのリソース (重なり合う配置リソースおよび予約リソースを含む) は非アクティブになります。

効率を最大化するため、エイリアシングバリアはまとめてグループ化し、一括で送信してください。

アクティブ化後、レンダーターゲットまたは深度ステンシルのフラグを持つリソースはさらに初期化が必要です。以下のリソース初期化に関する注意を参照してください。

必要なリソース初期化に関する注意

一部のリソースの種類は初期化が必要です。レンダーターゲットまたは深度ステンシルのフラグを持つリソースは、クリア操作、またはサブリソース全体のコピーの集合によって初期化する必要があります。2 つのエイリアスされたリソース間の遷移を示すためにエイリアシングバリアを使用した場合、初期化はエイリアシングバリアの後で行う必要があります。この初期化は、シンプルモデルにおいてリソースがアクティブ化される場面では常に必要です。

レンダーターゲットまたは深度ステンシルのフラグを持つ配置リソースおよび予約リソースは、他の操作を行う前に次のいずれかの操作で初期化する必要があります。

アプリケーションは、変更されるテクセル数が最も少なくなる、最も明示的な操作を選ぶべきです。次の例を検討してください。

アドバンストモデル

このモデルでは、アクティブ/非アクティブという状態の抽象化を無視できます。その代わり、次のより低レベルの規則を守る必要があります。

初期化操作は、サブリソース全体に対して行うか、64KB 単位で行う必要があります。サブリソース全体の初期化はすべてのリソースの種類でサポートされます。64KB 境界に整列した 64KB 単位の初期化は、バッファーと、64KB_UNDEFINED_SWIZZLE または 64KB_STANDARD_SWIZZLE のテクスチャレイアウトを持つテクスチャでサポートされます (D3D12_TEXTURE_LAYOUT を参照)。

エイリアシングバリアに関する注意

エイリアシングバリアでは、pResourceAfterpResourceBefore の両方を NULL に設定できます。ExecuteCommandLists のメモリ整合性の定義とエイリアシングバリアの定義は同じであり、同じ物理メモリへの 2 つのエイリアスされたアクセスが別々の ExecuteCommandLists 呼び出しで行われる場合、エイリアシングバリアは不要です。

D3D12 のアドバンストな使用モデルでは、ExecuteCommandLists の同期の定義はエイリアシングバリアと同等です。したがってアプリケーションは、物理メモリの再利用の間にエイリアシングバリアを挿入するか、物理メモリの 2 つのエイリアスされた使用が別々の ExecuteCommandLists 呼び出しで行われるようにするかのいずれかを選べます。

非アクティブ化される範囲はリソースのプロパティによって異なります。メモリレイアウトが未定義のテクスチャが最悪のケースで、テクスチャ全体をアトミックに非アクティブ化する必要があります。レイアウトが定義された 2 つの重なり合うリソースの場合、非アクティブ化はリソースの重なり合う整列済み領域のみに限定できます。データの継承も明確に定義できる場合があります。詳細については、メモリエイリアシングとデータ継承を参照してください。

vtbl 30 HRESULT CreateReservedResource(D3D12_RESOURCE_DESC* pDesc, D3D12_RESOURCE_STATES InitialState, D3D12_CLEAR_VALUE* pOptimizedClearValue, GUID* riid, void** ppvResource)

予約リソース (reserved resource) を作成します。予約リソースは、まだヒープ内のいずれのページにもマップされていません。

pDescD3D12_RESOURCE_DESC*inリソースを記述する D3D12_RESOURCE_DESC 構造体へのポインター。
InitialStateD3D12_RESOURCE_STATESinリソースの初期状態。D3D12_RESOURCE_STATES 列挙型の定数のビット単位 OR による組み合わせです。
pOptimizedClearValueD3D12_CLEAR_VALUE*inoptional

クリアカラーの既定値を記述する D3D12_CLEAR_VALUE 構造体を指定します。

pOptimizedClearValue には、クリア操作が最も効率的になる値を指定します。作成するリソースが D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET または D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL フラグを持つテクスチャの場合は、クリア操作で最も頻繁に使用する値を選んでください。他の値でクリア操作を呼び出すこともできますが、その場合はリソース作成時に渡した値と一致する場合ほど効率的にはなりません。

D3D12_RESOURCE_DIMENSION_BUFFER を使用する場合は、pOptimizedClearValuenullptr を設定する必要があります。

riidGUID*in

ppvResource で返されるリソースインターフェイスのグローバル一意識別子 (GUID) への参照。解説 を参照してください。

riidResource には ID3D12ResourceGUID を指定するのが最も一般的ですが、任意のインターフェイスの GUID を指定できます。リソースオブジェクトがこの GUID のインターフェイスをサポートしていない場合、作成は E_NOINTERFACE で失敗します。

ppvResourcevoid**outoptional

作成されたリソースオブジェクトへの要求されたインターフェイスポインターを受け取るメモリブロックへの省略可能なポインター。

ppvResource には nullptr を指定でき、機能テストに使用できます。ppvResourcenullptr の場合、オブジェクトは作成されず、pDesc が有効であれば S_FALSE が返されます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は HRESULTエラーコードを返します。

戻り値 説明
E_OUTOFMEMORY リソースを作成するのに十分なメモリがありません。

その他の戻り値については Direct3D 12 のリターンコードを参照してください。

解説(Remarks)

CreateReservedResource は、Direct3D 11 の D3D11_RESOURCE_MISC_TILED に相当します。仮想メモリのみを持ち、バッキングストアを持たないリソースを作成します。

このリソースを物理メモリ (すなわちヒープ) にマップするには、CopyTileMappingsUpdateTileMappings を使用する必要があります。

これらのリソースの種類は、アダプターがタイルリソース Tier 1 以上をサポートしている場合にのみ作成できます。タイルリソースの Tier は、ヒープにマップされていないリソースにアクセスした場合の動作を定義します。

vtbl 31 HRESULT CreateSharedHandle(ID3D12DeviceChild* pObject, SECURITY_ATTRIBUTES* pAttributes, DWORD Access, LPWSTR Name, HANDLE* pHandle)

ヒープ、リソース、またはフェンスオブジェクトへの共有ハンドルを作成します。

pObjectID3D12DeviceChild*in

共有用に作成するヒープ、リソース、またはフェンスオブジェクトを表す ID3D12DeviceChild インターフェイスへのポインター。 次のインターフェイス (ID3D12DeviceChild から派生) がサポートされます。

pAttributesSECURITY_ATTRIBUTES*inoptional

SECURITY_ATTRIBUTES 構造体へのポインター。この構造体には、独立しつつ関連する 2 つのデータメンバー、すなわち省略可能なセキュリティ記述子と、子プロセスが返されたハンドルを継承できるかどうかを決定する Boolean 値が含まれます。

アプリケーションが作成する可能性のある子プロセスに CreateSharedHandle が返すハンドルを継承させたくない場合、また返されたハンドルに関連付けられるリソースに既定のセキュリティ記述子を割り当てたい場合は、このパラメーターに NULL を設定します。

構造体の lpSecurityDescriptor メンバーは、リソースの SECURITY_DESCRIPTOR を指定します。 返されたハンドルに関連付けられるリソースに既定のセキュリティ記述子をランタイムが割り当てるようにするには、このメンバーを NULL に設定します。 リソースの既定のセキュリティ記述子の ACL は、作成者のプライマリトークンまたは偽装トークンから取得されます。 詳細については、同期オブジェクトのセキュリティとアクセス権を参照してください。

AccessDWORDin現在、このパラメーターが受け付ける値は GENERIC_ALL のみです。
NameLPWSTRinoptional

共有ヒープに関連付ける名前を含む、NULL 終端の UNICODE 文字列。 名前は MAX_PATH 文字までに制限されます。 名前の比較では大文字と小文字が区別されます。

Name が既存のリソースの名前と一致する場合、CreateSharedHandleDXGI_ERROR_NAME_ALREADY_EXISTS で失敗します。 これは、これらのオブジェクトが同じ名前空間を共有するためです。

名前には "Global" または "Local" のプレフィックスを付けて、グローバル名前空間またはセッション名前空間にオブジェクトを明示的に作成できます。 名前の残りの部分には、円記号 (\) 以外の任意の文字を使用できます。 詳細については、 カーネルオブジェクトの名前空間を参照してください。 高速ユーザー切り替えはターミナルサービスのセッションを使用して実装されています。 アプリケーションが複数のユーザーをサポートできるよう、カーネルオブジェクト名はターミナルサービスのガイドラインに従う必要があります。

オブジェクトはプライベート名前空間に作成することもできます。詳細については、オブジェクト名前空間を参照してください。

pHandleHANDLE*out共有するリソースの NT HANDLE 値を受け取る変数へのポインター。 このハンドルはリソースへのアクセスを行う呼び出しで使用できます。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は次のいずれかの値を返します。

解説(Remarks)

ヒープとコミットリソースの両方を共有できます。コミットリソースを共有すると、暗黙のヒープがコミットリソースの記述と共に共有され、別のデバイスから互換性のあるリソース記述をそのヒープにマップできるようになります。

Direct3D 11 と Direct3D 12 の相互運用シナリオでは、共有フェンスは DirectX 11 の ID3D11Device5::OpenSharedFence メソッドで開き、共有リソースは ID3D11Device::OpenSharedResource1 メソッドで開きます。

Direct3D 12 では、共有ハンドルは ID3D12Device::OpenSharedHandle または ID3D12Device::OpenSharedHandleByName メソッドで開きます。

vtbl 32 HRESULT OpenSharedHandle(HANDLE NTHandle, GUID* riid, void** ppvObj)

HANDLE と REFIID を使用して、共有リソース、共有ヒープ、共有フェンスのハンドルを開きます。

NTHandleHANDLEinID3D12Device::CreateSharedHandle の呼び出しによって出力されたハンドル。
riidGUID*in

次のいずれかのインターフェイスのグローバル一意識別子 (GUID)。

インターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。 たとえば、__uuidof(ID3D12Heap) はそのインターフェイスの GUID を取得します。
ppvObjvoid**outoptional

次のいずれかのインターフェイスへのポインターを受け取るメモリブロックへのポインター。

戻り値

型: HRESULT

このメソッドは Direct3D 12 のリターンコードのいずれかを返します。

vtbl 33 HRESULT OpenSharedHandleByName(LPWSTR Name, DWORD Access, HANDLE* pNTHandle)

Name と Access を使用して、共有リソース、共有ヒープ、共有フェンスのハンドルを開きます。

NameLPWSTRinID3D12Device::CreateSharedHandle の呼び出しで Name パラメーターに任意に渡した名前。
AccessDWORDinID3D12Device::CreateSharedHandle の呼び出しで Access パラメーターに指定したアクセスレベル。
pNTHandleHANDLE*out共有ハンドルへのポインター。

戻り値

型: HRESULT

このメソッドは Direct3D 12 のリターンコードのいずれかを返します。

vtbl 34 HRESULT MakeResident(DWORD NumObjects, ID3D12Pageable** ppObjects)

オブジェクトをデバイスに対して常駐 (resident) させます。

NumObjectsDWORDinppObjects 配列内で、デバイスに対して常駐させるオブジェクトの数。
ppObjectsID3D12Pageable**in

オブジェクトの ID3D12Pageable インターフェイスポインターの配列を含むメモリブロックへのポインター。

ほとんどの D3D12 オブジェクトは ID3D12Pageable を継承していますが、常駐状態の変更がサポートされるのは次のオブジェクトのみです。 記述子ヒープ、ヒープ、コミットリソース、クエリヒープ。

戻り値

型: HRESULT

このメソッドは Direct3D 12 のリターンコードのいずれかを返します。

解説(Remarks)

MakeResident は、リソースに関連付けられたデータをディスクから読み込み、そのリソースに適したメモリプールからメモリを再割り当てします。このメソッドは、物理メモリを所有するオブジェクトに対して呼び出す必要があります。

GPU のビデオメモリを管理するには、このメソッドと Evict を使用します。D3D11 ではこれが自動的に行われていましたが、D3D12 ではアプリが行う必要があります。

MakeResidentEvict は、多くのアダプターで常駐メモリ予算の管理に役立ちます。MakeResident は明示的にデータをページインし、その後ページアウトを抑止するため、GPU がデータにアクセスできるようになります。Evict はページアウトを許可します。

GPU アーキテクチャによっては、GPU 仮想アドレス空間が十分でないために常駐性の操作から利益を得られないものもあります。プロセスあたりの最大 GPU 仮想アドレス空間が小さすぎる、または常駐メモリ予算とほぼ同程度であるかを判断するには、D3D12_FEATURE_DATA_GPU_VIRTUAL_ADDRESS_SUPPORTIDXGIAdapter3::QueryVideoMemoryInfo を使用します。そのようなアーキテクチャでは、常駐メモリ予算は常に GPU 仮想アドレス空間の量によって制約されます。そのようなシステムでは、Evict を呼んでも常駐メモリ予算は解放されません。

常駐メモリ予算に十分な空きがあるように見える場合でも、アプリケーションは MakeResident の失敗を処理しなければなりません。物理メモリの断片化やアダプターアーキテクチャ固有の制約により、大きな連続領域を利用できないことがあります。アプリケーションは常駐メモリ予算をさらに解放してから再試行してください。

MakeResident は参照カウント方式であり、Evict が効果を持つには MakeResident と同じ回数だけ Evict を呼び出す必要があります。常駐性をサポートするオブジェクトは作成時に常駐状態になるため、Evict を 1 回呼び出せば実際にオブジェクトは退避されます。

アプリケーションはフェンスを使用して、GPU が非常駐のオブジェクトを使用しないようにしなければなりません。GPU がオブジェクトを参照するコマンドリストを実行する前に MakeResident が戻っている必要があります。Evict は、オブジェクトを参照するコマンドリストの GPU での実行が完了した後に呼び出す必要があります。

退避されたオブジェクトも、同じ GPU 仮想アドレスと同じ量の GPU 仮想アドレス空間を引き続き消費します。したがって、Evict の後もリソース記述子やその他の GPU 仮想アドレス参照は無効になりません。

vtbl 35 HRESULT Evict(DWORD NumObjects, ID3D12Pageable** ppObjects)

データのページアウトを有効にします。これにより、GPU からそのデータへのアクセスができなくなります。

NumObjectsDWORDinppObjects 配列内で、デバイスから退避するオブジェクトの数。
ppObjectsID3D12Pageable**in

オブジェクトの ID3D12Pageable インターフェイスポインターの配列を含むメモリブロックへのポインター。

ほとんどの D3D12 オブジェクトは ID3D12Pageable を継承していますが、常駐状態の変更がサポートされるのは次のオブジェクトのみです。 記述子ヒープ、ヒープ、コミットリソース、クエリヒープ。

戻り値

型: HRESULT

このメソッドは Direct3D 12 のリターンコードのいずれかを返します。

解説(Remarks)

Evict は、リソースに関連付けられたデータをディスクに永続化し、そのリソースが置かれていたメモリプールから取り除きます。このメソッドは、物理メモリを所有するオブジェクト、すなわちコミットリソース (仮想メモリと物理メモリの両方の割り当てを所有します) またはヒープに対して呼び出す必要があります。予約リソースは物理メモリを持たず、配置リソースはヒープからメモリを借りている点に注意してください。

MakeResident の解説も参照してください。

vtbl 36 HRESULT CreateFence(ULONGLONG InitialValue, D3D12_FENCE_FLAGS Flags, GUID* riid, void** ppFence)

フェンスオブジェクトを作成します。(ID3D12Device.CreateFence)

InitialValueULONGLONGinフェンスの初期値。
FlagsD3D12_FENCE_FLAGSinビット単位 OR で組み合わせた D3D12_FENCE_FLAGS 型の値の組み合わせ。 結果の値がフェンスのオプションを指定します。
riidGUID*inフェンスインターフェイス (ID3D12Fence) のグローバル一意識別子 (GUID)。 フェンスのインターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。 たとえば、__uuidof(ID3D12Fence) はフェンスのインターフェイスの GUID を取得します。
ppFencevoid**outフェンスへのアクセスに使用する ID3D12Fence インターフェイスへのポインターを受け取るメモリブロックへのポインター。

戻り値

型: HRESULT

成功した場合は S_OK を返します。それ以外の場合は Direct3D 12 のリターンコードのいずれかを返します。

vtbl 37 HRESULT GetDeviceRemovedReason()

デバイスが削除された理由を取得します。

戻り値

型: HRESULT

このメソッドは、デバイスが削除された理由を返します。

vtbl 38 void GetCopyableFootprints(D3D12_RESOURCE_DESC* pResourceDesc, DWORD FirstSubresource, DWORD NumSubresources, ULONGLONG BaseOffset, D3D12_PLACED_SUBRESOURCE_FOOTPRINT* pLayouts, DWORD* pNumRows, ULONGLONG* pRowSizeInBytes, ULONGLONG* pTotalBytes)

コピー可能なリソースレイアウトを取得します。アップロードヒープ内の領域をサブアロケートする際に、D3D12_PLACED_SUBRESOURCE_FOOTPRINT と D3D12_SUBRESOURCE_FOOTPRINT を埋めるのに役立ちます。

pResourceDescD3D12_RESOURCE_DESC*inリソースの記述。D3D12_RESOURCE_DESC 構造体へのポインターとして指定します。
FirstSubresourceDWORDinリソース内の最初のサブリソースのインデックス。 有効な値の範囲は 0 から D3D12_REQ_SUBRESOURCES です。
NumSubresourcesDWORDinリソース内のサブリソースの数。有効な値の範囲は 0 から (D3D12_REQ_SUBRESOURCES - FirstSubresource) です。
BaseOffsetULONGLONGinpLayouts 配列内の各 D3D12_PLACED_SUBRESOURCE_FOOTPRINTOffset に加算されるオフセット (バイト単位)。
pLayoutsD3D12_PLACED_SUBRESOURCE_FOOTPRINT*outoptional各サブリソースの記述と配置が設定される、長さ NumSubresourcesD3D12_PLACED_SUBRESOURCE_FOOTPRINT 構造体の配列へのポインター。
pNumRowsDWORD*outoptional各サブリソースの行数が設定される、長さ NumSubresources の整数変数の配列へのポインター。
pRowSizeInBytesULONGLONG*outoptional

各サブリソースの 1 行のパディングなしのサイズ (バイト単位) が各要素に設定される、長さ NumSubresources の整数変数の配列へのポインター。

たとえば、Texture2D リソースの幅が 32、1 ピクセルあたり 4 バイトの場合、

pRowSizeInBytes は 128 を返します。

pRowSizeInBytes行ピッチと混同しないでください。pLayouts を調べて行ピッチを取得すると、D3D12_TEXTURE_DATA_PITCH_ALIGNMENT に整列されるため 256 になります。

pTotalBytesULONGLONG*outoptional合計サイズ (バイト単位) が設定される整数変数へのポインター。pResourceDesc が無効な場合、pTotalBytes の値は UINT64_MAX に設定されます。

解説(Remarks)

このルーチンは、アップロードヒープ内の領域をサブアロケートする際に、アプリケーションが D3D12_PLACED_SUBRESOURCE_FOOTPRINT および D3D12_SUBRESOURCE_FOOTPRINT 構造体を埋めるのを支援します。 得られる構造体は GPU アダプターに依存しません。つまり、値は GPU アダプターによって変化しません。 GetCopyableFootprints は、(D3D12_RESOURCE_DESC 構造体から得られる) リソースフォーマット、テクスチャレイアウト、アラインメント要件の詳細を使用してサブリソース構造体を埋めます。 アプリケーションはこれらの詳細をすべて参照できるため、このメソッドやその派生をアプリの一部として実装することも可能です。

D3D12Multithreading サンプルでは、ID3D12Device::GetCopyableFootprints を次のように使用しています。

// Returns required size of a buffer to be used for data upload
inline UINT64 GetRequiredIntermediateSize(
    _In_ ID3D12Resource* pDestinationResource,
    _In_range_(0,D3D12_REQ_SUBRESOURCES) UINT FirstSubresource,
    _In_range_(0,D3D12_REQ_SUBRESOURCES-FirstSubresource) UINT NumSubresources)
{
    D3D12_RESOURCE_DESC Desc = pDestinationResource->GetDesc();
    UINT64 RequiredSize = 0;
    
    ID3D12Device* pDevice;
    pDestinationResource->GetDevice(__uuidof(*pDevice), reinterpret_cast<void**>(&pDevice));
    pDevice->GetCopyableFootprints(&Desc, FirstSubresource, NumSubresources, 0, nullptr, nullptr, nullptr, &RequiredSize);
    pDevice->Release();
    
    return RequiredSize;
}

D3D12 リファレンスのサンプルコードを参照してください。

vtbl 39 HRESULT CreateQueryHeap(D3D12_QUERY_HEAP_DESC* pDesc, GUID* riid, void** ppvHeap)

クエリヒープを作成します。クエリヒープはクエリの配列を保持します。

pDescD3D12_QUERY_HEAP_DESC*inクエリヒープを D3D12_QUERY_HEAP_DESC 構造体で指定します。
riidGUID*inヒープを一意に識別する REFIID を指定します。
ppvHeapvoid**outoptionalメソッドが正常に完了したときに返される、ヒープへのポインターを指定します。 ppvHeap には NULL を指定でき、機能テストに使用できます。 ppvHeap が NULL の場合、オブジェクトは作成されず、pDesc が有効であれば S_FALSE が返されます。

戻り値

型: HRESULT

このメソッドは Direct3D 12 のリターンコードのいずれかを返します。

解説(Remarks)

詳細については クエリを参照してください。

D3D12PredicationQueries サンプルでは、ID3D12Device::CreateQueryHeap を次のように使用しています。

クエリヒープとクエリ結果バッファーを作成します。

// Pipeline objects.
D3D12_VIEWPORT m_viewport;
D3D12_RECT m_scissorRect;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D12Device> m_device;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocators[FrameCount];
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature> m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12DescriptorHeap> m_cbvHeap;
ComPtr<ID3D12DescriptorHeap> m_dsvHeap;
ComPtr<ID3D12QueryHeap> m_queryHeap;
UINT m_rtvDescriptorSize;
UINT m_cbvSrvDescriptorSize;
UINT m_frameIndex;

// Synchronization objects.
ComPtr<ID3D12Fence> m_fence;
UINT64 m_fenceValues[FrameCount];
HANDLE m_fenceEvent;

// Asset objects.
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12PipelineState> m_queryState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
ComPtr<ID3D12Resource> m_vertexBuffer;
ComPtr<ID3D12Resource> m_constantBuffer;
ComPtr<ID3D12Resource> m_depthStencil;
ComPtr<ID3D12Resource> m_queryResult;
D3D12_VERTEX_BUFFER_VIEW m_vertexBufferView;
// Describe and create a heap for occlusion queries.
D3D12_QUERY_HEAP_DESC queryHeapDesc = {};
queryHeapDesc.Count = 1;
queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_OCCLUSION;
ThrowIfFailed(m_device->CreateQueryHeap(&queryHeapDesc, IID_PPV_ARGS(&m_queryHeap)));

D3D12 リファレンスのサンプルコードを参照してください。

vtbl 40 HRESULT SetStablePowerState(BOOL Enable)

特定の種類のプロファイリングや試験的なプロトタイピングを支援する、開発時向けの機能です。

EnableBOOLin安定電力状態のオン/オフを指定する BOOL。

戻り値

型: HRESULT

このメソッドは Direct3D 12 のリターンコードのいずれかを返します。

解説(Remarks)

このメソッドはアプリケーションの開発時にのみ有用です。動的周波数スケーリングによるアーティファクトの影響を受けずに、複数のアルゴリズムの GPU 使用状況をプロファイリングできるようになります。

出荷するアプリケーションの通常の実行時にこのメソッドを呼び出さないでください。このメソッドはマシンが開発者モードの場合にのみ機能します。開発者モードが有効でない場合はデバイスの削除が発生します。代わりに、既定でオフの開発者向けスイッチに応じてこのメソッドを呼び出してください。コマンドラインパラメーター、設定ファイル、レジストリキー、開発者向けコンソールコマンドに応じて呼び出すことは妥当な使用シナリオです。

安定電力状態では、通常アプリケーション負荷時にユーザーが経験する値よりも大幅に低い、遅めの設定に GPU のクロックレートが固定されます。このクロックレートの低下はシステム全体に影響します。プロセッサーが電力・電流・熱の限界を超えないようにするには、低いクロックレートが必要です。通常の使用シナリオでは、プロセッサーの動的なオーバークロック機能が活用されるのが一般的です。安定電力状態のもとで 2 つの設計を比較して得た結論は、実際の使用シナリオでの結果によって裏付けを取り、再確認する必要があります。

vtbl 41 HRESULT CreateCommandSignature(D3D12_COMMAND_SIGNATURE_DESC* pDesc, ID3D12RootSignature* pRootSignature, GUID* riid, void** ppvCommandSignature)

このメソッドはコマンドシグネチャを作成します。

pDescD3D12_COMMAND_SIGNATURE_DESC*in作成するコマンドシグネチャを D3D12_COMMAND_SIGNATURE_DESC 構造体で記述します。
pRootSignatureID3D12RootSignature*inoptional

コマンドシグネチャが適用される ID3D12RootSignature を指定します。

シグネチャ内のコマンドのいずれかがパイプライン上のバインディングを更新する場合、ルートシグネチャが必要です。含まれるコマンドが draw または dispatch のみの場合、ルートシグネチャのパラメーターは NULL に設定できます。

riidGUID*inコマンドシグネチャインターフェイス (ID3D12CommandSignature) のグローバル一意識別子 (GUID)。 コマンドシグネチャのインターフェイスの REFIID (GUID) は、__uuidof() マクロを使用して取得できます。 たとえば、__uuidof(ID3D12CommandSignature) はコマンドシグネチャのインターフェイスの GUID を取得します。
ppvCommandSignaturevoid**outoptionalメソッドが正常に完了したときに、作成されたコマンドシグネチャ (ID3D12CommandSignature) を指すポインターを指定します。

戻り値

型: HRESULT

このメソッドは Direct3D 12 のリターンコードのいずれかを返します。

vtbl 42 void GetResourceTiling(ID3D12Resource* pTiledResource, DWORD* pNumTilesForEntireResource, D3D12_PACKED_MIP_INFO* pPackedMipDesc, D3D12_TILE_SHAPE* pStandardTileShapeForNonPackedMips, DWORD* pNumSubresourceTilings, DWORD FirstSubresourceTilingToGet, D3D12_SUBRESOURCE_TILING* pSubresourceTilingsForNonPackedMips)

タイルリソースがどのようにタイルに分割されるかについての情報を取得します。(ID3D12Device.GetResourceTiling)

pTiledResourceID3D12Resource*in情報を取得する対象のタイル化された ID3D12Resource を指定します。
pNumTilesForEntireResourceDWORD*outoptionalタイルリソース全体を格納するのに必要なタイル数を受け取る変数へのポインター。
pPackedMipDescD3D12_PACKED_MIP_INFO*outoptionalタイルリソースのミップマップがどのようにパックされているかについての情報を GetResourceTiling が設定する、D3D12_PACKED_MIP_INFO 構造体へのポインター。
pStandardTileShapeForNonPackedMipsD3D12_TILE_SHAPE*outoptionalタイル形状についての情報を GetResourceTiling が設定する D3D12_TILE_SHAPE 構造体を指定します。これは、タイルリソースの寸法とは無関係に、ピクセルがタイル内にどのように収まるかに関する情報であり、パックされたミップマップは含みません。タイルリソース全体がパックされている場合、パックされたミップマップにはレイアウトが定義されないため、このパラメーターは意味を持ちません。この場合、GetResourceTiling は D3D12_TILE_SHAPE のメンバーを 0 に設定します。
pNumSubresourceTilingsDWORD*inoutoptionalサブリソース内のタイル数を保持する変数へのポインター。入力時にはタイリング情報を照会するサブリソースの数を、出力時には pSubresourceTilingsForNonPackedMips に実際に取得された数 (利用可能な数に丸められます) を表します。
FirstSubresourceTilingToGetDWORDin取得する最初のサブリソースタイルのインデックス。pNumSubresourceTilings が指す値が 0 の場合、GetResourceTiling はこのパラメーターを無視します。
pSubresourceTilingsForNonPackedMipsD3D12_SUBRESOURCE_TILING*outサブリソースタイルについての情報を GetResourceTiling が設定する D3D12_SUBRESOURCE_TILING 構造体を指定します。サブリソースタイルがパックされたミップマップの一部である場合、GetResourceTiling は D3D12_SUBRESOURCE_TILING のメンバーを 0 に設定しますが、StartTileIndexInOverallResource メンバーだけは D3D12_PACKED_TILE (0xffffffff) に設定します。D3D12_PACKED_TILE 定数は、この状況では D3D12_SUBRESOURCE_TILING 構造体全体が意味を持たず、pPackedMipDesc パラメーターが指す情報が適用されることを示します。

解説(Remarks)

ヒープサイズを計算して CreatePlacedResource を呼び出す際に必要となるテクスチャの総リソースサイズを見積もるには、GetResourceTiling ではなく GetResourceAllocationInfo を使用してください。 GetResourceTiling はこの目的には使用できません。

タイルリソースの詳細については、ボリュームタイルリソースを参照してください。

vtbl 43 LUID GetAdapterLuid()

現在のデバイス (アダプター) のローカル一意識別子を取得します。

戻り値

型: LUID

アダプターのローカル一意識別子。

解説(Remarks)

このメソッドは、アダプターのハードウェアに固有の一意な識別子を返します。 アプリケーションはこの識別子を使用して、さまざまな API (Direct3D 12、DXGI) にまたがる堅牢なマッピングを定義できます。

ローカル一意識別子 (LUID) は 64 ビットの値であり、生成されたシステム上でのみ一意であることが保証されます。 ローカル一意識別子 (LUID) の一意性は、システムが再起動されるまでの間のみ保証されます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_ID3D12Device "{189819F1-1DB6-4B57-BE54-1821339B85F7}"
#usecom global ID3D12Device IID_ID3D12Device "{}"
#comfunc global ID3D12Device_GetNodeCount                      7
#comfunc global ID3D12Device_CreateCommandQueue                8 var,var,sptr
#comfunc global ID3D12Device_CreateCommandAllocator            9 int,var,sptr
#comfunc global ID3D12Device_CreateGraphicsPipelineState       10 var,var,sptr
#comfunc global ID3D12Device_CreateComputePipelineState        11 var,var,sptr
#comfunc global ID3D12Device_CreateCommandList                 12 int,int,sptr,sptr,var,sptr
#comfunc global ID3D12Device_CheckFeatureSupport               13 int,sptr,int
#comfunc global ID3D12Device_CreateDescriptorHeap              14 var,var,sptr
#comfunc global ID3D12Device_GetDescriptorHandleIncrementSize  15 int
#comfunc global ID3D12Device_CreateRootSignature               16 int,sptr,sptr,var,sptr
#comfunc global ID3D12Device_CreateConstantBufferView          17 var,int
#comfunc global ID3D12Device_CreateShaderResourceView          18 sptr,var,int
#comfunc global ID3D12Device_CreateUnorderedAccessView         19 sptr,sptr,var,int
#comfunc global ID3D12Device_CreateRenderTargetView            20 sptr,var,int
#comfunc global ID3D12Device_CreateDepthStencilView            21 sptr,var,int
#comfunc global ID3D12Device_CreateSampler                     22 var,int
#comfunc global ID3D12Device_CopyDescriptors                   23 int,var,var,int,var,var,int
#comfunc global ID3D12Device_CopyDescriptorsSimple             24 int,int,int,int
#comfunc global ID3D12Device_GetResourceAllocationInfo         25 int,int,var
#comfunc global ID3D12Device_GetCustomHeapProperties           26 int,int
#comfunc global ID3D12Device_CreateCommittedResource           27 var,int,var,int,var,var,sptr
#comfunc global ID3D12Device_CreateHeap                        28 var,var,sptr
#comfunc global ID3D12Device_CreatePlacedResource              29 sptr,int64,var,int,var,var,sptr
#comfunc global ID3D12Device_CreateReservedResource            30 var,int,var,var,sptr
#comfunc global ID3D12Device_CreateSharedHandle                31 sptr,var,int,wstr,sptr
#comfunc global ID3D12Device_OpenSharedHandle                  32 sptr,var,sptr
#comfunc global ID3D12Device_OpenSharedHandleByName            33 wstr,int,sptr
#comfunc global ID3D12Device_MakeResident                      34 int,sptr
#comfunc global ID3D12Device_Evict                             35 int,sptr
#comfunc global ID3D12Device_CreateFence                       36 int64,int,var,sptr
#comfunc global ID3D12Device_GetDeviceRemovedReason            37
#comfunc global ID3D12Device_GetCopyableFootprints             38 var,int,int,int64,var,var,var,var
#comfunc global ID3D12Device_CreateQueryHeap                   39 var,var,sptr
#comfunc global ID3D12Device_SetStablePowerState               40 int
#comfunc global ID3D12Device_CreateCommandSignature            41 var,sptr,var,sptr
#comfunc global ID3D12Device_GetResourceTiling                 42 sptr,var,var,var,var,int,var
#comfunc global ID3D12Device_GetAdapterLuid                    43
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。