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 上:
- DedicatedVideoMemory 是 16 GB。
- MaxVolumeExtent 是 2048。
- 所以我希望能够创建宽度=2000、高度=2000、深度=2000、格式=
DXGI_FORMAT_R16_UINT
(~15 GiB) 的纹理,但它失败了。
- 宽度=1024,高度=1024,深度=2048,格式=
DXGI_FORMAT_R16_UINT
(4 GB) 仍然失败。
- 宽度=1024,高度=1024,深度=1024,格式=
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 目标中,没有别的是 运行 并用完系统或视频内存。)
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.
ID3D11Device::CreateTexture3D 适用于小于 4 GB 的纹理,但对于更大的尺寸 E_OUTOFMEMORY
会失败,即使有更多可用内存也是如此。为什么?
例如,在具有 16 GB 显存的 NVIDIA Quadro P5000 上:
- DedicatedVideoMemory 是 16 GB。
- MaxVolumeExtent 是 2048。
- 所以我希望能够创建宽度=2000、高度=2000、深度=2000、格式=
DXGI_FORMAT_R16_UINT
(~15 GiB) 的纹理,但它失败了。 - 宽度=1024,高度=1024,深度=2048,格式=
DXGI_FORMAT_R16_UINT
(4 GB) 仍然失败。 - 宽度=1024,高度=1024,深度=1024,格式=
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 目标中,没有别的是 运行 并用完系统或视频内存。)
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.