添加 WinDeviceManger

This commit is contained in:
DevWiki 2023-12-18 19:05:14 +08:00
parent 53b1a99d3c
commit 2e4e55b4d3
8 changed files with 57 additions and 59 deletions

View File

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16 # Visual Studio Version 17
VisualStudioVersion = 16.0.32802.440 VisualStudioVersion = 17.8.34322.80
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WinDevice", "WinDevice\WinDevice.vcxproj", "{FC07175F-EC7A-4CE5-9F7F-976DC6AED04D}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WinDevice", "WinDevice\WinDevice.vcxproj", "{FC07175F-EC7A-4CE5-9F7F-976DC6AED04D}"
EndProject EndProject

View File

@ -170,6 +170,42 @@ namespace WinDevice
bool WinDeviceManager::IsDirect3DAccelerationAvailable() bool WinDeviceManager::IsDirect3DAccelerationAvailable()
{ {
D3D_FEATURE_LEVEL featureLevel;
// 尝试创建硬件设备,如果失败,尝试创建支持较低特性级别的设备
HRESULT hr = D3D11CreateDevice(
nullptr,
D3D_DRIVER_TYPE_HARDWARE,
nullptr,
0,
nullptr,
0,
D3D11_SDK_VERSION,
nullptr,
&featureLevel,
nullptr
);
if (SUCCEEDED(hr))
{
return true;
}
// 依次尝试创建支持较低特性级别的设备
hr = D3D10CreateDevice(
nullptr,
D3D10_DRIVER_TYPE_HARDWARE,
nullptr,
0,
D3D10_SDK_VERSION,
nullptr
);
if (SUCCEEDED(hr))
{
return true;
}
IDirect3D9* pD3D = Direct3DCreate9(D3D_SDK_VERSION); IDirect3D9* pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if (pD3D == nullptr) if (pD3D == nullptr)
@ -177,7 +213,6 @@ namespace WinDevice
// DirectX is not installed or not available // DirectX is not installed or not available
return false; return false;
} }
D3DCAPS9 caps; D3DCAPS9 caps;
if (FAILED(pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps))) if (FAILED(pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps)))
{ {
@ -185,7 +220,6 @@ namespace WinDevice
pD3D->Release(); pD3D->Release();
return false; return false;
} }
// Check if Direct3D acceleration is supported // Check if Direct3D acceleration is supported
const bool accelerationAvailable = (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) != 0; const bool accelerationAvailable = (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) != 0;
@ -193,53 +227,4 @@ namespace WinDevice
return accelerationAvailable; return accelerationAvailable;
} }
bool WinDeviceManager::IsDirectX12Available()
{
HRESULT hr = S_OK;
// 初始化 COM 环境
hr = CoInitialize(nullptr);
if (FAILED(hr))
{
// 处理初始化失败的情况
return false;
}
// 创建 DXGI 工厂
IDXGIFactory4* pFactory = nullptr;
hr = CreateDXGIFactory1(__uuidof(IDXGIFactory4), reinterpret_cast<void**>(&pFactory));
if (FAILED(hr))
{
// 处理工厂创建失败的情况
CoUninitialize();
return false;
}
// 枚举适配器
IDXGIAdapter1* pAdapter = nullptr;
for (UINT adapterIndex = 0; pFactory->EnumAdapters1(adapterIndex, &pAdapter) != DXGI_ERROR_NOT_FOUND; ++adapterIndex)
{
// 检查适配器是否支持 DirectX 12
D3D_FEATURE_LEVEL featureLevels[] = {D3D_FEATURE_LEVEL_12_0, D3D_FEATURE_LEVEL_12_1};
for (const D3D_FEATURE_LEVEL featureLevel : featureLevels)
{
hr = D3D12CreateDevice(pAdapter, featureLevel, __uuidof(ID3D12Device), nullptr);
if (SUCCEEDED(hr))
{
// 找到支持 DirectX 12 的适配器
pAdapter->Release();
pFactory->Release();
CoUninitialize();
return true;
}
}
pAdapter->Release();
}
// 未找到支持 DirectX 12 的适配器
pFactory->Release();
CoUninitialize();
return false;
}
} }

View File

@ -14,7 +14,6 @@ namespace WinDevice
UserDeviceInfo GetUserDeviceInfo(); UserDeviceInfo GetUserDeviceInfo();
static bool IsDirectDrawAccelerationAvailable(); static bool IsDirectDrawAccelerationAvailable();
static bool IsDirect3DAccelerationAvailable(); static bool IsDirect3DAccelerationAvailable();
static bool IsDirectX12Available();
private: private:
std::shared_ptr<OsInfo> osInfo; std::shared_ptr<OsInfo> osInfo;

View File

@ -23,7 +23,6 @@ int main()
// ScreenManager sceen_manager; // ScreenManager sceen_manager;
// sceen_manager.UpdateDisplayInfo(); // sceen_manager.UpdateDisplayInfo();
spdlog::info("IsDirectX12Available: {0}", WinDevice::WinDeviceManager::IsDirectX12Available());
spdlog::info("IsDirect3DAccelerationAvailable: {0}", WinDevice::WinDeviceManager::IsDirect3DAccelerationAvailable()); spdlog::info("IsDirect3DAccelerationAvailable: {0}", WinDevice::WinDeviceManager::IsDirect3DAccelerationAvailable());
spdlog::info("IsDirectDrawAccelerationAvailable: {0}", WinDevice::WinDeviceManager::IsDirectDrawAccelerationAvailable()); spdlog::info("IsDirectDrawAccelerationAvailable: {0}", WinDevice::WinDeviceManager::IsDirectDrawAccelerationAvailable());
getchar(); getchar();

1
WinDevice/WinDevice.def Normal file
View File

@ -0,0 +1 @@
LIBRARY

View File

@ -99,7 +99,8 @@
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d10.lib;d3d11.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>WinDevice.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@ -117,7 +118,8 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d10.lib;d3d11.lib;d3d12.lib;ddraw.lib;version.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>WinDevice.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@ -131,7 +133,8 @@
<Link> <Link>
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d10.lib;d3d11.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>WinDevice.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@ -149,7 +152,8 @@
<EnableCOMDATFolding>true</EnableCOMDATFolding> <EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d10.lib;d3d11.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies)</AdditionalDependencies>
<ModuleDefinitionFile>WinDevice.def</ModuleDefinitionFile>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
@ -175,6 +179,9 @@
<ClInclude Include="Utils\TimeUtil.h" /> <ClInclude Include="Utils\TimeUtil.h" />
<ClInclude Include="Video\ScreenManager.h" /> <ClInclude Include="Video\ScreenManager.h" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="WinDevice.def" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets"> <ImportGroup Label="ExtensionTargets">
</ImportGroup> </ImportGroup>

View File

@ -75,4 +75,9 @@
<Filter>头文件</Filter> <Filter>头文件</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="WinDevice.def">
<Filter>源文件</Filter>
</None>
</ItemGroup>
</Project> </Project>

View File

@ -13,6 +13,8 @@
#include <dxgi1_4.h> #include <dxgi1_4.h>
#include <d3d9.h> #include <d3d9.h>
#include <d3d9caps.h> #include <d3d9caps.h>
#include <d3d11.h>
#include <d3d10_1.h>
#include <d3d12.h> #include <d3d12.h>
#include <DirectXMath.h> #include <DirectXMath.h>