我遇到了一个不寻常的问题 - 当我尝试创建 Compute PSO 时,函数因 E_INVALIDARGS 而失败。这可能是由于没有可用的 CachedPso,尽管我在 MSDN 上看到 Graphics PSO 是在没有缓存数据的情况下创建的。
所以这里是代码本身。Serializing Root Signature 和 RS 创建都报告 S_OK,但 CreateComputePS 失败。Shader 由 Visual Studio 编译(着色器版本 5.1),然后它是 ReadFileToBlob'ed。
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 在内存位置0x001DEFF4。