diff --git a/dlls/wined3d/swapchain.c b/dlls/wined3d/swapchain.c
index ccec8dc..134f4f6 100644
--- a/dlls/wined3d/swapchain.c
+++ b/dlls/wined3d/swapchain.c
@@ -425,34 +425,20 @@ #endif
 
 static HRESULT WINAPI IWineD3DSwapChainImpl_GetFrontBufferData(IWineD3DSwapChain *iface, IWineD3DSurface *pDestSurface) {
     IWineD3DSwapChainImpl *This = (IWineD3DSwapChainImpl *)iface;
-    WINED3DFORMAT d3dformat;
-    UINT width;
-    UINT height;
-    WINED3DSURFACE_DESC desc;
-    glDescriptor *glDescription;
+    WINDOWPLACEMENT wpl;
 
     TRACE("(%p) : iface(%p) pDestSurface(%p)\n", This, iface, pDestSurface);
-    ENTER_GL();
-    memset(&desc, 0, sizeof(desc));
-    desc.Width =  &width;
-    desc.Height = &height;
-    desc.Format = &d3dformat;
+    
+    if (!GetWindowPlacement(This->win_handle,&wpl)) {
+        FIXME("failed to get window position\n");
+        return WINED3DERR_INVALIDCALL;
+    }
+    
 #if 0 /* TODO: make sure that this swapchains context is active */
     IWineD3DDevice_ActivateSwapChainContext(This->wineD3DDevice, iface);
 #endif
-    IWineD3DSurface_GetDesc(pDestSurface, &desc);
-    /* make sure that the front buffer is the active read buffer */
-    glReadBuffer(GL_FRONT);
-    /* Read the pixels from the buffer into the surfaces memory */
-    IWineD3DSurface_GetGlDesc(pDestSurface, &glDescription);
-    glReadPixels(glDescription->target,
-                glDescription->level,
-                width,
-                height,
-                glDescription->glFormat,
-                glDescription->glType,
-                (void *)IWineD3DSurface_GetData(pDestSurface));
-    LEAVE_GL();
+    IWineD3DSurface_BltFast(pDestSurface, wpl.rcNormalPosition.left, wpl.rcNormalPosition.top , This->frontBuffer, NULL, 0);
+
     return WINED3D_OK;
 }
 
