All pastes #1819747 Raw Edit

bob

public text v1 · immutable
#1819747 ·published 2010-03-02 19:44 UTC
rendered paste body
From 38a24144980bd0c6d717f39eb5d215d3abc30ef5 Mon Sep 17 00:00:00 2001From: Robert Bragg <robert@linux.intel.com>Date: Tue, 2 Mar 2010 14:04:54 +0000Subject: [PATCH] glx tfp: make clutter_glx_texture_pixmap_update_area cheapThis changes clutter_glx_texture_pixmap_update_area so it defers thecall to glXBindTexImageEXT until our pre "paint" signal handler whichmakes clutter_glx_texture_pixmap_update_area cheap to call.The hope is that mutter can switch to reporting raw damage updates toClutterGLXTexturePixmap and we can use these to queue clipped redraws.--- clutter/glx/clutter-glx-texture-pixmap.c |  186 ++++++++++++++---------------- 1 files changed, 89 insertions(+), 97 deletions(-)diff --git a/clutter/glx/clutter-glx-texture-pixmap.c b/clutter/glx/clutter-glx-texture-pixmap.cindex 59a80e8..3e4cf2d 100644--- a/clutter/glx/clutter-glx-texture-pixmap.c+++ b/clutter/glx/clutter-glx-texture-pixmap.c@@ -107,7 +107,9 @@ struct _ClutterGLXTexturePixmapPrivate    gboolean      bound;   gint          can_mipmap;-  gint          mipmap_generate_queued;+  gboolean      mipmap_generate_queued;++  gboolean      bind_tex_image_queued;    gboolean      using_rectangle; };@@ -128,28 +130,93 @@ G_DEFINE_TYPE (ClutterGLXTexturePixmap,    \                clutter_glx_texture_pixmap, \                CLUTTER_X11_TYPE_TEXTURE_PIXMAP); -static gboolean-texture_bind (ClutterGLXTexturePixmap *tex)+static void+bind_texture (ClutterGLXTexturePixmap *tex) {-  GLuint     handle = 0;-  GLenum     target = 0;-  CoglHandle cogl_tex;-  cogl_tex = clutter_texture_get_cogl_texture (CLUTTER_TEXTURE(tex));+  GLuint handle = 0;+  GLenum target = 0;+  CoglHandle cogl_tex =+    clutter_texture_get_cogl_texture (CLUTTER_TEXTURE (tex));    if (!cogl_texture_get_gl_texture (cogl_tex, &handle, &target))-      return FALSE;+    g_warning ("Failed to pluck out GL handle from cogl texture to bind"); -  /* FIXME: fire off an error here? */   glBindTexture (target, handle);+}++static void+release_tex_image (ClutterGLXTexturePixmap *texture)+{+  ClutterGLXTexturePixmapPrivate *priv = texture->priv;+  Display *dpy;++  if (!priv->glx_pixmap || !priv->bound)+    return;++  dpy = clutter_x11_get_default_display ();++  bind_texture (texture);++  clutter_x11_trap_x_errors ();++  (_gl_release_tex_image) (dpy,+                           priv->glx_pixmap,+                           GLX_FRONT_LEFT_EXT);++  XSync (dpy, FALSE); -  return TRUE;+  if (clutter_x11_untrap_x_errors ())+    CLUTTER_NOTE (TEXTURE, "Failed to release?");++  CLUTTER_NOTE (TEXTURE, "Destroyed pxm: %li", priv->glx_pixmap);++  priv->bound = FALSE; }  static void on_glx_texture_pixmap_pre_paint (ClutterGLXTexturePixmap *texture,                                  gpointer                 user_data) {-  if (texture->priv->mipmap_generate_queued)+  ClutterGLXTexturePixmapPrivate *priv = texture->priv;+  gboolean tex_bound = FALSE;+  Display *dpy = clutter_x11_get_default_display();++  if (priv->bind_tex_image_queued)+    {+      CLUTTER_NOTE (TEXTURE, "Really updating via GLX");++      bind_texture (CLUTTER_GLX_TEXTURE_PIXMAP (texture));+      tex_bound = TRUE;++      clutter_x11_trap_x_errors ();++      (_gl_bind_tex_image) (dpy,+                            priv->glx_pixmap,+                            GLX_FRONT_LEFT_EXT,+                            NULL);++      XSync (dpy, FALSE);++      /* Note above fires X error for non name pixmaps - but+       * things still seem to work - i.e pixmap updated+       */+      if (clutter_x11_untrap_x_errors ())+        CLUTTER_NOTE (TEXTURE, "Update bind_tex_image failed");++      priv->bound = TRUE;++      if (clutter_texture_get_filter_quality (CLUTTER_TEXTURE (texture))+          == CLUTTER_TEXTURE_QUALITY_HIGH)+        {+          priv->mipmap_generate_queued++;+        }++      priv->bind_tex_image_queued = FALSE;+    }++  if (_gl_generate_mipmap &&+      priv->can_mipmap &&+      priv->mipmap_generate_queued)     {       GLuint     handle = 0;       GLenum     target = 0;@@ -157,19 +224,19 @@ on_glx_texture_pixmap_pre_paint (ClutterGLXTexturePixmap *texture,       cogl_tex = clutter_texture_get_cogl_texture         (CLUTTER_TEXTURE(texture)); -      texture_bind (texture);+      bind_texture (texture);+      tex_bound = TRUE;        cogl_texture_get_gl_texture (cogl_tex, &handle, &target);        _gl_generate_mipmap (target);--      texture->priv->mipmap_generate_queued = 0;     }+  priv->mipmap_generate_queued = FALSE;    /* Disable mipmaps if we can't support them */   if (clutter_texture_get_filter_quality (CLUTTER_TEXTURE (texture))       == CLUTTER_TEXTURE_QUALITY_HIGH-      && !texture->priv->can_mipmap)+      && !priv->can_mipmap)     {       CoglHandle material         = clutter_texture_get_cogl_material (CLUTTER_TEXTURE (texture));@@ -419,9 +486,8 @@ clutter_glx_texture_pixmap_realize (ClutterActor *actor) static void clutter_glx_texture_pixmap_unrealize (ClutterActor *actor) {-  ClutterGLXTexturePixmap        *texture = CLUTTER_GLX_TEXTURE_PIXMAP (actor);-  ClutterGLXTexturePixmapPrivate *priv = texture->priv;-  Display                        *dpy;+  ClutterGLXTexturePixmap *texture = CLUTTER_GLX_TEXTURE_PIXMAP (actor);+  Display                 *dpy;    dpy = clutter_x11_get_default_display(); @@ -437,19 +503,7 @@ clutter_glx_texture_pixmap_unrealize (ClutterActor *actor)   if (!CLUTTER_ACTOR_IS_REALIZED (actor))     return; -  if (priv->glx_pixmap && priv->bound)-    {-      clutter_x11_trap_x_errors ();--      (_gl_release_tex_image) (dpy,-                               priv->glx_pixmap,-                               GLX_FRONT_LEFT_EXT);--      XSync (clutter_x11_get_default_display(), FALSE);-      clutter_x11_untrap_x_errors ();--      priv->bound = FALSE;-    }+  release_tex_image (texture);    CLUTTER_ACTOR_UNSET_FLAGS (actor, CLUTTER_ACTOR_REALIZED); }@@ -595,26 +649,7 @@ clutter_glx_texture_pixmap_free_glx_pixmap (ClutterGLXTexturePixmap *texture)    dpy = clutter_x11_get_default_display (); -  if (priv->glx_pixmap &&-      priv->bound)-    {-      texture_bind (texture);--      clutter_x11_trap_x_errors ();--      (_gl_release_tex_image) (dpy,-			       priv->glx_pixmap,-			       GLX_FRONT_LEFT_EXT);--      XSync (clutter_x11_get_default_display(), FALSE);--      if (clutter_x11_untrap_x_errors ())-	CLUTTER_NOTE (TEXTURE, "Failed to release?");--      CLUTTER_NOTE (TEXTURE, "Destroyed pxm: %li", priv->glx_pixmap);--      priv->bound = FALSE;-    }+  release_tex_image (texture);    clutter_x11_trap_x_errors ();   if (priv->glx_pixmap)@@ -729,7 +764,7 @@ clutter_glx_texture_pixmap_create_glx_pixmap (ClutterGLXTexturePixmap *texture)       goto cleanup;     } - cleanup:+cleanup:    if (priv->glx_pixmap)     clutter_glx_texture_pixmap_free_glx_pixmap (texture);@@ -746,12 +781,10 @@ clutter_glx_texture_pixmap_create_glx_pixmap (ClutterGLXTexturePixmap *texture) 					      pixmap_width, pixmap_height);        /* Get ready to queue initial mipmap generation */-      if (_gl_generate_mipmap-          && priv->can_mipmap-          &&  clutter_texture_get_filter_quality (CLUTTER_TEXTURE (texture))+      if (clutter_texture_get_filter_quality (CLUTTER_TEXTURE (texture))           == CLUTTER_TEXTURE_QUALITY_HIGH)         {-          priv->mipmap_generate_queued++;+          priv->mipmap_generate_queued = TRUE;         }        return;@@ -775,12 +808,9 @@ clutter_glx_texture_pixmap_update_area (ClutterX11TexturePixmap *texture, {   ClutterGLXTexturePixmap *texture_glx = CLUTTER_GLX_TEXTURE_PIXMAP (texture);   ClutterGLXTexturePixmapPrivate  *priv = texture_glx->priv;-  Display                         *dpy;    CLUTTER_NOTE (TEXTURE, "Updating texture pixmap"); -  dpy = clutter_x11_get_default_display();-   if (!CLUTTER_ACTOR_IS_REALIZED (texture))     return; @@ -799,44 +829,6 @@ clutter_glx_texture_pixmap_update_area (ClutterX11TexturePixmap *texture,   if (priv->glx_pixmap == None)     return; -  if (texture_bind (CLUTTER_GLX_TEXTURE_PIXMAP(texture)))-    {-      CLUTTER_NOTE (TEXTURE, "Really updating via GLX");--      clutter_x11_trap_x_errors ();--      (_gl_bind_tex_image) (dpy,-                            priv->glx_pixmap,-                            GLX_FRONT_LEFT_EXT,-                            NULL);--      XSync (clutter_x11_get_default_display(), FALSE);--      /* Note above fires X error for non name pixmaps - but-       * things still seem to work - i.e pixmap updated-       */-      if (clutter_x11_untrap_x_errors ())-        CLUTTER_NOTE (TEXTURE, "Update bind_tex_image failed");--      priv->bound = TRUE;--      if (_gl_generate_mipmap-          && priv->can_mipmap-          &&  clutter_texture_get_filter_quality (CLUTTER_TEXTURE (texture))-              == CLUTTER_TEXTURE_QUALITY_HIGH)-        {-          /* FIXME: It may make more sense to set a flag here and only-           *        generate the mipmap on a pre paint.. compressing need-           *        to call generate mipmap-           *        May break clones however..-          */-          priv->mipmap_generate_queued++;-        }--    }-  else-    g_warning ("Failed to bind initial tex");-   priv->bind_tex_image_queued = TRUE; } -- 1.6.3.3