Alters the blitter's copy function so that you can pass a framebuffer to it directly.

TRAC #21910

Signed-off-by: Daniel Koch

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1375 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libGLESv2/renderer/Image.cpp b/src/libGLESv2/renderer/Image.cpp
index 0930173..9fe315b 100644
--- a/src/libGLESv2/renderer/Image.cpp
+++ b/src/libGLESv2/renderer/Image.cpp
@@ -15,6 +15,7 @@
 #include "libGLESv2/mathutil.h"
 #include "libGLESv2/utilities.h"
 #include "libGLESv2/Texture.h"
+#include "libGLESv2/Framebuffer.h"
 
 namespace gl
 {
@@ -973,8 +974,16 @@
 }
 
 // This implements glCopyTex[Sub]Image2D for non-renderable internal texture formats and incomplete textures
-void Image::copy(GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, IDirect3DSurface9 *renderTarget)
+void Image::copy(GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, Framebuffer *source)
 {
+    IDirect3DSurface9 *renderTarget = source->getRenderTarget();
+
+    if (!renderTarget)
+    {
+        ERR("Failed to retrieve the render target.");
+        return error(GL_OUT_OF_MEMORY);
+    }
+
     IDirect3DDevice9 *device = getDisplay()->getRenderer()->getDevice(); // D3D9_REPLACE
     IDirect3DSurface9 *renderTargetData = NULL;
     D3DSURFACE_DESC description;
@@ -985,6 +994,7 @@
     if (FAILED(result))
     {
         ERR("Could not create matching destination surface.");
+        renderTarget->Release();
         return error(GL_OUT_OF_MEMORY);
     }
 
@@ -994,6 +1004,7 @@
     {
         ERR("GetRenderTargetData unexpectedly failed.");
         renderTargetData->Release();
+        renderTarget->Release();
         return error(GL_OUT_OF_MEMORY);
     }
 
@@ -1007,6 +1018,7 @@
     {
         ERR("Failed to lock the source surface (rectangle might be invalid).");
         renderTargetData->Release();
+        renderTarget->Release();
         return error(GL_OUT_OF_MEMORY);
     }
 
@@ -1018,6 +1030,7 @@
         ERR("Failed to lock the destination surface (rectangle might be invalid).");
         renderTargetData->UnlockRect();
         renderTargetData->Release();
+        renderTarget->Release();
         return error(GL_OUT_OF_MEMORY);
     }
 
@@ -1192,6 +1205,7 @@
     renderTargetData->UnlockRect();
 
     renderTargetData->Release();
+    renderTarget->Release();
 
     mDirty = true;
 }