(view as text)
diff --git a/Source/Core/VideoBackends/D3D/PerfQuery.cpp b/Source/Core/VideoBackends/D3D/PerfQuery.cpp
index b2c77a8..425721d 100644
--- a/Source/Core/VideoBackends/D3D/PerfQuery.cpp
+++ b/Source/Core/VideoBackends/D3D/PerfQuery.cpp
@@ -28,9 +28,6 @@ PerfQuery::~PerfQuery()
 
 void PerfQuery::EnableQuery(PerfQueryGroup type)
 {
-	if (!ShouldEmulate())
-		return;
-
 	// Is this sane?
 	if (m_query_count > ArraySize(m_query_buffer) / 2)
 		WeakFlush();
@@ -56,9 +53,6 @@ void PerfQuery::EnableQuery(PerfQueryGroup type)
 
 void PerfQuery::DisableQuery(PerfQueryGroup type)
 {
-	if (!ShouldEmulate())
-		return;
-
 	// stop query
 	if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP)
 	{
@@ -75,9 +69,6 @@ void PerfQuery::ResetQuery()
 
 u32 PerfQuery::GetQueryResult(PerfQueryType type)
 {
-	if (!ShouldEmulate())
-		return 0;
-
 	u32 result = 0;
 
 	if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC)
@@ -102,9 +93,6 @@ u32 PerfQuery::GetQueryResult(PerfQueryType type)
 
 void PerfQuery::FlushOne()
 {
-	if (!ShouldEmulate())
-		return;
-
 	auto& entry = m_query_buffer[m_query_read_pos];
 
 	UINT64 result = 0;
@@ -125,18 +113,12 @@ void PerfQuery::FlushOne()
 // TODO: could selectively flush things, but I don't think that will do much
 void PerfQuery::FlushResults()
 {
-	if (!ShouldEmulate())
-		return;
-
 	while (!IsFlushed())
 		FlushOne();
 }
 
 void PerfQuery::WeakFlush()
 {
-	if (!ShouldEmulate())
-		return;
-
 	while (!IsFlushed())
 	{
 		auto& entry = m_query_buffer[m_query_read_pos];
@@ -161,9 +143,6 @@ void PerfQuery::WeakFlush()
 
 bool PerfQuery::IsFlushed() const
 {
-	if (!ShouldEmulate())
-		return true;
-
 	return 0 == m_query_count;
 }
 
diff --git a/Source/Core/VideoBackends/D3D/Render.cpp b/Source/Core/VideoBackends/D3D/Render.cpp
index 1c1955a..ad693f2 100644
--- a/Source/Core/VideoBackends/D3D/Render.cpp
+++ b/Source/Core/VideoBackends/D3D/Render.cpp
@@ -7,7 +7,6 @@
 
 #include "Timer.h"
 
-#include "Debugger.h"
 #include "EmuWindow.h"
 #include "Fifo.h"
 #include "OnScreenDisplay.h"
@@ -303,9 +302,10 @@ bool Renderer::CheckForResize()
 	return false;
 }
 
-void Renderer::SetScissorRect(const TargetRectangle& rc)
+void Renderer::SetScissorRect(const EFBRectangle& rc)
 {
-	D3D::context->RSSetScissorRects(1, rc.AsRECT());
+	TargetRectangle trc = ConvertEFBRectangle(rc);
+	D3D::context->RSSetScissorRects(1, trc.AsRECT());
 }
 
 void Renderer::SetColorMask()
@@ -476,8 +476,7 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
 }
 
 
-// Called from VertexShaderManager
-void Renderer::UpdateViewport()
+void Renderer::SetViewport()
 {
 	// reversed gxsetviewport(xorig, yorig, width, height, nearz, farz)
 	// [0] = width/2
@@ -725,7 +724,7 @@ void formatBufferDump(const u8* in, u8* out, int w, int h, int p)
 }
 
 // This function has the final picture. We adjust the aspect ratio here.
-void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
+void Renderer::vSwap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
 {
 	if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
 	{
@@ -945,9 +944,6 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r
 
 	OSD::DrawMessages();
 	D3D::EndFrame();
-	frameCount++;
-
-	GFX_DEBUGGER_PAUSE_AT(NEXT_FRAME, true);
 
 	TextureCache::Cleanup();
 
@@ -974,11 +970,6 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r
 	if (XFBWrited)
 		s_fps = UpdateFPSCounter();
 
-	// Begin new frame
-	// Set default viewport and scissor, for the clear to work correctly
-	// New frame
-	stats.ResetFrame();
-
 	// Flip/present backbuffer to frontbuffer here
 	D3D::Present();
 
@@ -1018,10 +1009,7 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r
 	RestoreAPIState();
 	D3D::BeginFrame();
 	D3D::context->OMSetRenderTargets(1, &FramebufferManager::GetEFBColorTexture()->GetRTV(), FramebufferManager::GetEFBDepthTexture()->GetDSV());
-	UpdateViewport();
-
-	Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB));
-	XFBWrited = false;
+	SetViewport();
 }
 
 // ALWAYS call RestoreAPIState for each ResetAPIState call you're doing
@@ -1038,7 +1026,7 @@ void Renderer::RestoreAPIState()
 	D3D::stateman->PopBlendState();
 	D3D::stateman->PopDepthState();
 	D3D::stateman->PopRasterizerState();
-	UpdateViewport();
+	SetViewport();
 	BPFunctions::SetScissor();
 }
 
diff --git a/Source/Core/VideoBackends/D3D/Render.h b/Source/Core/VideoBackends/D3D/Render.h
index 12e5b59..eb67e90 100644
--- a/Source/Core/VideoBackends/D3D/Render.h
+++ b/Source/Core/VideoBackends/D3D/Render.h
@@ -15,7 +15,7 @@ public:
 
 	void SetColorMask();
 	void SetBlendMode(bool forceUpdate);
-	void SetScissorRect(const TargetRectangle& rc);
+	void SetScissorRect(const EFBRectangle& rc);
 	void SetGenerationMode();
 	void SetDepthMode();
 	void SetLogicOpMode();
@@ -23,6 +23,7 @@ public:
 	void SetLineWidth();
 	void SetSamplerState(int stage,int texindex);
 	void SetInterlacingMode();
+	void SetViewport();
 
 	// TODO: Fix confusing names (see ResetAPIState and RestoreAPIState)
 	void ApplyState(bool bUseDstAlpha);
@@ -40,14 +41,12 @@ public:
 
 	TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc);
 
-	void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma);
+	void vSwap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma);
 
 	void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z);
 
 	void ReinterpretPixelData(unsigned int convtype);
 
-	void UpdateViewport();
-
 	bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc);
 
 	static bool CheckForResize();
diff --git a/Source/Core/VideoBackends/D3D/VertexManager.cpp b/Source/Core/VideoBackends/D3D/VertexManager.cpp
index f8274ee..a85c850 100644
--- a/Source/Core/VideoBackends/D3D/VertexManager.cpp
+++ b/Source/Core/VideoBackends/D3D/VertexManager.cpp
@@ -197,11 +197,8 @@ void VertexManager::Draw(UINT stride)
 	}
 }
 
-void VertexManager::vFlush()
+void VertexManager::vFlush(bool useDstAlpha)
 {
-	bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate &&
-		bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24;
-
 	if (!PixelShaderCache::SetShader(
 		useDstAlpha ? DSTALPHA_DUAL_SOURCE_BLEND : DSTALPHA_NONE,
 		g_nativeVertexFmt->m_components))
@@ -219,11 +216,7 @@ void VertexManager::vFlush()
 	g_nativeVertexFmt->SetupVertexPointers();
 	g_renderer->ApplyState(useDstAlpha);
 
-	g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP);
 	Draw(stride);
-	g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP);
-
-	GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true);
 
 	g_renderer->RestoreState();
 }
diff --git a/Source/Core/VideoBackends/D3D/VertexManager.h b/Source/Core/VideoBackends/D3D/VertexManager.h
index 644d13a..5810558 100644
--- a/Source/Core/VideoBackends/D3D/VertexManager.h
+++ b/Source/Core/VideoBackends/D3D/VertexManager.h
@@ -31,7 +31,7 @@ private:
 	void PrepareDrawBuffers();
 	void Draw(u32 stride);
 	// temp
-	void vFlush();
+	void vFlush(bool useDstAlpha);
 
 	u32 m_vertex_buffer_cursor;
 	u32 m_vertex_draw_offset;
diff --git a/Source/Core/VideoBackends/OGL/PerfQuery.cpp b/Source/Core/VideoBackends/OGL/PerfQuery.cpp
index 0dd97d9..a002051 100644
--- a/Source/Core/VideoBackends/OGL/PerfQuery.cpp
+++ b/Source/Core/VideoBackends/OGL/PerfQuery.cpp
@@ -28,9 +28,6 @@ PerfQuery::~PerfQuery()
 
 void PerfQuery::EnableQuery(PerfQueryGroup type)
 {
-	if (!ShouldEmulate())
-		return;
-
 	// Is this sane?
 	if (m_query_count > ArraySize(m_query_buffer) / 2)
 		WeakFlush();
@@ -55,9 +52,6 @@ void PerfQuery::EnableQuery(PerfQueryGroup type)
 
 void PerfQuery::DisableQuery(PerfQueryGroup type)
 {
-	if (!ShouldEmulate())
-		return;
-
 	// stop query
 	if (type == PQG_ZCOMP_ZCOMPLOC || type == PQG_ZCOMP)
 	{
@@ -67,17 +61,11 @@ void PerfQuery::DisableQuery(PerfQueryGroup type)
 
 bool PerfQuery::IsFlushed() const
 {
-	if (!ShouldEmulate())
-		return true;
-
 	return 0 == m_query_count;
 }
 
 void PerfQuery::FlushOne()
 {
-	if (!ShouldEmulate())
-		return;
-
 	auto& entry = m_query_buffer[m_query_read_pos];
 
 	GLuint result = 0;
@@ -93,18 +81,12 @@ void PerfQuery::FlushOne()
 // TODO: could selectively flush things, but I don't think that will do much
 void PerfQuery::FlushResults()
 {
-	if (!ShouldEmulate())
-		return;
-
 	while (!IsFlushed())
 		FlushOne();
 }
 
 void PerfQuery::WeakFlush()
 {
-	if (!ShouldEmulate())
-		return;
-
 	while (!IsFlushed())
 	{
 		auto& entry = m_query_buffer[m_query_read_pos];
@@ -131,9 +113,6 @@ void PerfQuery::ResetQuery()
 
 u32 PerfQuery::GetQueryResult(PerfQueryType type)
 {
-	if (!ShouldEmulate())
-		return 0;
-
 	u32 result = 0;
 
 	if (type == PQ_ZCOMP_INPUT_ZCOMPLOC || type == PQ_ZCOMP_OUTPUT_ZCOMPLOC)
diff --git a/Source/Core/VideoBackends/OGL/Render.cpp b/Source/Core/VideoBackends/OGL/Render.cpp
index 8921fdd..f55f4ee 100644
--- a/Source/Core/VideoBackends/OGL/Render.cpp
+++ b/Source/Core/VideoBackends/OGL/Render.cpp
@@ -44,7 +44,6 @@
 #include "StringUtil.h"
 #include "FramebufferManager.h"
 #include "Fifo.h"
-#include "Debugger.h"
 #include "Core.h"
 #include "Movie.h"
 #include "BPFunctions.h"
@@ -863,9 +862,10 @@ TargetRectangle Renderer::ConvertEFBRectangle(const EFBRectangle& rc)
 // Renderer::GetTargetHeight() = the fixed ini file setting
 // donkopunchstania - it appears scissorBR is the bottom right pixel inside the scissor box
 // therefore the width and height are (scissorBR + 1) - scissorTL
-void Renderer::SetScissorRect(const TargetRectangle& rc)
+void Renderer::SetScissorRect(const EFBRectangle& rc)
 {
-	glScissor(rc.left, rc.bottom, rc.GetWidth(), rc.GetHeight());
+	TargetRectangle trc = g_renderer->ConvertEFBRectangle(rc);
+	glScissor(trc.left, trc.bottom, trc.GetWidth(), trc.GetHeight());
 }
 
 void Renderer::SetColorMask()
@@ -1079,8 +1079,7 @@ u32 Renderer::AccessEFB(EFBAccessType type, u32 x, u32 y, u32 poke_data)
 	return 0;
 }
 
-// Called from VertexShaderManager
-void Renderer::UpdateViewport()
+void Renderer::SetViewport()
 {
 	// reversed gxsetviewport(xorig, yorig, width, height, nearz, farz)
 	// [0] = width/2
@@ -1278,7 +1277,7 @@ void DumpFrame(const std::vector<u8>& data, int w, int h)
 }
 
 // This function has the final picture. We adjust the aspect ratio here.
-void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
+void Renderer::vSwap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& rc,float Gamma)
 {
 	static int w = 0, h = 0;
 	if (g_bSkipCurrentFrame || (!XFBWrited && !g_ActiveConfig.RealXFBEnabled()) || !fbWidth || !fbHeight)
@@ -1594,15 +1593,6 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r
 	// Clean out old stuff from caches. It's not worth it to clean out the shader caches.
 	TextureCache::Cleanup();
 
-	frameCount++;
-
-	GFX_DEBUGGER_PAUSE_AT(NEXT_FRAME, true);
-
-	// Begin new frame
-	// Set default viewport and scissor, for the clear to work correctly
-	// New frame
-	stats.ResetFrame();
-
 	// Render to the framebuffer.
 	FramebufferManager::SetFramebuffer(0);
 
@@ -1620,8 +1610,6 @@ void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight,const EFBRectangle& r
 	// Renderer::SetZBufferRender();
 	// SaveTexture("tex.png", GL_TEXTURE_2D, s_FakeZTarget,
 	//	      GetTargetWidth(), GetTargetHeight());
-	Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB));
-	XFBWrited = false;
 
 	// Invalidate EFB cache
 	ClearEFBCache();
@@ -1652,7 +1640,7 @@ void Renderer::RestoreAPIState()
 	SetDepthMode();
 	SetBlendMode(true);
 	SetLogicOpMode();
-	UpdateViewport();
+	SetViewport();
 
 	if (GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGL)
 		glPolygonMode(GL_FRONT_AND_BACK, g_ActiveConfig.bWireFrame ? GL_LINE : GL_FILL);
diff --git a/Source/Core/VideoBackends/OGL/Render.h b/Source/Core/VideoBackends/OGL/Render.h
index 58ba086..0bb6cf6 100644
--- a/Source/Core/VideoBackends/OGL/Render.h
+++ b/Source/Core/VideoBackends/OGL/Render.h
@@ -48,7 +48,7 @@ public:
 
 	void SetColorMask() override;
 	void SetBlendMode(bool forceUpdate) override;
-	void SetScissorRect(const TargetRectangle& rc) override;
+	void SetScissorRect(const EFBRectangle& rc) override;
 	void SetGenerationMode() override;
 	void SetDepthMode() override;
 	void SetLogicOpMode() override;
@@ -56,6 +56,7 @@ public:
 	void SetLineWidth() override;
 	void SetSamplerState(int stage,int texindex) override;
 	void SetInterlacingMode() override;
+	void SetViewport() override;
 
 	// TODO: Implement and use these
 	void ApplyState(bool bUseDstAlpha) override {}
@@ -72,14 +73,12 @@ public:
 
 	TargetRectangle ConvertEFBRectangle(const EFBRectangle& rc) override;
 
-	void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma) override;
+	void vSwap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma) override;
 
 	void ClearScreen(const EFBRectangle& rc, bool colorEnable, bool alphaEnable, bool zEnable, u32 color, u32 z) override;
 
 	void ReinterpretPixelData(unsigned int convtype) override;
 
-	void UpdateViewport() override;
-
 	bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc);
 
 private:
diff --git a/Source/Core/VideoBackends/OGL/VertexManager.cpp b/Source/Core/VideoBackends/OGL/VertexManager.cpp
index aed97e2..670dd7d 100644
--- a/Source/Core/VideoBackends/OGL/VertexManager.cpp
+++ b/Source/Core/VideoBackends/OGL/VertexManager.cpp
@@ -25,9 +25,7 @@
 #include "VertexManager.h"
 #include "IndexGenerator.h"
 #include "FileUtil.h"
-#include "Debugger.h"
 #include "StreamBuffer.h"
-#include "PerfQueryBase.h"
 #include "Render.h"
 
 #include "main.h"
@@ -131,7 +129,7 @@ void VertexManager::Draw(u32 stride)
 	INCSTAT(stats.thisFrame.numIndexedDrawCalls);
 }
 
-void VertexManager::vFlush()
+void VertexManager::vFlush(bool useDstAlpha)
 {
 	GLVertexFormat *nativeVertexFmt = (GLVertexFormat*)g_nativeVertexFmt;
 	u32 stride  = nativeVertexFmt->GetVertexStride();
@@ -144,9 +142,6 @@ void VertexManager::vFlush()
 	PrepareDrawBuffers(stride);
 	GL_REPORT_ERRORD();
 
-	bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate
-		&& bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24;
-
 	// Makes sure we can actually do Dual source blending
 	bool dualSourcePossible = g_ActiveConfig.backend_info.bSupportsDualSourceBlend;
 
@@ -177,10 +172,7 @@ void VertexManager::vFlush()
 		g_nativeVertexFmt->SetupVertexPointers();
 	GL_REPORT_ERRORD();
 
-	g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP);
 	Draw(stride);
-	g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP);
-	//ERROR_LOG(VIDEO, "PerfQuery result: %d", g_perf_query->GetQueryResult(bpmem.zcontrol.early_ztest ? PQ_ZCOMP_OUTPUT_ZCOMPLOC : PQ_ZCOMP_OUTPUT));
 
 	// run through vertex groups again to set alpha
 	if (useDstAlpha && !dualSourcePossible)
@@ -200,7 +192,6 @@ void VertexManager::vFlush()
 		if (bpmem.blendmode.blendenable || bpmem.blendmode.subtract)
 			glEnable(GL_BLEND);
 	}
-	GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true);
 
 #if defined(_DEBUG) || defined(DEBUGFAST)
 	if (g_ActiveConfig.iLog & CONF_SAVESHADERS)
diff --git a/Source/Core/VideoBackends/OGL/VertexManager.h b/Source/Core/VideoBackends/OGL/VertexManager.h
index 11001ff..4e82c9a 100644
--- a/Source/Core/VideoBackends/OGL/VertexManager.h
+++ b/Source/Core/VideoBackends/OGL/VertexManager.h
@@ -44,7 +44,7 @@ protected:
 	virtual void ResetBuffer(u32 stride);
 private:
 	void Draw(u32 stride);
-	void vFlush() override;
+	void vFlush(bool useDstAlpha) override;
 	void PrepareDrawBuffers(u32 stride);
 	NativeVertexFormat *m_CurrentVertexFmt;
 };
diff --git a/Source/Core/VideoBackends/OGL/main.cpp b/Source/Core/VideoBackends/OGL/main.cpp
index ba7f1a0..184b567 100644
--- a/Source/Core/VideoBackends/OGL/main.cpp
+++ b/Source/Core/VideoBackends/OGL/main.cpp
@@ -97,7 +97,7 @@ std::string VideoBackend::GetName()
 
 std::string VideoBackend::GetDisplayName()
 {
-	if (g_renderer && GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGLES3)
+	if (GLInterface != nullptr && GLInterface->GetMode() == GLInterfaceMode::MODE_OPENGLES3)
 		return "OpenGLES";
 	else
 		return "OpenGL";
diff --git a/Source/Core/VideoCommon/BPFunctions.cpp b/Source/Core/VideoCommon/BPFunctions.cpp
index 43623a9..3cc1764 100644
--- a/Source/Core/VideoCommon/BPFunctions.cpp
+++ b/Source/Core/VideoCommon/BPFunctions.cpp
@@ -47,8 +47,7 @@ void SetScissor()
 	if (rc.left > rc.right) rc.right = rc.left;
 	if (rc.top > rc.bottom) rc.bottom = rc.top;
 
-	TargetRectangle trc = g_renderer->ConvertEFBRectangle(rc);
-	g_renderer->SetScissorRect(trc);
+	g_renderer->SetScissorRect(rc);
 }
 
 void SetLineWidth()
diff --git a/Source/Core/VideoCommon/BPStructs.cpp b/Source/Core/VideoCommon/BPStructs.cpp
index 5482dae..2434d34 100644
--- a/Source/Core/VideoCommon/BPStructs.cpp
+++ b/Source/Core/VideoCommon/BPStructs.cpp
@@ -423,7 +423,8 @@ void BPWritten(const BPCmd& bp)
 
 	case BPMEM_CLEAR_PIXEL_PERF:
 		// GXClearPixMetric writes 0xAAA here, Sunshine alternates this register between values 0x000 and 0xAAA
-		g_perf_query->ResetQuery();
+		if(PerfQueryBase::ShouldEmulate())
+			g_perf_query->ResetQuery();
 		break;
 
 	case BPMEM_PRELOAD_ADDR:
diff --git a/Source/Core/VideoCommon/MainBase.cpp b/Source/Core/VideoCommon/MainBase.cpp
index 7d81e4a..1285707 100644
--- a/Source/Core/VideoCommon/MainBase.cpp
+++ b/Source/Core/VideoCommon/MainBase.cpp
@@ -72,7 +72,7 @@ void VideoFifo_CheckSwapRequest()
 		if (Common::AtomicLoadAcquire(s_swapRequested))
 		{
 			EFBRectangle rc;
-			g_renderer->Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc);
+			Renderer::Swap(s_beginFieldArgs.xfbAddr, s_beginFieldArgs.fbWidth, s_beginFieldArgs.fbHeight,rc);
 			Common::AtomicStoreRelease(s_swapRequested, false);
 		}
 	}
diff --git a/Source/Core/VideoCommon/PerfQueryBase.cpp b/Source/Core/VideoCommon/PerfQueryBase.cpp
index af8bfa7..ada539c 100644
--- a/Source/Core/VideoCommon/PerfQueryBase.cpp
+++ b/Source/Core/VideoCommon/PerfQueryBase.cpp
@@ -3,7 +3,7 @@
 
 PerfQueryBase* g_perf_query = 0;
 
-bool PerfQueryBase::ShouldEmulate() const
+bool PerfQueryBase::ShouldEmulate()
 {
 	return g_ActiveConfig.bPerfQueriesEnable;
 }
diff --git a/Source/Core/VideoCommon/PerfQueryBase.h b/Source/Core/VideoCommon/PerfQueryBase.h
index 1136eea..12b7e8e 100644
--- a/Source/Core/VideoCommon/PerfQueryBase.h
+++ b/Source/Core/VideoCommon/PerfQueryBase.h
@@ -30,7 +30,7 @@ public:
 
 	// Checks if performance queries are enabled in the gameini configuration.
 	// NOTE: Called from CPU+GPU thread
-	bool ShouldEmulate() const;
+	static bool ShouldEmulate();
 
 	// Begin querying the specified value for the following host GPU commands
 	virtual void EnableQuery(PerfQueryGroup type) {}
diff --git a/Source/Core/VideoCommon/RenderBase.cpp b/Source/Core/VideoCommon/RenderBase.cpp
index 7f046e5..053d86e 100644
--- a/Source/Core/VideoCommon/RenderBase.cpp
+++ b/Source/Core/VideoCommon/RenderBase.cpp
@@ -30,6 +30,9 @@
 #include "XFMemory.h"
 #include "FifoPlayer/FifoRecorder.h"
 #include "AVIDump.h"
+#include "Debugger.h"
+#include "Statistics.h"
+#include "Core.h"
 
 #include <cmath>
 #include <string>
@@ -117,7 +120,7 @@ void Renderer::RenderToXFB(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRect
 	}
 	else
 	{
-		g_renderer->Swap(xfbAddr, fbWidth, fbHeight,sourceRc,Gamma);
+		Swap(xfbAddr, fbWidth, fbHeight,sourceRc,Gamma);
 		Common::AtomicStoreRelease(s_swapRequested, false);
 	}
 }
@@ -509,8 +512,25 @@ void Renderer::RecordVideoMemory()
 	FifoRecorder::GetInstance().SetVideoMemory(bpMem, cpMem, xfMem, xfRegs, sizeof(XFRegisters) / 4);
 }
 
-void UpdateViewport()
+void SetViewport()
 {
 	if (xfregs.viewport.wd != 0 && xfregs.viewport.ht != 0)
-		g_renderer->UpdateViewport();
+		g_renderer->SetViewport();
+}
+
+void Renderer::Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc, float Gamma)
+{
+	// TODO: merge more generic parts into VideoCommon
+	g_renderer->vSwap(xfbAddr, fbWidth, fbHeight, rc, Gamma);
+
+	frameCount++;
+	GFX_DEBUGGER_PAUSE_AT(NEXT_FRAME, true);
+
+	// Begin new frame
+	// Set default viewport and scissor, for the clear to work correctly
+	// New frame
+	stats.ResetFrame();
+
+	Core::Callback_VideoCopiedToXFB(XFBWrited || (g_ActiveConfig.bUseXFB && g_ActiveConfig.bUseRealXFB));
+	XFBWrited = false;
 }
diff --git a/Source/Core/VideoCommon/RenderBase.h b/Source/Core/VideoCommon/RenderBase.h
index 08c39f8..9a7ee61 100644
--- a/Source/Core/VideoCommon/RenderBase.h
+++ b/Source/Core/VideoCommon/RenderBase.h
@@ -50,7 +50,7 @@ public:
 
 	virtual void SetColorMask() = 0;
 	virtual void SetBlendMode(bool forceUpdate) = 0;
-	virtual void SetScissorRect(const TargetRectangle& rc) = 0;
+	virtual void SetScissorRect(const EFBRectangle& rc) = 0;
 	virtual void SetGenerationMode() = 0;
 	virtual void SetDepthMode() = 0;
 	virtual void SetLogicOpMode() = 0;
@@ -58,6 +58,7 @@ public:
 	virtual void SetLineWidth() = 0;
 	virtual void SetSamplerState(int stage,int texindex) = 0;
 	virtual void SetInterlacingMode() = 0;
+	virtual void SetViewport() = 0;
 
 	virtual void ApplyState(bool bUseDstAlpha) = 0;
 	virtual void RestoreState() = 0;
@@ -106,9 +107,8 @@ public:
 	virtual void RestoreAPIState() = 0;
 
 	// Finish up the current frame, print some stats
-	virtual void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0;
-
-	virtual void UpdateViewport() = 0;
+	static void Swap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f);
+	virtual void vSwap(u32 xfbAddr, u32 fbWidth, u32 fbHeight, const EFBRectangle& rc,float Gamma = 1.0f) = 0;
 
 	virtual bool SaveScreenshot(const std::string &filename, const TargetRectangle &rc) = 0;
 
@@ -161,6 +161,6 @@ private:
 
 extern Renderer *g_renderer;
 
-void UpdateViewport();
+extern void SetViewport();
 
 #endif // _COMMON_RENDERBASE_H_
diff --git a/Source/Core/VideoCommon/VertexManagerBase.cpp b/Source/Core/VideoCommon/VertexManagerBase.cpp
index c4980ae..0ea44d9 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.cpp
+++ b/Source/Core/VideoCommon/VertexManagerBase.cpp
@@ -11,6 +11,8 @@
 #include "RenderBase.h"
 #include "BPStructs.h"
 #include "XFMemory.h"
+#include "Debugger.h"
+#include "PerfQueryBase.h"
 
 #include "VertexManagerBase.h"
 #include "MainBase.h"
@@ -216,8 +218,16 @@ void VertexManager::Flush()
 	VertexShaderManager::SetConstants();
 	PixelShaderManager::SetConstants();
 
-	// TODO: need to merge more stuff into VideoCommon
-	g_vertex_manager->vFlush();
+	bool useDstAlpha = !g_ActiveConfig.bDstAlphaPass && bpmem.dstalpha.enable && bpmem.blendmode.alphaupdate
+		&& bpmem.zcontrol.pixel_format == PIXELFMT_RGBA6_Z24;
+
+	if(PerfQueryBase::ShouldEmulate())
+		g_perf_query->EnableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP);
+	g_vertex_manager->vFlush(useDstAlpha);
+	if(PerfQueryBase::ShouldEmulate())
+		g_perf_query->DisableQuery(bpmem.zcontrol.early_ztest ? PQG_ZCOMP_ZCOMPLOC : PQG_ZCOMP);
+
+	GFX_DEBUGGER_PAUSE_AT(NEXT_FLUSH, true);
 
 	IsFlushed = true;
 }
diff --git a/Source/Core/VideoCommon/VertexManagerBase.h b/Source/Core/VideoCommon/VertexManagerBase.h
index 83787e5..72353e7 100644
--- a/Source/Core/VideoCommon/VertexManagerBase.h
+++ b/Source/Core/VideoCommon/VertexManagerBase.h
@@ -60,7 +60,7 @@ private:
 
 	//virtual void Draw(u32 stride, bool alphapass) = 0;
 	// temp
-	virtual void vFlush() = 0;
+	virtual void vFlush(bool useDstAlpha) = 0;
 };
 
 extern VertexManager *g_vertex_manager;
diff --git a/Source/Core/VideoCommon/VertexShaderManager.cpp b/Source/Core/VideoCommon/VertexShaderManager.cpp
index 4632d09..169de08 100644
--- a/Source/Core/VideoCommon/VertexShaderManager.cpp
+++ b/Source/Core/VideoCommon/VertexShaderManager.cpp
@@ -18,6 +18,7 @@
 #include "XFMemory.h"
 #include "VideoCommon.h"
 #include "VertexManagerBase.h"
+#include "RenderBase.h"
 
 #include "RenderBase.h"
 float GC_ALIGNED16(g_fProjectionMatrix[16]);
@@ -173,8 +174,6 @@ static void ViewportCorrectionMatrix(Matrix44& result)
 	result.data[4*1+3] = (-intendedHt + 2.f * (Y - intendedY)) / Ht + 1.f;
 }
 
-void UpdateViewport();
-
 void VertexShaderManager::Init()
 {
 	Dirty();
@@ -373,7 +372,7 @@ void VertexShaderManager::SetConstants()
 		constants.depthparams[1] = xfregs.viewport.zRange / 16777216.0f;
 		dirty = true;
 		// This is so implementation-dependent that we can't have it here.
-		UpdateViewport();
+		SetViewport();
 		
 		// Update projection if the viewport isn't 1:1 useable
 		if(!g_ActiveConfig.backend_info.bSupportsOversizedViewports)