ID3D12GraphicsCommandList& commandList = *com_ptr;
FLOAT values[4] = { 1,1,1,1 };
commandList.ClearUnorderedAccessViewFloat(m_gpuUavHandle, m_cpuUavHandle, m_resource.get(), values, 0, nullptr);我得到了以下运行时错误:
访问冲突读取位置0x000000000000000140
但是,m_cpuUavHandle.ptr的值326在访问冲突320的位置之后仅为6个字节(十六进制=140)。
由于在Direct3d12中手动计算句柄地址,似乎有可能出错。
m_cpuUavHandle = CD3DX12_CPU_DESCRIPTOR_HANDLE(m_descriptorHeap.get()->GetCPUDescriptorHandleForHeapStart(), offset, m_cbvSrvUavDescriptorSize);编辑
我成功地在DirectX 12样例(并上传到github)中复制了这个结果,这次得到了一条调试消息。
ID3D12CommandList::ClearUnorderedAccessViewFloat:指定的描述符处理ptr=0x0000000000000021指向一个描述符堆类型,该描述符仅为D3D12写,因此读取它是无效的。UnorderedAccessViewCPUHandle是问题所在。执行错误#646: INVALID_DESCRIPTOR_HANDLE
现在,m_cpuUavHandle.ptr=33和访问冲突的位置是32 (在十六进制中是0x00000000000020)。
在我的主要项目中,我认为由于线程问题,在打印调试消息之前会碰到异常。
现在在我的主要项目中
访问违反读取位置0x0000000000000000。
,这仍然是m_cpuUavHandle.ptr = 6之前的6个字节,所以我不确定这是否正确
发布于 2022-07-06 19:54:35
妈妈在评论中解决了这个问题。文档指定cpu描述符必须引用非着色器可见堆(用D3D12_DESCRIPTOR_HEAP_FLAG_NONE创建的堆)。
对我来说,解决方案是只有两个相同的CBV_SRV_UAV堆,一个是用D3D12_DESCRIPTOR_HEAP_DESC::Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE创建的,用于调用ClearUnorderedAccessViewFloat,另一个是用D3D12_DESCRIPTOR_HEAP_DESC::Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE创建的。
需要注意的是,ClearUnorderedAccessViewFloat的cpu描述符和gpu描述符参数必须来自不同的堆。
https://stackoverflow.com/questions/70919199
复制相似问题