summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon
diff options
context:
space:
mode:
authorDentomologist <dentomologist@gmail.com>2026-07-05 13:28:31 -0700
committerGitHub <noreply@github.com>2026-07-05 13:28:31 -0700
commit774200dcf4ccea148ef357cc8cf86d8eab4446da (patch)
tree4cc18c009a9639916a7b18a650b9453c4aba43c7 /Source/Core/VideoCommon
parentacf6060a5419d4adf61b1603c19916d5482e644a (diff)
parentbe1df92153d94b276fee69182d4774e7bfc1b3f1 (diff)
Merge pull request #14689 from JosJuice/android-internal-resolution-display
VideoCommon: Use XFB for internal resolution stats
Diffstat (limited to 'Source/Core/VideoCommon')
-rw-r--r--Source/Core/VideoCommon/PerformanceMetrics.cpp57
-rw-r--r--Source/Core/VideoCommon/PerformanceMetrics.h10
-rw-r--r--Source/Core/VideoCommon/Present.cpp6
-rw-r--r--Source/Core/VideoCommon/VideoConfig.cpp2
-rw-r--r--Source/Core/VideoCommon/VideoConfig.h2
-rw-r--r--Source/Core/VideoCommon/VideoEvents.h43
6 files changed, 61 insertions, 59 deletions
diff --git a/Source/Core/VideoCommon/PerformanceMetrics.cpp b/Source/Core/VideoCommon/PerformanceMetrics.cpp
index fccc8ae38e..98efa64108 100644
--- a/Source/Core/VideoCommon/PerformanceMetrics.cpp
+++ b/Source/Core/VideoCommon/PerformanceMetrics.cpp
@@ -11,7 +11,6 @@
#include "Common/HookableEvent.h"
#include "Core/Config/GraphicsSettings.h"
#include "Core/Core.h"
-#include "VideoCommon/FramebufferManager.h"
#include "VideoCommon/VideoConfig.h"
PerformanceMetrics::PerformanceMetrics()
@@ -89,20 +88,6 @@ double PerformanceMetrics::GetFPS() const
return m_fps_counter.GetHzAvg();
}
-u32 PerformanceMetrics::GetEFBWidth() const
-{
- if (g_framebuffer_manager)
- return g_framebuffer_manager->GetEFBWidth();
- return 0;
-}
-
-u32 PerformanceMetrics::GetEFBHeight() const
-{
- if (g_framebuffer_manager)
- return g_framebuffer_manager->GetEFBHeight();
- return 0;
-}
-
double PerformanceMetrics::GetVPS() const
{
return m_vps_counter.GetHzAvg();
@@ -123,6 +108,11 @@ void PerformanceMetrics::SetLatestFramePresentationOffset(DT offset)
m_frame_presentation_offset.store(offset, std::memory_order_relaxed);
}
+void PerformanceMetrics::SetLatestFrameBufferSize(u32 width, u32 height)
+{
+ m_frame_buffer_size.store(FrameBufferSize{width, height}, std::memory_order_relaxed);
+}
+
void PerformanceMetrics::DrawImGuiStats(const float backbuffer_scale)
{
m_vps_counter.UpdateStats();
@@ -139,8 +129,6 @@ void PerformanceMetrics::DrawImGuiStats(const float backbuffer_scale)
const double fps = GetFPS();
const double vps = GetVPS();
const double speed = GetSpeed();
- const u32 width = GetEFBWidth();
- const u32 height = GetEFBHeight();
static ImVec2 last_display_size(-1.0f, -1.0f);
@@ -335,49 +323,50 @@ void PerformanceMetrics::DrawImGuiStats(const float backbuffer_scale)
ImGui::End();
}
- if (g_ActiveConfig.bShowInternalResolution)
+ if (g_ActiveConfig.bShowVPS || g_ActiveConfig.bShowVTimes)
{
+ // Position in the top-right corner of the screen.
ImGui::SetNextWindowPos(ImVec2(window_x, window_y), set_next_position_condition,
ImVec2(1.0f, 0.0f));
ImGui::SetNextWindowBgAlpha(bg_alpha);
- if (ImGui::Begin("ResolutionStats", nullptr, imgui_flags))
+ if (ImGui::Begin("VPSStats", nullptr, imgui_flags))
{
if (stack_vertically)
window_y += ImGui::GetWindowHeight() + window_padding;
else
window_x -= ImGui::GetWindowWidth() + window_padding;
-
clamp_window_position();
-
- ImGui::TextColored(ImVec4(r, g, b, 1.0f), "Res: %ux%u", width, height);
+ if (g_ActiveConfig.bShowVPS)
+ ImGui::TextColored(ImVec4(r, g, b, 1.0f), "VPS:%7.2lf", vps);
+ if (g_ActiveConfig.bShowVTimes)
+ {
+ ImGui::TextColored(ImVec4(r, g, b, 1.0f), "dt:%6.2lfms",
+ DT_ms(m_vps_counter.GetDtAvg()).count());
+ ImGui::TextColored(ImVec4(r, g, b, 1.0f), " ±:%6.2lfms",
+ DT_ms(m_vps_counter.GetDtStd()).count());
+ }
}
ImGui::End();
}
- if (g_ActiveConfig.bShowVPS || g_ActiveConfig.bShowVTimes)
+ if (g_ActiveConfig.bShowInternalResolution)
{
- // Position in the top-right corner of the screen.
ImGui::SetNextWindowPos(ImVec2(window_x, window_y), set_next_position_condition,
ImVec2(1.0f, 0.0f));
ImGui::SetNextWindowBgAlpha(bg_alpha);
- if (ImGui::Begin("VPSStats", nullptr, imgui_flags))
+ if (ImGui::Begin("ResolutionStats", nullptr, imgui_flags))
{
if (stack_vertically)
window_y += ImGui::GetWindowHeight() + window_padding;
else
window_x -= ImGui::GetWindowWidth() + window_padding;
+
clamp_window_position();
- if (g_ActiveConfig.bShowVPS)
- ImGui::TextColored(ImVec4(r, g, b, 1.0f), "VPS:%7.2lf", vps);
- if (g_ActiveConfig.bShowVTimes)
- {
- ImGui::TextColored(ImVec4(r, g, b, 1.0f), "dt:%6.2lfms",
- DT_ms(m_vps_counter.GetDtAvg()).count());
- ImGui::TextColored(ImVec4(r, g, b, 1.0f), " ±:%6.2lfms",
- DT_ms(m_vps_counter.GetDtStd()).count());
- }
+
+ const FrameBufferSize size = m_frame_buffer_size.load(std::memory_order_relaxed);
+ ImGui::TextColored(ImVec4(r, g, b, 1.0f), "XFB res: %ux%u", size.width, size.height);
}
ImGui::End();
}
diff --git a/Source/Core/VideoCommon/PerformanceMetrics.h b/Source/Core/VideoCommon/PerformanceMetrics.h
index 538360a05b..b24c6f6659 100644
--- a/Source/Core/VideoCommon/PerformanceMetrics.h
+++ b/Source/Core/VideoCommon/PerformanceMetrics.h
@@ -41,15 +41,20 @@ public:
double GetVPS() const;
double GetSpeed() const;
double GetMaxSpeed() const;
- u32 GetEFBWidth() const;
- u32 GetEFBHeight() const;
// Call from any thread.
void SetLatestFramePresentationOffset(DT offset);
+ void SetLatestFrameBufferSize(u32 width, u32 height);
// ImGui Functions
void DrawImGuiStats(const float backbuffer_scale);
private:
+ struct FrameBufferSize
+ {
+ u32 width = 0;
+ u32 height = 0;
+ };
+
PerformanceTracker m_fps_counter{"render_times.txt"};
PerformanceTracker m_vps_counter{"vblank_times.txt"};
@@ -59,6 +64,7 @@ private:
std::atomic<double> m_max_speed{};
std::atomic<DT> m_frame_presentation_offset{};
+ std::atomic<FrameBufferSize> m_frame_buffer_size{};
struct PerfSample
{
diff --git a/Source/Core/VideoCommon/Present.cpp b/Source/Core/VideoCommon/Present.cpp
index 7c62730667..41d05f3652 100644
--- a/Source/Core/VideoCommon/Present.cpp
+++ b/Source/Core/VideoCommon/Present.cpp
@@ -174,6 +174,8 @@ void Presenter::ViSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_height,
.present_count = m_present_count++,
.emulated_timestamp = ticks,
.intended_present_time = presentation_time,
+ .frame_buffer_width = fb_width,
+ .frame_buffer_height = fb_height,
};
if (is_duplicate)
@@ -234,9 +236,11 @@ void Presenter::ImmediateSwap(u32 xfb_addr, u32 fb_width, u32 fb_stride, u32 fb_
PresentInfo present_info{
.frame_count = m_frame_count++,
.present_count = m_present_count++,
- .reason = PresentInfo::PresentReason::Immediate,
.emulated_timestamp = ticks,
.intended_present_time = m_next_swap_estimated_time,
+ .reason = PresentInfo::PresentReason::Immediate,
+ .frame_buffer_width = fb_width,
+ .frame_buffer_height = fb_height,
};
auto& video_events = GetVideoEvents();
diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp
index 448f447741..c56f32c00c 100644
--- a/Source/Core/VideoCommon/VideoConfig.cpp
+++ b/Source/Core/VideoCommon/VideoConfig.cpp
@@ -106,7 +106,6 @@ void VideoConfig::Refresh()
iCropCustomBottom = Config::Get(Config::GFX_CROP_CUSTOM_BOTTOM);
iSafeTextureCache_ColorSamples = Config::Get(Config::GFX_SAFE_TEXTURE_CACHE_COLOR_SAMPLES);
bShowFPS = Config::Get(Config::GFX_SHOW_FPS);
- bShowInternalResolution = Config::Get(Config::GFX_SHOW_INTERNAL_RESOLUTION);
bShowFTimes = Config::Get(Config::GFX_SHOW_FTIMES);
bShowVPS = Config::Get(Config::GFX_SHOW_VPS);
bShowVTimes = Config::Get(Config::GFX_SHOW_VTIMES);
@@ -118,6 +117,7 @@ void VideoConfig::Refresh()
bOverlayStats = Config::Get(Config::GFX_OVERLAY_STATS);
bOverlayProjStats = Config::Get(Config::GFX_OVERLAY_PROJ_STATS);
bOverlayScissorStats = Config::Get(Config::GFX_OVERLAY_SCISSOR_STATS);
+ bShowInternalResolution = Config::Get(Config::GFX_SHOW_INTERNAL_RESOLUTION);
bDumpTextures = Config::Get(Config::GFX_DUMP_TEXTURES);
bDumpMipmapTextures = Config::Get(Config::GFX_DUMP_MIP_TEXTURES);
bDumpBaseTextures = Config::Get(Config::GFX_DUMP_BASE_TEXTURES);
diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h
index ec06f4a606..e16015491b 100644
--- a/Source/Core/VideoCommon/VideoConfig.h
+++ b/Source/Core/VideoCommon/VideoConfig.h
@@ -250,7 +250,6 @@ struct VideoConfig final
// Information
bool bShowFPS = false;
- bool bShowInternalResolution = false;
bool bShowFTimes = false;
bool bShowVPS = false;
bool bShowVTimes = false;
@@ -261,6 +260,7 @@ struct VideoConfig final
bool bOverlayStats = false;
bool bOverlayProjStats = false;
bool bOverlayScissorStats = false;
+ bool bShowInternalResolution = false;
bool bTexFmtOverlayEnable = false;
bool bTexFmtOverlayCenter = false;
bool bLogRenderTimeToFile = false;
diff --git a/Source/Core/VideoCommon/VideoEvents.h b/Source/Core/VideoCommon/VideoEvents.h
index fe30aa251b..f037dc266d 100644
--- a/Source/Core/VideoCommon/VideoEvents.h
+++ b/Source/Core/VideoCommon/VideoEvents.h
@@ -16,6 +16,23 @@ class System;
struct PresentInfo
{
+ enum class PresentTimeAccuracy
+ {
+ // The Driver/OS has given us an exact timestamp of when the first line of the frame started
+ // scanning out to the monitor
+ PresentOnScreenExact,
+
+ // An approximate timestamp of scanout.
+ PresentOnScreen,
+
+ // Dolphin doesn't have visibility of the present time. But the present operation has
+ // been queued with the GPU driver and will happen in the near future.
+ PresentInProgress,
+
+ // Not implemented
+ Unimplemented,
+ };
+
enum class PresentReason
{
Immediate, // FIFO is Presenting the XFB immediately, straight after the XFB copy
@@ -30,9 +47,6 @@ struct PresentInfo
// never goes backwards.
u64 present_count = 0;
- // The frame is identical to the previous frame
- PresentReason reason = PresentReason::Immediate;
-
// The exact emulated time of the when real hardware would have presented this frame
u64 emulated_timestamp = 0;
@@ -41,26 +55,15 @@ struct PresentInfo
// AfterPresent only: The actual time the frame was presented
TimePoint actual_present_time{};
- enum class PresentTimeAccuracy
- {
- // The Driver/OS has given us an exact timestamp of when the first line of the frame started
- // scanning out to the monitor
- PresentOnScreenExact,
-
- // An approximate timestamp of scanout.
- PresentOnScreen,
-
- // Dolphin doesn't have visibility of the present time. But the present operation has
- // been queued with the GPU driver and will happen in the near future.
- PresentInProgress,
-
- // Not implemented
- Unimplemented,
- };
-
// Accuracy of actual_present_time
PresentTimeAccuracy present_time_accuracy = PresentTimeAccuracy::Unimplemented;
+ // Where the presentation of the frame was triggered from
+ PresentReason reason = PresentReason::Immediate;
+
+ u32 frame_buffer_width;
+ u32 frame_buffer_height;
+
std::vector<std::string_view> xfb_copy_hashes;
};