From d12ef2b17cee2f6897989d5c4ad6694328a9cba8 Mon Sep 17 00:00:00 2001 From: KamFretoZ <14798312+kamfretoz@users.noreply.github.com> Date: Sun, 15 Sep 2024 19:24:05 +0700 Subject: [PATCH] OSD: Add GPU Info (#11808) * OSD: Add GPU Info * Qt: More Translatable Strings --- pcsx2/GS/GS.cpp | 2 +- pcsx2/GS/Renderers/Common/GSDevice.h | 4 ++++ pcsx2/GS/Renderers/DX11/GSDevice11.cpp | 5 ++++- pcsx2/GS/Renderers/DX12/GSDevice12.cpp | 2 ++ pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm | 4 +++- pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp | 5 ++++- pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp | 5 ++++- pcsx2/ImGui/ImGuiOverlays.cpp | 6 ++++++ 8 files changed, 28 insertions(+), 5 deletions(-) diff --git a/pcsx2/GS/GS.cpp b/pcsx2/GS/GS.cpp index 98bb62ba50..fb4d8a745f 100644 --- a/pcsx2/GS/GS.cpp +++ b/pcsx2/GS/GS.cpp @@ -528,7 +528,7 @@ void GSUpdateDisplayWindow() { if (!g_gs_device->UpdateWindow()) { - Host::ReportErrorAsync("Error", "Failed to change window after update. The log may contain more information."); + Host::ReportErrorAsync("Error", TRANSLATE_SV("GS", "Failed to change window after update. The log may contain more information.")); return; } diff --git a/pcsx2/GS/Renderers/Common/GSDevice.h b/pcsx2/GS/Renderers/Common/GSDevice.h index 186c83b80d..f2a3f13590 100644 --- a/pcsx2/GS/Renderers/Common/GSDevice.h +++ b/pcsx2/GS/Renderers/Common/GSDevice.h @@ -805,6 +805,7 @@ public: // clang-format on protected: + std::string m_name = "Unknown"; FeatureSupport m_features; u32 m_max_texture_size = 0; @@ -870,6 +871,9 @@ public: GSDevice(); virtual ~GSDevice(); + /// Returns a string containing current adapter in use. + const std::string& GetName() const { return m_name; } + /// Returns a string representing the specified API. static const char* RenderAPIToString(RenderAPI api); diff --git a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp index ba8a109ee6..ef0b4d0c58 100644 --- a/pcsx2/GS/Renderers/DX11/GSDevice11.cpp +++ b/pcsx2/GS/Renderers/DX11/GSDevice11.cpp @@ -112,7 +112,7 @@ bool GSDevice11::Create(GSVSyncMode vsync_mode, bool allow_present_throttle) { Host::ReportErrorAsync("GS", fmt::format( - "Failed to create D3D device: 0x{:08X}. A GPU which supports Direct3D Feature Level 10.0 is required.", + TRANSLATE_FS("GS", "Failed to create D3D device: 0x{:08X}. A GPU which supports Direct3D Feature Level 10.0 is required."), hr)); return false; } @@ -147,7 +147,10 @@ bool GSDevice11::Create(GSVSyncMode vsync_mode, bool allow_present_throttle) wil::com_ptr_nothrow dxgi_device; if (m_dev.try_query_to(&dxgi_device) && SUCCEEDED(dxgi_device->GetParent(IID_PPV_ARGS(dxgi_adapter.put())))) + { Console.WriteLn(fmt::format("D3D Adapter: {}", D3D::GetAdapterName(dxgi_adapter.get()))); + m_name = D3D::GetAdapterName(dxgi_adapter.get()); + } else Console.Error("Failed to obtain D3D adapter name."); diff --git a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp index e576bf6af6..529a94f3e1 100644 --- a/pcsx2/GS/Renderers/DX12/GSDevice12.cpp +++ b/pcsx2/GS/Renderers/DX12/GSDevice12.cpp @@ -690,6 +690,8 @@ bool GSDevice12::Create(GSVSyncMode vsync_mode, bool allow_present_throttle) return false; } + m_name = D3D::GetAdapterName(m_adapter.get()); + if (!CreateDescriptorHeaps() || !CreateCommandLists() || !CreateTimestampQuery()) return false; diff --git a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm index fd3428578f..f068304da7 100644 --- a/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm +++ b/pcsx2/GS/Renderers/Metal/GSDeviceMTL.mm @@ -855,8 +855,10 @@ bool GSDeviceMTL::Create(GSVSyncMode vsync_mode, bool allow_present_throttle) Console.Warning("Metal: Couldn't find adapter %s, using default", GSConfig.Adapter.c_str()); m_dev = GSMTLDevice(MRCTransfer(MTLCreateSystemDefaultDevice())); if (!m_dev.dev) - Host::ReportErrorAsync("No Metal Devices Available", "No Metal-supporting GPUs were found. PCSX2 requires a Metal GPU (available on all macs from 2012 onwards)."); + Host::ReportErrorAsync(TRANSLATE_SV("GSDeviceMTL", "No Metal Devices Available"), TRANSLATE_SV("GSDeviceMTL", "No Metal-supporting GPUs were found. PCSX2 requires a Metal GPU (available on all Macs from 2012 onwards).")); } + + m_name = [[m_dev.dev name] UTF8String]; m_queue = MRCTransfer([m_dev.dev newCommandQueue]); m_pass_desc = MRCTransfer([MTLRenderPassDescriptor new]); diff --git a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp index 5daccd7b37..209cd7e224 100644 --- a/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp +++ b/pcsx2/GS/Renderers/OpenGL/GSDeviceOGL.cpp @@ -184,6 +184,9 @@ bool GSDeviceOGL::Create(GSVSyncMode vsync_mode, bool allow_present_throttle) if (!CheckFeatures(buggy_pbo)) return false; + // Store adapter name currently in use + m_name = reinterpret_cast(glGetString(GL_RENDERER)); + SetSwapInterval(); // Render a frame as soon as possible to clear out whatever was previously being displayed. @@ -635,7 +638,7 @@ bool GSDeviceOGL::CheckFeatures(bool& buggy_pbo) if (!GLAD_GL_VERSION_3_3) { Host::ReportErrorAsync( - "GS", fmt::format("OpenGL renderer is not supported. Only OpenGL {}.{}\n was found", major_gl, minor_gl)); + "GS", fmt::format(TRANSLATE_FS("GSDeviceOGL", "OpenGL renderer is not supported. Only OpenGL {}.{}\n was found"), major_gl, minor_gl)); return false; } diff --git a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp index 4e5617b5e1..b84cd35564 100644 --- a/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp +++ b/pcsx2/GS/Renderers/Vulkan/GSDeviceVK.cpp @@ -2054,7 +2054,7 @@ bool GSDeviceVK::Create(GSVSyncMode vsync_mode, bool allow_present_throttle) if (!CheckFeatures()) { - Host::ReportErrorAsync("GS", "Your GPU does not support the required Vulkan features."); + Host::ReportErrorAsync("GS", TRANSLATE_SV("GSDeviceVK", "Your GPU does not support the required Vulkan features.")); return false; } @@ -2539,6 +2539,9 @@ bool GSDeviceVK::CreateDeviceAndSwapChain() // Read device physical memory properties, we need it for allocating buffers vkGetPhysicalDeviceProperties(m_physical_device, &m_device_properties); + // Stores the GPU name + m_name = m_device_properties.deviceName; + // We need this to be at least 32 byte aligned for AVX2 stores. m_device_properties.limits.minUniformBufferOffsetAlignment = std::max(m_device_properties.limits.minUniformBufferOffsetAlignment, static_cast(32)); diff --git a/pcsx2/ImGui/ImGuiOverlays.cpp b/pcsx2/ImGui/ImGuiOverlays.cpp index c997fcec46..1b2e96f561 100644 --- a/pcsx2/ImGui/ImGuiOverlays.cpp +++ b/pcsx2/ImGui/ImGuiOverlays.cpp @@ -213,12 +213,18 @@ __ri void ImGuiManager::DrawPerformanceOverlay(float& position_y, float scale, f if (GSConfig.OsdShowHardwareInfo) { + // CPU text.clear(); text.append_format("CPU: {} ({}C/{}T)", cpuinfo_get_package(0)->name, cpuinfo_get_cores_count(), cpuinfo_get_processors_count()); DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); + + // GPU + text.clear(); + text.append_format("GPU: {}", g_gs_device->GetName()); + DRAW_LINE(fixed_font, text.c_str(), IM_COL32(255, 255, 255, 255)); } if (GSConfig.OsdShowCPU)