Add GL_ARB_shader_texture_lod and copy_sub_image support (#1421055)

This commit is contained in:
mosquito 2017-09-28 22:07:13 +08:00
parent 742813b7c8
commit 4ee4cc0780
4 changed files with 487 additions and 4 deletions

View File

@ -0,0 +1,96 @@
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: 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.
Signed-off-by:
Sian Cao <yinshuiboy@gmail.com>: initial
---
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

View File

@ -0,0 +1,373 @@
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: texture: Support copy_sub_image
The patch is used to implement feature similar with kwin blur effect
by being abel to copy partial of framebuffer contents as texture and
do post blurring.
Signed-off-by:
Sian Cao <yinshuiboy@gmail.com>: initial
Bowen Li <sensor.wen@gmail.com>: fix coding style
---
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

View File

@ -6,7 +6,7 @@
Name: cogl Name: cogl
Version: 1.22.2 Version: 1.22.2
Release: 6%{?dist} Release: 7%{?dist}
Summary: A library for using 3D graphics hardware to draw pretty pictures Summary: A library for using 3D graphics hardware to draw pretty pictures
License: LGPLv2+ License: LGPLv2+
@ -18,6 +18,15 @@ Source0: http://download.gnome.org/sources/cogl/1.22/cogl-%{version}.tar.x
# ajax promises he'll clean this up. # ajax promises he'll clean this up.
Patch0: 0001-egl-Use-eglGetPlatformDisplay-not-eglGetDisplay.patch Patch0: 0001-egl-Use-eglGetPlatformDisplay-not-eglGetDisplay.patch
# "GL_ARB_shader_texture_lod" is used to do lod biased texturing. It
# make achieve faster blurring of images instead of using large blur radius.
Patch1: 0002-add-GL_ARB_shader_texture_lod-support.patch
# "copy_sub_image" is used to implement feature similar with kwin blur
# effect by being abel to copy partial of framebuffer contents as texture
# and do post blurring.
Patch2: 0003-texture-support-copy_sub_image.patch
BuildRequires: cairo-devel BuildRequires: cairo-devel
BuildRequires: chrpath BuildRequires: chrpath
BuildRequires: gdk-pixbuf2-devel BuildRequires: gdk-pixbuf2-devel
@ -91,6 +100,8 @@ This package contains the installable tests for %{cogl}.
%prep %prep
%setup -q %setup -q
%patch0 -p1 %patch0 -p1
%patch1 -p1
%patch2 -p1
%build %build
CFLAGS="$RPM_OPT_FLAGS -fPIC" CFLAGS="$RPM_OPT_FLAGS -fPIC"
@ -156,14 +167,17 @@ chrpath --delete $RPM_BUILD_ROOT%{_libdir}/libcogl-pango.so
%endif %endif
%changelog %changelog
* Thu Sep 28 2017 mosquito <sensor.wen@gmail.com> - 1.22.2-7
- Add GL_ARB_shader_texture_lod and copy_sub_image support (#1421055)
* Wed Aug 02 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.22.2-6 * Wed Aug 02 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.22.2-6
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Binutils_Mass_Rebuild
* Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.22.2-5 * Wed Jul 26 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.22.2-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_27_Mass_Rebuild
* Mon May 17 2017 Owen Taylor <otaylor@redhat.com> - 1.22.2-4 * Wed May 17 2017 Owen Taylor <otaylor@redhat.com> - 1.22.2-4
- Add Requires: %{name} = %{version}-%{release} to the tests subpackage - Add Requires: %%{name} = %%{version}-%%{release} to the tests subpackage
* Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.22.2-3 * Fri Feb 10 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.22.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild - Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild

View File

@ -1 +1 @@
d53b708ca7c4af03d7254e46945d6b33 cogl-1.22.2.tar.xz SHA512 (cogl-1.22.2.tar.xz) = 2ec99f5ff22683d12925b9a1f748387b47c4506aaf3c5afec851b3b6fe6b7cdfd211fb7e4359bd7a1d1b7cb3cb7fbd257efbcb7d2941d0f133a60bad1c9645e3