OpenGL: OSD menu live resolution change fixes

git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@4212 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
John Peterson 2009-09-06 15:11:21 +00:00
parent a3345ea942
commit 1320e21ded
8 changed files with 110 additions and 66 deletions

View File

@ -54,7 +54,15 @@ public:
static void SetBlendMode(bool forceUpdate); static void SetBlendMode(bool forceUpdate);
static bool SetScissorRect(); static bool SetScissorRect();
// Live resolution change
static bool Allow2x();
static bool AllowCustom();
// Render target management // Render target management
static int GetFrameBufferWidth();
static int GetFrameBufferHeight();
static int GetCustomWidth();
static int GetCustomHeight();
static int GetTargetWidth(); static int GetTargetWidth();
static int GetTargetHeight(); static int GetTargetHeight();

View File

@ -103,7 +103,6 @@ float Renderer::GetTargetScaleX()
{ {
return xScale; return xScale;
} }
float Renderer::GetTargetScaleY() float Renderer::GetTargetScaleY()
{ {
return yScale; return yScale;

View File

@ -25,7 +25,7 @@ Config g_Config;
Config::Config() Config::Config()
{ {
bAllow2xResolution = true; bRunning = false;
} }
void Config::Load() void Config::Load()

View File

@ -59,7 +59,7 @@ struct Config
char iFSResolution[16]; char iFSResolution[16];
char iInternalRes[16]; char iInternalRes[16];
bool bNativeResolution, b2xResolution, bAllow2xResolution; // Should possibly be augmented with 2x, 4x native. bool bNativeResolution, b2xResolution, bRunning; // Should possibly be augmented with 2x, 4x native.
bool bWidescreenHack; bool bWidescreenHack;
bool bKeepAR43, bKeepAR169, bCrop; // Aspect ratio controls. bool bKeepAR43, bKeepAR169, bCrop; // Aspect ratio controls.
bool bUseXFB; bool bUseXFB;

View File

@ -23,14 +23,15 @@
#include <wx/mimetype.h> #include <wx/mimetype.h>
#include "ConfigDlg.h" #include "ConfigDlg.h"
#include "FileUtil.h"
#include "../Globals.h" #include "../Globals.h"
#include "../Config.h" #include "../Config.h"
#include "../TextureMngr.h" #include "../TextureMngr.h"
#include "VertexShaderManager.h" #include "VertexShaderManager.h"
#include "../PostProcessing.h" #include "../PostProcessing.h"
#include "GlobalControl.h" #include "GlobalControl.h"
#include "Render.h"
#include "FileUtil.h"
BEGIN_EVENT_TABLE(GFXConfigDialogOGL,wxDialog) BEGIN_EVENT_TABLE(GFXConfigDialogOGL,wxDialog)
EVT_CLOSE(GFXConfigDialogOGL::OnClose) EVT_CLOSE(GFXConfigDialogOGL::OnClose)
@ -176,16 +177,16 @@ void GFXConfigDialogOGL::CreateGUIControls()
// General Display Settings // General Display Settings
sbBasic = new wxStaticBoxSizer(wxVERTICAL, m_PageGeneral, wxT("Basic Display Settings")); sbBasic = new wxStaticBoxSizer(wxVERTICAL, m_PageGeneral, wxT("Basic Display Settings"));
m_RenderToMainWindow = new wxCheckBox(m_PageGeneral, ID_RENDERTOMAINWINDOW, wxT("Render to main window"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_RenderToMainWindow = new wxCheckBox(m_PageGeneral, ID_RENDERTOMAINWINDOW, wxT("Child window"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
m_RenderToMainWindow->SetValue(g_Config.RenderToMainframe); m_RenderToMainWindow->SetValue(g_Config.RenderToMainframe);
m_NativeResolution = new wxCheckBox(m_PageGeneral, ID_NATIVERESOLUTION, wxT("Native"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_NativeResolution = new wxCheckBox(m_PageGeneral, ID_NATIVERESOLUTION, wxT("Native"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
m_2xResolution = new wxCheckBox(m_PageGeneral, ID_2X_RESOLUTION, wxT("2x"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_2xResolution = new wxCheckBox(m_PageGeneral, ID_2X_RESOLUTION, wxT("2x"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
m_WidescreenHack = new wxCheckBox(m_PageGeneral, ID_WIDESCREEN_HACK, wxT("Wide Screen Hack"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_WidescreenHack = new wxCheckBox(m_PageGeneral, ID_WIDESCREEN_HACK, wxT("Wide screen hack"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
wxStaticText *IRText = new wxStaticText(m_PageGeneral, ID_IRTEXT, wxT("Native resolution:"), wxDefaultPosition, wxDefaultSize, 0); wxStaticText *IRText = new wxStaticText(m_PageGeneral, ID_IRTEXT, wxT("Native resolution:"), wxDefaultPosition, wxDefaultSize, 0);
wxStaticText *RText = new wxStaticText(m_PageGeneral, ID_RTEXT, wxT("Custom resolution:"), wxDefaultPosition, wxDefaultSize, 0); wxStaticText *RText = new wxStaticText(m_PageGeneral, ID_RTEXT, wxT("Custom resolution:"), wxDefaultPosition, wxDefaultSize, 0);
wxStaticText *WMText = new wxStaticText(m_PageGeneral, ID_WMTEXT, wxT("Window mode:"), wxDefaultPosition, wxDefaultSize , 0 ); wxStaticText *WMText = new wxStaticText(m_PageGeneral, ID_WMTEXT, wxT("Window mode:"), wxDefaultPosition, wxDefaultSize , 0 );
wxStaticText *WM2Text = new wxStaticText(m_PageGeneral, ID_WM2TEXT, wxT("Window mode:"), wxDefaultPosition, wxDefaultSize , 0 ); wxStaticText *WM2Text = new wxStaticText(m_PageGeneral, ID_WM2TEXT, wxT("Window mode:"), wxDefaultPosition, wxDefaultSize , 0 );
wxStaticText *FMText = new wxStaticText(m_PageGeneral, ID_FMTEXT, wxT("Fullscreen mode:"), wxDefaultPosition, wxDefaultSize , 0 ); wxStaticText *FMText = new wxStaticText(m_PageGeneral, ID_FMTEXT, wxT("Separate window:"), wxDefaultPosition, wxDefaultSize , 0 );
m_WindowResolutionCB = new wxComboBox(m_PageGeneral, ID_WINDOWRESOLUTIONCB, arrayStringFor_WindowResolutionCB[0], wxDefaultPosition, wxDefaultSize, arrayStringFor_WindowResolutionCB, wxCB_READONLY, wxDefaultValidator); m_WindowResolutionCB = new wxComboBox(m_PageGeneral, ID_WINDOWRESOLUTIONCB, arrayStringFor_WindowResolutionCB[0], wxDefaultPosition, wxDefaultSize, arrayStringFor_WindowResolutionCB, wxCB_READONLY, wxDefaultValidator);
m_WindowResolutionCB->SetValue(wxString::FromAscii(g_Config.iInternalRes)); m_WindowResolutionCB->SetValue(wxString::FromAscii(g_Config.iInternalRes));
m_WindowFSResolutionCB = new wxComboBox(m_PageGeneral, ID_WINDOWFSRESOLUTIONCB, arrayStringFor_FullscreenCB[0], wxDefaultPosition, wxDefaultSize, arrayStringFor_FullscreenCB, wxCB_READONLY, wxDefaultValidator); m_WindowFSResolutionCB = new wxComboBox(m_PageGeneral, ID_WINDOWFSRESOLUTIONCB, arrayStringFor_FullscreenCB[0], wxDefaultPosition, wxDefaultSize, arrayStringFor_FullscreenCB, wxCB_READONLY, wxDefaultValidator);
@ -210,8 +211,6 @@ void GFXConfigDialogOGL::CreateGUIControls()
m_Crop->SetValue(g_Config.bCrop); m_Crop->SetValue(g_Config.bCrop);
m_UseXFB->SetValue(g_Config.bUseXFB); m_UseXFB->SetValue(g_Config.bUseXFB);
m_AutoScale->SetValue(g_Config.bAutoScale); m_AutoScale->SetValue(g_Config.bAutoScale);
// Enabled
m_2xResolution->Enable(g_Config.bAllow2xResolution);
#ifndef _WIN32 #ifndef _WIN32
m_HideCursor = new wxCheckBox(m_PageGeneral, ID_HIDECURSOR, wxT("Hide mouse cursor"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator); m_HideCursor = new wxCheckBox(m_PageGeneral, ID_HIDECURSOR, wxT("Hide mouse cursor"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator);
@ -244,8 +243,8 @@ void GFXConfigDialogOGL::CreateGUIControls()
// Tool tips // Tool tips
m_Fullscreen->SetToolTip( m_Fullscreen->SetToolTip(
wxT("This will create a Fullscreen window using the chosen Fullscreen resolution.") wxT("Start the separate window in fullscreen mode.")
wxT("\nPress Alt+Enter to switch between Fullscreen and Windowed mode.") wxT(" Press Alt+Enter to switch between Fullscreen and Windowed mode.")
wxT("\n\nApplies instanty during gameplay: <No>")); wxT("\n\nApplies instanty during gameplay: <No>"));
m_NativeResolution->SetToolTip( m_NativeResolution->SetToolTip(
wxT("This will use the game's native resolution and stretch it to fill the") wxT("This will use the game's native resolution and stretch it to fill the")
@ -317,7 +316,8 @@ void GFXConfigDialogOGL::CreateGUIControls()
shader = wxT("(off)"); shader = wxT("(off)");
m_PostShaderCB->SetStringSelection(shader); m_PostShaderCB->SetStringSelection(shader);
// How to use the wxGridBagSizer: The wxGBPosition() must have a column and row // Sizers
sGeneral = new wxBoxSizer(wxVERTICAL); sGeneral = new wxBoxSizer(wxVERTICAL);
sBasic = new wxGridBagSizer(0, 0); sBasic = new wxGridBagSizer(0, 0);
@ -337,22 +337,23 @@ void GFXConfigDialogOGL::CreateGUIControls()
sBasic->Add(m_Crop, wxGBPosition(3, 3), wxGBSpan(1, 1), wxALL, 5); sBasic->Add(m_Crop, wxGBPosition(3, 3), wxGBSpan(1, 1), wxALL, 5);
sBasic->Add(m_WidescreenHack, wxGBPosition(4, 1), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL | wxALL, 5); sBasic->Add(m_WidescreenHack, wxGBPosition(4, 1), wxGBSpan(1, 1), wxALIGN_CENTER_VERTICAL | wxALL, 5);
sBasic->Add(WM2Text, wxGBPosition(5, 0), wxGBSpan(1, 1), wxALL, 5);
sBasic->Add(m_Fullscreen, wxGBPosition(5, 1), wxGBSpan(1, 1), wxALL, 5);
// This option is configured from the main Dolphin.exe settings for _WIN32 // This option is configured from the main Dolphin.exe settings for _WIN32
#ifndef _WIN32 #ifndef _WIN32
sBasic->Add(m_HideCursor, wxGBPosition(3, 0), wxGBSpan(1, 4), wxALL, 5); sBasic->Add(m_HideCursor, wxGBPosition(5, 0), wxGBSpan(1, 4), wxALL, 5);
#endif #endif
sbBasic->Add(sBasic); sbBasic->Add(sBasic);
sGeneral->Add(sbBasic, 0, wxEXPAND|wxALL, 5); sGeneral->Add(sbBasic, 0, wxEXPAND|wxALL, 5);
sBasicAdvanced = new wxGridBagSizer(0, 0); sBasicAdvanced = new wxGridBagSizer(0, 0);
sBasicAdvanced->Add(m_EFBCopyDisableHotKey, wxGBPosition(0, 0), wxGBSpan(1, 3), wxALL, 5);
sBasicAdvanced->Add(m_VSync, wxGBPosition(1, 0), wxGBSpan(1, 3), wxALL, 5); sBasicAdvanced->Add(WM2Text, wxGBPosition(0, 0), wxGBSpan(1, 1), wxALL, 5);
sBasicAdvanced->Add(m_UseXFB, wxGBPosition(2, 0), wxGBSpan(1, 3), wxALL, 5); sBasicAdvanced->Add(m_RenderToMainWindow, wxGBPosition(0, 1), wxGBSpan(1, 1), wxALL, 5);
sBasicAdvanced->Add(m_RenderToMainWindow, wxGBPosition(3, 0), wxGBSpan(1, 3), wxALL, 5); sBasicAdvanced->Add(m_Fullscreen, wxGBPosition(0, 2), wxGBSpan(1, 1), wxALL, 5);
sBasicAdvanced->Add(m_EFBCopyDisableHotKey, wxGBPosition(1, 0), wxGBSpan(1, 3), wxALL, 5);
sBasicAdvanced->Add(m_VSync, wxGBPosition(2, 0), wxGBSpan(1, 3), wxALL, 5);
sBasicAdvanced->Add(m_UseXFB, wxGBPosition(3, 0), wxGBSpan(1, 3), wxALL, 5);
sBasicAdvanced->Add(m_AutoScale, wxGBPosition(4, 0), wxGBSpan(1, 3), wxALL, 5); sBasicAdvanced->Add(m_AutoScale, wxGBPosition(4, 0), wxGBSpan(1, 3), wxALL, 5);
sbBasicAdvanced->Add(sBasicAdvanced); sbBasicAdvanced->Add(sBasicAdvanced);
@ -775,14 +776,14 @@ void GFXConfigDialogOGL::UpdateGUI()
m_Fullscreen->Enable(!g_Config.RenderToMainframe); m_Fullscreen->Enable(!g_Config.RenderToMainframe);
if (g_Config.RenderToMainframe) m_Fullscreen->SetValue(false); if (g_Config.RenderToMainframe) m_Fullscreen->SetValue(false);
// Disable the internal resolution option if it's set to native // Resolution settings
m_WindowResolutionCB->Enable(!(g_Config.bNativeResolution || g_Config.b2xResolution)); m_2xResolution->Enable(!g_Config.bRunning || Renderer::Allow2x());
m_WindowFSResolutionCB->Enable(!(g_Config.bNativeResolution || g_Config.b2xResolution)); m_WindowResolutionCB->Enable(!g_Config.bRunning && !(g_Config.bNativeResolution || g_Config.b2xResolution));
m_WindowFSResolutionCB->Enable(!g_Config.bRunning && !(g_Config.RenderToMainframe || g_Config.bNativeResolution || g_Config.b2xResolution));
// Disable the Copy to options when EFBCopy is disabled // Disable the Copy to options when EFBCopy is disabled
m_Radio_CopyEFBToRAM->Enable(!(g_Config.bEFBCopyDisable)); m_Radio_CopyEFBToRAM->Enable(!(g_Config.bEFBCopyDisable));
m_Radio_CopyEFBToGL->Enable(!(g_Config.bEFBCopyDisable)); m_Radio_CopyEFBToGL->Enable(!(g_Config.bEFBCopyDisable));
} }

View File

@ -29,6 +29,7 @@
#include "Win32.h" #include "Win32.h"
#include "OnScreenDisplay.h" #include "OnScreenDisplay.h"
#include "VertexShaderManager.h" #include "VertexShaderManager.h"
#include "Render.h"
#include "StringUtil.h" #include "StringUtil.h"
@ -101,9 +102,9 @@ void OSDMenu(WPARAM wParam)
// Toggle native resolution // Toggle native resolution
if (!(g_Config.bNativeResolution || g_Config.b2xResolution)) if (!(g_Config.bNativeResolution || g_Config.b2xResolution))
g_Config.bNativeResolution = true; g_Config.bNativeResolution = true;
else if (g_Config.bNativeResolution) else if (g_Config.bNativeResolution && Renderer::AllowCustom())
{ g_Config.bNativeResolution = false; if (g_Config.bAllow2xResolution) {g_Config.b2xResolution = true;} } { g_Config.bNativeResolution = false; if (Renderer::Allow2x()) {g_Config.b2xResolution = true;} }
else else if (Renderer::AllowCustom())
g_Config.b2xResolution = false; g_Config.b2xResolution = false;
break; break;
case '4': case '4':

View File

@ -108,10 +108,13 @@ static std::string s_sScreenshotName;
int frameCount; int frameCount;
static int s_fps = 0; static int s_fps = 0;
// These STAY CONSTANT during execution, no matter how much you resize the game window. // The custom resolution
// TODO: Add functionality to reinit all the render targets when the window is resized. // TODO: Add functionality to reinit all the render targets when the window is resized.
static int s_targetwidth; // Size of render buffer FBO. static int m_CustomWidth;
static int s_targetheight; static int m_CustomHeight;
// The framebuffer size
static int m_FrameBufferWidth;
static int m_FrameBufferHeight;
static GLuint s_tempScreenshotFramebuffer = 0; static GLuint s_tempScreenshotFramebuffer = 0;
@ -290,42 +293,42 @@ bool Renderer::Init()
int W = (int)OpenGL_GetBackbufferWidth(), H = (int)OpenGL_GetBackbufferHeight(); int W = (int)OpenGL_GetBackbufferWidth(), H = (int)OpenGL_GetBackbufferHeight();
if (g_Config.bNativeResolution) if (g_Config.bNativeResolution)
{ {
s_targetwidth = EFB_WIDTH; m_FrameBufferWidth = EFB_WIDTH;
s_targetheight = EFB_HEIGHT; m_FrameBufferHeight = EFB_HEIGHT;
} }
else if (g_Config.b2xResolution) else if (g_Config.b2xResolution)
{ {
s_targetwidth = 2 * EFB_WIDTH; m_FrameBufferWidth = 2 * EFB_WIDTH;
s_targetheight = 2 * EFB_HEIGHT; m_FrameBufferHeight = 2 * EFB_HEIGHT;
} }
else else
{ {
// The size of the framebuffer targets should really NOT be the size of the OpenGL viewport. // The size of the framebuffer targets should really NOT be the size of the OpenGL viewport.
// The EFB is larger than 640x480 - in fact, it's 640x528, give or take a couple of lines. // The EFB is larger than 640x480 - in fact, it's 640x528, give or take a couple of lines.
s_targetwidth = (EFB_WIDTH >= W) ? EFB_WIDTH : W; m_FrameBufferWidth = (EFB_WIDTH >= W) ? EFB_WIDTH : W;
s_targetheight = (480 >= H) ? 480 : H; m_FrameBufferHeight = (480 >= H) ? 480 : H;
// Adjust all heights with this ratio, the resulting height will be the same as H or EFB_HEIGHT. I.e. // Adjust all heights with this ratio, the resulting height will be the same as H or EFB_HEIGHT. I.e.
// 768 (-1) for 1024x768 etc. // 768 (-1) for 1024x768 etc.
s_targetheight *= 528.0 / 480.0; m_FrameBufferHeight *= 528.0 / 480.0;
// Ensure a minimum target size so that the native res target always fits // Ensure a minimum target size so that the native res target always fits
if (s_targetwidth < EFB_WIDTH) s_targetwidth = EFB_WIDTH; if (m_FrameBufferWidth < EFB_WIDTH) m_FrameBufferWidth = EFB_WIDTH;
if (s_targetheight < EFB_HEIGHT) s_targetheight = EFB_HEIGHT; if (m_FrameBufferHeight < EFB_HEIGHT) m_FrameBufferHeight = EFB_HEIGHT;
} }
// Disable the 2x option // Save the custom resolution
if (!g_Config.b2xResolution && (W < 1280 || H < 960)) g_Config.bAllow2xResolution = false; m_CustomWidth = (int)OpenGL_GetBackbufferWidth();
m_CustomHeight = (int)OpenGL_GetBackbufferHeight();
// Because of the fixed framebuffer size we need to disable the resolution options while running
g_Config.bRunning = true;
if (GL_REPORT_ERROR() != GL_NO_ERROR) if (GL_REPORT_ERROR() != GL_NO_ERROR)
bSuccess = false; bSuccess = false;
// Initialize the FramebufferManager // Initialize the FramebufferManager
g_framebufferManager.Init(s_targetwidth, s_targetheight, s_MSAASamples, s_MSAACoverageSamples); g_framebufferManager.Init(m_FrameBufferWidth, m_FrameBufferHeight, s_MSAASamples, s_MSAACoverageSamples);
// Save the custom resolution
s_targetwidth = (int)OpenGL_GetBackbufferWidth();
s_targetheight = (int)OpenGL_GetBackbufferHeight();
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT); glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
@ -407,7 +410,7 @@ bool Renderer::Init()
void Renderer::Shutdown(void) void Renderer::Shutdown(void)
{ {
g_Config.bAllow2xResolution = true; g_Config.bRunning = false;
delete s_pfont; delete s_pfont;
s_pfont = 0; s_pfont = 0;
@ -432,19 +435,51 @@ void Renderer::Shutdown(void)
#endif #endif
} }
// Return the rendering window width and height // For the OSD menu's live resolution change
bool Renderer::Allow2x()
{
if (GetFrameBufferWidth() >= 1280 && GetFrameBufferHeight() >= 960)
return true;
else
return false;
}
bool Renderer::AllowCustom()
{
if (GetCustomWidth() <= GetFrameBufferWidth() && GetCustomHeight() <= GetFrameBufferHeight())
return true;
else
return false;
}
// Return the framebuffer size
int Renderer::GetFrameBufferWidth()
{
return m_FrameBufferWidth;
}
int Renderer::GetFrameBufferHeight()
{
return m_FrameBufferHeight;
}
// Return the custom resolution
int Renderer::GetCustomWidth()
{
return m_CustomWidth;
}
int Renderer::GetCustomHeight()
{
return m_CustomHeight;
}
// Return the rendering target width and height
int Renderer::GetTargetWidth() int Renderer::GetTargetWidth()
{ {
return (g_Config.bNativeResolution || g_Config.b2xResolution) ? return (g_Config.bNativeResolution || g_Config.b2xResolution) ?
(g_Config.bNativeResolution ? EFB_WIDTH : EFB_WIDTH * 2) : s_targetwidth; (g_Config.bNativeResolution ? EFB_WIDTH : EFB_WIDTH * 2) : m_CustomWidth;
} }
int Renderer::GetTargetHeight() int Renderer::GetTargetHeight()
{ {
return (g_Config.bNativeResolution || g_Config.b2xResolution) ? return (g_Config.bNativeResolution || g_Config.b2xResolution) ?
(g_Config.bNativeResolution ? EFB_HEIGHT : EFB_HEIGHT * 2) : s_targetheight; (g_Config.bNativeResolution ? EFB_HEIGHT : EFB_HEIGHT * 2) : m_CustomHeight;
} }
float Renderer::GetTargetScaleX() float Renderer::GetTargetScaleX()
{ {
return (float)GetTargetWidth() / (float)EFB_WIDTH; return (float)GetTargetWidth() / (float)EFB_WIDTH;

View File

@ -22,14 +22,14 @@
1.1 Display settings 1.1 Display settings
Internal and fullscreen resolution: Since the only internal resolutions allowed are also Internal and fullscreen resolution: Since the only internal resolutions allowed are also
fullscreen resolution allowed by the system there is only need for one resolution setting fullscreen resolution allowed by the system there is only need for one resolution setting
that applies to both the internal resolution and the fullscreen resolution. that applies to both the internal resolution and the fullscreen resolution.
- Apparently no, someone else doesn't agree
Todo: Make the internal resolution option apply instantly, currently only the native and 2x option Todo: Make the internal resolution option apply instantly, currently only the native and 2x option
applies instantly. To do this we need to enumerate all avaliable display resolutions before applies instantly. To do this we need to be able to change the reinitialize FramebufferManager:Init()
Renderer:Init(). while a game is running.
1.2 Screenshots 1.2 Screenshots