Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何检查是否使用了真正的硬件视频适配器_C++_Windows_Directx_Directx 11_Dxgi - Fatal编程技术网

C++ 如何检查是否使用了真正的硬件视频适配器

C++ 如何检查是否使用了真正的硬件视频适配器,c++,windows,directx,directx-11,dxgi,C++,Windows,Directx,Directx 11,Dxgi,我开发了一个应用程序,它在窗口中显示类似视频的内容。我使用这里描述的技术。在我的例子中,唯一的区别是最终我使用 ID2D1DeviceContext::CreateBitmap 然后我用 ID2D1Bitmap::CopyFromMemory 将原始RGB数据复制到其中,然后调用 ID2D1DeviceContext::DrawBitmap 绘制位图。我使用高质量立方体插值模式D2D1_插值模式_高质量_立方体进行缩放以获得最佳图片,但在某些情况下(RDP、Citrix、虚拟机等),速度非

我开发了一个应用程序,它在窗口中显示类似视频的内容。我使用这里描述的技术。在我的例子中,唯一的区别是最终我使用

ID2D1DeviceContext::CreateBitmap
然后我用

ID2D1Bitmap::CopyFromMemory
将原始RGB数据复制到其中,然后调用

ID2D1DeviceContext::DrawBitmap
绘制位图。我使用高质量立方体插值模式D2D1_插值模式_高质量_立方体进行缩放以获得最佳图片,但在某些情况下(RDP、Citrix、虚拟机等),速度非常慢,CPU消耗非常高。这是因为在这些情况下使用了非硬件视频适配器。所以对于非硬件适配器,我尝试关闭插值并使用更快的方法。问题是我无法准确地检查系统是否有真正的硬件适配器

当我调用D3D11CreateDevice时,我将其与D3D_驱动程序_类型_硬件一起使用,但在虚拟机上,它通常返回“Microsoft Basic Render DRIVER”,这是一个软件驱动程序,不使用GPU(它消耗CPU)。因此,目前我检查供应商ID。如果供应商是AMD(ATI)、NVIDIA或Intel,则我使用立方插值。在另一种情况下,我使用最快的方法,它不会消耗很多CPU

Microsoft::WRL::ComPtr<IDXGIDevice> dxgiDevice;
if (SUCCEEDED(m_pD3dDevice->QueryInterface(...)))
{
    Microsoft::WRL::ComPtr<IDXGIAdapter> adapter;
    if (SUCCEEDED(dxgiDevice->GetAdapter(&adapter)))
    {
        DXGI_ADAPTER_DESC desc;
        if (SUCCEEDED(adapter->GetDesc(&desc)))
        {
            // NVIDIA
            if (desc.VendorId == 0x10DE ||
                // AMD
                desc.VendorId == 0x1002 || // 0x1022 ?
                // Intel
                desc.VendorId == 0x8086) // 0x163C, 0x8087 ?
            {
                bSupported = true;
            }
        }
     }
 }
在带有硬件适配器的真实机器上进行RDP会话的情况下,Flags==0,但正如我通过Process Hacker 2看到的,GPU未被使用。至少在使用ATI Radeon的Windows 7上,我可以看到RDP会话情况下更大的CPU使用率。所以看起来DXGI_适配器_标志_软件只适用于Microsoft基本渲染驱动程序。所以这个问题没有解决

问题

是否有正确的方法检查当前Windows会话是否使用了真正的硬件视频卡(GPU)?或者可以检查ID2D1DeviceContext::DrawBitmap的特定插值模式是否具有硬件实现,并且是否在当前会话中使用GPU

UPD


本主题不是关于检测RDP或Citrix会话。这与检测应用程序是否在虚拟机中无关。我已经有了所有的验证,并在这些情况下使用线性插值。本主题是关于检测当前Windows会话是否使用真实的GPU来显示桌面。我正在寻找一个更复杂的解决方案,使用DirectX和DXGI的功能来做出决策

如果要检测Microsoft Basic渲染器,最好的选择是使用它的VID/PID组合:

ComPtr<IDXGIDevice> dxgiDevice;
if (SUCCEEDED(device.As(&dxgiDevice)))
{
    ComPtr<IDXGIAdapter> adapter;
    if (SUCCEEDED(dxgiDevice->GetAdapter(&adapter)))
    {
        DXGI_ADAPTER_DESC desc;
        if (SUCCEEDED(adapter->GetDesc(&desc)))
        {
            if ( (desc.VendorId == 0x1414) && (desc.DeviceId == 0x8c) )
            {
                // WARNING: Microsoft Basic Render Driver is active.
                // Performance of this application may be unsatisfactory.
                // Please ensure that your video card is Direct3D10/11 capable
                // and has the appropriate driver installed.
            }
        }
    }
}
comptrdxgidevice;
if(成功(device.As(&dxgiDevice)))
{
ComPtr适配器;
if(成功(dxgiDevice->GetAdapter(&adapter)))
{
DXGI_适配器_DESC DESC;
如果(成功(适配器->GetDesc(&desc)))
{
if((desc.VendorId==0x1414)和&(desc.DeviceId==0x8c))
{
//警告:Microsoft Basic渲染驱动程序处于活动状态。
//此应用程序的性能可能不令人满意。
//请确保您的视频卡支持Direct3D10/11
//并安装了相应的驱动程序。
}
}
}
}
看到和

对于测试/调试,您可能会发现不希望显式阻止这些场景,但确实希望向用户提供某种警告或通知反馈,告知他们正在使用软件而不是硬件渲染

从Win32 classic桌面应用程序进行远程桌面检测最好直接通过
GetSystemMetrics(SM\u REMOTESESSION)
完成


有关远程桌面方案,请参见

,我相信您可以检查
DXGI\u适配器\u DESC1
或更高版本的
DXGI\u适配器\u标志\u软件的标志。我需要再次检查它…感谢您的回答,但不幸的是,我不需要检测Microsoft Basic渲染器。当我对一台真正的机器执行RDP会话时,IDXGIAdapter返回(在描述中)安装在机器上的真正视频适配器。根据ProcessHacker2等工具,不使用GPU,而是使用CPU进行渲染。我查看了IDXGIAdapter1::GetDesc1和DXGI_适配器_标志,在RDP会话的情况下,它同样没有DXGI_适配器_标志_软件标志。您在原始帖子中的逻辑存在缺陷,因为您试图“锁定”三个供应商之一。我的答案是,如果你担心的话,你应该颠倒逻辑,排除MBR。RDP是一个独特的问题,您当然可以直接检测到它。你知道你是否在使用RemoteFX vGPU吗?“我们在原始帖子中的逻辑有缺陷,因为你试图“锁定”三家供应商之一。”你能确定虚拟机不会模拟实际具有软件实现的真实硬件视频卡吗?目前我只能测试VMWare。它在设备中有VMWare SVGA 3D,但IDXGIDevice返回“Microsoft基本渲染器”。但是其他虚拟化软件呢?如果您备份并解释您试图解决的问题,而不是解决方案,可能会有所帮助。如果您担心您的应用程序无法正常运行,那么请检测RDP和/或MBR场景,并设置一个警告框,以便用户知道它无法正常运行。您不能假设NVIDIA、AMD和/或Intel永远不会推出软件渲染器。事实上,很多早期的英特尔“GPU”都只是软件。
 Virtual Machine RDP Win Serv 2012 (Microsoft Basic Render Driver) -> (0x02) DXGI_ADAPTER_FLAG_SOFTWARE
 Physical Win 10 (Intel Video) -> (0x00) DXGI_ADAPTER_FLAG_NONE
 Physical Win 7 (ATI Radeon) - > (0x00) DXGI_ADAPTER_FLAG_NONE
 RDP Win 10 (Intel Video) -> (0x00) DXGI_ADAPTER_FLAG_NONE
 RDP Win 7 (ATI Radeon) -> (0x00) DXGI_ADAPTER_FLAG_NONE
ComPtr<IDXGIDevice> dxgiDevice;
if (SUCCEEDED(device.As(&dxgiDevice)))
{
    ComPtr<IDXGIAdapter> adapter;
    if (SUCCEEDED(dxgiDevice->GetAdapter(&adapter)))
    {
        DXGI_ADAPTER_DESC desc;
        if (SUCCEEDED(adapter->GetDesc(&desc)))
        {
            if ( (desc.VendorId == 0x1414) && (desc.DeviceId == 0x8c) )
            {
                // WARNING: Microsoft Basic Render Driver is active.
                // Performance of this application may be unsatisfactory.
                // Please ensure that your video card is Direct3D10/11 capable
                // and has the appropriate driver installed.
            }
        }
    }
}