"D3D12 CORRUPT: ID3D12CommandList::CopyResource: pDstResource is corrupt."我是如何损坏着色器资源视图的缓冲区的?
"D3D12 CORRUPTION: ID3D12CommandList::CopyResource: pDstResource is corrupt." How did I corrupt my Shader Resource View's buffer?
与标题中错误相对应的调用代码为:
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。
相关文章:
- 具有瞬态资源的RAII类
- 为什么会发生堆损坏
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 平均图像时图像损坏
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 为什么C中的通用链表中存储的数据已损坏
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 如何跨平台将二进制资源构建到程序中?
- C++双重释放或损坏(out)
- 捕获标准输出以压缩并使用 CTRL-C 中断会给出损坏的 zip 文件
- "D3D12 CORRUPT: ID3D12CommandList::CopyResource: pDstResource is corrupt."我是如何损坏着色器资源视图的缓冲区的?
- 使用QT5_ADD_RESOURCES和CMake进行多线程编译时,资源.cpp文件已损坏
- CreateStreamOnHGlobal对html资源造成堆损坏