From e7addc140bac671cc06f3c61de7c75b0b3a6c048 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Wed, 11 Oct 2017 03:09:27 +0200 Subject: [PATCH] [tests] Added DXGI test case --- tests/dxgi/meson.build | 5 ++ tests/dxgi/test_dxgi_factory.cpp | 90 ++++++++++++++++++++++++++++++++ tests/meson.build | 1 + 3 files changed, 96 insertions(+) create mode 100644 tests/dxgi/meson.build create mode 100644 tests/dxgi/test_dxgi_factory.cpp diff --git a/tests/dxgi/meson.build b/tests/dxgi/meson.build new file mode 100644 index 00000000..b1e48450 --- /dev/null +++ b/tests/dxgi/meson.build @@ -0,0 +1,5 @@ +test_dxgi_deps = [ dxvk_dep, dxgi_dep ] + +executable('dxgi-factory', files('test_dxgi_factory.cpp'), + link_with : util_lib, + dependencies : test_dxgi_deps) \ No newline at end of file diff --git a/tests/dxgi/test_dxgi_factory.cpp b/tests/dxgi/test_dxgi_factory.cpp new file mode 100644 index 00000000..d9d96127 --- /dev/null +++ b/tests/dxgi/test_dxgi_factory.cpp @@ -0,0 +1,90 @@ +#include + +#include + +#include +#include + +using namespace dxvk; + +int WINAPI WinMain(HINSTANCE hInstance, + HINSTANCE hPrevInstance, + LPSTR lpCmdLine, + int nCmdShow) { + Com factory = nullptr; + + if (CreateDXGIFactory(__uuidof(IDXGIFactory), + reinterpret_cast(&factory)) != S_OK) { + Logger::err("Failed to create DXGI factory"); + return 1; + } + + Com adapter = nullptr; + + for (UINT i = 0; factory->EnumAdapters(i, &adapter) == S_OK; i++) { + DXGI_ADAPTER_DESC adapterDesc; + + if (adapter->GetDesc(&adapterDesc) != S_OK) { + Logger::err("Failed to get DXGI adapter info"); + return 1; + } + + Com output; + + for (UINT j = 0; adapter->EnumOutputs(j, &output) == S_OK; j++) { + std::vector modes; + + HRESULT status = S_OK; + UINT displayModeCount = 0; + + Logger::info(str::format("Adapter ", i, ":")); + + DXGI_ADAPTER_DESC desc; + + if (adapter->GetDesc(&desc) != S_OK) { + Logger::err("Failed to get DXGI adapter info"); + return 1; + } + + std::array chars; + std::wcstombs(chars.data(), desc.Description, chars.size() - 1); + Logger::info(str::format(" ", chars.data())); + Logger::info(str::format(" Vendor: ", desc.VendorId)); + Logger::info(str::format(" Device: ", desc.DeviceId)); + Logger::info(str::format(" Dedicated RAM: ", desc.DedicatedVideoMemory)); + Logger::info(str::format(" Shared RAM: ", desc.SharedSystemMemory)); + + do { + if (output->GetDisplayModeList( + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_ENUM_MODES_SCALING, + &displayModeCount, nullptr) != S_OK) { + Logger::err("Failed to get DXGI output display mode count"); + return 1; + } + + modes.resize(displayModeCount); + + status = output->GetDisplayModeList( + DXGI_FORMAT_R8G8B8A8_UNORM, + DXGI_ENUM_MODES_SCALING, + &displayModeCount, modes.data()); + } while (status == DXGI_ERROR_MORE_DATA); + + if (status != S_OK) { + Logger::err("Failed to get DXGI output display mode list"); + return 1; + } + + Logger::info(str::format(" Output ", j, ":")); + for (auto mode : modes) { + Logger::info(str::format(" ", + mode.Width, "x", mode.Height, " @ ", + mode.RefreshRate.Numerator / mode.RefreshRate.Denominator)); + } + } + } + + return 0; +} + diff --git a/tests/meson.build b/tests/meson.build index 22ba4479..742b376d 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -1 +1,2 @@ +subdir('dxgi') subdir('dxvk') \ No newline at end of file