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

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