[gegl] Support for auxiliary iterators in cl-iterator
- From: Ãyvind KolÃs <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] Support for auxiliary iterators in cl-iterator
- Date: Tue, 20 Mar 2012 13:54:00 +0000 (UTC)
commit d09af07c416c60b1dece397a9556bee27378237f
Author: Victor Oliveira <victormatheus gmail com>
Date: Mon Mar 5 11:57:54 2012 -0300
Support for auxiliary iterators in cl-iterator
so we can keep intermediate results.
gegl/buffer/gegl-buffer-cl-iterator.c | 117 +++++++++++++++++++++------------
gegl/buffer/gegl-buffer-cl-iterator.h | 3 +-
gegl/opencl/gegl-cl-color.c | 3 +
3 files changed, 81 insertions(+), 42 deletions(-)
---
diff --git a/gegl/buffer/gegl-buffer-cl-iterator.c b/gegl/buffer/gegl-buffer-cl-iterator.c
index 1cb8c95..54f05e9 100644
--- a/gegl/buffer/gegl-buffer-cl-iterator.c
+++ b/gegl/buffer/gegl-buffer-cl-iterator.c
@@ -86,26 +86,44 @@ gegl_buffer_cl_iterator_add_2 (GeglBufferClIterator *iterator,
result = self==0?&(buffer->extent):&(i->rect[0]);
i->rect[self]=*result;
- i->buffer[self]= g_object_ref (buffer);
-
- if (format)
- i->format[self]=format;
- else
- i->format[self]=buffer->format;
i->flags[self]=flags;
- if (flags == GEGL_CL_BUFFER_WRITE)
- i->conv[self] = gegl_cl_color_supported (format, buffer->format);
- else
- i->conv[self] = gegl_cl_color_supported (buffer->format, format);
+ if (flags == GEGL_CL_BUFFER_WRITE || flags == GEGL_CL_BUFFER_READ)
+ {
+ g_assert (buffer);
+
+ i->buffer[self]= g_object_ref (buffer);
- gegl_cl_color_babl (buffer->format, &i->buf_cl_format_size[self]);
- gegl_cl_color_babl (format, &i->op_cl_format_size [self]);
+ if (format)
+ i->format[self]=format;
+ else
+ i->format[self]=buffer->format;
+
+ if (flags == GEGL_CL_BUFFER_WRITE)
+ i->conv[self] = gegl_cl_color_supported (format, buffer->format);
+ else
+ i->conv[self] = gegl_cl_color_supported (buffer->format, format);
+
+ gegl_cl_color_babl (buffer->format, &i->buf_cl_format_size[self]);
+ gegl_cl_color_babl (format, &i->op_cl_format_size [self]);
+ }
+ else /* GEGL_CL_BUFFER_AUX */
+ {
+ g_assert (buffer == NULL);
+
+ i->buffer[self] = NULL;
+ i->format[self] = NULL;
+ i->conv[self] = -1;
+ i->buf_cl_format_size[self] = SIZE_MAX;
+
+ gegl_cl_color_babl (format, &i->op_cl_format_size [self]);
+ }
i->area[self][0] = left;
i->area[self][1] = right;
i->area[self][2] = top;
i->area[self][3] = bottom;
+
if (flags == GEGL_CL_BUFFER_WRITE
&& (left > 0 || right > 0 || top > 0 || bottom > 0))
g_assert(FALSE);
@@ -167,22 +185,25 @@ gegl_buffer_cl_iterator_next (GeglBufferClIterator *iterator, gboolean *err)
{
for (no=0; no<i->iterators;no++)
{
- gint j;
- gboolean found = FALSE;
- for (j=0; j<no; j++)
- if (i->buffer[no]==i->buffer[j])
- {
- found = TRUE;
- break;
- }
- if (!found)
- gegl_buffer_lock (i->buffer[no]);
-
- if (i->flags[no] == GEGL_CL_BUFFER_WRITE
- || (i->flags[no] == GEGL_CL_BUFFER_READ
- && (i->area[no][0] > 0 || i->area[no][1] > 0 || i->area[no][2] > 0 || i->area[no][3] > 0)))
+ if (i->buffer[no])
{
- gegl_buffer_cl_cache_invalidate (i->buffer[no], &i->rect[no]);
+ gint j;
+ gboolean found = FALSE;
+ for (j=0; j<no; j++)
+ if (i->buffer[no]==i->buffer[j])
+ {
+ found = TRUE;
+ break;
+ }
+ if (!found)
+ gegl_buffer_lock (i->buffer[no]);
+
+ if (i->flags[no] == GEGL_CL_BUFFER_WRITE
+ || (i->flags[no] == GEGL_CL_BUFFER_READ
+ && (i->area[no][0] > 0 || i->area[no][1] > 0 || i->area[no][2] > 0 || i->area[no][3] > 0)))
+ {
+ gegl_buffer_cl_cache_invalidate (i->buffer[no], &i->rect[no]);
+ }
}
}
}
@@ -460,6 +481,20 @@ gegl_buffer_cl_iterator_next (GeglBufferClIterator *iterator, gboolean *err)
}
}
}
+ else if (i->flags[no] == GEGL_CL_BUFFER_AUX)
+ {
+ for (j=0; j < i->n; j++)
+ {
+ g_assert (i->tex_op[no][j] == NULL);
+ i->tex_op[no][j] = gegl_clCreateBuffer (gegl_cl_get_context (),
+ CL_MEM_READ_WRITE,
+ i->size[no][j] * i->op_cl_format_size [no],
+ NULL, &cl_err);
+ if (cl_err != CL_SUCCESS) CL_ERROR;
+
+ i->tex[no][j] = i->tex_op[no][j];
+ }
+ }
}
i->roi_no += i->n;
@@ -470,21 +505,21 @@ gegl_buffer_cl_iterator_next (GeglBufferClIterator *iterator, gboolean *err)
{
for (no=0; no<i->iterators;no++)
{
- gint j;
- gboolean found = FALSE;
- for (j=0; j<no; j++)
- if (i->buffer[no]==i->buffer[j])
- {
- found = TRUE;
- break;
- }
- if (!found)
- gegl_buffer_unlock (i->buffer[no]);
- }
+ if (i->buffer[no])
+ {
+ gint j;
+ gboolean found = FALSE;
+ for (j=0; j<no; j++)
+ if (i->buffer[no]==i->buffer[j])
+ {
+ found = TRUE;
+ break;
+ }
+ if (!found)
+ gegl_buffer_unlock (i->buffer[no]);
- for (no=0; no<i->iterators;no++)
- {
- g_object_unref (i->buffer[no]);
+ g_object_unref (i->buffer[no]);
+ }
}
i->is_finished = TRUE;
diff --git a/gegl/buffer/gegl-buffer-cl-iterator.h b/gegl/buffer/gegl-buffer-cl-iterator.h
index 936974a..69b9683 100644
--- a/gegl/buffer/gegl-buffer-cl-iterator.h
+++ b/gegl/buffer/gegl-buffer-cl-iterator.h
@@ -10,7 +10,8 @@
enum
{
GEGL_CL_BUFFER_READ = 1,
- GEGL_CL_BUFFER_WRITE = 2
+ GEGL_CL_BUFFER_WRITE = 2,
+ GEGL_CL_BUFFER_AUX = 3
};
typedef struct GeglBufferClIterator
diff --git a/gegl/opencl/gegl-cl-color.c b/gegl/opencl/gegl-cl-color.c
index 62b33d1..1c0c4ff 100644
--- a/gegl/opencl/gegl-cl-color.c
+++ b/gegl/opencl/gegl-cl-color.c
@@ -148,6 +148,9 @@ gegl_cl_color_babl (const Babl *buffer_format, size_t *bytes)
int i;
gboolean supported_format = FALSE;
+ if (bytes)
+ *bytes = SIZE_MAX;
+
for (i = 0; i < CL_FORMAT_N; i++)
if (format[i] == buffer_format) supported_format = TRUE;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]