summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-08-18 09:24:48 +0100
committerChris Wilson <chris@chris-wilson.co.uk>2012-08-18 09:24:48 +0100
commit75b0f870e311a801790ad108f6dfa13cf42e461d (patch)
treebdb609a8947213ccdfe2420bb2d1c9a4c5887656
parentbff332662ef91b2cf77acb7ea7cbd7dc497b1f04 (diff)
ximage: Provide double buffering for the similar image
-rw-r--r--ximage.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/ximage.c b/ximage.c
index a3de2b0..7420708 100644
--- a/ximage.c
+++ b/ximage.c
@@ -8,7 +8,8 @@
struct ximage_device {
struct device base;
- struct framebuffer fb;
+ struct framebuffer fb[2];
+ int q;
};
static void
@@ -41,7 +42,8 @@ static struct framebuffer *
get_fb (struct device *abstract_device)
{
struct ximage_device *device = (struct ximage_device *) abstract_device;
- return &device->fb;
+ int q = ++device->q & 1;
+ return &device->fb[q];
}
static void
@@ -57,8 +59,8 @@ static struct framebuffer *
get_inplace_fb (struct device *abstract_device)
{
struct ximage_device *device = (struct ximage_device *) abstract_device;
- device->fb.surface = cairo_surface_map_to_image (device->base.scanout, NULL);
- return &device->fb;
+ device->fb[0].surface = cairo_surface_map_to_image (device->base.scanout, NULL);
+ return &device->fb[0];
}
struct device *
@@ -147,24 +149,28 @@ ximage_open (int argc, char **argv)
device->base.width, device->base.height);
if (map) {
- device->fb.show = inplace_show;
+ device->fb[0].show = inplace_show;
device->base.get_framebuffer = get_inplace_fb;
} else {
- if (similar)
- device->fb.surface =
+ if (similar) {
+ device->fb[0].surface =
cairo_surface_create_similar_image (device->base.scanout,
CAIRO_FORMAT_RGB24,
device->base.width, device->base.height);
- else
- device->fb.surface =
+ device->fb[1].surface =
+ cairo_surface_create_similar_image (device->base.scanout,
+ CAIRO_FORMAT_RGB24,
+ device->base.width, device->base.height);
+ } else
+ device->fb[1].surface = device->fb[0].surface =
cairo_image_surface_create (CAIRO_FORMAT_RGB24,
device->base.width, device->base.height);
- device->fb.show = show;
+ device->fb[1].show = device->fb[0].show = show;
device->base.get_framebuffer = get_fb;
}
- device->fb.destroy = destroy;
- device->fb.device = &device->base;
+ device->fb[1].destroy = device->fb[0].destroy = destroy;
+ device->fb[1].device = device->fb[0].device = &device->base;
return &device->base;
}