about summary refs log tree commit diff
path: root/nixpkgs/pkgs/development/libraries/cogl
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2023-06-16 06:56:35 +0000
committerAlyssa Ross <hi@alyssa.is>2023-06-16 06:56:35 +0000
commit99fcaeccb89621dd492203ce1f2d551c06f228ed (patch)
tree41cb730ae07383004789779b0f6e11cb3f4642a3 /nixpkgs/pkgs/development/libraries/cogl
parent59c5f5ac8682acc13bb22bc29c7cf02f7d75f01f (diff)
parent75a5ebf473cd60148ba9aec0d219f72e5cf52519 (diff)
downloadnixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.gz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.bz2
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.lz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.xz
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.tar.zst
nixlib-99fcaeccb89621dd492203ce1f2d551c06f228ed.zip
Merge branch 'nixos-unstable' of https://github.com/NixOS/nixpkgs
Conflicts:
	nixpkgs/nixos/modules/config/console.nix
	nixpkgs/nixos/modules/services/mail/mailman.nix
	nixpkgs/nixos/modules/services/mail/public-inbox.nix
	nixpkgs/nixos/modules/services/mail/rss2email.nix
	nixpkgs/nixos/modules/services/networking/ssh/sshd.nix
	nixpkgs/pkgs/applications/networking/instant-messengers/dino/default.nix
	nixpkgs/pkgs/applications/networking/irc/weechat/default.nix
	nixpkgs/pkgs/applications/window-managers/sway/default.nix
	nixpkgs/pkgs/build-support/go/module.nix
	nixpkgs/pkgs/build-support/rust/build-rust-package/default.nix
	nixpkgs/pkgs/development/interpreters/python/default.nix
	nixpkgs/pkgs/development/node-packages/overrides.nix
	nixpkgs/pkgs/development/tools/b4/default.nix
	nixpkgs/pkgs/servers/dict/dictd-db.nix
	nixpkgs/pkgs/servers/mail/public-inbox/default.nix
	nixpkgs/pkgs/tools/security/pinentry/default.nix
	nixpkgs/pkgs/tools/text/unoconv/default.nix
	nixpkgs/pkgs/top-level/all-packages.nix
Diffstat (limited to 'nixpkgs/pkgs/development/libraries/cogl')
-rw-r--r--nixpkgs/pkgs/development/libraries/cogl/default.nix90
-rw-r--r--nixpkgs/pkgs/development/libraries/cogl/patches/gnome_bugzilla_787443_359589_deepin.patch93
-rw-r--r--nixpkgs/pkgs/development/libraries/cogl/patches/gnome_bugzilla_787443_361056_deepin.patch368
3 files changed, 523 insertions, 28 deletions
diff --git a/nixpkgs/pkgs/development/libraries/cogl/default.nix b/nixpkgs/pkgs/development/libraries/cogl/default.nix
index e58a500cf838..41aa3045841f 100644
--- a/nixpkgs/pkgs/development/libraries/cogl/default.nix
+++ b/nixpkgs/pkgs/development/libraries/cogl/default.nix
@@ -1,7 +1,27 @@
-{ lib, stdenv, fetchurl, fetchpatch, pkg-config, libGL, glib, gdk-pixbuf, xorg, libintl
-, pangoSupport ? true, pango, cairo, gobject-introspection, wayland, gnome
-, mesa, automake, autoconf
-, gstreamerSupport ? true, gst_all_1 }:
+{ lib
+, stdenv
+, fetchurl
+, fetchpatch
+, pkg-config
+, libGL
+, glib
+, gdk-pixbuf
+, xorg
+, libintl
+, pangoSupport ? true
+, pango
+, cairo
+, gobject-introspection
+, wayland
+, gnome
+, mesa
+, automake
+, autoconf
+, gstreamerSupport ? true
+, gst_all_1
+, harfbuzz
+, OpenGL
+}:
 
 stdenv.mkDerivation rec {
   pname = "cogl";
@@ -17,42 +37,56 @@ stdenv.mkDerivation rec {
     # submitted by Fedora on the GNOME Bugzilla
     # (https://bugzilla.gnome.org/787443). Upstream thinks the patch
     # could be merged, but dev can not make a new release.
-
-    (fetchpatch {
-      url = "https://bug787443.bugzilla-attachments.gnome.org/attachment.cgi?id=359589";
-      sha256 = "0f0d9iddg8zwy853phh7swikg4yzhxxv71fcag36f8gis0j5p998";
-    })
-
-    (fetchpatch {
-      url = "https://bug787443.bugzilla-attachments.gnome.org/attachment.cgi?id=361056";
-      sha256 = "09fyrdci4727fg6qm5aaapsbv71sf4wgfaqz8jqlyy61dibgg490";
-    })
+    ./patches/gnome_bugzilla_787443_359589_deepin.patch
+    ./patches/gnome_bugzilla_787443_361056_deepin.patch
   ];
 
   outputs = [ "out" "dev" ];
 
-  nativeBuildInputs = [ pkg-config libintl automake autoconf ];
+  nativeBuildInputs = [ pkg-config libintl automake autoconf gobject-introspection ];
 
   configureFlags = [
     "--enable-introspection"
+  ] ++ lib.optionals (!stdenv.isDarwin) [
     "--enable-kms-egl-platform"
     "--enable-wayland-egl-platform"
     "--enable-wayland-egl-server"
-  ] ++ lib.optional gstreamerSupport "--enable-cogl-gst"
-  ++ lib.optionals (!stdenv.isDarwin) [ "--enable-gles1" "--enable-gles2" ];
+    "--enable-gles1"
+    "--enable-gles2"
+  ] ++ lib.optionals stdenv.isDarwin [
+    "--disable-glx"
+    "--without-x"
+  ] ++ lib.optionals gstreamerSupport [
+    "--enable-cogl-gst"
+  ];
 
-  propagatedBuildInputs = with xorg; [
-      glib gdk-pixbuf gobject-introspection wayland mesa
-      libGL libXrandr libXfixes libXcomposite libXdamage
-    ]
-    ++ lib.optionals gstreamerSupport [ gst_all_1.gstreamer
-                                               gst_all_1.gst-plugins-base ];
+  # TODO: this shouldn't propagate so many things
+  # especially not gobject-introspection
+  propagatedBuildInputs = [
+    glib
+    gdk-pixbuf
+    gobject-introspection
+  ] ++ lib.optionals stdenv.isLinux [
+    wayland
+    mesa
+    libGL
+    xorg.libXrandr
+    xorg.libXfixes
+    xorg.libXcomposite
+    xorg.libXdamage
+  ] ++ lib.optionals gstreamerSupport [
+    gst_all_1.gstreamer
+    gst_all_1.gst-plugins-base
+  ];
 
-  buildInputs = lib.optionals pangoSupport [ pango cairo ];
+  buildInputs = lib.optionals pangoSupport [ pango cairo harfbuzz ]
+    ++ lib.optionals stdenv.isDarwin [ OpenGL ];
 
-  COGL_PANGO_DEP_CFLAGS
-    = lib.optionalString (stdenv.isDarwin && pangoSupport)
-      "-I${pango.dev}/include/pango-1.0 -I${cairo.dev}/include/cairo";
+  COGL_PANGO_DEP_CFLAGS = toString (lib.optionals (stdenv.isDarwin && pangoSupport) [
+    "-I${pango.dev}/include/pango-1.0"
+    "-I${cairo.dev}/include/cairo"
+    "-I${harfbuzz.dev}/include/harfbuzz"
+  ]);
 
   #doCheck = true; # all tests fail (no idea why)
 
@@ -74,7 +108,7 @@ stdenv.mkDerivation rec {
       render without stepping on each other's toes.
     '';
 
-    platforms = platforms.mesaPlatforms;
+    platforms = platforms.unix;
     license = with licenses; [ mit bsd3 publicDomain sgi-b-20 ];
   };
 }
diff --git a/nixpkgs/pkgs/development/libraries/cogl/patches/gnome_bugzilla_787443_359589_deepin.patch b/nixpkgs/pkgs/development/libraries/cogl/patches/gnome_bugzilla_787443_359589_deepin.patch
new file mode 100644
index 000000000000..45342dcff2cd
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/cogl/patches/gnome_bugzilla_787443_359589_deepin.patch
@@ -0,0 +1,93 @@
+From 78636289b073d67209a20145ef0dc003f2d77db6 Mon Sep 17 00:00:00 2001
+From: Sian Cao <yinshuiboy@gmail.com>
+Date: Tue, 12 Apr 2016 11:36:51 +0800
+Subject: [PATCH 1/2] Add GL_ARB_shader_texture_lod support
+
+The patch is used to do lod biased texturing. I can achieve
+faster blurring of images instead of using large blur radius.
+
+---
+ cogl/cogl-context.h                |  1 +
+ cogl/cogl-glsl-shader.c            | 13 +++++++++++--
+ cogl/cogl-types.h                  |  3 ++-
+ cogl/driver/gl/gl/cogl-driver-gl.c |  7 +++++++
+ 4 files changed, 21 insertions(+), 3 deletions(-)
+
+diff --git a/cogl/cogl-context.h b/cogl/cogl-context.h
+index 07badeb..261ce49 100644
+--- a/cogl/cogl-context.h
++++ b/cogl/cogl-context.h
+@@ -290,6 +290,7 @@ typedef enum _CoglFeatureID
+   COGL_FEATURE_ID_PER_VERTEX_POINT_SIZE,
+   COGL_FEATURE_ID_TEXTURE_RG,
+   COGL_FEATURE_ID_BUFFER_AGE,
++  COGL_FEATURE_ID_SHADER_TEXTURE_LOD,
+ 
+   /*< private >*/
+   _COGL_N_FEATURE_IDS   /*< skip >*/
+diff --git a/cogl/cogl-glsl-shader.c b/cogl/cogl-glsl-shader.c
+index 196e0c7..4fb0eb5 100644
+--- a/cogl/cogl-glsl-shader.c
++++ b/cogl/cogl-glsl-shader.c
+@@ -87,8 +87,8 @@ _cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
+   const char *vertex_boilerplate;
+   const char *fragment_boilerplate;
+ 
+-  const char **strings = g_alloca (sizeof (char *) * (count_in + 4));
+-  GLint *lengths = g_alloca (sizeof (GLint) * (count_in + 4));
++  const char **strings = g_alloca (sizeof (char *) * (count_in + 5));
++  GLint *lengths = g_alloca (sizeof (GLint) * (count_in + 5));
+   char *version_string;
+   int count = 0;
+ 
+@@ -111,6 +111,15 @@ _cogl_glsl_shader_set_source_with_boilerplate (CoglContext *ctx,
+       lengths[count++] = sizeof (texture_3d_extension) - 1;
+     }
+ 
++  if (_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_GL_PROGRAMMABLE) &&
++      cogl_has_feature (ctx, COGL_FEATURE_ID_SHADER_TEXTURE_LOD))
++    {
++      static const char shader_texture_lod_ext[] =
++        "#extension GL_ARB_shader_texture_lod : enable\n";
++      strings[count] = shader_texture_lod_ext;
++      lengths[count++] = sizeof (shader_texture_lod_ext) - 1;
++    }
++
+   if (shader_gl_type == GL_VERTEX_SHADER)
+     {
+       strings[count] = vertex_boilerplate;
+diff --git a/cogl/cogl-types.h b/cogl/cogl-types.h
+index 6accf8d..77964c6 100644
+--- a/cogl/cogl-types.h
++++ b/cogl/cogl-types.h
+@@ -470,7 +470,8 @@ typedef enum
+   COGL_FEATURE_MAP_BUFFER_FOR_READ    = (1 << 21),
+   COGL_FEATURE_MAP_BUFFER_FOR_WRITE   = (1 << 22),
+   COGL_FEATURE_ONSCREEN_MULTIPLE      = (1 << 23),
+-  COGL_FEATURE_DEPTH_TEXTURE          = (1 << 24)
++  COGL_FEATURE_DEPTH_TEXTURE          = (1 << 24),
++  COGL_FEATURE_SHADER_TEXTURE_LOD     = (1 << 25)
+ } CoglFeatureFlags;
+ 
+ /**
+diff --git a/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/driver/gl/gl/cogl-driver-gl.c
+index 716d1dd..f305b6a 100644
+--- a/cogl/driver/gl/gl/cogl-driver-gl.c
++++ b/cogl/driver/gl/gl/cogl-driver-gl.c
+@@ -568,6 +568,13 @@ _cogl_driver_update_features (CoglContext *ctx,
+                       COGL_FEATURE_ID_TEXTURE_RECTANGLE, TRUE);
+     }
+ 
++  if (_cogl_check_extension ("GL_ARB_shader_texture_lod", gl_extensions))
++    {
++      flags |= COGL_FEATURE_SHADER_TEXTURE_LOD;
++      COGL_FLAGS_SET (ctx->features,
++                      COGL_FEATURE_ID_SHADER_TEXTURE_LOD, TRUE);
++    }
++
+   if (ctx->glTexImage3D)
+     {
+       flags |= COGL_FEATURE_TEXTURE_3D;
+-- 
+2.9.5
+
diff --git a/nixpkgs/pkgs/development/libraries/cogl/patches/gnome_bugzilla_787443_361056_deepin.patch b/nixpkgs/pkgs/development/libraries/cogl/patches/gnome_bugzilla_787443_361056_deepin.patch
new file mode 100644
index 000000000000..d8409e33fa93
--- /dev/null
+++ b/nixpkgs/pkgs/development/libraries/cogl/patches/gnome_bugzilla_787443_361056_deepin.patch
@@ -0,0 +1,368 @@
+From d8b34ab0604d80d0be22b8b78e9aa6bf4fac7db0 Mon Sep 17 00:00:00 2001
+From: Sian Cao <yinshuiboy@gmail.com>
+Date: Thu, 27 Oct 2016 15:19:32 +0800
+Subject: [PATCH 2/2] texture: Support copy_sub_image
+
+We need copy_sub_image to implement blurring effects of partial framebuffer
+contents as texture sources.
+
+---
+ cogl/cogl-atlas-texture.c                   |  1 +
+ cogl/cogl-driver.h                          | 10 ++++++++
+ cogl/cogl-sub-texture.c                     |  1 +
+ cogl/cogl-texture-2d-sliced.c               |  1 +
+ cogl/cogl-texture-2d.c                      | 30 ++++++++++++++++++++++
+ cogl/cogl-texture-3d.c                      |  1 +
+ cogl/cogl-texture-private.h                 |  9 +++++++
+ cogl/cogl-texture-rectangle.c               |  1 +
+ cogl/cogl-texture.c                         | 33 ++++++++++++++++++++++++
+ cogl/cogl-texture.h                         |  9 +++++++
+ cogl/driver/gl/cogl-texture-2d-gl-private.h |  9 +++++++
+ cogl/driver/gl/cogl-texture-2d-gl.c         | 39 +++++++++++++++++++++++++++++
+ cogl/driver/gl/gl/cogl-driver-gl.c          |  1 +
+ cogl/driver/gl/gles/cogl-driver-gles.c      |  1 +
+ cogl/driver/nop/cogl-driver-nop.c           |  1 +
+ cogl/winsys/cogl-texture-pixmap-x11.c       |  1 +
+ 16 files changed, 148 insertions(+)
+
+diff --git a/cogl/cogl-atlas-texture.c b/cogl/cogl-atlas-texture.c
+index 1c8b569..e411302 100644
+--- a/cogl/cogl-atlas-texture.c
++++ b/cogl/cogl-atlas-texture.c
+@@ -1027,6 +1027,7 @@ cogl_atlas_texture_vtable =
+     FALSE, /* not primitive */
+     _cogl_atlas_texture_allocate,
+     _cogl_atlas_texture_set_region,
++    NULL, /* copy_sub_image */
+     NULL, /* get_data */
+     _cogl_atlas_texture_foreach_sub_texture_in_region,
+     _cogl_atlas_texture_get_max_waste,
+diff --git a/cogl/cogl-driver.h b/cogl/cogl-driver.h
+index 648228c..4a0aeaf 100644
+--- a/cogl/cogl-driver.h
++++ b/cogl/cogl-driver.h
+@@ -192,6 +192,16 @@ struct _CoglDriverVtable
+                                    int level,
+                                    CoglError **error);
+ 
++  CoglBool
++  (* texture_2d_copy_sub_image) (CoglTexture2D *tex_2d,
++                                 GLint xoffset,
++                                 GLint yoffset,
++                                 GLint x,
++                                 GLint y,
++                                 GLsizei width,
++                                 GLsizei height,
++                                 CoglError **error);
++
+   /* Reads back the full contents of the given texture and write it to
+    * @data in the given @format and with the given @rowstride.
+    *
+diff --git a/cogl/cogl-sub-texture.c b/cogl/cogl-sub-texture.c
+index 7baf95e..0a16193 100644
+--- a/cogl/cogl-sub-texture.c
++++ b/cogl/cogl-sub-texture.c
+@@ -460,6 +460,7 @@ cogl_sub_texture_vtable =
+     FALSE, /* not primitive */
+     _cogl_sub_texture_allocate,
+     _cogl_sub_texture_set_region,
++    NULL, /* copy_sub_image */
+     NULL, /* get_data */
+     _cogl_sub_texture_foreach_sub_texture_in_region,
+     _cogl_sub_texture_get_max_waste,
+diff --git a/cogl/cogl-texture-2d-sliced.c b/cogl/cogl-texture-2d-sliced.c
+index e76bef6..b0b099f 100644
+--- a/cogl/cogl-texture-2d-sliced.c
++++ b/cogl/cogl-texture-2d-sliced.c
+@@ -1526,6 +1526,7 @@ cogl_texture_2d_sliced_vtable =
+     FALSE, /* not primitive */
+     _cogl_texture_2d_sliced_allocate,
+     _cogl_texture_2d_sliced_set_region,
++    NULL, /* copy_sub_image */
+     NULL, /* get_data */
+     _cogl_texture_2d_sliced_foreach_sub_texture_in_region,
+     _cogl_texture_2d_sliced_get_max_waste,
+diff --git a/cogl/cogl-texture-2d.c b/cogl/cogl-texture-2d.c
+index cc28cd9..d9ab188 100644
+--- a/cogl/cogl-texture-2d.c
++++ b/cogl/cogl-texture-2d.c
+@@ -628,6 +628,35 @@ _cogl_texture_2d_set_region (CoglTexture *tex,
+ }
+ 
+ static CoglBool
++_cogl_texture_2d_copy_sub_image (CoglTexture *tex,
++                                 GLint xoffset,
++                                 GLint yoffset,
++                                 GLint x,
++                                 GLint y,
++                                 GLsizei width,
++                                 GLsizei height,
++                                 CoglError **error)
++{
++  CoglContext *ctx = tex->context;
++  CoglTexture2D *tex_2d = COGL_TEXTURE_2D (tex);
++
++  cogl_texture_allocate (tex, NULL); /* (abort on error) */
++
++  ctx->driver_vtable->texture_2d_copy_sub_image (tex_2d,
++                                                 xoffset,
++                                                 yoffset,
++                                                 x,
++                                                 y,
++                                                 width,
++                                                 height,
++                                                 error);
++
++  tex_2d->mipmaps_dirty = TRUE;
++
++  return TRUE;
++}
++
++static CoglBool
+ _cogl_texture_2d_get_data (CoglTexture *tex,
+                            CoglPixelFormat format,
+                            int rowstride,
+@@ -675,6 +704,7 @@ cogl_texture_2d_vtable =
+     TRUE, /* primitive */
+     _cogl_texture_2d_allocate,
+     _cogl_texture_2d_set_region,
++    _cogl_texture_2d_copy_sub_image,
+     _cogl_texture_2d_get_data,
+     NULL, /* foreach_sub_texture_in_region */
+     _cogl_texture_2d_get_max_waste,
+diff --git a/cogl/cogl-texture-3d.c b/cogl/cogl-texture-3d.c
+index 8e2ff08..a59d386 100644
+--- a/cogl/cogl-texture-3d.c
++++ b/cogl/cogl-texture-3d.c
+@@ -741,6 +741,7 @@ cogl_texture_3d_vtable =
+     TRUE, /* primitive */
+     _cogl_texture_3d_allocate,
+     _cogl_texture_3d_set_region,
++    NULL, /* copy_sub_image */
+     _cogl_texture_3d_get_data,
+     NULL, /* foreach_sub_texture_in_region */
+     _cogl_texture_3d_get_max_waste,
+diff --git a/cogl/cogl-texture-private.h b/cogl/cogl-texture-private.h
+index 472c41d..34ff81c 100644
+--- a/cogl/cogl-texture-private.h
++++ b/cogl/cogl-texture-private.h
+@@ -90,6 +90,15 @@ struct _CoglTextureVtable
+                            CoglBitmap *bitmap,
+                            CoglError **error);
+ 
++    CoglBool (* copy_sub_image) (CoglTexture *texture,
++                                 GLint xoffset,
++                                 GLint yoffset,
++                                 GLint x,
++                                 GLint y,
++                                 GLsizei width,
++                                 GLsizei height,
++                                 CoglError **error);
++
+   /* This should copy the image data of the texture into @data. The
+      requested format will have been first passed through
+      ctx->texture_driver->find_best_gl_get_data_format so it should
+diff --git a/cogl/cogl-texture-rectangle.c b/cogl/cogl-texture-rectangle.c
+index 65d2f06..9f533c9 100644
+--- a/cogl/cogl-texture-rectangle.c
++++ b/cogl/cogl-texture-rectangle.c
+@@ -761,6 +761,7 @@ cogl_texture_rectangle_vtable =
+     TRUE, /* primitive */
+     _cogl_texture_rectangle_allocate,
+     _cogl_texture_rectangle_set_region,
++    NULL, /* copy_sub_image */
+     _cogl_texture_rectangle_get_data,
+     NULL, /* foreach_sub_texture_in_region */
+     _cogl_texture_rectangle_get_max_waste,
+diff --git a/cogl/cogl-texture.c b/cogl/cogl-texture.c
+index d93db22..1f4b43c 100644
+--- a/cogl/cogl-texture.c
++++ b/cogl/cogl-texture.c
+@@ -514,6 +514,39 @@ cogl_texture_set_region (CoglTexture *texture,
+ }
+ 
+ CoglBool
++cogl_texture_copy_sub_image (CoglTexture *texture,
++                             int xoffset,
++                             int yoffset,
++                             int x,
++                             int y,
++                             size_t width,
++                             size_t height)
++{
++  CoglError *ignore_error = NULL;
++  CoglBool status;
++
++  if (!texture->allocated)
++    cogl_texture_allocate (texture, NULL);
++
++  if (!texture->vtable->copy_sub_image)
++    return FALSE;
++
++  status = texture->vtable->copy_sub_image (texture,
++                                            xoffset,
++                                            yoffset,
++                                            x,
++                                            y,
++                                            width,
++                                            height,
++                                            &ignore_error);
++
++  if (!status)
++    cogl_error_free (ignore_error);
++  return status;
++}
++
++
++CoglBool
+ cogl_texture_set_data (CoglTexture *texture,
+                        CoglPixelFormat format,
+                        int rowstride,
+diff --git a/cogl/cogl-texture.h b/cogl/cogl-texture.h
+index 2718830..81657d1 100644
+--- a/cogl/cogl-texture.h
++++ b/cogl/cogl-texture.h
+@@ -399,6 +399,15 @@ cogl_texture_set_region (CoglTexture *texture,
+                          unsigned int rowstride,
+                          const uint8_t *data);
+ 
++CoglBool
++cogl_texture_copy_sub_image (CoglTexture *texture,
++                             int xoffset,
++                             int yoffset,
++                             int x,
++                             int y,
++                             size_t width,
++                             size_t height);
++
+ #if defined (COGL_ENABLE_EXPERIMENTAL_API)
+ 
+ /**
+diff --git a/cogl/driver/gl/cogl-texture-2d-gl-private.h b/cogl/driver/gl/cogl-texture-2d-gl-private.h
+index e5c6585..d2f9985 100644
+--- a/cogl/driver/gl/cogl-texture-2d-gl-private.h
++++ b/cogl/driver/gl/cogl-texture-2d-gl-private.h
+@@ -109,6 +109,15 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d,
+                                       int dst_y,
+                                       int level,
+                                       CoglError **error);
++CoglBool
++_cogl_texture_2d_gl_copy_sub_image (CoglTexture2D *tex_2d,
++                                    GLint xoffset,
++                                    GLint yoffset,
++                                    GLint x,
++                                    GLint y,
++                                    GLsizei width,
++                                    GLsizei height,
++                                    CoglError **error);
+ 
+ void
+ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
+diff --git a/cogl/driver/gl/cogl-texture-2d-gl.c b/cogl/driver/gl/cogl-texture-2d-gl.c
+index 8675f52..bc15ac5 100644
+--- a/cogl/driver/gl/cogl-texture-2d-gl.c
++++ b/cogl/driver/gl/cogl-texture-2d-gl.c
+@@ -35,6 +35,7 @@
+ #include <config.h>
+ 
+ #include <string.h>
++#include <stdio.h>
+ 
+ #include "cogl-private.h"
+ #include "cogl-texture-private.h"
+@@ -719,6 +720,44 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d,
+   return status;
+ }
+ 
++CoglBool
++_cogl_texture_2d_gl_copy_sub_image (CoglTexture2D *tex_2d,
++                                    GLint xoffset,
++                                    GLint yoffset,
++                                    GLint x,
++                                    GLint y,
++                                    GLsizei width,
++                                    GLsizei height,
++                                    CoglError **error)
++{
++  CoglContext *ctx = COGL_TEXTURE (tex_2d)->context;
++
++  if (ctx->current_read_buffer == NULL)
++    return FALSE;
++
++  if (ctx->current_draw_buffer)
++    _cogl_framebuffer_flush_journal (ctx->current_draw_buffer);
++
++  if (ctx->current_read_buffer != NULL &&
++      ctx->current_read_buffer != ctx->current_draw_buffer)
++    _cogl_framebuffer_flush_journal (ctx->current_read_buffer);
++
++  _cogl_bind_gl_texture_transient (GL_TEXTURE_2D,
++                                   tex_2d->gl_texture,
++                                   tex_2d->is_foreign);
++
++  ctx->glCopyTexSubImage2D (GL_TEXTURE_2D,
++                            0,
++                            xoffset,
++                            yoffset,
++                            x,
++                            y,
++                            width,
++                            height);
++
++  return TRUE;
++}
++
+ void
+ _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
+                               CoglPixelFormat format,
+diff --git a/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/driver/gl/gl/cogl-driver-gl.c
+index f305b6a..f7f5020 100644
+--- a/cogl/driver/gl/gl/cogl-driver-gl.c
++++ b/cogl/driver/gl/gl/cogl-driver-gl.c
+@@ -695,6 +695,7 @@ _cogl_driver_gl =
+     _cogl_texture_2d_gl_get_gl_handle,
+     _cogl_texture_2d_gl_generate_mipmap,
+     _cogl_texture_2d_gl_copy_from_bitmap,
++    _cogl_texture_2d_gl_copy_sub_image,
+     _cogl_texture_2d_gl_get_data,
+     _cogl_gl_flush_attributes_state,
+     _cogl_clip_stack_gl_flush,
+diff --git a/cogl/driver/gl/gles/cogl-driver-gles.c b/cogl/driver/gl/gles/cogl-driver-gles.c
+index e94449f..f5ac771 100644
+--- a/cogl/driver/gl/gles/cogl-driver-gles.c
++++ b/cogl/driver/gl/gles/cogl-driver-gles.c
+@@ -476,6 +476,7 @@ _cogl_driver_gles =
+     _cogl_texture_2d_gl_get_gl_handle,
+     _cogl_texture_2d_gl_generate_mipmap,
+     _cogl_texture_2d_gl_copy_from_bitmap,
++    _cogl_texture_2d_gl_copy_sub_image,
+     NULL, /* texture_2d_get_data */
+     _cogl_gl_flush_attributes_state,
+     _cogl_clip_stack_gl_flush,
+diff --git a/cogl/driver/nop/cogl-driver-nop.c b/cogl/driver/nop/cogl-driver-nop.c
+index 53f5975..9d88955 100644
+--- a/cogl/driver/nop/cogl-driver-nop.c
++++ b/cogl/driver/nop/cogl-driver-nop.c
+@@ -80,6 +80,7 @@ _cogl_driver_nop =
+     _cogl_texture_2d_nop_get_gl_handle,
+     _cogl_texture_2d_nop_generate_mipmap,
+     _cogl_texture_2d_nop_copy_from_bitmap,
++    NULL, /* texture_2d_copy_from_image */
+     NULL, /* texture_2d_get_data */
+     _cogl_nop_flush_attributes_state,
+     _cogl_clip_stack_nop_flush,
+diff --git a/cogl/winsys/cogl-texture-pixmap-x11.c b/cogl/winsys/cogl-texture-pixmap-x11.c
+index 398c357..a44cdaf 100644
+--- a/cogl/winsys/cogl-texture-pixmap-x11.c
++++ b/cogl/winsys/cogl-texture-pixmap-x11.c
+@@ -1164,6 +1164,7 @@ cogl_texture_pixmap_x11_vtable =
+     FALSE, /* not primitive */
+     _cogl_texture_pixmap_x11_allocate,
+     _cogl_texture_pixmap_x11_set_region,
++    NULL, /* copy_sub_image */
+     _cogl_texture_pixmap_x11_get_data,
+     _cogl_texture_pixmap_x11_foreach_sub_texture_in_region,
+     _cogl_texture_pixmap_x11_get_max_waste,
+-- 
+2.9.5
+