[gtk+/master.fcw: 259/648] gdkgl: Optionally Use vfunc For Uploading Textures



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]