diff --git a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp b/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp
index 1f70c75d69..7452e12a97 100644
--- a/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp
+++ b/Source/Plugins/Plugin_VideoOGL/Src/FramebufferManager.cpp
@@ -29,6 +29,8 @@ namespace OGL
 extern bool s_bHaveFramebufferBlit; // comes from Render.cpp. ugly.
 
 static GLuint s_VBO = 0;
+static MathUtil::Rectangle<float> s_cached_sourcerc;
+static MathUtil::Rectangle<float> s_cached_drawrc;
 
 int FramebufferManager::m_targetWidth;
 int FramebufferManager::m_targetHeight;
@@ -56,6 +58,15 @@ FramebufferManager::FramebufferManager(int targetWidth, int targetHeight, int ms
     m_resolvedDepthTexture = 0;
     m_xfbFramebuffer = 0;
 
+	s_cached_sourcerc.bottom = -1;
+	s_cached_sourcerc.left = -1;
+	s_cached_sourcerc.right = -1;
+	s_cached_sourcerc.top = -1;
+	s_cached_drawrc.bottom = -1;
+	s_cached_drawrc.left = -1;
+	s_cached_drawrc.right = -1;
+	s_cached_drawrc.top = -1;   
+	
 	m_targetWidth = targetWidth;
 	m_targetHeight = targetHeight;
 
@@ -311,23 +322,32 @@ void XFBSource::Draw(const MathUtil::Rectangle<float> &sourcerc,
 
 	glBindTexture(GL_TEXTURE_RECTANGLE_ARB, texture);
 
-	GLfloat vertices[] = {
-		drawrc.left, drawrc.bottom,
-		sourcerc.left, sourcerc.bottom,
-		0.0f, 0.0f,
-		drawrc.left, drawrc.top,
-		sourcerc.left, sourcerc.top,
-		0.0f, 1.0f,
-		drawrc.right, drawrc.top,
-		sourcerc.right, sourcerc.top,
-		1.0f, 1.0f,
-		drawrc.right, drawrc.bottom,
-		sourcerc.right, sourcerc.bottom,
-		1.0f, 0.0f
-	};
-	
-	glBindBuffer(GL_ARRAY_BUFFER, s_VBO);
-	glBufferData(GL_ARRAY_BUFFER, 2*4*3*sizeof(GLfloat), vertices, GL_STREAM_DRAW);
+	if(!(s_cached_sourcerc == sourcerc) || !(s_cached_drawrc == drawrc)) {
+		GLfloat vertices[] = {
+			drawrc.left, drawrc.bottom,
+			sourcerc.left, sourcerc.bottom,
+			0.0f, 0.0f,
+			drawrc.left, drawrc.top,
+			sourcerc.left, sourcerc.top,
+			0.0f, 1.0f,
+			drawrc.right, drawrc.top,
+			sourcerc.right, sourcerc.top,
+			1.0f, 1.0f,
+			drawrc.right, drawrc.bottom,
+			sourcerc.right, sourcerc.bottom,
+			1.0f, 0.0f
+		};
+		glBindBuffer(GL_ARRAY_BUFFER, s_VBO);
+		glBufferData(GL_ARRAY_BUFFER, 2*4*3*sizeof(GLfloat), vertices, GL_STREAM_DRAW);
+		
+		s_cached_sourcerc = sourcerc;
+		s_cached_drawrc = drawrc;
+	}
+	else
+	{
+		// TODO: remove on VAO
+		glBindBuffer(GL_ARRAY_BUFFER, s_VBO);
+	}
 	
 	// disable all pointer, TODO: use VAO
 	glEnableClientState(GL_VERTEX_ARRAY);