summaryrefslogtreecommitdiff
path: root/src/gallium
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2011-02-24 13:03:07 +0100
committerThomas Hellstrom <thellstrom@vmware.com>2011-03-01 10:36:19 +0100
commit2b079485f6092051ebb7fec0e6210d6743926064 (patch)
treea4906a80ba23165c94bc7abaeca127ca84d9771a /src/gallium
parentd1e4117355f1db6ff87c837df6212bf6168e98a0 (diff)
st/egl: Add a helper to perform a copy swap on a resource surface
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>
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/state_trackers/egl/common/native_helper.c41
-rw-r--r--src/gallium/state_trackers/egl/common/native_helper.h4
2 files changed, 45 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/egl/common/native_helper.c b/src/gallium/state_trackers/egl/common/native_helper.c
index a9d8f32e007..0f00c4d13ef 100644
--- a/src/gallium/state_trackers/egl/common/native_helper.c
+++ b/src/gallium/state_trackers/egl/common/native_helper.c
@@ -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;
+}
diff --git a/src/gallium/state_trackers/egl/common/native_helper.h b/src/gallium/state_trackers/egl/common/native_helper.h
index 03995de19ae..ad6827336a3 100644
--- a/src/gallium/state_trackers/egl/common/native_helper.h
+++ b/src/gallium/state_trackers/egl/common/native_helper.h
@@ -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);