[gegl/threaded-base-classes] dont use tile mutexes when single threaded
- From: Øyvind Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl/threaded-base-classes] dont use tile mutexes when single threaded
- Date: Fri, 27 Jun 2014 07:47:13 +0000 (UTC)
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]