diff -up cogl-1.10.0/cogl/winsys/cogl-winsys-glx.c.llvmpipe cogl-1.10.0/cogl/winsys/cogl-winsys-glx.c
--- cogl-1.10.0/cogl/winsys/cogl-winsys-glx.c.llvmpipe	2012-03-20 08:37:28.000000000 -0400
+++ cogl-1.10.0/cogl/winsys/cogl-winsys-glx.c	2012-04-16 11:31:57.000000000 -0400
@@ -421,8 +421,17 @@ update_winsys_features (CoglContext *con
                     TRUE);
 
   if (glx_renderer->pf_glXCopySubBuffer || context->glBlitFramebuffer)
-    COGL_FLAGS_SET (context->winsys_features,
-                    COGL_WINSYS_FEATURE_SWAP_REGION, TRUE);
+    {
+      /* This is broken in software Mesa at least as of 7.10 */
+      const GLubyte *renderer = context->glGetString (GL_RENDERER);
+      if (!strstr (renderer, "llvmpipe") &&
+	  !strstr (renderer, "softpipe") &&
+	  !strstr (renderer, "software rasterizer"))
+	{
+	  COGL_FLAGS_SET (context->winsys_features,
+			  COGL_WINSYS_FEATURE_SWAP_REGION, TRUE);
+	}
+    }
 
   /* Note: glXCopySubBuffer and glBlitFramebuffer won't be throttled
    * by the SwapInterval so we have to throttle swap_region requests
