[gegl/threaded-base-classes] dont use tile mutexes when single threaded



commit 5cf9950dd63ee9e27b52a758ff71d0e54a8568ef
Author: Øyvind Kolås <pippin gimp org>
Date:   Fri Jun 27 09:46:55 2014 +0200

    dont use tile mutexes when single threaded

 gegl/buffer/gegl-buffer-access.c   |   19 +++++++++++++++----
 gegl/buffer/gegl-buffer-iterator.c |   21 +++++++++++++++++----
 gegl/buffer/gegl-sampler-nearest.c |    3 +++
 3 files changed, 35 insertions(+), 8 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-access.c b/gegl/buffer/gegl-buffer-access.c
index 34539f7..a54cbe3 100644
--- a/gegl/buffer/gegl-buffer-access.c
+++ b/gegl/buffer/gegl-buffer-access.c
@@ -37,6 +37,7 @@
 #include "gegl-tile-backend.h"
 #include "gegl-buffer-iterator.h"
 #include "gegl-buffer-cl-cache.h"
+#include "gegl-config.h"
 
 static void gegl_buffer_iterate_read_fringed (GeglBuffer          *buffer,
                                               const GeglRectangle *roi,
@@ -334,6 +335,7 @@ gegl_buffer_iterate_write (GeglBuffer          *buffer,
   gint abyss_x_total  = buffer_abyss_x + buffer->abyss.width;
   gint abyss_y_total  = buffer_abyss_y + buffer->abyss.height;
   gint factor         = 1<<level;
+  gboolean threaded   = gegl_config()->threads > 1;
   const Babl *fish;
 
   /* roi specified, override buffers extent */
@@ -393,10 +395,19 @@ gegl_buffer_iterate_write (GeglBuffer          *buffer,
           index_x = gegl_tile_indice (tiledx, tile_width);
           index_y = gegl_tile_indice (tiledy, tile_height);
 
-          g_mutex_lock (&mutexes[(index_x&15) * 16 + (index_y&15)]);
-          tile = gegl_tile_source_get_tile ((GeglTileSource *) (buffer),
-                                            index_x, index_y, level);
-          g_mutex_unlock (&mutexes[(index_x&15) * 16 + (index_y&15)]);
+          if (threaded)
+            {
+              g_mutex_lock (&mutexes[(index_x&15) * 16 + (index_y&15)]);
+              tile = gegl_tile_source_get_tile ((GeglTileSource *) (buffer),
+                                                index_x, index_y, level);
+              g_mutex_unlock (&mutexes[(index_x&15) * 16 + (index_y&15)]);
+            }
+          else
+            {
+              tile = gegl_tile_source_get_tile ((GeglTileSource *) (buffer),
+                                                index_x, index_y, level);
+            }
+
 
           lskip = (buffer_abyss_x) - (buffer_x + bufx);
           /* gap between left side of tile, and abyss */
diff --git a/gegl/buffer/gegl-buffer-iterator.c b/gegl/buffer/gegl-buffer-iterator.c
index e0a8360..a8bfe50 100644
--- a/gegl/buffer/gegl-buffer-iterator.c
+++ b/gegl/buffer/gegl-buffer-iterator.c
@@ -32,6 +32,7 @@
 #include "gegl-buffer-iterator-private.h"
 #include "gegl-buffer-private.h"
 #include "gegl-buffer-cl-cache.h"
+#include "gegl-config.h"
 
 #define GEGL_ITERATOR_INCOMPATIBLE (1 << 2)
 
@@ -79,6 +80,7 @@ struct _GeglBufferIteratorPriv
   SubIterState      sub_iter[GEGL_BUFFER_MAX_ITERATORS];
 };
 
+static gboolean threaded = TRUE;
 
 GeglBufferIterator *
 gegl_buffer_iterator_empty_new (void)
@@ -88,6 +90,9 @@ gegl_buffer_iterator_empty_new (void)
 
   iter->priv->num_buffers = 0;
   iter->priv->state       = GeglIteratorState_Start;
+
+  threaded = gegl_config()->threads > 1;
+
   return iter;
 }
 
@@ -314,10 +319,18 @@ get_tile (GeglBufferIterator *iter,
       int tile_x = gegl_tile_indice (iter->roi[index].x + shift_x, tile_width);
       int tile_y = gegl_tile_indice (iter->roi[index].y + shift_y, tile_height);
 
-      g_mutex_lock (&mutexes[(ABS(tile_x) % 16) * 16 + (ABS(tile_y)%16)]);
-      sub->current_tile = gegl_tile_source_get_tile ((GeglTileSource *)(buf),
-                                                     tile_x, tile_y, 0);
-      g_mutex_unlock (&mutexes[(ABS(tile_x) % 16) * 16 + (ABS(tile_y)%16)]);
+      if (threaded)
+        {
+          g_mutex_lock (&mutexes[(ABS(tile_x) % 16) * 16 + (ABS(tile_y)%16)]);
+          sub->current_tile = gegl_tile_source_get_tile ((GeglTileSource *)(buf),
+                                                         tile_x, tile_y, 0);
+          g_mutex_unlock (&mutexes[(ABS(tile_x) % 16) * 16 + (ABS(tile_y)%16)]);
+        }
+      else
+        {
+          sub->current_tile = gegl_tile_source_get_tile ((GeglTileSource *)(buf),
+                                                         tile_x, tile_y, 0);
+        }
 
       if (sub->flags & GEGL_BUFFER_WRITE)
         gegl_tile_lock (sub->current_tile);
diff --git a/gegl/buffer/gegl-sampler-nearest.c b/gegl/buffer/gegl-sampler-nearest.c
index 40cb7c6..21d3d87 100644
--- a/gegl/buffer/gegl-sampler-nearest.c
+++ b/gegl/buffer/gegl-sampler-nearest.c
@@ -192,6 +192,7 @@ gegl_sampler_nearest_get (      GeglSampler*    restrict  sampler,
   gegl_buffer_get (sampler->buffer, &rect, 1.0, sampler->format, output, GEGL_AUTO_ROWSTRIDE, repeat_mode);
   return;
 
+  /*
 
 #if 0
   gegl_sampler_get_pixel (sampler,
@@ -205,6 +206,8 @@ gegl_sampler_nearest_get (      GeglSampler*    restrict  sampler,
                           repeat_mode);
   babl_process (sampler->fish, in_bptr, output, 1);
 #endif
+
+  */
 }
 
 


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