diff --git a/cogl/cogl-matrix.c b/cogl/cogl-matrix.c
index 51c98fb83..4ceece7d2 100644
--- a/cogl/cogl-matrix.c
+++ b/cogl/cogl-matrix.c
@@ -2041,3 +2041,13 @@ cogl_matrix_project_points (const CoglMatrix *matrix,
n_points);
}
}
+
+gboolean
+cogl_matrix_is_identity (const CoglMatrix *matrix)
+{
+ if (!(matrix->flags & MAT_DIRTY_TYPE) &&
+ matrix->type == COGL_MATRIX_TYPE_IDENTITY)
+ return TRUE;
+ else
+ return memcmp (matrix, identity, sizeof (float) * 16) == 0;
+}
diff --git a/cogl/cogl-matrix.h b/cogl/cogl-matrix.h
index 903d2ea62..a2c238544 100644
--- a/cogl/cogl-matrix.h
+++ b/cogl/cogl-matrix.h
@@ -585,6 +585,18 @@ cogl_matrix_project_points (const CoglMatrix *matrix,
#endif /* COGL_ENABLE_EXPERIMENTAL_API */
+/**
+ * cogl_matrix_is_identity:
+ * @matrix: A #CoglMatrix
+ *
+ * Determines if the given matrix is an identity matrix.
+ *
+ * Returns: %TRUE if @matrix is an identity matrix else %FALSE
+ * Since: 1.8
+ */
+gboolean
+cogl_matrix_is_identity (const CoglMatrix *matrix);
+
#ifdef _COGL_SUPPORTS_GTYPE_INTEGRATION
#define COGL_GTYPE_TYPE_MATRIX (cogl_gtype_matrix_get_type ())
diff --git a/doc/reference/cogl-2.0-experimental/cogl-sections.txt b/doc/reference/cogl-2.0-experimental/cogl-sections.txt
index 02f793155..1f7216fa2 100644
--- a/doc/reference/cogl-2.0-experimental/cogl-sections.txt
+++ b/doc/reference/cogl-2.0-experimental/cogl-sections.txt
@@ -387,6 +387,7 @@ cogl_matrix_scale
cogl_matrix_init_from_array
cogl_matrix_get_array
cogl_matrix_get_inverse
+cogl_matrix_is_identity
cogl-euler
diff --git a/doc/reference/cogl/cogl-sections.txt b/doc/reference/cogl/cogl-sections.txt
index c737a8b4c..1bbb50b08 100644
--- a/doc/reference/cogl/cogl-sections.txt
+++ b/doc/reference/cogl/cogl-sections.txt
@@ -469,6 +469,7 @@ cogl_matrix_get_inverse
cogl_matrix_transform_point
cogl_matrix_project_points
cogl_matrix_transform_points
+cogl_matrix_is_identity