[gegl] buffer: fix linear buffer fast path



commit 0bf04189bc494baeafe50a45721c6c776dd0e3ff
Author: Øyvind Kolås <pippin gimp org>
Date:   Wed Jun 4 07:40:02 2014 +0200

    buffer: fix linear buffer fast path

 gegl/buffer/gegl-buffer-iterator.c |   72 +++++++++++-------------------------
 1 files changed, 22 insertions(+), 50 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-iterator.c b/gegl/buffer/gegl-buffer-iterator.c
index 81dacfd..ce7edb8 100644
--- a/gegl/buffer/gegl-buffer-iterator.c
+++ b/gegl/buffer/gegl-buffer-iterator.c
@@ -48,7 +48,6 @@ typedef enum {
   GeglIteratorTileMode_DirectTile,
   GeglIteratorTileMode_LinearTile,
   GeglIteratorTileMode_GetBuffer,
-  GeglIteratorTileMode_Linear,
   GeglIteratorTileMode_Empty,
 } GeglIteratorTileMode;
 
@@ -195,13 +194,6 @@ release_tile (GeglBufferIterator *iter,
 
       sub->current_tile_mode = GeglIteratorTileMode_Empty;
     }
-  else if (sub->current_tile_mode == GeglIteratorTileMode_Linear)
-    {
-      g_assert (sub->linear);
-      gegl_buffer_linear_close (sub->buffer, sub->linear);
-      sub->linear = NULL;
-      sub->current_tile_mode = GeglIteratorTileMode_Empty;
-    }
   else if (sub->current_tile_mode == GeglIteratorTileMode_Empty)
     {
       return;
@@ -360,24 +352,6 @@ get_indirect (GeglBufferIterator *iter,
   sub->current_tile_mode = GeglIteratorTileMode_GetBuffer;
 }
 
-
-static void
-get_linear (GeglBufferIterator *iter,
-            int        index)
-{
-  GeglBufferIteratorPriv *priv = iter->priv;
-  SubIterState           *sub  = &priv->sub_iter[index];
-  int rowstride;
-
-  sub->linear = gegl_buffer_linear_open (sub->buffer,
-       &sub->real_roi, &rowstride, sub->format);
-      
-  sub->row_stride = rowstride;
-
-  iter->data[index] = sub->linear;
-  sub->current_tile_mode = GeglIteratorTileMode_Linear;
-}
-
 static gboolean
 needs_indirect_read (GeglBufferIterator *iter,
                      int        index)
@@ -535,8 +509,7 @@ gegl_buffer_iterator_stop (GeglBufferIterator *iter)
           gegl_tile_unref (sub->linear_tile);
         }
 
-      if (sub->current_tile_mode != GeglIteratorTileMode_Linear)
-        gegl_buffer_unlock (sub->buffer);
+      gegl_buffer_unlock (sub->buffer);
 
       if (sub->flags & GEGL_BUFFER_WRITE)
         gegl_buffer_emit_changed_signal (sub->buffer, &sub->full_rect);
@@ -556,31 +529,34 @@ static void linear_shortcut (GeglBufferIterator *iter)
   for (index = priv->num_buffers-1; index >=0 ; index--)
   {
     SubIterState *sub = &priv->sub_iter[index];
-    gboolean found = FALSE;
 
     sub->real_roi    = sub0->full_rect;
     iter->roi[index] = sub0->full_rect;
     iter->length = iter->roi[0].width * iter->roi[0].height;
-#if 1
-    found = FALSE;
+
     if (priv->sub_iter[0].buffer == sub->buffer && index != 0)
     {
-      found = TRUE;
       if (sub->format == priv->sub_iter[0].format)
         re_use_first[index] = 1;
     }
-    if (found)
+
+    if (!re_use_first[index])
     {
-      if (!re_use_first[index])
+      gegl_buffer_lock (sub->buffer);
+      if (index == 0)
+        get_tile (iter, index);
+      else
       {
-        gegl_buffer_lock (sub->buffer);
-        get_indirect (iter, index);
+        if (sub->buffer->tile_width == sub->buffer->extent.width 
+            && sub->buffer->tile_height == sub->buffer->extent.height)
+        {
+          /* XXX: does this work correctly for coords? */
+          get_tile (iter, index);
+        }
+        else
+          get_indirect (iter, index);
       }
     }
-    else
-    {
-      get_linear (iter, index);
-    }
   }
   for (index = 1; index < priv->num_buffers; index++)
   {
@@ -589,10 +565,6 @@ static void linear_shortcut (GeglBufferIterator *iter)
       g_print ("!\n");
       iter->data[index] = iter->data[0];
     }
-#else
-    gegl_buffer_lock (sub->buffer);
-    get_indirect (iter, index);
-#endif
   }
 
   priv->state = GeglIteratorState_Invalid; /* quit on next iterator_next */
@@ -607,12 +579,12 @@ gegl_buffer_iterator_next (GeglBufferIterator *iter)
     {
       int index;
       GeglBuffer *primary = priv->sub_iter[0].buffer;
-      if (primary->tile_width == primary->extent.width &&
-          primary->tile_height == primary->extent.height &&
-          priv->sub_iter[0].full_rect.width == primary->tile_width &&
-          priv->sub_iter[0].full_rect.height == primary->tile_height &&
-          priv->sub_iter[0].full_rect.x == primary->extent.x &&
-          priv->sub_iter[0].full_rect.y == primary->extent.y && 0)
+      if (primary->tile_width == primary->extent.width 
+          && primary->tile_height == primary->extent.height 
+          && priv->sub_iter[0].full_rect.width == primary->tile_width 
+          && priv->sub_iter[0].full_rect.height == primary->tile_height
+          && priv->sub_iter[0].full_rect.x == primary->extent.x
+          && priv->sub_iter[0].full_rect.y == primary->extent.y)
       {
         if (gegl_cl_is_accelerated ())
           for (index = 0; index < priv->num_buffers; index++)


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]