Merge branch 'master' of git+ssh://agd5f@git.freedesktop.org/git/mesa/mesa into r6xx...
[mesa.git] / src / mesa / drivers / dri / radeon / radeon_common.c
index 3bf42e9bb0068fac80062c5d4a67f9e64ec79631..dde615a4d9dc2843f285f2c2135d9425ceb66a2a 100644 (file)
@@ -481,6 +481,32 @@ void radeonCopyBuffer( __DRIdrawablePrivate *dPriv,
                if (!n)
                        continue;
 
+               if (IS_R600_CLASS(rmesa->radeonScreen)) {
+                       int cpp = rmesa->radeonScreen->cpp;
+                       int src_pitch = rmesa->radeonScreen->backPitch * cpp;
+                       int dst_pitch = rmesa->radeonScreen->frontPitch * cpp;
+                       char *src = (char *)rmesa->radeonScreen->driScreen->pFB + rmesa->radeonScreen->backOffset;
+                       char *dst = (char *)rmesa->radeonScreen->driScreen->pFB + rmesa->radeonScreen->frontOffset;
+                       int j;
+                       drm_clip_rect_t *pb = rmesa->sarea->boxes;
+
+                       for (j = 0; j < n; j++) {
+                               int x = pb[j].x1;
+                               int y = pb[j].y1;
+                               int w = pb[j].x2 - x;
+                               int h = pb[j].y2 - y;
+
+                               src += (y * src_pitch) + (x * cpp);
+                               dst += (y * dst_pitch) + (x * cpp);
+
+                               while (h--) {
+                                       memcpy(dst, src, w * cpp);
+                                       src += src_pitch;
+                                       dst += dst_pitch;
+                               }
+                       }
+               }
+
                ret = drmCommandNone( rmesa->dri.fd, DRM_RADEON_SWAP );
 
                if ( ret ) {
@@ -1082,7 +1108,8 @@ void radeonFinish(GLcontext * ctx)
        struct gl_framebuffer *fb = ctx->DrawBuffer;
        int i;
 
-       radeonFlush(ctx);
+       if (ctx->Driver.Flush)
+               ctx->Driver.Flush(ctx); /* +r6/r7 */
 
        if (radeon->radeonScreen->kernel_mm) {
                for (i = 0; i < fb->_NumColorDrawBuffers; i++) {