首页 > 解决方案 > 当应用程序在支持无头图形的 Ec2 实例上启动时,IDirect3D9::CheckDeviceType 返回 D3DERR_NOTAVAILABLE

问题描述

我编写了一个应用程序,它在需要硬件加速才能正确呈现的 AWS Ec2 实例上启动统一应用程序。此启动器应用程序会进行预健全性检查,以确保 HAL(硬件加速)设备与 Direct3D 调用一起存在,例如

D3DDISPLAYMODE mode;
HRESULT hr;
if (FAILED (hr = s_D3D->GetAdapterDisplayMode (g_D3DAdapter, &mode)))
{
   return false;
}

if(FAILED (hr = s_D3D->CheckDeviceType (g_D3DAdapter, D3DDEVTYPE_HAL, mode.Format, mode.Format, TRUE)))
{
   /// This fails.
   return false;
}

当我按预期从远程桌面运行启动器应用程序时,完整性检查成功。但是当应用程序在启动时启动时它会失败。

如果我删除完整性检查,统一应用程序在启动时正确加载,但某些确实需要硬件加速的元素/着色器无法正确呈现。

我正在使用带有 Windows10 和 NVIDIA Tesla T4 显卡的 AWS EC2 G4 实例。我也安装了最新的驱动程序(Nvidia 和 Directx)。

为了进行额外的调试,我尝试打印一些调试日志以查看是否检测到图形驱动程序并且应用程序似乎确实找到了它。

D3DADAPTER_IDENTIFIER9 adapter_info;
hr = s_D3D->GetAdapterIdentifier (g_D3DAdapter, 0, &adapter_info);
std::cout << "Device Name: " << adapter_info.DeviceName << std::endl;
std::cout << "Device Id: " << std::to_string (adapter_info.DeviceId) << std::endl;
std::cout << "Device Desc: " << adapter_info.Description << std::endl;
std::cout << "Device Driver: " << adapter_info.Driver << std::endl;

如果您对我如何在启动时启动应用程序进程感到好奇,我会使用 AWS 的 UserDataScripts 功能。通过 UserData 脚本,我确保应用程序进程以管理员权限和正确的 Windows 会话运行。以下是讨论我正在使用的方法的链接。 https://www.codeproject.com/Articles/35773/Subverting-Vista-UAC-in-Both-32-and-64-bit-Archite

从我到目前为止所做的搜索中,我没有找到任何与此主题相关的内容。

标签: amazon-web-serviceswinapiamazon-ec2directxdirect3d

解决方案


推荐阅读