"D3D12 CORRUPT: ID3D12CommandList::CopyResource: pDstResource is corrupt."我是如何损坏着色器资源视图的缓冲区的?



与标题中错误相对应的调用代码为:

this->directCommandList.Get()->CopyResource(
    this->srvBuffer.Get(), 
    this->stagingWriteBuffer.Get());

srvbuffer是指向ID3D12Resource的明智指针。我与它的第一个真正互动是在这里:

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

之后,我什么都不对SrvBuffer做任何事情,直到尝试复制它为止。这向我表明,我必须在CreateShaderResourceview函数中至少犯了一个错误,我在此处包括:

       static inline void CreateShaderResourceView(
                _In_ ID3D12Device* pDevice,
                _In_opt_ ID3D12DescriptorHeap* pDescriptorHeap,
                uint32_t index, // descriptor index
                uint32_t count,
                _COM_Outptr_ ID3D12Resource** ppBuffer)
        {
            D3D12_HEAP_PROPERTIES heapProperties =
            {
                D3D12_HEAP_TYPE_DEFAULT, // Type
                D3D12_CPU_PAGE_PROPERTY_UNKNOWN, // CPUPageProperty
                D3D12_MEMORY_POOL_UNKNOWN, // MemoryPoolPreference
                0, // CreationNodeMask
                0, // VisibleNodeMask
            };
            D3D12_RESOURCE_DESC resourceDesc =
            {
                D3D12_RESOURCE_DIMENSION_BUFFER, // Dimension
                D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT, // Alignment
                count * STRUCTURE_BYTE_STRIDE, // Width
                1, // Height
                1, // DepthOrArraySize
                1, // MipLevels
                DXGI_FORMAT_UNKNOWN, // Format
                {
                    1, // Count
                    0, // Quality
                }, // SampleDesc
                D3D12_TEXTURE_LAYOUT_ROW_MAJOR, // Layout
                D3D12_RESOURCE_FLAG_NONE, // Flags
            };
            CHR(pDevice->CreateCommittedResource(
                &heapProperties,
                D3D12_HEAP_FLAG_NONE,
                &resourceDesc,
                D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE,
                nullptr,
                IID_PPV_ARGS(ppBuffer)));
            if (pDescriptorHeap != nullptr)
            {
                D3D12_SHADER_RESOURCE_VIEW_DESC desc =
                {
                    DXGI_FORMAT_UNKNOWN, // Format
                    D3D12_SRV_DIMENSION_BUFFER, // ViewDimension
                    D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING,
                    {
                        0, // FirstElement
                        count, // NumElements
                        STRUCTURE_BYTE_STRIDE, // StructurebyteStride,
                        D3D12_BUFFER_SRV_FLAG_NONE // Flags
                    }, // Buffer
                };
                D3D12_CPU_DESCRIPTOR_HANDLE cpuDescriptor =
                    pDescriptorHeap->GetCPUDescriptorHandleForHeapStart();
                size_t offset = pDevice->GetDescriptorHandleIncrementSize(
                    D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV);
                offset *= index;
                cpuDescriptor.ptr += offset;
                pDevice->CreateShaderResourceView(
                    *ppBuffer,
                    &desc,
                    cpuDescriptor);
            }
        }

我还检查了最终的pdevice-> createShaderResourceview通过在那里放置一个断点而受到打击。我希望有一个简单的答案。

编辑:我发现的一个问题是,在尝试复制srvbuffer之前,我的资源过渡障碍会遇到另一个错误:" D3D12错误:ID3D12 CommandList :: Resource -Barrier:指定的空指针。"事实证明,this-> srvbuffer.get()返回一个空指针,这向我表明我在createCommententResource中失败了,我正在尝试找出这一点。这个问题可能会解释原始错误。

事实证明,我问题的答案不在我发布的代码中;在这里,假设其他一切都是正确的,那么工作就足够正确了。事实证明,我的错误是我在继承的类中有第二个> srvbuffer,该类调用复制资源(我忘记了在完成整体结构时忘记了它删除它),因此,用createCommittedResource初始化的srvbuffer nasn''t被传递给CopyResource。

最新更新