[gtk+/master.fcw: 259/648] gdkgl: Optionally Use vfunc For Uploading Textures
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/master.fcw: 259/648] gdkgl: Optionally Use vfunc For Uploading Textures
- Date: Wed, 4 Feb 2015 05:06:34 +0000 (UTC)
commit 3fec50c716293f1240062d4dee95e53a2ee2e21e
Author: Chun-wei Fan <fanchunwei src gnome org>
Date: Tue Dec 16 23:03:10 2014 +0800
gdkgl: Optionally Use vfunc For Uploading Textures
As the alignments, strides and image formats may be different across
platforms, allow backends to override the GL commands for uploading
textures for the software implementation for gdk_gl_texture_from_surface(),
if necessary.
Suggested by Alex to avoid copying non-trivial portions of code which would
then add maintainenace burden.
https://bugzilla.gnome.org/show_bug.cgi?id=740795
gdk/gdkgl.c | 16 +++++++++++-----
gdk/gdkglcontextprivate.h | 5 +++++
2 files changed, 16 insertions(+), 5 deletions(-)
---
diff --git a/gdk/gdkgl.c b/gdk/gdkgl.c
index bc08bbc..b1f7eb5 100644
--- a/gdk/gdkgl.c
+++ b/gdk/gdkgl.c
@@ -720,11 +720,17 @@ gdk_gl_texture_from_surface (cairo_surface_t *surface,
e.height *= sy;
image = cairo_surface_map_to_image (surface, &e);
- glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
- glPixelStorei (GL_UNPACK_ROW_LENGTH, cairo_image_surface_get_stride (image)/4);
- glTexImage2D (target, 0, 4, e.width, e.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
- cairo_image_surface_get_data (image));
- glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
+ /* We might have a different alignment, stride or format, so allow overriding here if needed */
+ if (GDK_GL_CONTEXT_GET_CLASS (paint_context)->upload_texture)
+ GDK_GL_CONTEXT_GET_CLASS (paint_context)->upload_texture (paint_context, image, e.width, e.height,
target);
+ else
+ {
+ glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
+ glPixelStorei (GL_UNPACK_ROW_LENGTH, cairo_image_surface_get_stride (image)/4);
+ glTexImage2D (target, 0, 4, e.width, e.height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
+ cairo_image_surface_get_data (image));
+ glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
+ }
cairo_surface_unmap_image (surface, image);
diff --git a/gdk/gdkglcontextprivate.h b/gdk/gdkglcontextprivate.h
index 7f5f574..612b79d 100644
--- a/gdk/gdkglcontextprivate.h
+++ b/gdk/gdkglcontextprivate.h
@@ -46,6 +46,11 @@ struct _GdkGLContextClass
gboolean (* texture_from_surface) (GdkGLContext *context,
cairo_surface_t *surface,
cairo_region_t *region);
+ void (* upload_texture) (GdkGLContext *context,
+ cairo_surface_t *image_surface,
+ int width,
+ int height,
+ guint texture_target);
};
typedef struct {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]