summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boilerplate/Makefile.win32.features10
-rw-r--r--build/Makefile.win32.features1
-rw-r--r--build/Makefile.win32.features-h3
-rw-r--r--build/configure.ac.features1
-rw-r--r--configure.ac14
-rw-r--r--src/Makefile.sources8
-rw-r--r--src/Makefile.win32.features14
-rw-r--r--src/cairo-xcb-connection.c22
-rw-r--r--src/cairo-xcb-private.h21
-rw-r--r--src/cairo-xcb-surface-core.c2
-rw-r--r--src/cairo-xcb-surface-render.c2
-rw-r--r--src/cairo-xcb-surface.c14
12 files changed, 105 insertions, 7 deletions
diff --git a/boilerplate/Makefile.win32.features b/boilerplate/Makefile.win32.features
index 8d5641189..07427872b 100644
--- a/boilerplate/Makefile.win32.features
+++ b/boilerplate/Makefile.win32.features
@@ -59,6 +59,16 @@ enabled_cairo_boilerplate_private += $(cairo_boilerplate_xlib_xcb_private)
enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xlib_xcb_sources)
endif
+supported_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers)
+all_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers)
+all_cairo_boilerplate_private += $(cairo_boilerplate_xcb_shm_private)
+all_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_shm_sources)
+ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1)
+enabled_cairo_boilerplate_headers += $(cairo_boilerplate_xcb_shm_headers)
+enabled_cairo_boilerplate_private += $(cairo_boilerplate_xcb_shm_private)
+enabled_cairo_boilerplate_sources += $(cairo_boilerplate_xcb_shm_sources)
+endif
+
unsupported_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers)
all_cairo_boilerplate_headers += $(cairo_boilerplate_qt_headers)
all_cairo_boilerplate_private += $(cairo_boilerplate_qt_private)
diff --git a/build/Makefile.win32.features b/build/Makefile.win32.features
index b8c40a85d..66938fc06 100644
--- a/build/Makefile.win32.features
+++ b/build/Makefile.win32.features
@@ -4,6 +4,7 @@ CAIRO_HAS_XLIB_SURFACE=0
CAIRO_HAS_XLIB_XRENDER_SURFACE=0
CAIRO_HAS_XCB_SURFACE=0
CAIRO_HAS_XLIB_XCB_FUNCTIONS=0
+CAIRO_HAS_XCB_SHM_FUNCTIONS=0
CAIRO_HAS_QT_SURFACE=0
CAIRO_HAS_QUARTZ_SURFACE=0
CAIRO_HAS_QUARTZ_FONT=0
diff --git a/build/Makefile.win32.features-h b/build/Makefile.win32.features-h
index 95e9386d9..ca21aba26 100644
--- a/build/Makefile.win32.features-h
+++ b/build/Makefile.win32.features-h
@@ -17,6 +17,9 @@ endif
ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1)
@echo "#define CAIRO_HAS_XLIB_XCB_FUNCTIONS 1" >> src/cairo-features.h
endif
+ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1)
+ @echo "#define CAIRO_HAS_XCB_SHM_FUNCTIONS 1" >> src/cairo-features.h
+endif
ifeq ($(CAIRO_HAS_QT_SURFACE),1)
@echo "#define CAIRO_HAS_QT_SURFACE 1" >> src/cairo-features.h
endif
diff --git a/build/configure.ac.features b/build/configure.ac.features
index c55b4efa8..8c96ed0a0 100644
--- a/build/configure.ac.features
+++ b/build/configure.ac.features
@@ -395,6 +395,7 @@ AC_DEFUN([CAIRO_REPORT],
echo " Eagle functions: $use_eagle"
echo " X11-xcb functions: $use_xlib_xcb"
echo " XCB-drm functions: $use_xcb_drm"
+ echo " XCB-shm functions: $use_xcb_shm"
echo ""
echo "The following features and utilies:"
echo " cairo-trace: $use_trace"
diff --git a/configure.ac b/configure.ac
index 30d3e98c7..b4f5aa7dd 100644
--- a/configure.ac
+++ b/configure.ac
@@ -109,7 +109,7 @@ CAIRO_ENABLE_SURFACE_BACKEND(xlib_xrender, Xlib Xrender, auto, [
dnl ===========================================================================
CAIRO_ENABLE_SURFACE_BACKEND(xcb, XCB, no, [
- xcb_REQUIRES="xcb >= 0.9.92 xcb-render >= 0.9.92 xcb-shm"
+ xcb_REQUIRES="xcb >= 0.9.92 xcb-render >= 0.9.92"
PKG_CHECK_MODULES(xcb, $xcb_REQUIRES, ,
[AC_MSG_RESULT(no)
use_xcb="no (requires $xcb_REQUIRES http://xcb.freedesktop.org)"])
@@ -126,6 +126,18 @@ CAIRO_ENABLE_FUNCTIONS(xlib_xcb, Xlib/XCB, no, [
])
AM_CONDITIONAL(BUILD_XLIB_XCB, test "x$use_xlib_xcb" = "xyes")
+CAIRO_ENABLE_FUNCTIONS(xcb_shm, XCB/SHM, auto, [
+ if test "x$use_xcb" == "xyes"; then
+ xcb_shm_REQUIRES="xcb-shm"
+ PKG_CHECK_MODULES(xcb_shm, $xcb_shm_REQUIRES, ,
+ [AC_MSG_RESULT(no)
+ use_xcb_shm="no (requires $xcb_shm http://xcb.freedesktop.org)"])
+ else
+ use_xcb_drm="no (requires both --enable-xcb)"
+ fi
+])
+AM_CONDITIONAL(BUILD_XCB_SHM, test "x$use_xcb_shm" = "xyes")
+
dnl ===========================================================================
CAIRO_ENABLE_SURFACE_BACKEND(qt, Qt, no, [
diff --git a/src/Makefile.sources b/src/Makefile.sources
index 0f77f0ed8..a7f5839b0 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -269,14 +269,18 @@ cairo_xcb_sources = \
cairo-xcb-connection.c \
cairo-xcb-connection-core.c \
cairo-xcb-connection-render.c \
- cairo-xcb-connection-shm.c \
cairo-xcb-screen.c \
- cairo-xcb-shm.c \
cairo-xcb-surface.c \
cairo-xcb-surface-cairo.c \
cairo-xcb-surface-core.c \
cairo-xcb-surface-render.c \
$(NULL)
+if BUILD_XCB_SHM
+cairo_xcb_sources += \
+ cairo-xcb-shm.c \
+ cairo-xcb-connection-shm.c \
+ $(NULL)
+endif
cairo_qt_headers = cairo-qt.h
cairo_qt_sources = cairo-qt-surface.cpp
diff --git a/src/Makefile.win32.features b/src/Makefile.win32.features
index 357505793..daf88a783 100644
--- a/src/Makefile.win32.features
+++ b/src/Makefile.win32.features
@@ -77,6 +77,20 @@ ifeq ($(CAIRO_HAS_XLIB_XCB_FUNCTIONS),1)
enabled_cairo_pkgconf += cairo-xlib-xcb.pc
endif
+supported_cairo_headers += $(cairo_xcb_shm_headers)
+all_cairo_headers += $(cairo_xcb_shm_headers)
+all_cairo_private += $(cairo_xcb_shm_private)
+all_cairo_sources += $(cairo_xcb_shm_sources)
+ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1)
+enabled_cairo_headers += $(cairo_xcb_shm_headers)
+enabled_cairo_private += $(cairo_xcb_shm_private)
+enabled_cairo_sources += $(cairo_xcb_shm_sources)
+endif
+all_cairo_pkgconf += cairo-xcb-shm.pc
+ifeq ($(CAIRO_HAS_XCB_SHM_FUNCTIONS),1)
+enabled_cairo_pkgconf += cairo-xcb-shm.pc
+endif
+
unsupported_cairo_headers += $(cairo_qt_headers)
all_cairo_headers += $(cairo_qt_headers)
all_cairo_private += $(cairo_qt_private)
diff --git a/src/cairo-xcb-connection.c b/src/cairo-xcb-connection.c
index e2293a6f5..18ccd4ab4 100644
--- a/src/cairo-xcb-connection.c
+++ b/src/cairo-xcb-connection.c
@@ -37,13 +37,19 @@
#include "cairo-freelist-private.h"
#include "cairo-list-private.h"
-#include <sys/ipc.h>
-#include <sys/shm.h>
#include <xcb/xcbext.h>
#include <xcb/bigreq.h>
+#include <errno.h>
+
+#if CAIRO_HAS_XCB_DRM_FUNCTIONS
#include <xcb/dri2.h>
+#endif
+
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
+#include <sys/ipc.h>
+#include <sys/shm.h>
#include <xcb/shm.h>
-#include <errno.h>
+#endif
typedef struct _cairo_xcb_xrender_format {
cairo_hash_entry_t key;
@@ -383,6 +389,7 @@ _cairo_xcb_connection_query_cairo (cairo_xcb_connection_t *connection)
}
#endif
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
static cairo_bool_t
can_use_shm (cairo_xcb_connection_t *connection)
{
@@ -438,6 +445,7 @@ _cairo_xcb_connection_query_shm (cairo_xcb_connection_t *connection)
if (can_use_shm (connection))
connection->flags |= CAIRO_XCB_HAS_SHM;
}
+#endif
#if CAIRO_HAS_XCB_DRM_FUNCTIONS
static void
@@ -544,7 +552,9 @@ _device_destroy (void *device)
connection->visual_to_xrender_format);
_cairo_hash_table_destroy (connection->visual_to_xrender_format);
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
_cairo_xcb_connection_shm_mem_pools_fini (connection);
+#endif
_cairo_freepool_fini (&connection->shm_info_freelist);
_cairo_freepool_fini (&connection->xid_pool);
@@ -604,8 +614,10 @@ _cairo_xcb_connection_get (xcb_connection_t *xcb_connection)
connection->has_socket = FALSE;
xcb_prefetch_extension_data (xcb_connection, &xcb_big_requests_id);
- xcb_prefetch_extension_data (xcb_connection, &xcb_shm_id);
xcb_prefetch_extension_data (xcb_connection, &xcb_render_id);
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
+ xcb_prefetch_extension_data (xcb_connection, &xcb_shm_id);
+#endif
#if 0
xcb_prefetch_extension_data (xcb_connection, &xcb_cairo_id);
#endif
@@ -655,11 +667,13 @@ _cairo_xcb_connection_get (xcb_connection_t *xcb_connection)
#endif
connection->shm = NULL;
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
ext = xcb_get_extension_data (xcb_connection, &xcb_shm_id);
if (ext != NULL && ext->present) {
_cairo_xcb_connection_query_shm (connection);
connection->shm = ext;
}
+#endif
connection->dri2 = NULL;
#if CAIRO_HAS_XCB_DRM_FUNCTIONS
diff --git a/src/cairo-xcb-private.h b/src/cairo-xcb-private.h
index 18a485cf0..f6b8c05e3 100644
--- a/src/cairo-xcb-private.h
+++ b/src/cairo-xcb-private.h
@@ -541,6 +541,7 @@ _cairo_xcb_connection_poly_fill_rectangle (cairo_xcb_connection_t *connection,
uint32_t num_rectangles,
xcb_rectangle_t *rectangles);
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
cairo_private uint32_t
_cairo_xcb_connection_shm_attach (cairo_xcb_connection_t *connection,
uint32_t id,
@@ -575,6 +576,26 @@ _cairo_xcb_connection_shm_get_image (cairo_xcb_connection_t *connection,
cairo_private void
_cairo_xcb_connection_shm_detach (cairo_xcb_connection_t *connection,
uint32_t segment);
+#else
+static inline uint64_t
+_cairo_xcb_connection_shm_put_image (cairo_xcb_connection_t *connection,
+ xcb_drawable_t dst,
+ xcb_gcontext_t gc,
+ uint16_t total_width,
+ uint16_t total_height,
+ int16_t src_x,
+ int16_t src_y,
+ uint16_t width,
+ uint16_t height,
+ int16_t dst_x,
+ int16_t dst_y,
+ uint8_t depth,
+ uint32_t shm,
+ uint32_t offset)
+{
+ return 0;
+}
+#endif
cairo_private void
_cairo_xcb_connection_render_spans (cairo_xcb_connection_t *connection,
diff --git a/src/cairo-xcb-surface-core.c b/src/cairo-xcb-surface-core.c
index 6f1002a8f..2788bdf2d 100644
--- a/src/cairo-xcb-surface-core.c
+++ b/src/cairo-xcb-surface-core.c
@@ -153,6 +153,7 @@ _cairo_xcb_shm_image_create (cairo_xcb_connection_t *connection,
cairo_xcb_shm_info_t *shm_info = NULL;
cairo_status_t status;
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
if ((connection->flags & CAIRO_XCB_HAS_SHM)) {
size_t size, stride;
@@ -185,6 +186,7 @@ _cairo_xcb_shm_image_create (cairo_xcb_connection_t *connection,
}
}
}
+#endif
if (image == NULL) {
image = _cairo_image_surface_create_with_pixman_format (NULL,
diff --git a/src/cairo-xcb-surface-render.c b/src/cairo-xcb-surface-render.c
index e07f575cc..5d19792ed 100644
--- a/src/cairo-xcb-surface-render.c
+++ b/src/cairo-xcb-surface-render.c
@@ -776,6 +776,7 @@ _cairo_xcb_shm_image_create (cairo_xcb_connection_t *connection,
cairo_xcb_shm_info_t *shm_info = NULL;
cairo_status_t status;
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
if ((connection->flags & CAIRO_XCB_HAS_SHM)) {
size_t size, stride;
@@ -808,6 +809,7 @@ _cairo_xcb_shm_image_create (cairo_xcb_connection_t *connection,
}
}
}
+#endif
if (image == NULL) {
image = _cairo_image_surface_create_with_pixman_format (NULL,
diff --git a/src/cairo-xcb-surface.c b/src/cairo-xcb-surface.c
index 2e08c6419..c61ddb34e 100644
--- a/src/cairo-xcb-surface.c
+++ b/src/cairo-xcb-surface.c
@@ -59,6 +59,7 @@ slim_hidden_proto (cairo_xcb_surface_create_with_xrender_format);
#include "drm/cairo-drm-private.h"
#endif
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
static cairo_status_t
_cairo_xcb_surface_create_similar_shm (cairo_xcb_surface_t *other,
pixman_format_code_t pixman_format,
@@ -103,6 +104,7 @@ _cairo_xcb_surface_create_similar_shm (cairo_xcb_surface_t *other,
*out = image;
return CAIRO_STATUS_SUCCESS;
}
+#endif
cairo_surface_t *
_cairo_xcb_surface_create_similar_image (cairo_xcb_surface_t *other,
@@ -127,6 +129,7 @@ _cairo_xcb_surface_create_similar_image (cairo_xcb_surface_t *other,
break;
}
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
if (other->flags & CAIRO_XCB_HAS_SHM) {
cairo_status_t status;
@@ -137,6 +140,7 @@ _cairo_xcb_surface_create_similar_image (cairo_xcb_surface_t *other,
if (_cairo_status_is_error (status))
return _cairo_surface_create_in_error (status);
}
+#endif
if (image == NULL) {
image = _cairo_image_surface_create_with_pixman_format (NULL,
@@ -288,6 +292,7 @@ _destroy_image (pixman_image_t *image, void *data)
free (data);
}
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
static cairo_int_status_t
_cairo_xcb_surface_create_shm_image (cairo_xcb_surface_t *target,
cairo_image_surface_t **image_out,
@@ -340,11 +345,13 @@ _cairo_xcb_surface_create_shm_image (cairo_xcb_surface_t *target,
*shm_info_out = shm_info;
return CAIRO_STATUS_SUCCESS;
}
+#endif
static cairo_status_t
_get_shm_image (cairo_xcb_surface_t *surface,
cairo_image_surface_t **image_out)
{
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
cairo_image_surface_t *image;
cairo_xcb_shm_info_t *shm_info;
cairo_status_t status;
@@ -369,6 +376,9 @@ _get_shm_image (cairo_xcb_surface_t *surface,
*image_out = image;
return CAIRO_STATUS_SUCCESS;
+#else
+ return CAIRO_INT_STATUS_UNSUPPORTED;
+#endif
}
static cairo_status_t
@@ -588,6 +598,7 @@ _put_shm_image (cairo_xcb_surface_t *surface,
xcb_gcontext_t gc,
cairo_image_surface_t *image)
{
+#if CAIRO_HAS_XCB_SHM_FUNCTIONS
cairo_xcb_shm_info_t *shm_info;
shm_info = _cairo_user_data_array_get_data (&image->base.user_data,
@@ -608,6 +619,9 @@ _put_shm_image (cairo_xcb_surface_t *surface,
shm_info->offset);
return CAIRO_STATUS_SUCCESS;
+#else
+ return CAIRO_INT_STATUS_UNSUPPORTED;
+#endif
}
static cairo_status_t