diff --git a/cogl/Makefile.am b/cogl/Makefile.am
index e8b7c5649..8add97695 100644
--- a/cogl/Makefile.am
+++ b/cogl/Makefile.am
@@ -114,6 +114,7 @@ cogl_experimental_h = \
$(srcdir)/cogl-pixel-buffer.h \
$(srcdir)/cogl2-experimental.h \
$(srcdir)/cogl2-compatibility.h \
+ $(srcdir)/cogl-version.h \
$(NULL)
# driver sources
diff --git a/cogl/cogl-defines.h.in b/cogl/cogl-defines.h.in
index ccdca066b..a9c0b5c7e 100644
--- a/cogl/cogl-defines.h.in
+++ b/cogl/cogl-defines.h.in
@@ -40,6 +40,11 @@ G_BEGIN_DECLS
#define NativeWindowType EGLNativeWindowType
#endif
+#define COGL_VERSION_MAJOR_INTERNAL @COGL_MAJOR_VERSION@
+#define COGL_VERSION_MINOR_INTERNAL @COGL_MINOR_VERSION@
+#define COGL_VERSION_MICRO_INTERNAL @COGL_MICRO_VERSION@
+#define COGL_VERSION_STRING_INTERNAL "@COGL_VERSION@"
+
G_END_DECLS
#endif
diff --git a/cogl/cogl-gpu-info.c b/cogl/cogl-gpu-info.c
index 993c59068..aa7084367 100644
--- a/cogl/cogl-gpu-info.c
+++ b/cogl/cogl-gpu-info.c
@@ -30,7 +30,7 @@
#include "cogl-gpu-info-private.h"
#include "cogl-context-private.h"
-#include "cogl-util.h"
+#include "cogl-version.h"
typedef struct
{
diff --git a/cogl/cogl-util.h b/cogl/cogl-util.h
index 698391a09..44589857b 100644
--- a/cogl/cogl-util.h
+++ b/cogl/cogl-util.h
@@ -52,27 +52,6 @@
#define COGL_EXPORT
#endif
-/* Macros to handle compacting a 3-component version number into an
- int for quick comparison. This assumes all of the components are
- <= 1023 */
-#define COGL_VERSION_COMPONENT_BITS 10
-#define COGL_VERSION_MAX_COMPONENT_VALUE \
- ((1 << COGL_VERSION_COMPONENT_BITS) - 1)
-
-#define COGL_VERSION_ENCODE(major, minor, micro) \
- (((major) << (COGL_VERSION_COMPONENT_BITS * 2)) | \
- ((minor) << COGL_VERSION_COMPONENT_BITS) \
- | (micro))
-
-#define COGL_VERSION_GET_MAJOR(version) \
- (((version) >> 20) & COGL_VERSION_MAX_COMPONENT_VALUE)
-
-#define COGL_VERSION_GET_MINOR(version) \
- (((version) >> 10) & COGL_VERSION_MAX_COMPONENT_VALUE)
-
-#define COGL_VERSION_GET_MICRO(version) \
- ((version) & COGL_VERSION_MAX_COMPONENT_VALUE)
-
int
_cogl_util_next_p2 (int a);
diff --git a/cogl/cogl-version.h b/cogl/cogl-version.h
new file mode 100644
index 000000000..ca1177faa
--- /dev/null
+++ b/cogl/cogl-version.h
@@ -0,0 +1,184 @@
+/*
+ * Cogl
+ *
+ * An object oriented GL/GLES Abstraction/Utility Layer
+ *
+ * Copyright (C) 2012 Intel Corporation.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ *
+ */
+
+#ifndef __COGL_VERSION_H__
+#define __COGL_VERSION_H__
+
+#include
+
+/**
+ * SECTION:cogl-version
+ * @short_description: Macros for determining the version of Cogl being used
+ *
+ * Cogl offers a set of macros for checking the version of the library
+ * at compile time.
+ *
+ * Since: 2.0
+ */
+
+/**
+ * COGL_VERSION_MAJOR:
+ *
+ * The major version of the Cogl library (1, if %COGL_VERSION is 1.2.3)
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION_MAJOR COGL_VERSION_MAJOR_INTERNAL
+
+/**
+ * COGL_VERSION_MINOR:
+ *
+ * The minor version of the Cogl library (2, if %COGL_VERSION is 1.2.3)
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION_MINOR COGL_VERSION_MINOR_INTERNAL
+
+/**
+ * COGL_VERSION_MICRO:
+ *
+ * The micro version of the Cogl library (3, if %COGL_VERSION is 1.2.3)
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION_MICRO COGL_VERSION_MICRO_INTERNAL
+
+/**
+ * COGL_VERSION_STRING:
+ *
+ * The full version of the Cogl library, in string form (suited for
+ * string concatenation)
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION_STRING COGL_VERSION_STRING_INTERNAL
+
+/* Macros to handle compacting a 3-component version number into an
+ * int for quick comparison. This assumes all of the components are <=
+ * 1023 and that an int is >= 31 bits */
+#define COGL_VERSION_COMPONENT_BITS 10
+#define COGL_VERSION_MAX_COMPONENT_VALUE \
+ ((1 << COGL_VERSION_COMPONENT_BITS) - 1)
+
+/**
+ * COGL_VERSION:
+ *
+ * The Cogl version encoded into a single integer using the
+ * COGL_VERSION_ENCODE() macro. This can be used for quick comparisons
+ * with particular versions.
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION \
+ COGL_VERSION_ENCODE (COGL_VERSION_MAJOR, \
+ COGL_VERSION_MINOR, \
+ COGL_VERSION_MICRO)
+
+/**
+ * COGL_VERSION_ENCODE:
+ * @major: The major part of a version number
+ * @minor: The minor part of a version number
+ * @micro: The micro part of a version number
+ *
+ * Encodes a 3 part version number into a single integer. This can be
+ * used to compare the Cogl version. For example if there is a known
+ * bug in Cogl versions between 1.3.2 and 1.3.4 you could use the
+ * following code to provide a workaround:
+ *
+ * |[
+ * #if COGL_VERSION >= COGL_VERSION_ENCODE (1, 3, 2) && \
+ * COGL_VERSION <= COGL_VERSION_ENCODE (1, 3, 4)
+ * /* Do the workaround */
+ * #endif
+ * ]|
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION_ENCODE(major, minor, micro) \
+ (((major) << (COGL_VERSION_COMPONENT_BITS * 2)) | \
+ ((minor) << COGL_VERSION_COMPONENT_BITS) \
+ | (micro))
+
+/**
+ * COGL_VERSION_GET_MAJOR:
+ * @version: An encoded version number
+ *
+ * Extracts the major part of an encoded version number.
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION_GET_MAJOR(version) \
+ (((version) >> (COGL_VERSION_COMPONENT_BITS * 2)) \
+ & COGL_VERSION_MAX_COMPONENT_VALUE)
+
+/**
+ * COGL_VERSION_GET_MINOR:
+ * @version: An encoded version number
+ *
+ * Extracts the minor part of an encoded version number.
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION_GET_MINOR(version) \
+ (((version) >> COGL_VERSION_COMPONENT_BITS) & \
+ COGL_VERSION_MAX_COMPONENT_VALUE)
+
+/**
+ * COGL_VERSION_GET_MICRO:
+ * @version: An encoded version number
+ *
+ * Extracts the micro part of an encoded version number.
+ *
+ * Since: 2.0
+ */
+#define COGL_VERSION_GET_MICRO(version) \
+ ((version) & COGL_VERSION_MAX_COMPONENT_VALUE)
+
+/**
+ * COGL_VERSION_CHECK:
+ * @major: The major part of a version number
+ * @minor: The minor part of a version number
+ * @micro: The micro part of a version number
+ *
+ * A convenient macro to check whether the Cogl version being compiled
+ * against is at least the given version number. For example if the
+ * function cogl_pipeline_frobnicate was added in version 2.0.1 and
+ * you want to conditionally use that function when it is available,
+ * you could write the following:
+ *
+ * |[
+ * #if COGL_VERSION_CHECK (2, 0, 1)
+ * cogl_pipeline_frobnicate (pipeline);
+ * #else
+ * /* Frobnication is not supported. Use a red color instead */
+ * cogl_pipeline_set_color_4f (pipeline, 1.0f, 0.0f, 0.0f, 1.0f);
+ * #endif
+ * ]|
+ *
+ * Return value: %TRUE if the Cogl version being compiled against is
+ * greater than or equal to the given three part version number.
+ */
+#define COGL_VERSION_CHECK(major, minor, micro) \
+ (COGL_VERSION >= COGL_VERSION_ENCODE (major, minor, micro))
+
+#endif /* __COGL_VERSION_H__ */
diff --git a/cogl/cogl.h b/cogl/cogl.h
index 0e3c7b6fb..2462984ed 100644
--- a/cogl/cogl.h
+++ b/cogl/cogl.h
@@ -56,6 +56,7 @@
#include
#include
#include
+#include
/*
* 1.x only api...
diff --git a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
index 6c9b91ce6..8e3a30256 100644
--- a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
+++ b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-docs.xml.in
@@ -127,6 +127,7 @@
+
diff --git a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
index da3d4315b..3bfed9580 100644
--- a/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
+++ b/doc/reference/cogl-2.0-experimental/cogl-2.0-experimental-sections.txt
@@ -761,6 +761,21 @@ cogl_vector3_dot_product
cogl_vector3_distance
+
+cogl-version
+Versioning utility macros
+COGL_VERSION_MAJOR
+COGL_VERSION_MINOR
+COGL_VERSION_MICRO
+COGL_VERSION_STRING
+COGL_VERSION
+COGL_VERSION_ENCODE
+COGL_VERSION_CHECK
+COGL_VERSION_GET_MAJOR
+COGL_VERSION_GET_MINOR
+COGL_VERSION_GET_MICRO
+
+
cogl-types
Common Types
diff --git a/tests/conform/Makefile.am b/tests/conform/Makefile.am
index 9b656a66a..4d96d88f4 100644
--- a/tests/conform/Makefile.am
+++ b/tests/conform/Makefile.am
@@ -53,6 +53,7 @@ test_sources = \
test-point-size.c \
test-point-sprite.c \
test-no-gl-header.c \
+ test-version.c \
$(NULL)
test_conformance_SOURCES = $(common_sources) $(test_sources)
diff --git a/tests/conform/test-conform-main.c b/tests/conform/test-conform-main.c
index 1e2ddd28d..bb1c48ccc 100644
--- a/tests/conform/test-conform-main.c
+++ b/tests/conform/test-conform-main.c
@@ -95,6 +95,8 @@ main (int argc, char **argv)
ADD_TEST (test_point_sprite,
TEST_KNOWN_FAILURE | TEST_REQUIREMENT_POINT_SPRITE);
+ ADD_TEST (test_version, 0);
+
UNPORTED_TEST (test_viewport);
g_printerr ("Unknown test name \"%s\"\n", argv[1]);
diff --git a/tests/conform/test-version.c b/tests/conform/test-version.c
new file mode 100644
index 000000000..f1d9de95a
--- /dev/null
+++ b/tests/conform/test-version.c
@@ -0,0 +1,77 @@
+#include
+
+/* These will be redefined in config.h */
+#undef COGL_ENABLE_EXPERIMENTAL_2_0_API
+#undef COGL_ENABLE_EXPERIMENTAL_API
+
+#include "test-utils.h"
+#include "config.h"
+#include
+
+_COGL_STATIC_ASSERT (COGL_VERSION_ENCODE (COGL_VERSION_MAJOR,
+ COGL_VERSION_MINOR,
+ COGL_VERSION_MICRO) ==
+ COGL_VERSION,
+ "The pre-encoded Cogl version does not match the version "
+ "encoding macro");
+
+_COGL_STATIC_ASSERT (COGL_VERSION_GET_MAJOR (COGL_VERSION_ENCODE (100,
+ 200,
+ 300)) ==
+ 100,
+ "Getting the major component out of a encoded version "
+ "does not work");
+_COGL_STATIC_ASSERT (COGL_VERSION_GET_MINOR (COGL_VERSION_ENCODE (100,
+ 200,
+ 300)) ==
+ 200,
+ "Getting the minor component out of a encoded version "
+ "does not work");
+_COGL_STATIC_ASSERT (COGL_VERSION_GET_MICRO (COGL_VERSION_ENCODE (100,
+ 200,
+ 300)) ==
+ 300,
+ "Getting the micro component out of a encoded version "
+ "does not work");
+
+_COGL_STATIC_ASSERT (COGL_VERSION_CHECK (COGL_VERSION_MAJOR,
+ COGL_VERSION_MINOR,
+ COGL_VERSION_MICRO),
+ "Checking the Cogl version against the current version "
+ "does not pass");
+_COGL_STATIC_ASSERT (!COGL_VERSION_CHECK (COGL_VERSION_MAJOR,
+ COGL_VERSION_MINOR,
+ COGL_VERSION_MICRO + 1),
+ "Checking the Cogl version against a later micro version "
+ "should not pass");
+_COGL_STATIC_ASSERT (!COGL_VERSION_CHECK (COGL_VERSION_MAJOR,
+ COGL_VERSION_MINOR + 1,
+ COGL_VERSION_MICRO),
+ "Checking the Cogl version against a later minor version "
+ "should not pass");
+_COGL_STATIC_ASSERT (!COGL_VERSION_CHECK (COGL_VERSION_MAJOR + 1,
+ COGL_VERSION_MINOR,
+ COGL_VERSION_MICRO),
+ "Checking the Cogl version against a later major version "
+ "should not pass");
+
+_COGL_STATIC_ASSERT (COGL_VERSION_CHECK (COGL_VERSION_MAJOR - 1,
+ COGL_VERSION_MINOR,
+ COGL_VERSION_MICRO),
+ "Checking the Cogl version against a older major version "
+ "should pass");
+
+void
+test_version (void)
+{
+ const char *version = g_strdup_printf ("version = %i.%i.%i",
+ COGL_VERSION_MAJOR,
+ COGL_VERSION_MINOR,
+ COGL_VERSION_MICRO);
+
+ g_assert_cmpstr (version, ==, "version = " COGL_VERSION_STRING);
+
+ if (cogl_test_verbose ())
+ g_print ("OK\n");
+}
+