«D3D12 ОШИБКА: ID3D12Device :: CreateComputePipelineState: корневая подпись не соответствует Compute Shader ...» где ошибка в моем коде? - PullRequest
0 голосов
/ 06 февраля 2019

Полная ошибка в выходных данных отладки:

"ОШИБКА D3D12: ID3D12Device :: CreateComputePipelineState: Подпись корня не соответствует Compute Shader: диапазон дескриптора шейдера SRV (RegisterSpace = 0, NumDescriptors = 1, BaseShaderRegister= 0) не полностью связан с корневой подписью "

. Это указывает на проблему с тем, как я создал SRV / привязал его к корневой подписи, но я не уверен, что именно я сделал неправильно.Я попытаюсь вставить сюда минимально необходимый код:

void Dc12DxbcHelper::CreateComputePipelineState(
    _In_ ID3D12Device* pDevice,
    _In_ ID3D12RootSignature* pRootSignature,
    _In_reads_bytes_(length) const void* shader,
    size_t length,
    UINT nodeMask,
    D3D12_PIPELINE_STATE_FLAGS flags,
    _COM_Outptr_ ID3D12PipelineState** ppPipelineState)
{
    DxbcReader reader(
        reinterpret_cast<const uint8_t*>(shader),
        length);

    DC12::CreateComputePipelineState(
        pDevice,
        pRootSignature,
        reader.get_Shader(),
        reader.get_Length(),
        nodeMask,
        flags,
        ppPipelineState);
}

...

void DC12::CreateRootSignature(
    _In_ ID3D12Device* pDevice,
    _In_reads_opt_(numParameters) const D3D12_ROOT_PARAMETER* pParameters,
    UINT numParameters,
    _COM_Outptr_ ID3D12RootSignature** ppRootSignature)
{
    D3D12_ROOT_SIGNATURE_DESC rootSignatureDesc =
    {
        numParameters, // NumParameters
        pParameters, // pParameters
        0, // NumStaticSamplers
        nullptr, // pStaticSamplers
        D3D12_ROOT_SIGNATURE_FLAG_NONE, // Flags
    };

    SafeComPointer<ID3DBlob> blob;

    SafeComPointer<ID3DBlob> errorBlob;

    HRESULT hr = ::D3D12SerializeRootSignature(
        &rootSignatureDesc,
        D3D_ROOT_SIGNATURE_VERSION_1,
        blob.GetAddressOf(),
        errorBlob.GetAddressOf());

    if (FAILED(hr))
    {
        std::string errorString(ERROR_MESSAGE);

        if (errorBlob)
        {
            errorString.append(": ");

            errorString.append(
                reinterpret_cast<char*>(
                    errorBlob->GetBufferPointer()),
                errorBlob->GetBufferSize());
        }

        throw std::system_error(
            hr,
            HRESULT_error_category(),
            errorString);
    }

    CHR(pDevice->CreateRootSignature(
        0,
        blob->GetBufferPointer(),
        blob->GetBufferSize(),
        IID_PPV_ARGS(ppRootSignature)));
}

...

        CreateWithSrv(
            _In_ const uint8_t threadGroupLog2,
            _In_ const uint32_t stagingWriteBufferSize,
            _In_ const uint32_t shaderResourceViewCount,
            _In_ const uint32_t unorderedAccessViewCount,
            _In_ const uint32_t stagingReadBufferCount)
        {

            ...

            // create & assign srv

            DC12::CreateDescriptorHeap(
                this->device.Get(),
                1,
                D3D12_DESCRIPTOR_HEAP_FLAG_NONE,
                0,
                this->srvDescriptor.GetAddressOf());

            DC12::CreateShaderResourceView(
                this->device.Get(),
                this->srvDescriptor.Get(),
                0,
                shaderResourceViewCount,
                this->srvBuffer.GetAddressOf());

            // create & assign uav

            DC12::CreateDescriptorHeap(
                this->device.Get(),
                1,
                D3D12_DESCRIPTOR_HEAP_FLAG_NONE,
                0,
                this->uavDescriptor.GetAddressOf());

            DC12::CreateUnorderedAccessView(
                this->device.Get(),
                this->uavDescriptor.Get(),
                0,
                unorderedAccessViewCount,
                this->uavBuffer.GetAddressOf());

            ...

        }

...

        class ROOT_PARAMETER_SRV
            : public D3D12_ROOT_PARAMETER
        {
        public:
            ROOT_PARAMETER_SRV(
                UINT shaderRegister)
            {
                this->ParameterType =
                    D3D12_ROOT_PARAMETER_TYPE_SRV;

                this->Descriptor =
                {
                    shaderRegister, // ShaderRegister
                    0, // RegisterSpace,
                };

                this->ShaderVisibility =
                    D3D12_SHADER_VISIBILITY_ALL;
            }
        };

...

Dc12HasherImpl::CreateWithSrv(
    CryptoNightDcHelper::ThreadGroupLog2,
    this->SrvSimdCount * sizeof(simd),
    this->SrvSimdCount,
    count,
    MaxUAVReadSizeSimd);

D3D12_ROOT_PARAMETER rootParameters[] =
{
    DC12::ROOT_PARAMETER_32BIT_CONSTANTS(0, 3),
    DC12::ROOT_PARAMETER_CBV(1),
    DC12::ROOT_PARAMETER_CBV(2),
    DC12::ROOT_PARAMETER_SRV(3),
    DC12::ROOT_PARAMETER_UAV(4),
};

DC12::CreateRootSignature(
    this->device.Get(),
    rootParameters,
    _countof(rootParameters),
    this->rootSignature.GetAddressOf());

D3D12_PIPELINE_STATE_FLAGS computePipelineStateFlags =
    D3D12_PIPELINE_STATE_FLAG_NONE;

Dc12DxbcHelper::CreateComputePipelineState(
    this->device.Get(),
    this->rootSignature.Get(),
    shaderBytecode,
    shaderBytecodeLength,
    0,
    computePipelineStateFlags,
    this->preKeccakShader.GetAddressOf());

Кстати, это проходит без ошибок, если я закомментирую все специфичные для SRV вещи.Если вам нужно что-то еще, чтобы я мог опубликовать здесь, чтобы лучше диагностировать проблему, я могу попытаться предоставить это.

edit: соответствующий бит шейдера DX Asm:

...
dcl_constantbuffer cb0[1], immediateIndexed
dcl_constantbuffer cb1[13], immediateIndexed
dcl_constantbuffer cb2[1], immediateIndexed
dcl_resource_structured t0, 16
dcl_uav_structured u0, 16
...
...