0

我遇到了一个不寻常的问题 - 当我尝试创建 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。

4

0 回答 0