C++ ID3D12Device::CreateComputePipelineState失败(E_INVALIDARGS)

C++ ID3D12Device::CreateComputePipelineState失败(E_INVALIDARGS),c++,directx,directcompute,C++,Directx,Directcompute,我遇到了一个无法解决的问题——当我尝试创建计算PSO时,函数会因E_INVALIDARGS而失败。这可能是因为没有可用的CachedPso,尽管我在MSDN上看到图形PSO是在没有缓存数据的情况下创建的 这就是代码本身。序列化根签名和RS创建报告S_正常,但CreateComputePS失败。 着色器由Visual Studio(着色器版本5.1)编译,然后将其ReadFileToBlob'ed COMPTR<ID3DBlob> pSRSignatre = nullptr; COMP

我遇到了一个无法解决的问题——当我尝试创建计算PSO时,函数会因E_INVALIDARGS而失败。这可能是因为没有可用的CachedPso,尽管我在MSDN上看到图形PSO是在没有缓存数据的情况下创建的

这就是代码本身。序列化根签名和RS创建报告S_正常,但CreateComputePS失败。 着色器由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
COMPTR pSRSignatre=nullptr;
COMPTR peror=nullptr;
D3D12_ROOT_SIGNATURE_DESC RSDesc;
零内存(&RSDesc,sizeof(D3D12_ROOT_SIGNATURE_DESC));
RSDesc.NumParameters=1;
RSDesc.NumStaticSamplers=0;
RSDesc.pParameters=&rootParam;
RSDesc.pStaticSamplers=nullptr;
RSDesc.Flags=D3D12\u根\u签名\u标志\u无;
结果=D3D12SerializeRootSignature(
&RSDesc,
D3D\u根\u签名\u版本\u 1,
pSRSignatre.GetAddressOf(),
pError.GetAddressOf()
);
#ifdef调试
报告(结果,L“序列化根签名”);
#恩迪夫
COMPTR pRootSign=nullptr;
结果=sm_pDevice->CreateRootSignature(
0, 
pSRSignatre->GetBufferPointer(),
pSRSignatre->GetBufferSize(),
IID_PPV_参数(pRootSign.GetAddressOf())
);
#ifdef调试
报告(结果,L“根签名”);
#恩迪夫
COMPTR pState=nullptr;
D3D12_计算_管道_状态_描述CPSDesc;
ZeroMemory(&CPSDesc,sizeof(D3D12_COMPUTE_PIPELINE_STATE_DESC));
CPSDesc.CS=m_着色器;
CPSDesc.NodeMask=0;
CPSDesc.pRootSignature=pRootSign.Get();
CPSDesc.Flags=D3D12_管道_状态_标志_无;
结果=sm_pDevice->CreateComputePipelineState(&CPSDesc,IID_PPV_ARGS(pState.GetAddressOf());
#ifdef调试
报告(结果,L“计算粒子群优化”);
#恩迪夫
UPD:输出日志中有一个错误(实际上没有引发异常,只是一条文本消息,很难注意到),它出现在调用CreateCompS之后:
在DeCutoTeCopyToRiBi.EXE中0x77CD928中抛出的异常:微软C++异常:在内存位置0x1001DEFF4../P>中的μCo错误,启用了调试层吗?它报告了什么吗?调试层是获取有关“无效参数”错误的更多信息的第一个地方。此外,返回HRESULT的函数随时可能失败,因此必须始终检查返回结果是否失败。只检查调试版本中的失败是不可靠的。我真愚蠢。我忘了创建调试接口。D3D12错误:ID3D12Device::CreateComputePipelineState:根签名与计算着色器不匹配:着色器UAV描述符范围(RegisterSpace=0,NumDescriptors=1,BaseShaderRegister=0)未完全绑定在根签名中[状态\创建错误\ 882:CreateComputePipelineState\ CS\根\签名\不匹配]您可以跳过序列化并将嵌入着色器blob中的根签名直接用于对
CreateRootSignature
的调用,这样可以避免不匹配。@galop1n,请您解释一下,如何直接使用着色器blob?在CreateRootSignature,我是否应该只使用着色器指针和缓冲区大小,而不是序列化的缓冲区输出?是的,着色器blob与CreateRootSignature兼容(如果它嵌入了一个)。如果从VisualStudio(或d3dcompile api)使用fxc构建着色器,默认情况下,除非将选项设置为将其剥离,否则它将具有一个着色器。还可以选择向fxc提供签名,以便在着色器之间重用,并在hlsl源中定义根签名。