summaryrefslogtreecommitdiffstatsci
path: root/src/cairo-xcb.cpp
diff options
context:
space:
mode:
authorBryce Harrington <bryce@osg.samsung.com>2017-12-01 20:11:12 -0800
committerBryce Harrington <bryce@osg.samsung.com>2017-12-01 20:19:53 -0800
commit45f67bf2ab96f15ef2d99848ef150128b3d44465 (patch)
tree4c122afb9043665a0a9c901efd93827a643b2b28 /src/cairo-xcb.cpp
parente3c990e8ab999a26d24c28222738040546db5ab5 (diff)
Add XCB supportHEADmaster
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.cpp82
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 :