DirectX 11 E_INVALIDARG 在设备创建期间

DirectX 11 E_INVALIDARG during device creation

创建 d3d11 设备和交换链的代码在某些计算机上 运行 失败,returns 出现 E_INVALIDARG 错误。 对于具有相同版本 DirectX 的计算机,这也有所不同。 我似乎没有找到不同行为的原因。

DXGI_MODE_DESC bufferDesc;
ZeroMemory(&bufferDesc, sizeof(DXGI_MODE_DESC));
bufferDesc.Width = width;
bufferDesc.Height = height;
bufferDesc.RefreshRate.Numerator = 60;
bufferDesc.RefreshRate.Denominator = 1;
bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;

DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));
swapChainDesc.BufferDesc = bufferDesc;
swapChainDesc.SampleDesc.Count = aaCount;
swapChainDesc.SampleDesc.Quality = aaQuality;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.BufferCount = 1;
swapChainDesc.OutputWindow = *hwnd; 
swapChainDesc.Windowed = TRUE; 
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

//results in E_INVALIDARG in some cases
hr = D3D11CreateDeviceAndSwapChain(
    nullptr,                        
    D3D_DRIVER_TYPE_HARDWARE,       
    nullptr,                        
    NULL,
    nullptr,
    NULL,
    D3D11_SDK_VERSION,
    &swapChainDesc,
    &SwapChain,                 
    &d3d11Device,               
    nullptr,
    &d3d11DevCon);              

ID3D11Texture2D* BackBuffer;
hr = SwapChain->GetBuffer( 0, __uuidof( ID3D11Texture2D ), (void**)(&BackBuffer) );

hr = d3d11Device->CreateRenderTargetView( BackBuffer, nullptr, &renderTargetView );

将 'Flags' 参数(当前为 NULL)替换为 D3D11_CREATE_DEVICE_DEBUG,您将在输出中收到一条人类可读的错误消息,告诉您哪里出了问题。

问题是抗锯齿(aaCount、aaQuality)设置过高,一些系统无法处理它们,因此无法创建 D3D11Device/Swapchain。

从评论中发现,设备创建失败的原因是多重样本质量 and/or 计数的组合不受支持。可以在设备创建之后和交换链创建之前使用 D3D11CreateDevice function, and then ID3D11Device::CheckMultisampleQualityLevels 查询此支持。之后,可以使用适当的参数创建交换链。

此外,还有一些基于功能级别的有保证的 MSAA 支持,因此,如果您在创建设备时需要特定的功能级别,它也可以是一种验证 MSAA 参数的方法(例如,仍在使用D3D11CreateDeviceAndSwapChain 函数)。从 CheckMultisampleQualityLevels 文档中,此保证支持是:

Note that FEATURE_LEVEL_10_1 devices are required to support 4x MSAA for all render targets except R32G32B32A32 and R32G32B32. FEATURE_LEVEL_11_0 devices are required to support 4x MSAA for all render target formats, and 8x MSAA for all render target formats except R32G32B32A32 formats.