diff --git a/Source/Core/DolphinWX/VideoConfigDiag.cpp b/Source/Core/DolphinWX/VideoConfigDiag.cpp index 0fcb6a70f5..fd6db1942c 100644 --- a/Source/Core/DolphinWX/VideoConfigDiag.cpp +++ b/Source/Core/DolphinWX/VideoConfigDiag.cpp @@ -236,6 +236,11 @@ static wxString cache_hires_textures_desc = "more RAM but fixes possible stuttering.\n\nIf unsure, leave this unchecked."); static wxString dump_efb_desc = wxTRANSLATE( "Dump the contents of EFB copies to User/Dump/Textures/.\n\nIf unsure, leave this unchecked."); +static wxString internal_resolution_frame_dumping_desc = wxTRANSLATE( + "Create frame dumps and screenshots at the internal resolution of the renderer, rather than " + "the size of the window it is displayed within. If the aspect ratio is widescreen, the output " + "image will be scaled horizontally to preserve the vertical resolution.\n\nIf unsure, leave " + "this unchecked."); #if defined(HAVE_LIBAV) || defined(_WIN32) static wxString use_ffv1_desc = wxTRANSLATE("Encode frame dumps using the FFV1 codec.\n\nIf unsure, leave this unchecked."); @@ -858,6 +863,14 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string& title) CreateCheckBox(page_advanced, _("Prefetch Custom Textures"), wxGetTranslation(cache_hires_textures_desc), vconfig.bCacheHiresTextures); szr_utility->Add(cache_hires_textures); + + if (vconfig.backend_info.bSupportsInternalResolutionFrameDumps) + { + szr_utility->Add(CreateCheckBox(page_advanced, _("Full Resolution Frame Dumps"), + wxGetTranslation(internal_resolution_frame_dumping_desc), + vconfig.bInternalResolutionFrameDumps)); + } + szr_utility->Add(CreateCheckBox(page_advanced, _("Dump EFB Target"), wxGetTranslation(dump_efb_desc), vconfig.bDumpEFBTarget)); szr_utility->Add(CreateCheckBox(page_advanced, _("Free Look"), diff --git a/Source/Core/VideoBackends/D3D/main.cpp b/Source/Core/VideoBackends/D3D/main.cpp index b70ad215d3..fe32d89603 100644 --- a/Source/Core/VideoBackends/D3D/main.cpp +++ b/Source/Core/VideoBackends/D3D/main.cpp @@ -72,6 +72,7 @@ void VideoBackend::InitBackendInfo() g_Config.backend_info.bSupportsDepthClamp = true; g_Config.backend_info.bSupportsReversedDepthRange = false; g_Config.backend_info.bSupportsMultithreading = false; + g_Config.backend_info.bSupportsInternalResolutionFrameDumps = false; IDXGIFactory* factory; IDXGIAdapter* ad; diff --git a/Source/Core/VideoBackends/D3D12/main.cpp b/Source/Core/VideoBackends/D3D12/main.cpp index b34dc26175..774783f5a1 100644 --- a/Source/Core/VideoBackends/D3D12/main.cpp +++ b/Source/Core/VideoBackends/D3D12/main.cpp @@ -75,6 +75,7 @@ void VideoBackend::InitBackendInfo() g_Config.backend_info.bSupportsDepthClamp = true; g_Config.backend_info.bSupportsReversedDepthRange = false; g_Config.backend_info.bSupportsMultithreading = false; + g_Config.backend_info.bSupportsInternalResolutionFrameDumps = false; IDXGIFactory* factory; IDXGIAdapter* ad; diff --git a/Source/Core/VideoBackends/Null/NullBackend.cpp b/Source/Core/VideoBackends/Null/NullBackend.cpp index 8e54a730e7..1e3117088e 100644 --- a/Source/Core/VideoBackends/Null/NullBackend.cpp +++ b/Source/Core/VideoBackends/Null/NullBackend.cpp @@ -41,6 +41,7 @@ void VideoBackend::InitBackendInfo() g_Config.backend_info.bSupportsDepthClamp = true; g_Config.backend_info.bSupportsReversedDepthRange = true; g_Config.backend_info.bSupportsMultithreading = false; + g_Config.backend_info.bSupportsInternalResolutionFrameDumps = false; // aamodes: We only support 1 sample, so no MSAA g_Config.backend_info.Adapters.clear(); diff --git a/Source/Core/VideoBackends/OGL/main.cpp b/Source/Core/VideoBackends/OGL/main.cpp index 5951959253..059b88375d 100644 --- a/Source/Core/VideoBackends/OGL/main.cpp +++ b/Source/Core/VideoBackends/OGL/main.cpp @@ -104,6 +104,7 @@ void VideoBackend::InitBackendInfo() g_Config.backend_info.bSupportsSSAA = true; g_Config.backend_info.bSupportsReversedDepthRange = true; g_Config.backend_info.bSupportsMultithreading = false; + g_Config.backend_info.bSupportsInternalResolutionFrameDumps = false; // Overwritten in Render.cpp later g_Config.backend_info.bSupportsDualSourceBlend = true; diff --git a/Source/Core/VideoBackends/Software/SWmain.cpp b/Source/Core/VideoBackends/Software/SWmain.cpp index 3df4afd57c..1ecd9517c8 100644 --- a/Source/Core/VideoBackends/Software/SWmain.cpp +++ b/Source/Core/VideoBackends/Software/SWmain.cpp @@ -132,6 +132,7 @@ void VideoSoftware::InitBackendInfo() g_Config.backend_info.bSupportsOversizedViewports = true; g_Config.backend_info.bSupportsPrimitiveRestart = false; g_Config.backend_info.bSupportsMultithreading = false; + g_Config.backend_info.bSupportsInternalResolutionFrameDumps = false; // aamodes g_Config.backend_info.AAModes = {1}; diff --git a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp index 7696568ef4..0bfed91c38 100644 --- a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp +++ b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp @@ -233,6 +233,7 @@ void VulkanContext::PopulateBackendInfo(VideoConfig* config) config->backend_info.bSupportsPaletteConversion = true; // Assumed support. config->backend_info.bSupportsClipControl = true; // Assumed support. config->backend_info.bSupportsMultithreading = true; // Assumed support. + config->backend_info.bSupportsInternalResolutionFrameDumps = false; // No support yet. config->backend_info.bSupportsPostProcessing = false; // No support yet. config->backend_info.bSupportsDualSourceBlend = false; // Dependent on features. config->backend_info.bSupportsGeometryShaders = false; // Dependent on features. diff --git a/Source/Core/VideoCommon/VideoConfig.cpp b/Source/Core/VideoCommon/VideoConfig.cpp index 123d7e9e58..2351caee88 100644 --- a/Source/Core/VideoCommon/VideoConfig.cpp +++ b/Source/Core/VideoCommon/VideoConfig.cpp @@ -39,6 +39,7 @@ VideoConfig::VideoConfig() backend_info.api_type = APIType::Nothing; backend_info.bSupportsExclusiveFullscreen = false; backend_info.bSupportsMultithreading = false; + backend_info.bSupportsInternalResolutionFrameDumps = false; bEnableValidationLayer = false; bBackendMultithreading = true; @@ -74,6 +75,7 @@ void VideoConfig::Load(const std::string& ini_file) settings->Get("DumpFramesAsImages", &bDumpFramesAsImages, 0); settings->Get("FreeLook", &bFreeLook, 0); settings->Get("UseFFV1", &bUseFFV1, 0); + settings->Get("InternalResolutionFrameDumps", &bInternalResolutionFrameDumps, 0); settings->Get("EnablePixelLighting", &bEnablePixelLighting, 0); settings->Get("FastDepthCalc", &bFastDepthCalc, true); settings->Get("MSAA", &iMultisamples, 1); @@ -291,6 +293,7 @@ void VideoConfig::Save(const std::string& ini_file) settings->Set("DumpFramesAsImages", bDumpFramesAsImages); settings->Set("FreeLook", bFreeLook); settings->Set("UseFFV1", bUseFFV1); + settings->Set("InternalResolutionFrameDumps", bInternalResolutionFrameDumps); settings->Set("EnablePixelLighting", bEnablePixelLighting); settings->Set("FastDepthCalc", bFastDepthCalc); settings->Set("MSAA", iMultisamples); diff --git a/Source/Core/VideoCommon/VideoConfig.h b/Source/Core/VideoCommon/VideoConfig.h index e1bac2c5ff..9e6b0180f3 100644 --- a/Source/Core/VideoCommon/VideoConfig.h +++ b/Source/Core/VideoCommon/VideoConfig.h @@ -101,6 +101,7 @@ struct VideoConfig final bool bDumpEFBTarget; bool bDumpFramesAsImages; bool bUseFFV1; + bool bInternalResolutionFrameDumps; bool bFreeLook; bool bBorderlessFullscreen; @@ -184,6 +185,7 @@ struct VideoConfig final bool bSupportsDepthClamp; // Needed by VertexShaderGen, so must stay in VideoCommon bool bSupportsReversedDepthRange; bool bSupportsMultithreading; + bool bSupportsInternalResolutionFrameDumps; } backend_info; // Utility