diff options
author | Emmanuele Bassi <ebassi@gnome.org> | 2016-04-25 10:31:51 +0100 |
---|---|---|
committer | Emmanuele Bassi <ebassi@gnome.org> | 2016-04-25 14:33:35 +0100 |
commit | 1379b4b175910a253bb4aa8df3194eec2e160213 (patch) | |
tree | 02684640a2d89387fe1a4f2a3f297545fcb89b20 /gdk/gdkglcontext.c | |
parent | 88fed84d45e184490673f63bc20b556beeff7b98 (diff) | |
download | gtk+-1379b4b175910a253bb4aa8df3194eec2e160213.tar.gz |
gl: Add fallback for missing subimage unpacking
For GLES 2.0 platforms with the subimage unpacking extension we need to
upload one row of the image surface at a time.
Diffstat (limited to 'gdk/gdkglcontext.c')
-rw-r--r-- | gdk/gdkglcontext.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/gdk/gdkglcontext.c b/gdk/gdkglcontext.c index ca29955848..cd544798e3 100644 --- a/gdk/gdkglcontext.c +++ b/gdk/gdkglcontext.c @@ -248,14 +248,13 @@ gdk_gl_context_upload_texture (GdkGLContext *context, /* GL_UNPACK_ROW_LENGTH is available on desktop GL, OpenGL ES >= 3.0, or if * the GL_EXT_unpack_subimage extension for OpenGL ES 2.0 is available */ - if (!gdk_gl_context_get_use_es (context) || - (gdk_gl_context_get_use_es (context) && - (priv->gl_version >= 30 || priv->has_unpack_subimage))) + if (!priv->use_es || + (priv->use_es && (priv->gl_version >= 30 || priv->has_unpack_subimage))) { glPixelStorei (GL_UNPACK_ALIGNMENT, 4); glPixelStorei (GL_UNPACK_ROW_LENGTH, cairo_image_surface_get_stride (image_surface) / 4); - if (gdk_gl_context_get_use_es (context)) + if (priv->use_es) glTexImage2D (texture_target, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, cairo_image_surface_get_data (image_surface)); else @@ -265,7 +264,26 @@ gdk_gl_context_upload_texture (GdkGLContext *context, glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); } else - g_critical ("Unable to upload the contents of the image surface"); + { + GLvoid *data = cairo_image_surface_get_data (image_surface); + int stride = cairo_image_surface_get_stride (image_surface); + int i; + + if (priv->use_es) + { + glTexImage2D (texture_target, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); + + for (i = 0; i < height; i++) + glTexSubImage2D (texture_target, 0, 0, i, width, 1, GL_RGBA, GL_UNSIGNED_BYTE, data + (i * stride)); + } + else + { + glTexImage2D (texture_target, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL); + + for (i = 0; i < height; i++) + glTexSubImage2D (texture_target, 0, 0, i, width, 1, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, data + (i * stride)); + } + } } static void |