在D3D12中,渲染目标视图可以是任何缓冲区吗?

时间:2017-02-04 15:31:58

标签: directx-12

在我看过的样本中,到目前为止,一些命令是这样的:

  1. D3D12_DESCRIPTOR_HEAP_DESC与D3D12_DESCRIPTOR_HEAP_TYPE :: D3D12_DESCRIPTOR_HEAP_TYPE_RTV
  2. ID3D12Device :: CreateDescriptorHeap
  3. D3D12_CPU_DESCRIPTOR_HANDLE与ID3D12DescriptorHeap :: GetCPUDescriptorHandleForHeapStart(可能还有ID3D12Device :: GetDescriptorHandleIncrementSize)
  4. (可选?)ID3D12Device :: CreateRenderTargetView
    1. (可选?)IDXGISwapChain3 :: GetBuffer
  5. 将渲染内容安排到命令列表,注意OMSetRenderTargets和DrawInstanced,然后关闭命令列表。
  6. ID3D12CommandQueue :: ExecuteCommandLists
    1. (可选?)IDXGISwapChain3 ::现在
  7. 使用ID3D12CommandQueue ::围栏上的信号安排信号
  8. 等待GPU完成ID3D12Fence :: SetEventOnCompletion和WaitForSingleObjectEx
  9. 如果可能,如何用选择的缓冲区替换步骤4.1?即如何创建一个ID3D12Resource *并呈现给它,然后从中读取到一个std :: vector? (我假设是否可以忽略步骤6.1,因为交换链没有呈现目标视图。在这种情况下,步骤4也是不必要的?也许只有OMSetRenderTargets很重要?)

1 个答案:

答案 0 :(得分:4)

取决于视频内存架构,渲染目标的确切位置。在某些系统上,它只在视频卡可以访问的专用视频内存中。在某些系统中,它在CPU和GPU都可以访问的总线上共享的视频内存中。在统一内存架构中,一切都在系统内存中。

因此,您可以限制渲染目标的确切位置。这就是为什么在创建计划绑定为渲染目标的ID3D12Resource时必须使用D3D12_HEAP_TYPE_DEFAULT并指定D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET的原因(这也是在创建交换链渲染目标时由DXGI隐式完成的)。

一般来说,您不能并且不应该使用低级DXGI表面创建API来创建Direct3D资源。它们主要用于系统使用而不是应用程序。

  

除非您恰好位于UMA系统上,否则应尽量减少对渲染目标的CPU访问,否则将需要昂贵的副本。即使在UMA系统上,也需要去除平铺以使结果成线性形式。

Direct3D 12还提供了#34; Placed Resource"这些方法还可以提供对内存分配位置的更多控制(或者更具体地说,分配虚拟内存地址的位置),但您仍然必须遵守底层架构限制。根据内存架构,您可以使用"别名"多个不同的ID3D12Resource实例都使用相同的内存(例如渲染目标被别名为无序访问资源),但是您负责将所需的资源障碍插入命令列表(并对其进行测试)以确保其有效可靠地安装在所有DX12硬件上。请参阅MSDN

如果您不需要用户查看结果,则无需Present渲染目标。

Memory Management Strategies

UMA Optimizations: CPU Accessible Textures and Standard Swizzle

Getting Started with Direct3D 12

  

如果您不熟悉DirectX 12,则应该看到DirectX Tool Kit for DirectX 12教程。如果您还不熟悉DirectX 11,则应等待DirectX 12并以DirectX Tool Kit for DirectX 11开头。