Directx D3D11\U创建\U设备\U禁用\U GPU\U超时是否可以通过D3D\U功能\U级别\U 11\U 0?

Directx D3D11\U创建\U设备\U禁用\U GPU\U超时是否可以通过D3D\U功能\U级别\U 11\U 0?,directx,direct3d,direct3d11,Directx,Direct3d,Direct3d11,说: Direct3D 11:在Direct3D 11.1之前不支持此值 这是指运行时版本还是功能级别 我可以将标志传递给但只能传递功能级别11_0吗 功能级别是否与此无关,是否仅取决于安装的运行时版本?如果我将标志传递给DX运行时11.0,会发生什么?它会被默默地忽略吗?或者我必须首先检测DX运行时版本,然后仅当DX运行时版本至少为11.1时才传递该标志吗?这是关于运行时版本的,因此您至少需要Windows 8才能启用此功能 您可以在具有此标志的情况下请求功能级别仅为11的设备,只要尝试,它就

说:

Direct3D 11:在Direct3D 11.1之前不支持此值

这是指运行时版本还是功能级别

我可以将标志传递给但只能传递功能级别11_0吗


功能级别是否与此无关,是否仅取决于安装的运行时版本?如果我将标志传递给DX运行时11.0,会发生什么?它会被默默地忽略吗?或者我必须首先检测DX运行时版本,然后仅当DX运行时版本至少为11.1时才传递该标志吗?

这是关于运行时版本的,因此您至少需要Windows 8才能启用此功能

您可以在具有此标志的情况下请求功能级别仅为11的设备,只要尝试,它就可以完美地工作


否则,这将是有问题的,因为NVidia卡仅在其900代之后才支持11.1。

它指的是运行时版本

您可能会检测到操作系统版本,但通过检查已安装的DirectX运行时
.dll
版本,您可能会更容易,方法是尝试:


按顺序执行,直到失败(返回
NULL
)。或者按相反的顺序,直到成功。这与创建具有最高功能级别的设备相同。

确定是否具有Direct3D 11.1运行时的“正确”方法如下:

#include <d3d11_1.h>
#include <wrl/client.h>

#pragma comment(lib,"d3d11.lib")

bool IsDirect3D11_1OrGreater()
{
    Microsoft::WRL::ComPtr<ID3D11Device> device;

    HRESULT hr = D3D11CreateDevice(
        nullptr,
        D3D_DRIVER_TYPE_NULL,
        nullptr,
        0,
        nullptr,
        0,
        D3D11_SDK_VERSION,
        device.GetAddressOf(),
        nullptr,
        nullptr
        );

    if (FAILED(hr))
        return false;

    Microsoft::WRL::ComPtr<ID3D11Device1> device1;
    return SUCCEEDED(device.As(&device1));
}

另请参见和。

那么,如果运行时为11.0,会发生什么情况?我是否必须首先检测Win7平台更新,并确保在缺少标志时不通过标志?澄清一下:基于第二代Maxwell芯片(GM2xx)的卡支持功能级别120。第1代(GM1xx)仅支持11_0。960M基于GM107(第1代)是的,就是这样,很遗憾,现在没有windows 7机器,所以我无法尝试。我发现了一台没有DX11.1的windows 7机器。传递标志失败,原因是
HRESULT:[0x80004005],模块:[General],ApiCode:[E_FAIL/Unspecified error],消息:Unspecified error
。令人惊讶的是,KB2670838和IE10已经安装,d3d11.dll的版本为6.2.9200.16570,但DX11.1仍然没有安装。确定了,然后永远不要使用操作系统版本检测来检查功能。看见默认情况下,您甚至无法在Windows 8.1或Windows 10上获得“真实”的操作系统版本号。看见
LoadLibrary
DLL检查也有问题,但至少比从操作系统版本推断它要好。一个简单的解决方案是创建一个11设备,即一个11.1设备。如果它有效,您可以使用11.1或更高版本。在本例中,是的。您永远不应该使用
LoadLibrary
依赖项来解决问题,您可以通过直接的功能检查更可靠地解决这些依赖项。在这种情况下,为
ID3D11设备1
调用
QueryInterface
以关闭
ID3D11设备
,是查看您是否拥有Direct3D 11.1运行时的最可靠和直接的方法。是的,这意味着您创建的设备不带该标志,然后在知道该标志有效时再执行一次。请参阅和。这说明在Win7SP1+KB2670838上可以使用D3D11.1运行时,但是传递
D3D11\u创建\u设备\u禁用\u GPU超时
标志失败。知道为什么吗?对不起,我需要在我的Windows 7安装程序中再次检查。该标志为“已知”,但可能需要Win7SP1+KB2670838不支持的更新驱动程序。Win7SP1+KB2670838上的Per DirectX 11.1提供了所有“软件”功能,但不需要Win7SP1不支持的驱动程序。我已经确认,在安装了KB2670838的Windows 7 Service Pack 1上,您实际上可以使用
D3D11\u创建\u设备\u禁用\u GPU超时
标志。遗憾的是,它并不总是起作用,看,嗯,这里一定也有司机行为的依赖性。听起来您必须使用该标志创建设备,如果失败,请在不使用该标志的情况下重试。我假设您的应用程序在没有设置标志的情况下失败?
#include <d3d11_1.h>
#include <wrl/client.h>

#pragma comment(lib,"d3d11.lib")

bool IsDirect3D11_1OrGreater()
{
    Microsoft::WRL::ComPtr<ID3D11Device> device;

    HRESULT hr = D3D11CreateDevice(
        nullptr,
        D3D_DRIVER_TYPE_NULL,
        nullptr,
        0,
        nullptr,
        0,
        D3D11_SDK_VERSION,
        device.GetAddressOf(),
        nullptr,
        nullptr
        );

    if (FAILED(hr))
        return false;

    Microsoft::WRL::ComPtr<ID3D11Device1> device1;
    return SUCCEEDED(device.As(&device1));
}
This application requires the DirectX 11.1 Runtime. It is supported on
Windows 7 Service Pack 1 with KB2670838 or later Windows operating systems.