問題が発生しました。Compute PSO を作成しようとすると、関数が E_INVALIDARGS で失敗します。グラフィックPSOがキャッシュされたデータなしで作成されることをMSDNで見ましたが、おそらくCachedPsoが利用できないことが原因です。
ここにコード自体があります。ルート署名のシリアル化と RS 作成の両方で S_OK が報告されますが、CreateComputePS は失敗します。シェーダーは Visual Studio (シェーダー バージョン 5.1) によってコンパイルされ、ReadFileToBlob されます。
COMPTR<ID3DBlob> pSRSignatre = nullptr;
COMPTR<ID3DBlob> pError = nullptr;
D3D12_ROOT_SIGNATURE_DESC RSDesc;
ZeroMemory(&RSDesc, sizeof(D3D12_ROOT_SIGNATURE_DESC));
RSDesc.NumParameters = 1;
RSDesc.NumStaticSamplers = 0;
RSDesc.pParameters = &rootParam;
RSDesc.pStaticSamplers = nullptr;
RSDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_NONE;
result = D3D12SerializeRootSignature(
&RSDesc,
D3D_ROOT_SIGNATURE_VERSION_1,
pSRSignatre.GetAddressOf(),
pError.GetAddressOf()
);
#ifdef DEBUG
Report(result, L"Serializaing root signature");
#endif
COMPTR<ID3D12RootSignature> pRootSign = nullptr;
result = sm_pDevice->CreateRootSignature(
0,
pSRSignatre->GetBufferPointer(),
pSRSignatre->GetBufferSize(),
IID_PPV_ARGS(pRootSign.GetAddressOf())
);
#ifdef DEBUG
Report(result, L"Root signature");
#endif
COMPTR<ID3D12PipelineState> pState = nullptr;
D3D12_COMPUTE_PIPELINE_STATE_DESC CPSDesc;
ZeroMemory(&CPSDesc, sizeof(D3D12_COMPUTE_PIPELINE_STATE_DESC));
CPSDesc.CS = m_Shader;
CPSDesc.NodeMask = 0;
CPSDesc.pRootSignature = pRootSign.Get();
CPSDesc.Flags = D3D12_PIPELINE_STATE_FLAG_NONE;
result = sm_pDevice->CreateComputePipelineState(&CPSDesc, IID_PPV_ARGS(pState.GetAddressOf()));
#ifdef DEBUG
Report(result, L"Compute PSO");
#endif
UPD: CreateCompPS への呼び出しの直後に表示される出力ログにエラーがあります (実際にスローされた例外はなく、テキスト メッセージのみで、気付きにくい): DirectComputeInteropLib.exe の 0x774CD928 で例外がスローされました: Microsoft C++ 例外: _com_error at memory location 0x001DEFF4。