在设备创建期间DirectX 11 E_INVALIDARG

时间:2015-07-13 02:50:58

标签: c++ windows directx

创建d3d11设备和交换链的代码无法在某些计算机上运行并返回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 );

3 个答案:

答案 0 :(得分:1)

更换' Flags'使用D3D11_CREATE_DEVICE_DEBUG的参数(当前为NULL),您将在输出中收到一条人类可读的错误消息,告诉您错误。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

此外,基于功能级别有一些保证的MSAA支持,因此,如果在创建设备时需要某个功能级别,它也可以是验证MSAA参数的方法(例如,仍然使用{ {1}}功能)。从CheckMultisampleQualityLevels文档中,这种有保障的支持是:

请注意,FEATURE_LEVEL_10_1设备需要为除R32G32B32A32和R32G32B32之外的所有渲染目标支持4x MSAA。 FEATURE_LEVEL_11_0设备需要支持所有渲染目标格式的4x MSAA,以及除R32G32B32A32格式之外的所有渲染目标格式的8x MSAA。