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>
This commit is contained in:
Thomas Hellstrom 2011-02-24 13:03:07 +01:00
parent d1e4117355
commit 2b079485f6
2 changed files with 45 additions and 0 deletions

View 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;
}

View 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);