VideoCommon: Fix crash at startup with virtual XFB enabled

This commit is contained in:
Stenzek 2017-03-09 23:39:48 +10:00
parent 883bec873f
commit 4012166085
4 changed files with 12 additions and 14 deletions

View File

@ -248,20 +248,18 @@ void FramebufferManagerBase::ReplaceVirtualXFB()
} }
} }
int FramebufferManagerBase::ScaleToVirtualXfbWidth(int x) int FramebufferManagerBase::ScaleToVirtualXfbWidth(int x, const TargetRectangle& target_rectangle)
{ {
if (g_ActiveConfig.RealXFBEnabled()) if (g_ActiveConfig.RealXFBEnabled())
return x; return x;
return x * static_cast<int>(g_renderer->GetTargetRectangle().GetWidth()) / return x * target_rectangle.GetWidth() / s_last_xfb_width;
static_cast<int>(FramebufferManagerBase::LastXfbWidth());
} }
int FramebufferManagerBase::ScaleToVirtualXfbHeight(int y) int FramebufferManagerBase::ScaleToVirtualXfbHeight(int y, const TargetRectangle& target_rectangle)
{ {
if (g_ActiveConfig.RealXFBEnabled()) if (g_ActiveConfig.RealXFBEnabled())
return y; return y;
return y * static_cast<int>(g_renderer->GetTargetRectangle().GetHeight()) / return y * target_rectangle.GetHeight() / s_last_xfb_height;
static_cast<int>(FramebufferManagerBase::LastXfbHeight());
} }

View File

@ -57,8 +57,8 @@ public:
static void SetLastXfbHeight(unsigned int height) { s_last_xfb_height = height; } static void SetLastXfbHeight(unsigned int height) { s_last_xfb_height = height; }
static unsigned int LastXfbWidth() { return s_last_xfb_width; } static unsigned int LastXfbWidth() { return s_last_xfb_width; }
static unsigned int LastXfbHeight() { return s_last_xfb_height; } static unsigned int LastXfbHeight() { return s_last_xfb_height; }
static int ScaleToVirtualXfbWidth(int x); static int ScaleToVirtualXfbWidth(int x, const TargetRectangle& target_rectangle);
static int ScaleToVirtualXfbHeight(int y); static int ScaleToVirtualXfbHeight(int y, const TargetRectangle& target_rectangle);
static unsigned int GetEFBLayers() { return m_EFBLayers; } static unsigned int GetEFBLayers() { return m_EFBLayers; }
virtual std::pair<u32, u32> GetTargetSize() const = 0; virtual std::pair<u32, u32> GetTargetSize() const = 0;

View File

@ -84,8 +84,8 @@ Renderer::Renderer(int backbuffer_width, int backbuffer_height)
FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT); FramebufferManagerBase::SetLastXfbHeight(MAX_XFB_HEIGHT);
UpdateActiveConfig(); UpdateActiveConfig();
CalculateTargetSize();
UpdateDrawRectangle(); UpdateDrawRectangle();
CalculateTargetSize();
OSDChoice = 0; OSDChoice = 0;
OSDTime = 0; OSDTime = 0;
@ -127,7 +127,7 @@ int Renderer::EFBToScaledX(int x)
switch (g_ActiveConfig.iEFBScale) switch (g_ActiveConfig.iEFBScale)
{ {
case SCALE_AUTO: // fractional case SCALE_AUTO: // fractional
return FramebufferManagerBase::ScaleToVirtualXfbWidth(x); return FramebufferManagerBase::ScaleToVirtualXfbWidth(x, m_target_rectangle);
default: default:
return x * (int)m_efb_scale_numeratorX / (int)m_efb_scale_denominatorX; return x * (int)m_efb_scale_numeratorX / (int)m_efb_scale_denominatorX;
@ -139,7 +139,7 @@ int Renderer::EFBToScaledY(int y)
switch (g_ActiveConfig.iEFBScale) switch (g_ActiveConfig.iEFBScale)
{ {
case SCALE_AUTO: // fractional case SCALE_AUTO: // fractional
return FramebufferManagerBase::ScaleToVirtualXfbHeight(y); return FramebufferManagerBase::ScaleToVirtualXfbHeight(y, m_target_rectangle);
default: default:
return y * (int)m_efb_scale_numeratorY / (int)m_efb_scale_denominatorY; return y * (int)m_efb_scale_numeratorY / (int)m_efb_scale_denominatorY;
@ -173,8 +173,8 @@ bool Renderer::CalculateTargetSize()
{ {
case SCALE_AUTO: case SCALE_AUTO:
case SCALE_AUTO_INTEGRAL: case SCALE_AUTO_INTEGRAL:
newEFBWidth = FramebufferManagerBase::ScaleToVirtualXfbWidth(EFB_WIDTH); newEFBWidth = FramebufferManagerBase::ScaleToVirtualXfbWidth(EFB_WIDTH, m_target_rectangle);
newEFBHeight = FramebufferManagerBase::ScaleToVirtualXfbHeight(EFB_HEIGHT); newEFBHeight = FramebufferManagerBase::ScaleToVirtualXfbHeight(EFB_HEIGHT, m_target_rectangle);
if (m_last_efb_scale == SCALE_AUTO_INTEGRAL) if (m_last_efb_scale == SCALE_AUTO_INTEGRAL)
{ {

View File

@ -168,7 +168,7 @@ protected:
int m_backbuffer_width = 0; int m_backbuffer_width = 0;
int m_backbuffer_height = 0; int m_backbuffer_height = 0;
int m_last_efb_scale = 0; int m_last_efb_scale = 0;
TargetRectangle m_target_rectangle; TargetRectangle m_target_rectangle = {};
bool m_xfb_written = false; bool m_xfb_written = false;
FPSCounter m_fps_counter; FPSCounter m_fps_counter;