diff options
| author | Bryce Harrington <bryce@osg.samsung.com> | 2017-12-01 20:11:12 -0800 |
|---|---|---|
| committer | Bryce Harrington <bryce@osg.samsung.com> | 2017-12-01 20:19:53 -0800 |
| commit | 45f67bf2ab96f15ef2d99848ef150128b3d44465 (patch) | |
| tree | 4c122afb9043665a0a9c901efd93827a643b2b28 /src/cairo-xcb.cpp | |
| parent | e3c990e8ab999a26d24c28222738040546db5ab5 (diff) | |
This adds an XCB backend and hooks it up for cairo (not skia... yet).
This is for doing performance comparisons of the GL backend against
"standard Cairo".
Diffstat (limited to 'src/cairo-xcb.cpp')
| -rw-r--r-- | src/cairo-xcb.cpp | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/cairo-xcb.cpp b/src/cairo-xcb.cpp new file mode 100644 index 0000000..7a67a54 --- /dev/null +++ b/src/cairo-xcb.cpp @@ -0,0 +1,82 @@ +/* + * Copyright 2017 © Samsung Research America, Silicon Valley + * + * Use of this source code is governed by the 3-Clause BSD license + * specified in the COPYING file included with this source code. + */ +#include <config.h> + +#include <err.h> +#include <stdlib.h> +#include <assert.h> + +#include <cairo.h> +#include <cairo-xcb.h> + +#include "xcb.h" +#include "device_config.h" + +static xcb_state_t *state; +static cairo_surface_t *cairo_surface; + +cairo_surface_t * +create_cairo_surface_xcb (const device_config_t& config) +{ + // TODO: This needs initted to 0 + state = (xcb_state_t*) malloc (sizeof (xcb_state_t)); + if (!state) { + warnx ("Out of memory\n"); + return NULL; + } + + if (!createXCBContextAndWindow(state, config.width, config.height)) { + cleanup_state_xcb(state); + errx (-1, "Could not create XCB context and window\n"); + } + + assert(state->xcb_window >= 0); + assert(state->xcb_connection); + assert(state->xcb_visual_type); + + // TODO: Do XCB-specific setup and surface creation + cairo_surface = cairo_xcb_surface_create( + state->xcb_connection, // XCB connection + state->xcb_window, // XCB drawable window + state->xcb_visual_type, // Visual to use for drawing to window + config.width, // Window width + config.height); // Window height + + // TODO: Set background, clear colors, etc. + + return cairo_surface; +} + +void +destroy_cairo_xcb(void) +{ + cleanup_state_xcb((void*)state); + + cairo_surface_finish(cairo_surface); + + // TODO: Do I need to destroy the surface here, or higher up? If here, then do I need to track + // cairo_surface in state? Uncommented, this causes a ref count fault, so it appears to + // already have been destroyed (maybe by _finish?) + //cairo_surface_destroy(cairo_surface); +} + +void +update_cairo_xcb(void) +{ + // TODO +} + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : |