st/egl: Add a helper to perform a copy swap on a resource surface
authorThomas Hellstrom <thellstrom@vmware.com>
Thu, 24 Feb 2011 12:03:07 +0000 (13:03 +0100)
committerThomas Hellstrom <thellstrom@vmware.com>
Tue, 1 Mar 2011 09:36:19 +0000 (10:36 +0100)
The copy swap can be used when we need to preserve the contents of
the back buffer or when there is no way to do native page-flipping.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
src/gallium/state_trackers/egl/common/native_helper.c
src/gallium/state_trackers/egl/common/native_helper.h

index a9d8f32e007bc35dc81020212e0289c923104683..0f00c4d13ef315ddca1188d3f6b45afab3082b6a 100644 (file)
@@ -225,3 +225,44 @@ resource_surface_present(struct resource_surface *rsurf,
 
    return TRUE;
 }
+
+/**
+ * Schedule a copy swap from the back to the front buffer using the
+ * native display's copy context.
+ */
+boolean
+resource_surface_copy_swap(struct resource_surface *rsurf,
+                          struct native_display *ndpy)
+{
+   struct pipe_resource *ftex;
+   struct pipe_resource *btex;
+   struct pipe_context *pipe;
+   struct pipe_box src_box;
+   boolean ret = FALSE;
+
+   pipe = ndpy_get_copy_context(ndpy);
+   if (!pipe)
+      return FALSE;
+
+   ftex = resource_surface_get_single_resource(rsurf,
+                                              NATIVE_ATTACHMENT_FRONT_LEFT);
+   if (!ftex)
+      goto out_no_ftex;
+   btex = resource_surface_get_single_resource(rsurf,
+                                              NATIVE_ATTACHMENT_BACK_LEFT);
+   if (!btex)
+      goto out_no_btex;
+
+   u_box_origin_2d(ftex->width0, ftex->height0, &src_box);
+   pipe->resource_copy_region(pipe, ftex, 0, 0, 0, 0,
+                             btex, 0, &src_box);
+   pipe->flush(pipe, PIPE_FLUSH_RENDER_CACHE, NULL);
+   ret = TRUE;
+
+ out_no_ftex:
+   pipe_resource_reference(&btex, NULL);
+ out_no_btex:
+   pipe_resource_reference(&ftex, NULL);
+
+   return ret;
+}
index 03995de19ae30c5afe3b3c39b325f340c9eaae13..ad6827336a3dd9311cbb4be0877afaf723dc8e9f 100644 (file)
@@ -74,3 +74,7 @@ boolean
 resource_surface_present(struct resource_surface *rsurf,
                          enum native_attachment which,
                          void *winsys_drawable_handle);
+
+boolean
+resource_surface_copy_swap(struct resource_surface *rsurf,
+                          struct native_display *ndpy);