【问题标题】:ID3D11Device::CreateTexture3D E_OUTOFMEMORY for 4GB+ textures on 16GB NVIDIA Quadro P5000ID3D11Device::CreateTexture3D E_OUTOFMEMORY 用于 16GB NVIDIA Quadro P5000 上的 4GB+ 纹理
【发布时间】:2019-12-04 11:41:11
【问题描述】:

ID3D11Device::CreateTexture3D 适用于小于 4 GB 的纹理,但对于较大的尺寸,E_OUTOFMEMORY 会失败,即使有更多可用内存也是如此。为什么?

例如在具有 16 GB 显存的 NVIDIA Quadro P5000 上:

  • DedicatedVideoMemory 为 16 GB。
  • MaxVolumeExtent 是 2048。
  • 所以我希望能够创建 Width=2000、Height=2000、Depth=2000、Format=DXGI_FORMAT_R16_UINT (~15 GiB) 的纹理,但它失败了。
  • Width=1024, Height=1024, Depth=2048, Format=DXGI_FORMAT_R16_UINT (4 GB) 仍然失败。
  • Width=1024,Height=1024,Depth=1024,Format=DXGI_FORMAT_R16_UINT (2 GB) 有效。

其他 NVIDIA 卡(例如具有 8 GB 显存的 NVIDIA GeForce GTX 1070)具有相同的限制。

这是 D3D11 的已知限制吗? NVIDIA 驱动程序/卡?有什么办法可以让它发挥作用吗?

        ID3D11Texture3D* texture = 0;
        D3D11_TEXTURE3D_DESC texureDesc;
        ZeroMemory(&volTexDesc, sizeof(texureDesc));
        texureDesc.Width = 1024;
        texureDesc.Height = 1024;
        texureDesc.Depth = 2048;
        texureDesc.MipLevels = 1;
        texureDesc.Format = DXGI_FORMAT_R16_UINT;
        texureDesc.Usage = D3D11_USAGE_DEFAULT;
        texureDesc.BindFlags = 0;
        texureDesc.CPUAccessFlags = 0;
        texureDesc.MiscFlags = 0;
        HRESULT result = d3dDevice->CreateTexture3D(&texureDesc, NULL, &texture);

(在具有 64 GB 系统内存的 64 位 OS / x64 目标中,没有其他东西正在运行并耗尽系统或视频内存。)

【问题讨论】:

    标签: nvidia direct3d


    【解决方案1】:

    Direct3D 11 规范只要求驱动程序支持最大资源大小:

    min(max(128,0.25f * (amount of dedicated VRAM)), 2048) MB
    

    由 d3d11.h 头文件中的这些常量定义:

    D3D11_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_A_TERM (128)
    D3D11_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_B_TERM (0.25f)
    D3D11_REQ_RESOURCE_SIZE_IN_MEGABYTES_EXPRESSION_C_TERM (2048)
    

    因此,通常 2 GB 是您可以合理预期为单个资源工作的大小。使用 x64 版本的操作系统和 Direct3D 可以让您使用许多大型资源。

    请参阅 Microsoft DocsDirect3D Specs

    就所需的资源大小支持而言,Direct3D 12 也是如此。

    【讨论】:

    • Direct3D 12 是否仍具有相同的限制?驱动程序是否允许(但不是必需)支持更大的资源?测试表明,在实践中 ~4064 MB 是这些 NVIDIA 驱动程序的极限。其他显卡是否支持更大(超过/超过要求)的尺寸?处理此类大型 3D 数据集的最佳技术是什么?
    • 你看过tiled resources吗?
    • 我不知道他们。 "Texture3D might be supported in the future"这还在未来吗?
    • 它在 Direct3D 12 中,参见Microsoft Docs
    • 你应该看看this presentation 以及这个blog post
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2016-05-09
    • 2014-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多