diff --git a/WinDevice.sln b/WinDevice.sln index d4a24ac..43d6eee 100644 --- a/WinDevice.sln +++ b/WinDevice.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.32802.440 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34322.80 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "WinDevice", "WinDevice\WinDevice.vcxproj", "{FC07175F-EC7A-4CE5-9F7F-976DC6AED04D}" EndProject diff --git a/WinDevice/Device/WinDeviceManager.cpp b/WinDevice/Device/WinDeviceManager.cpp index 2dee472..c5d2cb3 100644 --- a/WinDevice/Device/WinDeviceManager.cpp +++ b/WinDevice/Device/WinDeviceManager.cpp @@ -170,6 +170,42 @@ namespace WinDevice 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); if (pD3D == nullptr) @@ -177,7 +213,6 @@ namespace WinDevice // DirectX is not installed or not available return false; } - D3DCAPS9 caps; if (FAILED(pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps))) { @@ -185,7 +220,6 @@ namespace WinDevice pD3D->Release(); return false; } - // Check if Direct3D acceleration is supported const bool accelerationAvailable = (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) != 0; @@ -193,53 +227,4 @@ namespace WinDevice 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(&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; - } } diff --git a/WinDevice/Device/WinDeviceManager.h b/WinDevice/Device/WinDeviceManager.h index 24a0951..8fff806 100644 --- a/WinDevice/Device/WinDeviceManager.h +++ b/WinDevice/Device/WinDeviceManager.h @@ -14,7 +14,6 @@ namespace WinDevice UserDeviceInfo GetUserDeviceInfo(); static bool IsDirectDrawAccelerationAvailable(); static bool IsDirect3DAccelerationAvailable(); - static bool IsDirectX12Available(); private: std::shared_ptr osInfo; diff --git a/WinDevice/WinDevice.cpp b/WinDevice/WinDevice.cpp index 8fc312a..834ea0b 100644 --- a/WinDevice/WinDevice.cpp +++ b/WinDevice/WinDevice.cpp @@ -23,7 +23,6 @@ int main() // ScreenManager sceen_manager; // sceen_manager.UpdateDisplayInfo(); - spdlog::info("IsDirectX12Available: {0}", WinDevice::WinDeviceManager::IsDirectX12Available()); spdlog::info("IsDirect3DAccelerationAvailable: {0}", WinDevice::WinDeviceManager::IsDirect3DAccelerationAvailable()); spdlog::info("IsDirectDrawAccelerationAvailable: {0}", WinDevice::WinDeviceManager::IsDirectDrawAccelerationAvailable()); getchar(); diff --git a/WinDevice/WinDevice.def b/WinDevice/WinDevice.def new file mode 100644 index 0000000..396c1b9 --- /dev/null +++ b/WinDevice/WinDevice.def @@ -0,0 +1 @@ +LIBRARY diff --git a/WinDevice/WinDevice.vcxproj b/WinDevice/WinDevice.vcxproj index d52e3a0..ca430cc 100644 --- a/WinDevice/WinDevice.vcxproj +++ b/WinDevice/WinDevice.vcxproj @@ -99,7 +99,8 @@ Console true - dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies) + dxgi.lib;cfgmgr32.lib;d3d9.lib;d3d10.lib;d3d11.lib;d3d12.lib;ddraw.lib;%(AdditionalDependencies) + WinDevice.def @@ -117,7 +118,8 @@ true true true - 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) + 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) + WinDevice.def @@ -131,7 +133,8 @@ Console true - 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) + 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) + WinDevice.def @@ -149,7 +152,8 @@ true true true - 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) + 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) + WinDevice.def @@ -175,6 +179,9 @@ + + + diff --git a/WinDevice/WinDevice.vcxproj.filters b/WinDevice/WinDevice.vcxproj.filters index 3f69a31..6f1d272 100644 --- a/WinDevice/WinDevice.vcxproj.filters +++ b/WinDevice/WinDevice.vcxproj.filters @@ -75,4 +75,9 @@ 头文件 + + + 源文件 + + \ No newline at end of file diff --git a/WinDevice/stdafx.h b/WinDevice/stdafx.h index 0805be4..d98893e 100644 --- a/WinDevice/stdafx.h +++ b/WinDevice/stdafx.h @@ -13,6 +13,8 @@ #include #include #include +#include +#include #include #include