Blame SOURCES/0003-texture-support-copy_sub_image.patch

525926
From d8b34ab0604d80d0be22b8b78e9aa6bf4fac7db0 Mon Sep 17 00:00:00 2001
525926
From: Sian Cao <yinshuiboy@gmail.com>
525926
Date: Thu, 27 Oct 2016 15:19:32 +0800
525926
Subject: texture: Support copy_sub_image
525926
525926
The patch is used to implement feature similar with kwin blur effect
525926
by being abel to copy partial of framebuffer contents as texture and
525926
do post blurring.
525926
525926
Signed-off-by:
525926
 Sian Cao <yinshuiboy@gmail.com>: initial
525926
 Bowen Li <sensor.wen@gmail.com>: fix coding style
525926
525926
---
525926
 cogl/cogl-atlas-texture.c                   |  1 +
525926
 cogl/cogl-driver.h                          | 10 ++++++++
525926
 cogl/cogl-sub-texture.c                     |  1 +
525926
 cogl/cogl-texture-2d-sliced.c               |  1 +
525926
 cogl/cogl-texture-2d.c                      | 30 ++++++++++++++++++++++
525926
 cogl/cogl-texture-3d.c                      |  1 +
525926
 cogl/cogl-texture-private.h                 |  9 +++++++
525926
 cogl/cogl-texture-rectangle.c               |  1 +
525926
 cogl/cogl-texture.c                         | 33 ++++++++++++++++++++++++
525926
 cogl/cogl-texture.h                         |  9 +++++++
525926
 cogl/driver/gl/cogl-texture-2d-gl-private.h |  9 +++++++
525926
 cogl/driver/gl/cogl-texture-2d-gl.c         | 39 +++++++++++++++++++++++++++++
525926
 cogl/driver/gl/gl/cogl-driver-gl.c          |  1 +
525926
 cogl/driver/gl/gles/cogl-driver-gles.c      |  1 +
525926
 cogl/driver/nop/cogl-driver-nop.c           |  1 +
525926
 cogl/winsys/cogl-texture-pixmap-x11.c       |  1 +
525926
 16 files changed, 148 insertions(+)
525926
525926
diff --git a/cogl/cogl-atlas-texture.c b/cogl/cogl-atlas-texture.c
525926
index 1c8b569..e411302 100644
525926
--- a/cogl/cogl-atlas-texture.c
525926
+++ b/cogl/cogl-atlas-texture.c
525926
@@ -1027,6 +1027,7 @@ cogl_atlas_texture_vtable =
525926
     FALSE, /* not primitive */
525926
     _cogl_atlas_texture_allocate,
525926
     _cogl_atlas_texture_set_region,
525926
+    NULL, /* copy_sub_image */
525926
     NULL, /* get_data */
525926
     _cogl_atlas_texture_foreach_sub_texture_in_region,
525926
     _cogl_atlas_texture_get_max_waste,
525926
diff --git a/cogl/cogl-driver.h b/cogl/cogl-driver.h
525926
index 648228c..4a0aeaf 100644
525926
--- a/cogl/cogl-driver.h
525926
+++ b/cogl/cogl-driver.h
525926
@@ -192,6 +192,16 @@ struct _CoglDriverVtable
525926
                                    int level,
525926
                                    CoglError **error);
525926
 
525926
+  CoglBool
525926
+  (* texture_2d_copy_sub_image) (CoglTexture2D *tex_2d,
525926
+                                 GLint xoffset,
525926
+                                 GLint yoffset,
525926
+                                 GLint x,
525926
+                                 GLint y,
525926
+                                 GLsizei width,
525926
+                                 GLsizei height,
525926
+                                 CoglError **error);
525926
+
525926
   /* Reads back the full contents of the given texture and write it to
525926
    * @data in the given @format and with the given @rowstride.
525926
    *
525926
diff --git a/cogl/cogl-sub-texture.c b/cogl/cogl-sub-texture.c
525926
index 7baf95e..0a16193 100644
525926
--- a/cogl/cogl-sub-texture.c
525926
+++ b/cogl/cogl-sub-texture.c
525926
@@ -460,6 +460,7 @@ cogl_sub_texture_vtable =
525926
     FALSE, /* not primitive */
525926
     _cogl_sub_texture_allocate,
525926
     _cogl_sub_texture_set_region,
525926
+    NULL, /* copy_sub_image */
525926
     NULL, /* get_data */
525926
     _cogl_sub_texture_foreach_sub_texture_in_region,
525926
     _cogl_sub_texture_get_max_waste,
525926
diff --git a/cogl/cogl-texture-2d-sliced.c b/cogl/cogl-texture-2d-sliced.c
525926
index e76bef6..b0b099f 100644
525926
--- a/cogl/cogl-texture-2d-sliced.c
525926
+++ b/cogl/cogl-texture-2d-sliced.c
525926
@@ -1526,6 +1526,7 @@ cogl_texture_2d_sliced_vtable =
525926
     FALSE, /* not primitive */
525926
     _cogl_texture_2d_sliced_allocate,
525926
     _cogl_texture_2d_sliced_set_region,
525926
+    NULL, /* copy_sub_image */
525926
     NULL, /* get_data */
525926
     _cogl_texture_2d_sliced_foreach_sub_texture_in_region,
525926
     _cogl_texture_2d_sliced_get_max_waste,
525926
diff --git a/cogl/cogl-texture-2d.c b/cogl/cogl-texture-2d.c
525926
index cc28cd9..d9ab188 100644
525926
--- a/cogl/cogl-texture-2d.c
525926
+++ b/cogl/cogl-texture-2d.c
525926
@@ -628,6 +628,35 @@ _cogl_texture_2d_set_region (CoglTexture *tex,
525926
 }
525926
 
525926
 static CoglBool
525926
+_cogl_texture_2d_copy_sub_image (CoglTexture *tex,
525926
+                                 GLint xoffset,
525926
+                                 GLint yoffset,
525926
+                                 GLint x,
525926
+                                 GLint y,
525926
+                                 GLsizei width,
525926
+                                 GLsizei height,
525926
+                                 CoglError **error)
525926
+{
525926
+  CoglContext *ctx = tex->context;
525926
+  CoglTexture2D *tex_2d = COGL_TEXTURE_2D (tex);
525926
+
525926
+  cogl_texture_allocate (tex, NULL); /* (abort on error) */
525926
+
525926
+  ctx->driver_vtable->texture_2d_copy_sub_image (tex_2d,
525926
+                                                 xoffset,
525926
+                                                 yoffset,
525926
+                                                 x,
525926
+                                                 y,
525926
+                                                 width,
525926
+                                                 height,
525926
+                                                 error);
525926
+
525926
+  tex_2d->mipmaps_dirty = TRUE;
525926
+
525926
+  return TRUE;
525926
+}
525926
+
525926
+static CoglBool
525926
 _cogl_texture_2d_get_data (CoglTexture *tex,
525926
                            CoglPixelFormat format,
525926
                            int rowstride,
525926
@@ -675,6 +704,7 @@ cogl_texture_2d_vtable =
525926
     TRUE, /* primitive */
525926
     _cogl_texture_2d_allocate,
525926
     _cogl_texture_2d_set_region,
525926
+    _cogl_texture_2d_copy_sub_image,
525926
     _cogl_texture_2d_get_data,
525926
     NULL, /* foreach_sub_texture_in_region */
525926
     _cogl_texture_2d_get_max_waste,
525926
diff --git a/cogl/cogl-texture-3d.c b/cogl/cogl-texture-3d.c
525926
index 8e2ff08..a59d386 100644
525926
--- a/cogl/cogl-texture-3d.c
525926
+++ b/cogl/cogl-texture-3d.c
525926
@@ -741,6 +741,7 @@ cogl_texture_3d_vtable =
525926
     TRUE, /* primitive */
525926
     _cogl_texture_3d_allocate,
525926
     _cogl_texture_3d_set_region,
525926
+    NULL, /* copy_sub_image */
525926
     _cogl_texture_3d_get_data,
525926
     NULL, /* foreach_sub_texture_in_region */
525926
     _cogl_texture_3d_get_max_waste,
525926
diff --git a/cogl/cogl-texture-private.h b/cogl/cogl-texture-private.h
525926
index 472c41d..34ff81c 100644
525926
--- a/cogl/cogl-texture-private.h
525926
+++ b/cogl/cogl-texture-private.h
525926
@@ -90,6 +90,15 @@ struct _CoglTextureVtable
525926
                            CoglBitmap *bitmap,
525926
                            CoglError **error);
525926
 
525926
+    CoglBool (* copy_sub_image) (CoglTexture *texture,
525926
+                                 GLint xoffset,
525926
+                                 GLint yoffset,
525926
+                                 GLint x,
525926
+                                 GLint y,
525926
+                                 GLsizei width,
525926
+                                 GLsizei height,
525926
+                                 CoglError **error);
525926
+
525926
   /* This should copy the image data of the texture into @data. The
525926
      requested format will have been first passed through
525926
      ctx->texture_driver->find_best_gl_get_data_format so it should
525926
diff --git a/cogl/cogl-texture-rectangle.c b/cogl/cogl-texture-rectangle.c
525926
index 65d2f06..9f533c9 100644
525926
--- a/cogl/cogl-texture-rectangle.c
525926
+++ b/cogl/cogl-texture-rectangle.c
525926
@@ -761,6 +761,7 @@ cogl_texture_rectangle_vtable =
525926
     TRUE, /* primitive */
525926
     _cogl_texture_rectangle_allocate,
525926
     _cogl_texture_rectangle_set_region,
525926
+    NULL, /* copy_sub_image */
525926
     _cogl_texture_rectangle_get_data,
525926
     NULL, /* foreach_sub_texture_in_region */
525926
     _cogl_texture_rectangle_get_max_waste,
525926
diff --git a/cogl/cogl-texture.c b/cogl/cogl-texture.c
525926
index d93db22..1f4b43c 100644
525926
--- a/cogl/cogl-texture.c
525926
+++ b/cogl/cogl-texture.c
525926
@@ -514,6 +514,39 @@ cogl_texture_set_region (CoglTexture *texture,
525926
 }
525926
 
525926
 CoglBool
525926
+cogl_texture_copy_sub_image (CoglTexture *texture,
525926
+                             int xoffset,
525926
+                             int yoffset,
525926
+                             int x,
525926
+                             int y,
525926
+                             size_t width,
525926
+                             size_t height)
525926
+{
525926
+  CoglError *ignore_error = NULL;
525926
+  CoglBool status;
525926
+
525926
+  if (!texture->allocated)
525926
+    cogl_texture_allocate (texture, NULL);
525926
+
525926
+  if (!texture->vtable->copy_sub_image)
525926
+    return FALSE;
525926
+
525926
+  status = texture->vtable->copy_sub_image (texture,
525926
+                                            xoffset,
525926
+                                            yoffset,
525926
+                                            x,
525926
+                                            y,
525926
+                                            width,
525926
+                                            height,
525926
+                                            &ignore_error);
525926
+
525926
+  if (!status)
525926
+    cogl_error_free (ignore_error);
525926
+  return status;
525926
+}
525926
+
525926
+
525926
+CoglBool
525926
 cogl_texture_set_data (CoglTexture *texture,
525926
                        CoglPixelFormat format,
525926
                        int rowstride,
525926
diff --git a/cogl/cogl-texture.h b/cogl/cogl-texture.h
525926
index 2718830..81657d1 100644
525926
--- a/cogl/cogl-texture.h
525926
+++ b/cogl/cogl-texture.h
525926
@@ -399,6 +399,15 @@ cogl_texture_set_region (CoglTexture *texture,
525926
                          unsigned int rowstride,
525926
                          const uint8_t *data);
525926
 
525926
+CoglBool
525926
+cogl_texture_copy_sub_image (CoglTexture *texture,
525926
+                             int xoffset,
525926
+                             int yoffset,
525926
+                             int x,
525926
+                             int y,
525926
+                             size_t width,
525926
+                             size_t height);
525926
+
525926
 #if defined (COGL_ENABLE_EXPERIMENTAL_API)
525926
 
525926
 /**
525926
diff --git a/cogl/driver/gl/cogl-texture-2d-gl-private.h b/cogl/driver/gl/cogl-texture-2d-gl-private.h
525926
index e5c6585..d2f9985 100644
525926
--- a/cogl/driver/gl/cogl-texture-2d-gl-private.h
525926
+++ b/cogl/driver/gl/cogl-texture-2d-gl-private.h
525926
@@ -109,6 +109,15 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d,
525926
                                       int dst_y,
525926
                                       int level,
525926
                                       CoglError **error);
525926
+CoglBool
525926
+_cogl_texture_2d_gl_copy_sub_image (CoglTexture2D *tex_2d,
525926
+                                    GLint xoffset,
525926
+                                    GLint yoffset,
525926
+                                    GLint x,
525926
+                                    GLint y,
525926
+                                    GLsizei width,
525926
+                                    GLsizei height,
525926
+                                    CoglError **error);
525926
 
525926
 void
525926
 _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
525926
diff --git a/cogl/driver/gl/cogl-texture-2d-gl.c b/cogl/driver/gl/cogl-texture-2d-gl.c
525926
index 8675f52..bc15ac5 100644
525926
--- a/cogl/driver/gl/cogl-texture-2d-gl.c
525926
+++ b/cogl/driver/gl/cogl-texture-2d-gl.c
525926
@@ -35,6 +35,7 @@
525926
 #include <config.h>
525926
 
525926
 #include <string.h>
525926
+#include <stdio.h>
525926
 
525926
 #include "cogl-private.h"
525926
 #include "cogl-texture-private.h"
525926
@@ -719,6 +720,44 @@ _cogl_texture_2d_gl_copy_from_bitmap (CoglTexture2D *tex_2d,
525926
   return status;
525926
 }
525926
 
525926
+CoglBool
525926
+_cogl_texture_2d_gl_copy_sub_image (CoglTexture2D *tex_2d,
525926
+                                    GLint xoffset,
525926
+                                    GLint yoffset,
525926
+                                    GLint x,
525926
+                                    GLint y,
525926
+                                    GLsizei width,
525926
+                                    GLsizei height,
525926
+                                    CoglError **error)
525926
+{
525926
+  CoglContext *ctx = COGL_TEXTURE (tex_2d)->context;
525926
+
525926
+  if (ctx->current_read_buffer == NULL)
525926
+    return FALSE;
525926
+
525926
+  if (ctx->current_draw_buffer)
525926
+    _cogl_framebuffer_flush_journal (ctx->current_draw_buffer);
525926
+
525926
+  if (ctx->current_read_buffer != NULL &&
525926
+      ctx->current_read_buffer != ctx->current_draw_buffer)
525926
+    _cogl_framebuffer_flush_journal (ctx->current_read_buffer);
525926
+
525926
+  _cogl_bind_gl_texture_transient (GL_TEXTURE_2D,
525926
+                                   tex_2d->gl_texture,
525926
+                                   tex_2d->is_foreign);
525926
+
525926
+  ctx->glCopyTexSubImage2D (GL_TEXTURE_2D,
525926
+                            0,
525926
+                            xoffset,
525926
+                            yoffset,
525926
+                            x,
525926
+                            y,
525926
+                            width,
525926
+                            height);
525926
+
525926
+  return TRUE;
525926
+}
525926
+
525926
 void
525926
 _cogl_texture_2d_gl_get_data (CoglTexture2D *tex_2d,
525926
                               CoglPixelFormat format,
525926
diff --git a/cogl/driver/gl/gl/cogl-driver-gl.c b/cogl/driver/gl/gl/cogl-driver-gl.c
525926
index f305b6a..f7f5020 100644
525926
--- a/cogl/driver/gl/gl/cogl-driver-gl.c
525926
+++ b/cogl/driver/gl/gl/cogl-driver-gl.c
525926
@@ -695,6 +695,7 @@ _cogl_driver_gl =
525926
     _cogl_texture_2d_gl_get_gl_handle,
525926
     _cogl_texture_2d_gl_generate_mipmap,
525926
     _cogl_texture_2d_gl_copy_from_bitmap,
525926
+    _cogl_texture_2d_gl_copy_sub_image,
525926
     _cogl_texture_2d_gl_get_data,
525926
     _cogl_gl_flush_attributes_state,
525926
     _cogl_clip_stack_gl_flush,
525926
diff --git a/cogl/driver/gl/gles/cogl-driver-gles.c b/cogl/driver/gl/gles/cogl-driver-gles.c
525926
index e94449f..f5ac771 100644
525926
--- a/cogl/driver/gl/gles/cogl-driver-gles.c
525926
+++ b/cogl/driver/gl/gles/cogl-driver-gles.c
525926
@@ -476,6 +476,7 @@ _cogl_driver_gles =
525926
     _cogl_texture_2d_gl_get_gl_handle,
525926
     _cogl_texture_2d_gl_generate_mipmap,
525926
     _cogl_texture_2d_gl_copy_from_bitmap,
525926
+    _cogl_texture_2d_gl_copy_sub_image,
525926
     NULL, /* texture_2d_get_data */
525926
     _cogl_gl_flush_attributes_state,
525926
     _cogl_clip_stack_gl_flush,
525926
diff --git a/cogl/driver/nop/cogl-driver-nop.c b/cogl/driver/nop/cogl-driver-nop.c
525926
index 53f5975..9d88955 100644
525926
--- a/cogl/driver/nop/cogl-driver-nop.c
525926
+++ b/cogl/driver/nop/cogl-driver-nop.c
525926
@@ -80,6 +80,7 @@ _cogl_driver_nop =
525926
     _cogl_texture_2d_nop_get_gl_handle,
525926
     _cogl_texture_2d_nop_generate_mipmap,
525926
     _cogl_texture_2d_nop_copy_from_bitmap,
525926
+    NULL, /* texture_2d_copy_from_image */
525926
     NULL, /* texture_2d_get_data */
525926
     _cogl_nop_flush_attributes_state,
525926
     _cogl_clip_stack_nop_flush,
525926
diff --git a/cogl/winsys/cogl-texture-pixmap-x11.c b/cogl/winsys/cogl-texture-pixmap-x11.c
525926
index 398c357..a44cdaf 100644
525926
--- a/cogl/winsys/cogl-texture-pixmap-x11.c
525926
+++ b/cogl/winsys/cogl-texture-pixmap-x11.c
525926
@@ -1164,6 +1164,7 @@ cogl_texture_pixmap_x11_vtable =
525926
     FALSE, /* not primitive */
525926
     _cogl_texture_pixmap_x11_allocate,
525926
     _cogl_texture_pixmap_x11_set_region,
525926
+    NULL, /* copy_sub_image */
525926
     _cogl_texture_pixmap_x11_get_data,
525926
     _cogl_texture_pixmap_x11_foreach_sub_texture_in_region,
525926
     _cogl_texture_pixmap_x11_get_max_waste,
525926
-- 
525926
2.9.5
525926