summaryrefslogtreecommitdiffstatsci
path: root/src/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/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/xcb.cpp')
-rw-r--r--src/xcb.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/xcb.cpp b/src/xcb.cpp
new file mode 100644
index 0000000..4de34da
--- /dev/null
+++ b/src/xcb.cpp
@@ -0,0 +1,117 @@
+/*
+ * 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 <string.h>
+#include <unistd.h>
+
+#include "xcb.h"
+#include "device_config.h"
+
+bool
+createXCBContextAndWindow(xcb_state_t *state, int width, int height)
+{
+ xcb_screen_t *screen;
+ uint32_t mask[2];
+ const xcb_setup_t *setup;
+ xcb_visualtype_t *visual;
+ xcb_generic_event_t *event;
+ xcb_screen_iterator_t screen_iter;
+ xcb_depth_iterator_t depth_iter;
+
+ // Set up XCB
+ state->xcb_connection = xcb_connect(NULL, &state->xcb_screen_number);
+ if (state->xcb_connection == NULL) {
+ warnx("Could not create XCB context\n");
+ return false;
+ } else if (xcb_connection_has_error(state->xcb_connection)) {
+ warnx("Could not connect to X11 server\n");
+ return false;
+ }
+
+ // Set up screen
+ setup = xcb_get_setup(state->xcb_connection);
+ if (setup == NULL) {
+ warnx("Could not create XCB setup\n");
+ return false;
+ }
+ screen_iter = xcb_setup_roots_iterator(setup);
+ for (; screen_iter.rem; --state->xcb_screen_number, xcb_screen_next(&screen_iter)) {
+ if (state->xcb_screen_number == 0) {
+ state->xcb_screen = screen_iter.data;
+ break;
+ }
+ }
+ if (state->xcb_screen == NULL) {
+ warnx("Could not create XCB screen\n");
+ return false;
+ }
+
+ // Create window
+ state->xcb_window = xcb_generate_id(state->xcb_connection);
+ mask[0] = 1;
+ mask[1] = XCB_EVENT_MASK_EXPOSURE;
+ xcb_create_window(state->xcb_connection, // XCB connection to X11
+ XCB_COPY_FROM_PARENT, // Window's depth
+ state->xcb_window, // Window ID
+ state->xcb_screen->root, // Parent window
+ 20, 20, // X, Y position
+ width, // Window width
+ height, // Window height
+ 0, // Border width in pixels
+ XCB_WINDOW_CLASS_INPUT_OUTPUT, // Behavior class for window
+ state->xcb_screen->root_visual, // New window's visual id
+ XCB_CW_OVERRIDE_REDIRECT | XCB_CW_EVENT_MASK, // Mask type
+ mask); // Mask values list
+ xcb_map_window(state->xcb_connection, state->xcb_window);
+ xcb_flush(state->xcb_connection);
+
+ // Get the visual
+ depth_iter = xcb_screen_allowed_depths_iterator(state->xcb_screen);
+ for (; depth_iter.rem; xcb_depth_next(&depth_iter)) {
+ xcb_visualtype_iterator_t visual_iter;
+
+ visual_iter = xcb_depth_visuals_iterator(depth_iter.data);
+ for (; visual_iter.rem; xcb_visualtype_next(&visual_iter)) {
+ if (state->xcb_screen->root_visual == visual_iter.data->visual_id) {
+ state->xcb_visual_type = visual_iter.data;
+ return true;
+ }
+ }
+ }
+
+ warnx("XCB internal error, could not find visual\n");
+ xcb_disconnect(state->xcb_connection);
+ return false;
+}
+
+void
+destroyXCBContextAndWindow (xcb_state_t *state)
+{
+ xcb_disconnect(state->xcb_connection);
+}
+
+void
+cleanup_state_xcb (void *data)
+{
+ xcb_state_t *state = (xcb_state_t*)data;
+ destroyXCBContextAndWindow(state);
+ free(state);
+}
+
+/*
+ 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 :