mirror of https://github.com/PCSX2/pcsx2.git
HostDisplay: Add GetDriverInfo()
This commit is contained in:
parent
ed9b6f0d3f
commit
c263c12448
|
@ -524,6 +524,98 @@ void D3D11HostDisplay::DestroyRenderSurface()
|
|||
m_swap_chain.Reset();
|
||||
}
|
||||
|
||||
static std::string GetDriverVersionFromLUID(const LUID& luid)
|
||||
{
|
||||
std::string ret;
|
||||
|
||||
HKEY hKey;
|
||||
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\DirectX"), 0, KEY_READ, &hKey) == ERROR_SUCCESS)
|
||||
{
|
||||
DWORD max_key_len = 0, adapter_count = 0;
|
||||
if (RegQueryInfoKey(hKey, nullptr, nullptr, nullptr, &adapter_count, &max_key_len,
|
||||
nullptr, nullptr, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS)
|
||||
{
|
||||
std::vector<TCHAR> current_name(max_key_len + 1);
|
||||
for (DWORD i = 0; i < adapter_count; ++i)
|
||||
{
|
||||
DWORD subKeyLength = static_cast<DWORD>(current_name.size());
|
||||
if (RegEnumKeyEx(hKey, i, current_name.data(), &subKeyLength, nullptr, nullptr, nullptr, nullptr) == ERROR_SUCCESS)
|
||||
{
|
||||
LUID current_luid = {};
|
||||
DWORD current_luid_size = sizeof(uint64_t);
|
||||
if (RegGetValue(hKey, current_name.data(), _T("AdapterLuid"), RRF_RT_QWORD, nullptr, ¤t_luid, ¤t_luid_size) == ERROR_SUCCESS &&
|
||||
current_luid.HighPart == luid.HighPart && current_luid.LowPart == luid.LowPart)
|
||||
{
|
||||
LARGE_INTEGER driver_version = {};
|
||||
DWORD driver_version_size = sizeof(driver_version);
|
||||
if (RegGetValue(hKey, current_name.data(), _T("DriverVersion"), RRF_RT_QWORD, nullptr, &driver_version, &driver_version_size) == ERROR_SUCCESS)
|
||||
{
|
||||
WORD nProduct = HIWORD(driver_version.HighPart);
|
||||
WORD nVersion = LOWORD(driver_version.HighPart);
|
||||
WORD nSubVersion = HIWORD(driver_version.LowPart);
|
||||
WORD nBuild = LOWORD(driver_version.LowPart);
|
||||
ret = StringUtil::StdStringFromFormat("%u.%u.%u.%u", nProduct, nVersion, nSubVersion, nBuild);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RegCloseKey(hKey);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string D3D11HostDisplay::GetDriverInfo() const
|
||||
{
|
||||
std::string ret = "Unknown Feature Level";
|
||||
|
||||
static constexpr std::array<std::tuple<D3D_FEATURE_LEVEL, const char*>, 4> feature_level_names = {{
|
||||
{D3D_FEATURE_LEVEL_10_0, "D3D_FEATURE_LEVEL_10_0"},
|
||||
{D3D_FEATURE_LEVEL_10_0, "D3D_FEATURE_LEVEL_10_1"},
|
||||
{D3D_FEATURE_LEVEL_11_0, "D3D_FEATURE_LEVEL_11_0"},
|
||||
{D3D_FEATURE_LEVEL_11_1, "D3D_FEATURE_LEVEL_11_1"},
|
||||
}};
|
||||
|
||||
const D3D_FEATURE_LEVEL fl = m_device->GetFeatureLevel();
|
||||
for (size_t i = 0; i < std::size(feature_level_names); i++)
|
||||
{
|
||||
if (fl == std::get<0>(feature_level_names[i]))
|
||||
{
|
||||
ret = std::get<1>(feature_level_names[i]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ret += "\n";
|
||||
|
||||
ComPtr<IDXGIDevice> dxgi_dev;
|
||||
if (SUCCEEDED(m_device.As(&dxgi_dev)))
|
||||
{
|
||||
ComPtr<IDXGIAdapter> dxgi_adapter;
|
||||
if (SUCCEEDED(dxgi_dev->GetAdapter(dxgi_adapter.ReleaseAndGetAddressOf())))
|
||||
{
|
||||
DXGI_ADAPTER_DESC desc;
|
||||
if (SUCCEEDED(dxgi_adapter->GetDesc(&desc)))
|
||||
{
|
||||
ret += StringUtil::StdStringFromFormat("VID: 0x%04X PID: 0x%04X\n", desc.VendorId, desc.DeviceId);
|
||||
ret += StringUtil::WideStringToUTF8String(desc.Description);
|
||||
ret += "\n";
|
||||
|
||||
const std::string driver_version(GetDriverVersionFromLUID(desc.AdapterLuid));
|
||||
if (!driver_version.empty())
|
||||
{
|
||||
ret += "Driver Version: ";
|
||||
ret += driver_version;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void D3D11HostDisplay::ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale)
|
||||
{
|
||||
if (!m_swap_chain)
|
||||
|
|
|
@ -56,6 +56,7 @@ public:
|
|||
bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override;
|
||||
AdapterAndModeList GetAdapterAndModeList() override;
|
||||
void DestroyRenderSurface() override;
|
||||
std::string GetDriverInfo() const override;
|
||||
|
||||
std::unique_ptr<HostDisplayTexture> CreateTexture(u32 width, u32 height, u32 layers, u32 levels,
|
||||
const void* data, u32 data_stride, bool dynamic = false) override;
|
||||
|
|
|
@ -319,6 +319,15 @@ void OpenGLHostDisplay::DestroyRenderSurface()
|
|||
Console.Error("Failed to switch to surfaceless");
|
||||
}
|
||||
|
||||
std::string OpenGLHostDisplay::GetDriverInfo() const
|
||||
{
|
||||
const char* gl_vendor = reinterpret_cast<const char*>(glGetString(GL_VENDOR));
|
||||
const char* gl_renderer = reinterpret_cast<const char*>(glGetString(GL_RENDERER));
|
||||
const char* gl_version = reinterpret_cast<const char*>(glGetString(GL_VERSION));
|
||||
return StringUtil::StdStringFromFormat(
|
||||
"%s Context:\n%s\n%s %s", m_gl_context->IsGLES() ? "OpenGL ES" : "OpenGL", gl_version, gl_vendor, gl_renderer);
|
||||
}
|
||||
|
||||
bool OpenGLHostDisplay::CreateImGuiContext()
|
||||
{
|
||||
return ImGui_ImplOpenGL3_Init(GetGLSLVersionString());
|
||||
|
|
|
@ -50,6 +50,7 @@ public:
|
|||
bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override;
|
||||
AdapterAndModeList GetAdapterAndModeList() override;
|
||||
void DestroyRenderSurface() override;
|
||||
std::string GetDriverInfo() const override;
|
||||
|
||||
std::unique_ptr<HostDisplayTexture> CreateTexture(u32 width, u32 height, u32 layers, u32 levels, const void* data,
|
||||
u32 data_stride, bool dynamic) override;
|
||||
|
|
|
@ -127,6 +127,31 @@ void VulkanHostDisplay::DestroyRenderSurface()
|
|||
m_swap_chain.reset();
|
||||
}
|
||||
|
||||
std::string VulkanHostDisplay::GetDriverInfo() const
|
||||
{
|
||||
std::string ret;
|
||||
const u32 version = g_vulkan_context->GetDeviceProperties().apiVersion;
|
||||
if (g_vulkan_context->GetOptionalExtensions().vk_khr_driver_properties)
|
||||
{
|
||||
const VkPhysicalDeviceDriverProperties& props = g_vulkan_context->GetDeviceDriverProperties();
|
||||
ret = StringUtil::StdStringFromFormat(
|
||||
"Vulkan %u.%u.%u\nConformance Version %u.%u.%u.%u\n%s\n%s\n%s",
|
||||
VK_API_VERSION_MAJOR(version), VK_API_VERSION_MINOR(version), VK_API_VERSION_PATCH(version),
|
||||
props.conformanceVersion.major, props.conformanceVersion.minor, props.conformanceVersion.subminor, props.conformanceVersion.patch,
|
||||
props.driverInfo, props.driverName,
|
||||
g_vulkan_context->GetDeviceProperties().deviceName);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = StringUtil::StdStringFromFormat(
|
||||
"Vulkan %u.%u.%u\n%s",
|
||||
VK_API_VERSION_MAJOR(version), VK_API_VERSION_MINOR(version), VK_API_VERSION_PATCH(version),
|
||||
g_vulkan_context->GetDeviceProperties().deviceName);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static bool UploadBufferToTexture(Vulkan::Texture* texture, u32 width, u32 height, const void* data, u32 data_stride)
|
||||
{
|
||||
const u32 tight_stride = Vulkan::Util::GetTexelSize(texture->GetFormat()) * width;
|
||||
|
|
|
@ -41,6 +41,7 @@ public:
|
|||
bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) override;
|
||||
AdapterAndModeList GetAdapterAndModeList() override;
|
||||
void DestroyRenderSurface() override;
|
||||
std::string GetDriverInfo() const override;
|
||||
|
||||
std::unique_ptr<HostDisplayTexture> CreateTexture(u32 width, u32 height, u32 layers, u32 levels,
|
||||
const void* data, u32 data_stride, bool dynamic = false) override;
|
||||
|
|
|
@ -108,6 +108,7 @@ public:
|
|||
virtual bool IsFullscreen() = 0;
|
||||
virtual bool SetFullscreen(bool fullscreen, u32 width, u32 height, float refresh_rate) = 0;
|
||||
virtual AdapterAndModeList GetAdapterAndModeList() = 0;
|
||||
virtual std::string GetDriverInfo() const = 0;
|
||||
|
||||
/// Call when the window size changes externally to recreate any resources.
|
||||
virtual void ResizeRenderWindow(s32 new_window_width, s32 new_window_height, float new_window_scale) = 0;
|
||||
|
|
Loading…
Reference in New Issue