ID3D11Device::CreateTexture3D E_OUTOFMEMORY 16GB NVIDIA Quadro P5000 上的 4GB+ 纹理

ID3D11Device::CreateTexture3D E_OUTOFMEMORY for 4GB+ textures on 16GB NVIDIA Quadro P5000

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

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

其他 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 目标中,没有别的是 运行 并用完系统或视频内存。)

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

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

由 d3d11.h header 中的这些常量定义:

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 版本的 OS 和 Direct3D 可以让您使用许多大型资源。

Microsoft Docs and Direct3D Specs

The same is true of Direct3D 12 in terms of required resource size support.