yuzu-emu
/
yuzu
Archived
1
0
Fork 0

Fix screenshot dimensions when at 1x scale

This was regressed by ART.
Prior to ART, the screenshots were saved at the title's framebuffer resolution. A misunderstanding of the existing logic led to screenshot dimensions becoming dependent on the host render window size.

This changes the behavior to match how it was prior to ART at 1x, with screenshots now always being the title's framebuffer dimensions scaled by the resolution scaling factor.
This commit is contained in:
ameerj 2021-11-20 17:48:22 -05:00
parent c3e1ffc44b
commit fe1f06c856
5 changed files with 8 additions and 20 deletions

View File

@ -25,7 +25,12 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) {
ASSERT(height > 0); ASSERT(height > 0);
// The drawing code needs at least somewhat valid values for both screens // The drawing code needs at least somewhat valid values for both screens
// so just calculate them both even if the other isn't showing. // so just calculate them both even if the other isn't showing.
FramebufferLayout res{width, height, false, {}}; FramebufferLayout res{
.width = width,
.height = height,
.screen = {},
.is_srgb = false,
};
const float window_aspect_ratio = static_cast<float>(height) / static_cast<float>(width); const float window_aspect_ratio = static_cast<float>(height) / static_cast<float>(width);
const float emulation_aspect_ratio = EmulationAspectRatio( const float emulation_aspect_ratio = EmulationAspectRatio(

View File

@ -35,17 +35,8 @@ enum class AspectRatio {
struct FramebufferLayout { struct FramebufferLayout {
u32 width{ScreenUndocked::Width}; u32 width{ScreenUndocked::Width};
u32 height{ScreenUndocked::Height}; u32 height{ScreenUndocked::Height};
bool is_srgb{};
Common::Rectangle<u32> screen; Common::Rectangle<u32> screen;
bool is_srgb{};
/**
* Returns the ration of pixel size of the screen, compared to the native size of the undocked
* Switch screen.
*/
float GetScalingRatio() const {
return static_cast<float>(screen.GetWidth()) / ScreenUndocked::Width;
}
}; };
/** /**

View File

@ -55,10 +55,4 @@ std::unique_ptr<Tegra::GPU> CreateGPU(Core::Frontend::EmuWindow& emu_window, Cor
} }
} }
float GetResolutionScaleFactor(const RendererBase& renderer) {
return Settings::values.resolution_info.active
? Settings::values.resolution_info.up_factor
: renderer.GetRenderWindow().GetFramebufferLayout().GetScalingRatio();
}
} // namespace VideoCore } // namespace VideoCore

View File

@ -25,6 +25,4 @@ class RendererBase;
/// Creates an emulated GPU instance using the given system context. /// Creates an emulated GPU instance using the given system context.
std::unique_ptr<Tegra::GPU> CreateGPU(Core::Frontend::EmuWindow& emu_window, Core::System& system); std::unique_ptr<Tegra::GPU> CreateGPU(Core::Frontend::EmuWindow& emu_window, Core::System& system);
float GetResolutionScaleFactor(const RendererBase& renderer);
} // namespace VideoCore } // namespace VideoCore

View File

@ -630,7 +630,7 @@ void GRenderWindow::ReleaseRenderTarget() {
void GRenderWindow::CaptureScreenshot(const QString& screenshot_path) { void GRenderWindow::CaptureScreenshot(const QString& screenshot_path) {
auto& renderer = system.Renderer(); auto& renderer = system.Renderer();
const f32 res_scale = VideoCore::GetResolutionScaleFactor(renderer); const f32 res_scale = Settings::values.resolution_info.up_factor;
const Layout::FramebufferLayout layout{Layout::FrameLayoutFromResolutionScale(res_scale)}; const Layout::FramebufferLayout layout{Layout::FrameLayoutFromResolutionScale(res_scale)};
screenshot_image = QImage(QSize(layout.width, layout.height), QImage::Format_RGB32); screenshot_image = QImage(QSize(layout.width, layout.height), QImage::Format_RGB32);