«D3D12 КОРРУПЦИЯ: ID3D12CommandList :: CopyResource: pDstResource поврежден.»Как я повредил буфер моего Shader Resource View? - PullRequest
0 голосов
/ 22 февраля 2019

Код вызова, соответствующий ошибке в заголовке:

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 ОШИБКА:ID3D12CommandList :: ResourceBarrier: указатель NULL указан. "Оказывается, this-> srvBuffer.Get () возвращает нулевой указатель, который подсказывает мне, что у меня произошел сбой в CreateCommittedResource, который я пытаюсь выяснить.Эта проблема, вероятно, объясняет исходную ошибку.

1 Ответ

0 голосов
/ 22 февраля 2019

Оказывается, что ответ на мой вопрос не в коде, который я отправил вообще;то, что здесь, достаточно правильно, чтобы работать, если все остальное правильно.Оказывается, моя ошибка заключалась в том, что у меня был второй this-> srvBuffer в унаследованном классе, который вызывает ресурс копирования (я забыл удалить его при завершении работы со всей структурой), и, таким образом, srvBuffer, который был инициализирован с CreateCommittedResource wasn 't тот, который передается в CopyResource.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...