summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authordonkopunchstania <donkopunchstania@gmail.com>2011-01-07 04:57:59 +0000
committerdonkopunchstania <donkopunchstania@gmail.com>2011-01-07 04:57:59 +0000
commitd16357cd5ce810c74fcee602ed13028d397c6254 (patch)
tree686b83ec22a0fc123666105afdb7a919f085274b /Source/Core
parent49b7da6445013c33a89fa6d68b2b64bcd538c7eb (diff)
Add anvideo config option to automatically resize the render window to the size of the game's output resolution. This avoids artifacts that appear when the render target is scaled to fit a window of a different size.
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@6764 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/Src/Core.cpp18
-rw-r--r--Source/Core/Core/Src/Host.h3
-rw-r--r--Source/Core/DolphinWX/Src/Frame.cpp22
-rw-r--r--Source/Core/DolphinWX/Src/Frame.h3
-rw-r--r--Source/Core/DolphinWX/Src/Main.cpp9
-rw-r--r--Source/Core/DolphinWX/Src/MainNoGUI.cpp2
-rw-r--r--Source/Core/VideoCommon/Src/EmuWindow.cpp2
-rw-r--r--Source/Core/VideoCommon/Src/RenderBase.cpp53
-rw-r--r--Source/Core/VideoCommon/Src/RenderBase.h1
-rw-r--r--Source/Core/VideoCommon/Src/VideoConfig.cpp2
-rw-r--r--Source/Core/VideoCommon/Src/VideoConfig.h1
-rw-r--r--Source/Core/VideoUICommon/Src/VideoConfigDiag.cpp2
12 files changed, 87 insertions, 31 deletions
diff --git a/Source/Core/Core/Src/Core.cpp b/Source/Core/Core/Src/Core.cpp
index 0b0c8af66a..97d5b2fe8f 100644
--- a/Source/Core/Core/Src/Core.cpp
+++ b/Source/Core/Core/Src/Core.cpp
@@ -80,7 +80,8 @@ volatile u32 DrawnFrame = 0;
u32 DrawnVideo = 0;
// Function forwarding
-void Callback_VideoRequestWindowSize(int& x, int& y, int& width, int& height);
+void Callback_VideoGetWindowSize(int& x, int& y, int& width, int& height);
+void Callback_VideoRequestWindowSize(int& width, int& height);
void Callback_VideoLog(const TCHAR* _szMessage, int _bDoBreak);
void Callback_VideoCopiedToXFB(bool video_update);
void Callback_DSPLog(const TCHAR* _szMessage, int _v);
@@ -342,6 +343,7 @@ THREAD_RETURN EmuThread(void *pArg)
VideoInitialize.pWindowHandle = _CoreParameter.hMainWindow;
VideoInitialize.pLog = Callback_VideoLog;
VideoInitialize.pSysMessage = Host_SysMessage;
+ VideoInitialize.pGetWindowSize = Callback_VideoGetWindowSize;
VideoInitialize.pRequestWindowSize = Callback_VideoRequestWindowSize;
VideoInitialize.pCopiedToXFB = Callback_VideoCopiedToXFB;
VideoInitialize.pPeekMessages = NULL;
@@ -717,10 +719,18 @@ void Callback_VideoCopiedToXFB(bool video_update)
Frame::FrameUpdate();
}
-// Ask the host for the desired window size
-void Callback_VideoRequestWindowSize(int& x, int& y, int& width, int& height)
+// Ask the host for the window size
+void Callback_VideoGetWindowSize(int& x, int& y, int& width, int& height)
{
- Host_RequestWindowSize(x, y, width, height);
+ Host_GetRenderWindowSize(x, y, width, height);
+}
+
+// Suggest to the host that it sets the window to the given size.
+// The host may or may not decide to do this depending on fullscreen or not.
+// Sets width and height to the actual size of the window.
+void Callback_VideoRequestWindowSize(int& width, int& height)
+{
+ Host_RequestRenderWindowSize(width, height);
}
// Callback_DSPLog
diff --git a/Source/Core/Core/Src/Host.h b/Source/Core/Core/Src/Host.h
index e91c2138cd..310cb6f462 100644
--- a/Source/Core/Core/Src/Host.h
+++ b/Source/Core/Core/Src/Host.h
@@ -46,7 +46,8 @@ void Host_NotifyMapLoaded();
void Host_UpdateBreakPointView();
void Host_ShowJitResults(unsigned int address);
void Host_SetDebugMode(bool enable);
-void Host_RequestWindowSize(int& x, int& y, int& width, int& height);
+void Host_GetRenderWindowSize(int& x, int& y, int& width, int& height);
+void Host_RequestRenderWindowSize(int& width, int& height);
bool Host_RendererHasFocus();
void Host_SetWaitCursor(bool enable);
diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp
index fcf183e291..c280b200da 100644
--- a/Source/Core/DolphinWX/Src/Frame.cpp
+++ b/Source/Core/DolphinWX/Src/Frame.cpp
@@ -669,7 +669,7 @@ void CFrame::OnHostMessage(wxCommandEvent& event)
}
}
-void CFrame::OnSizeRequest(int& x, int& y, int& width, int& height)
+void CFrame::GetRenderWindowSize(int& x, int& y, int& width, int& height)
{
wxMutexGuiEnter();
m_RenderParent->GetSize(&width, &height);
@@ -677,6 +677,26 @@ void CFrame::OnSizeRequest(int& x, int& y, int& width, int& height)
wxMutexGuiLeave();
}
+void CFrame::OnRenderWindowSizeRequest(int& width, int& height)
+{
+ wxMutexGuiEnter();
+
+ if (IsFullScreen())
+ {
+ m_RenderParent->GetSize(&width, &height);
+ }
+ else if (SConfig::GetInstance().m_LocalCoreStartupParameter.bRenderToMain)
+ {
+ m_RenderParent->SetClientSize(width, height);
+ }
+ else
+ {
+ m_RenderParent->GetParent()->SetClientSize(width, height);
+ }
+
+ wxMutexGuiLeave();
+}
+
bool CFrame::RendererHasFocus()
{
if (m_RenderParent == NULL)
diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h
index 04068bf30c..b948d38a09 100644
--- a/Source/Core/DolphinWX/Src/Frame.h
+++ b/Source/Core/DolphinWX/Src/Frame.h
@@ -123,7 +123,8 @@ class CFrame : public CRenderFrame
void PostEvent(wxCommandEvent& event);
void StatusBarMessage(const char * Text, ...);
void ClearStatusBar();
- void OnSizeRequest(int& x, int& y, int& width, int& height);
+ void GetRenderWindowSize(int& x, int& y, int& width, int& height);
+ void OnRenderWindowSizeRequest(int& width, int& height);
void BootGame(const std::string& filename);
void OnRenderParentClose(wxCloseEvent& event);
void OnRenderParentMove(wxMoveEvent& event);
diff --git a/Source/Core/DolphinWX/Src/Main.cpp b/Source/Core/DolphinWX/Src/Main.cpp
index f49b14b9d8..ec6d1fb2e5 100644
--- a/Source/Core/DolphinWX/Src/Main.cpp
+++ b/Source/Core/DolphinWX/Src/Main.cpp
@@ -602,9 +602,14 @@ void Host_UpdateMemoryView()
void Host_SetDebugMode(bool)
{}
-void Host_RequestWindowSize(int& x, int& y, int& width, int& height)
+void Host_GetRenderWindowSize(int& x, int& y, int& width, int& height)
{
- main_frame->OnSizeRequest(x, y, width, height);
+ main_frame->GetRenderWindowSize(x, y, width, height);
+}
+
+void Host_RequestRenderWindowSize(int& width, int& height)
+{
+ main_frame->OnRenderWindowSizeRequest(width, height);
}
void Host_SetWaitCursor(bool enable)
diff --git a/Source/Core/DolphinWX/Src/MainNoGUI.cpp b/Source/Core/DolphinWX/Src/MainNoGUI.cpp
index 0abb2c1b6c..a0dc1fa08f 100644
--- a/Source/Core/DolphinWX/Src/MainNoGUI.cpp
+++ b/Source/Core/DolphinWX/Src/MainNoGUI.cpp
@@ -93,7 +93,7 @@ void Host_UpdateMemoryView(){}
void Host_SetDebugMode(bool){}
-void Host_RequestWindowSize(int& x, int& y, int& width, int& height)
+void Host_GetRenderWindowSize(int& x, int& y, int& width, int& height)
{
x = SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowXPos;
y = SConfig::GetInstance().m_LocalCoreStartupParameter.iRenderWindowYPos;
diff --git a/Source/Core/VideoCommon/Src/EmuWindow.cpp b/Source/Core/VideoCommon/Src/EmuWindow.cpp
index 62882c48e6..3f37687f26 100644
--- a/Source/Core/VideoCommon/Src/EmuWindow.cpp
+++ b/Source/Core/VideoCommon/Src/EmuWindow.cpp
@@ -323,7 +323,7 @@ HWND Create(HWND hParent, HINSTANCE hInstance, const TCHAR *title)
// 3. Request window sizes which actually make the client area map to a common resolution
HWND Ret;
int x=0, y=0, width=640, height=480;
- g_VideoInitialize.pRequestWindowSize(x, y, width, height);
+ g_VideoInitialize.pGetWindowSize(x, y, width, height);
// TODO: Don't show if fullscreen
Ret = OpenWindow(hParent, hInstance, width, height, title);
diff --git a/Source/Core/VideoCommon/Src/RenderBase.cpp b/Source/Core/VideoCommon/Src/RenderBase.cpp
index 4e67c5c72f..4d584f2711 100644
--- a/Source/Core/VideoCommon/Src/RenderBase.cpp
+++ b/Source/Core/VideoCommon/Src/RenderBase.cpp
@@ -114,13 +114,42 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect
}
}
+void Renderer::CalculateTargetScale(int x, int y, int &scaledX, int &scaledY)
+{
+ switch (g_ActiveConfig.iEFBScale)
+ {
+ case 3: // 2x
+ scaledX = x * 2;
+ scaledY = y * 2;
+ break;
+ case 4: // 3x
+ scaledX = x * 3;
+ scaledY = y * 3;
+ break;
+ case 5: // 0.75x
+ scaledX = (x * 3) / 4;
+ scaledY = (y * 3) / 4;
+ break;
+ case 6: // 0.5x
+ scaledX = x / 2;
+ scaledY = y / 2;
+ break;
+ case 7: // 0.375x
+ scaledX = (x * 3) / 8;
+ scaledY = (y * 3) / 8;
+ break;
+ default:
+ scaledX = x;
+ scaledY = y;
+ };
+}
+
// return true if target size changed
bool Renderer::CalculateTargetSize(int multiplier)
{
int newEFBWidth, newEFBHeight;
switch (s_LastEFBScale)
{
- default:
case 0: // fractional
newEFBWidth = (int)(EFB_WIDTH * xScale);
newEFBHeight = (int)(EFB_HEIGHT * yScale);
@@ -129,25 +158,9 @@ bool Renderer::CalculateTargetSize(int multiplier)
newEFBWidth = EFB_WIDTH * (int)ceilf(xScale);
newEFBHeight = EFB_HEIGHT * (int)ceilf(yScale);
break;
- case 2: // 1x
- case 3: // 2x
- case 4: // 3x
- newEFBWidth = EFB_WIDTH * (g_ActiveConfig.iEFBScale - 1);
- newEFBHeight = EFB_HEIGHT * (g_ActiveConfig.iEFBScale - 1);
- break;
- case 5: // 0.75x
- newEFBWidth = (EFB_WIDTH * 3) / 4;
- newEFBHeight = (EFB_HEIGHT * 3) / 4;
- break;
- case 6: // 0.5x
- newEFBWidth = EFB_WIDTH / 2;
- newEFBHeight = EFB_HEIGHT / 2;
- break;
- case 7: // 0.375x
- newEFBWidth = (EFB_WIDTH * 3) / 8;
- newEFBHeight = (EFB_HEIGHT * 3) / 8;
- break;
- };
+ default:
+ CalculateTargetScale(EFB_WIDTH, EFB_HEIGHT, newEFBWidth, newEFBHeight);
+ }
newEFBWidth *= multiplier;
newEFBHeight *= multiplier;
diff --git a/Source/Core/VideoCommon/Src/RenderBase.h b/Source/Core/VideoCommon/Src/RenderBase.h
index 58e4699d5d..1d265083d9 100644
--- a/Source/Core/VideoCommon/Src/RenderBase.h
+++ b/Source/Core/VideoCommon/Src/RenderBase.h
@@ -134,6 +134,7 @@ protected:
static Common::CriticalSection s_criticalScreenshot;
static std::string s_sScreenshotName;
+ static void CalculateTargetScale(int x, int y, int &scaledX, int &scaledY);
static bool CalculateTargetSize(int multiplier = 1);
static void CalculateXYScale(const TargetRectangle& dst_rect);
diff --git a/Source/Core/VideoCommon/Src/VideoConfig.cpp b/Source/Core/VideoCommon/Src/VideoConfig.cpp
index ddca461be9..f08cbe8a7f 100644
--- a/Source/Core/VideoCommon/Src/VideoConfig.cpp
+++ b/Source/Core/VideoCommon/Src/VideoConfig.cpp
@@ -61,6 +61,7 @@ void VideoConfig::Load(const char *ini_file)
iniFile.Get("Settings", "UseXFB", &bUseXFB, 0);
iniFile.Get("Settings", "UseRealXFB", &bUseRealXFB, 0);
iniFile.Get("Settings", "UseNativeMips", &bUseNativeMips, true);
+ iniFile.Get("Settings", "AdjustWindowSize", &bAdjustWindowSize, false);
iniFile.Get("Settings", "SafeTextureCache", &bSafeTextureCache, false); // Settings
//Safe texture cache params
@@ -179,6 +180,7 @@ void VideoConfig::Save(const char *ini_file)
iniFile.Set("Settings", "UseXFB", bUseXFB);
iniFile.Set("Settings", "UseRealXFB", bUseRealXFB);
iniFile.Set("Settings", "UseNativeMips", bUseNativeMips);
+ iniFile.Set("Settings", "AdjustWindowSize", bAdjustWindowSize);
iniFile.Set("Settings", "SafeTextureCache", bSafeTextureCache);
//safe texture cache params
diff --git a/Source/Core/VideoCommon/Src/VideoConfig.h b/Source/Core/VideoCommon/Src/VideoConfig.h
index 9ffffe2f0c..276ef6f903 100644
--- a/Source/Core/VideoCommon/Src/VideoConfig.h
+++ b/Source/Core/VideoCommon/Src/VideoConfig.h
@@ -77,6 +77,7 @@ struct VideoConfig
bool bUseXFB;
bool bUseRealXFB;
bool bUseNativeMips;
+ bool bAdjustWindowSize;
// OpenCL
bool bEnableOpenCL;
diff --git a/Source/Core/VideoUICommon/Src/VideoConfigDiag.cpp b/Source/Core/VideoUICommon/Src/VideoConfigDiag.cpp
index c438cf5e1e..b81c18b024 100644
--- a/Source/Core/VideoUICommon/Src/VideoConfigDiag.cpp
+++ b/Source/Core/VideoUICommon/Src/VideoConfigDiag.cpp
@@ -101,6 +101,7 @@ wxString crop_tooltip = wxT("");
wxString opencl_tooltip = wxT("");
wxString dlc_tooltip = wxT("");
wxString hotkeys_tooltip = wxT("");
+wxString adjust_window_size_tooltip = wxT("Adjusts the window to match the game's output resolution scaled by the EFB scale.\nIt is best to set the aspect ratio to stretch when using this.");
wxString ppshader_tooltip = wxT("");
wxString cache_efb_copies_tooltip = _("When using EFB to RAM we very often need to decode RAM data to a VRAM texture, which is a very time-consuming task.\nWith this option enabled, we'll skip decoding a texture if it didn't change.\nThis results in a nice speedup, but possibly causes glitches.\nIf you have any problems with this option enabled you should either try increasing the safety of the texture cache or disable this option.\n(NOTE: The safier the texture cache is adjusted the lower the speedup will be; accurate texture cache set to \"safe\" might actually be slower!)");
@@ -425,6 +426,7 @@ VideoConfigDiag::VideoConfigDiag(wxWindow* parent, const std::string &title, con
szr_misc->Add(new SettingCheckBox(page_advanced, _("Enable OpenCL"), opencl_tooltip, vconfig.bEnableOpenCL));
szr_misc->Add(new SettingCheckBox(page_advanced, _("Enable Display List Caching"), dlc_tooltip, vconfig.bDlistCachingEnable));
szr_misc->Add(new SettingCheckBox(page_advanced, _("Enable Hotkeys"), hotkeys_tooltip, vconfig.bOSDHotKey));
+ szr_misc->Add(new SettingCheckBox(page_advanced, wxT("Adjust window size"), adjust_window_size_tooltip, vconfig.bAdjustWindowSize));
// postproc shader
if (vconfig.backend_info.PPShaders.size())