summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2020-09-26 21:55:28 -0400
committerMatthias Clasen <mclasen@redhat.com>2020-09-26 21:55:28 -0400
commit9ca9f42452700b29ccbe40449127018d7077fc7c (patch)
tree38f071061dfcfcf5fd5c630beb3ab2455a5fd49f
parent92e551f8958b917885579a6b2cf887aa9546465a (diff)
downloadgtk+-avoid-gl-texture-download.tar.gz
gsk: Avoid downloading GL textures when possibleavoid-gl-texture-download
I found that the gears demo was spending 40% cpu downloading a GL texture every frame, only to upload it again to another context. While the GSK rendering and the GtkGLArea use different GL contexts, they are (usually) connected by sharing data with the same global context, so we can just use the texture without the download/upload dance. This brings gears down to < 10% cpu.
-rw-r--r--gsk/gl/gskgldriver.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/gsk/gl/gskgldriver.c b/gsk/gl/gskgldriver.c
index a383344eae..b1f8d6ea0e 100644
--- a/gsk/gl/gskgldriver.c
+++ b/gsk/gl/gskgldriver.c
@@ -521,8 +521,15 @@ gsk_gl_driver_get_texture_for_texture (GskGLDriver *self,
if (GDK_IS_GL_TEXTURE (texture))
{
GdkGLContext *texture_context = gdk_gl_texture_get_context ((GdkGLTexture *)texture);
+ GdkGLContext *shared_context = gdk_gl_context_get_shared_context (self->gl_context);
- if (texture_context != self->gl_context)
+ if (texture_context == self->gl_context ||
+ (gdk_gl_context_get_shared_context (texture_context) == shared_context && shared_context != NULL))
+ {
+ /* A GL texture from the same GL context is a simple task... */
+ return gdk_gl_texture_get_id ((GdkGLTexture *)texture);
+ }
+ else
{
cairo_surface_t *surface;
@@ -539,11 +546,6 @@ gsk_gl_driver_get_texture_for_texture (GskGLDriver *self,
source_texture = downloaded_texture;
}
- else
- {
- /* A GL texture from the same GL context is a simple task... */
- return gdk_gl_texture_get_id ((GdkGLTexture *)texture);
- }
}
else
{