是否需要在 D3D12 中释放视图? (如果不这样做,它们会导致泄漏吗?)
Do Views need to be deallocated in D3D12? (Will they cause a leak if you don't?)
我正在根据本指南学习 DirectX12 here,让我感到困惑的一件事是他们调整深度缓冲区的大小时。以下是他们的做法:
void Tutorial2::ResizeDepthBuffer(int width, int height)
{
if (m_ContentLoaded)
{
// Flush any GPU commands that might be referencing the depth buffer.
Application::Get().Flush(); //this here wait for any pending command lists to finish execution on the command queue
width = std::max(1, width);
height = std::max(1, height);
auto device = Application::Get().GetDevice();
// Resize screen dependent resources.
// Create a depth buffer.
D3D12_CLEAR_VALUE optimizedClearValue = {};
optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
optimizedClearValue.DepthStencil = { 1.0f, 0 };
ThrowIfFailed(device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, width, height,
1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL),
D3D12_RESOURCE_STATE_DEPTH_WRITE,
&optimizedClearValue,
IID_PPV_ARGS(&m_DepthBuffer)
));
// Update the depth-stencil view.
D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
dsv.Format = DXGI_FORMAT_D32_FLOAT;
dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
dsv.Texture2D.MipSlice = 0;
dsv.Flags = D3D12_DSV_FLAG_NONE;
device->CreateDepthStencilView(m_DepthBuffer.Get(), &dsv,
m_DSVHeap->GetCPUDescriptorHandleForHeapStart());
}
}
我们是否必须释放旧的 Depth/Stencil 视图,因为在上面的代码中,它们只是用新视图 (CreateDepthStencilView) 覆盖描述符堆中的描述符,而不是释放旧视图?那是泄漏吗?
这是githublink的代码
(如果它在描述符中(在描述符堆中)与仅基于堆栈的视图相比,我是否需要解除分配它们,如果需要如何解除分配?)
DirectX 12 中的 SRV、CBV、UAV、RTV 和 DSV“视图”按它们分配到的堆存储在内存中 'owned'。如果需要,您可以重复使用这些插槽。 Create*View
方法只是将数据填充到该内存中。当关联的堆被释放时,内存本身也被释放。
顶点缓冲区和索引缓冲区视图也只是简单的结构。
您需要确保释放的 ref-counted 部分是 ID3D12Resource 和 ID3D12Heap 对象。
In addition to that tutorial, you may want to take a look at DirectX Tool Kit for DX12.
我正在根据本指南学习 DirectX12 here,让我感到困惑的一件事是他们调整深度缓冲区的大小时。以下是他们的做法:
void Tutorial2::ResizeDepthBuffer(int width, int height)
{
if (m_ContentLoaded)
{
// Flush any GPU commands that might be referencing the depth buffer.
Application::Get().Flush(); //this here wait for any pending command lists to finish execution on the command queue
width = std::max(1, width);
height = std::max(1, height);
auto device = Application::Get().GetDevice();
// Resize screen dependent resources.
// Create a depth buffer.
D3D12_CLEAR_VALUE optimizedClearValue = {};
optimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
optimizedClearValue.DepthStencil = { 1.0f, 0 };
ThrowIfFailed(device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, width, height,
1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL),
D3D12_RESOURCE_STATE_DEPTH_WRITE,
&optimizedClearValue,
IID_PPV_ARGS(&m_DepthBuffer)
));
// Update the depth-stencil view.
D3D12_DEPTH_STENCIL_VIEW_DESC dsv = {};
dsv.Format = DXGI_FORMAT_D32_FLOAT;
dsv.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
dsv.Texture2D.MipSlice = 0;
dsv.Flags = D3D12_DSV_FLAG_NONE;
device->CreateDepthStencilView(m_DepthBuffer.Get(), &dsv,
m_DSVHeap->GetCPUDescriptorHandleForHeapStart());
}
}
我们是否必须释放旧的 Depth/Stencil 视图,因为在上面的代码中,它们只是用新视图 (CreateDepthStencilView) 覆盖描述符堆中的描述符,而不是释放旧视图?那是泄漏吗?
这是githublink的代码
(如果它在描述符中(在描述符堆中)与仅基于堆栈的视图相比,我是否需要解除分配它们,如果需要如何解除分配?)
DirectX 12 中的 SRV、CBV、UAV、RTV 和 DSV“视图”按它们分配到的堆存储在内存中 'owned'。如果需要,您可以重复使用这些插槽。 Create*View
方法只是将数据填充到该内存中。当关联的堆被释放时,内存本身也被释放。
顶点缓冲区和索引缓冲区视图也只是简单的结构。
您需要确保释放的 ref-counted 部分是 ID3D12Resource 和 ID3D12Heap 对象。
In addition to that tutorial, you may want to take a look at DirectX Tool Kit for DX12.