D3D11_USAGE_STAGING,使用了什么样的GPU / CPU内存?

时间:2018-05-17 16:18:04

标签: windows directx gpu directx-11

我阅读了D3D11 Usage页面并来自CUDA背景我想知道将标记为D3D11_USAGE_STAGING的纹理存储到哪种内存中。

我想在CUDA中会固定页面锁定的零拷贝内存。我测量了从带有ID3D11Texture2D的{​​{1}}到分配有D3D11_USAGE_STAGING的主机缓冲区的传输时间,它花了将近7毫秒(在流媒体/游戏中相当多),我认为这将是从GPU全局内存到该内存区域所需的时间。

我的任何假设是否正确?什么是malloc用作GPU内存?

1 个答案:

答案 0 :(得分:6)

D3D11_USAGE_STAGING的主要用途是将数据加载到其他D3D11_USAGE_DEFAULT池资源中。另一个常见的用法是回读' CPU可访问内存的渲染目标。您可以使用CopySubResourceRegion在DEFAULT和STAGING资源之间移动数据(离散硬件通常使用Direct Memory Access来处理系统内存和VRAM之间的数据移动。)

这是一种概括,因为它取决于架构和驱动程序选择,但简而言之::

  • D3D11_USAGE_STAGING表示将其放入系统内存,GPU无法访问它。

  • D3D11_USAGE_DEFAULT将其放入VRAM,CPU无法访问它。要将数据放入其中,需要从STAGING资源复制数据。您可以将UpdateSubresource视为一个便利函数,它创建一个STAGING资源,将数据复制到它,从STAGING复制到DEFAULT,然后释放STAGING副本。

    • DirectX 11.2或更高版本中有一个可选功能,如果他们选择允许CPU访问D3D11_USAGE_DEFAULT池内容,则可由驱动程序实现。这取决于他们如何设置内存系统(即Unified Memory Architectures,系统RAM和VRAM是一样的。)
  • D3D11_USAGE_IMMUTABLED3D11_USAGE_DEFAULT基本相同,但您说您只是在创建调用中初始化它一次。

  • D3D11_USAGE_DYNAMIC意味着将它放在共享系统内存中,即CPU和CPU。 GPU都需要访问它。与DEFAULT相比,GPU通常会从中读取性能,因此您需要谨慎使用它。它实际上是你在CPU上生成每一帧然后需要渲染的东西(例如地形系统或程序几何)。

  

使用内容流的游戏通常会有一组STAGING纹理,它们会将数据加载到背景中,然后在它们可用于高效渲染时将其复制到DEFAULT纹理。这使他们可以重复使用STAGING和DEFAULT纹理,而不会在每一帧中破坏/创建资源。

请参阅这篇有点过​​时的MSDN文章:Resource Management Best Practices