forked from AuroraMiddleware/gtk
gdkgl: Use vfunc For Uploading Textures
As the alignments, strides and image formats may be different across platforms, make the texture upload a vfunc to 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
This commit is contained in:
parent
6e7bf9ca7a
commit
9fd9f61b00
@ -720,11 +720,8 @@ gdk_gl_texture_from_surface (cairo_surface_t *surface,
|
|||||||
e.height *= sy;
|
e.height *= sy;
|
||||||
image = cairo_surface_map_to_image (surface, &e);
|
image = cairo_surface_map_to_image (surface, &e);
|
||||||
|
|
||||||
glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
|
/* We might have a different alignment, stride or format, so allow overriding here if needed */
|
||||||
glPixelStorei (GL_UNPACK_ROW_LENGTH, cairo_image_surface_get_stride (image)/4);
|
GDK_GL_CONTEXT_GET_CLASS (paint_context)->upload_texture (paint_context, image, e.width, e.height, target);
|
||||||
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);
|
cairo_surface_unmap_image (surface, image);
|
||||||
|
|
||||||
|
@ -226,6 +226,23 @@ gdk_gl_context_get_property (GObject *gobject,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Default implementation of upload_texture() for gdk_gl_texture_from_surface() */
|
||||||
|
static void
|
||||||
|
gdk_gl_context_upload_texture (GdkGLContext *context,
|
||||||
|
cairo_surface_t *image_surface,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
guint texture_target)
|
||||||
|
{
|
||||||
|
g_return_if_fail (GDK_IS_GL_CONTEXT (context));
|
||||||
|
|
||||||
|
glPixelStorei (GL_UNPACK_ALIGNMENT, 4);
|
||||||
|
glPixelStorei (GL_UNPACK_ROW_LENGTH, cairo_image_surface_get_stride (image_surface)/4);
|
||||||
|
glTexImage2D (texture_target, 0, 4, width, height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV,
|
||||||
|
cairo_image_surface_get_data (image_surface));
|
||||||
|
glPixelStorei (GL_UNPACK_ROW_LENGTH, 0);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gdk_gl_context_class_init (GdkGLContextClass *klass)
|
gdk_gl_context_class_init (GdkGLContextClass *klass)
|
||||||
{
|
{
|
||||||
@ -301,6 +318,9 @@ gdk_gl_context_class_init (GdkGLContextClass *klass)
|
|||||||
gobject_class->dispose = gdk_gl_context_dispose;
|
gobject_class->dispose = gdk_gl_context_dispose;
|
||||||
gobject_class->finalize = gdk_gl_context_finalize;
|
gobject_class->finalize = gdk_gl_context_finalize;
|
||||||
|
|
||||||
|
/* Default Implementation of upload_texture() for gdk_gl_texture_from_surface() */
|
||||||
|
klass->upload_texture = gdk_gl_context_upload_texture;
|
||||||
|
|
||||||
g_object_class_install_properties (gobject_class, LAST_PROP, obj_pspecs);
|
g_object_class_install_properties (gobject_class, LAST_PROP, obj_pspecs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +46,11 @@ struct _GdkGLContextClass
|
|||||||
gboolean (* texture_from_surface) (GdkGLContext *context,
|
gboolean (* texture_from_surface) (GdkGLContext *context,
|
||||||
cairo_surface_t *surface,
|
cairo_surface_t *surface,
|
||||||
cairo_region_t *region);
|
cairo_region_t *region);
|
||||||
|
void (* upload_texture) (GdkGLContext *context,
|
||||||
|
cairo_surface_t *image_surface,
|
||||||
|
int width,
|
||||||
|
int height,
|
||||||
|
guint texture_target);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user