0

問題が発生しました。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。

4

0 に答える 0