Код вызова, соответствующий ошибке в заголовке:
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, который я пытаюсь выяснить.Эта проблема, вероятно, объясняет исходную ошибку.