[gegl] operations,opencl: fix edge-laplace



commit 05669339c67e7c6cfb0f2ad7f7f509ddaffdcbc7
Author: Téo Mazars <teo mazars ensimag fr>
Date:   Mon Oct 14 08:39:04 2013 +0200

    operations,opencl: fix edge-laplace
    
    - reoder floating point operations
    - use ABYSS_CLAMP for the input buffer
    - use EPSILON for the critical comparison to 0.0f
    - update the LAPLACE_RADIUS constant
    
    it's still weak though.

 opencl/edge-laplace.cl           |   10 ++++++----
 opencl/edge-laplace.cl.h         |   10 ++++++----
 operations/common/edge-laplace.c |    2 +-
 3 files changed, 13 insertions(+), 9 deletions(-)
---
diff --git a/opencl/edge-laplace.cl b/opencl/edge-laplace.cl
index 2259a5f..fccceb5 100644
--- a/opencl/edge-laplace.cl
+++ b/opencl/edge-laplace.cl
@@ -1,4 +1,6 @@
-#define LAPLACE_RADIUS 1
+#define LAPLACE_RADIUS 2
+#define EPSILON        1e-5f
+
 void minmax(float x1, float x2, float x3,
             float x4, float x5,
             float *min_result,
@@ -99,9 +101,9 @@ kernel void pre_edgelaplace (global float4 *in,
             fmax((maxval - pix_mm[c]),(pix_mm[c] - minval));
         gradient[c] =
             (pix_fl[c] + pix_fm[c] + pix_fr[c] +
-             pix_ml[c] + pix_mr[c] + pix_bl[c] +
-             pix_bm[c] + pix_br[c] - 8.0f * pix_mm[c]) >
-             0.0f ? gradient[c] : -1.0f * gradient[c];
+             pix_bm[c]  - 8.0f * pix_mm[c]+ pix_br[c]
+             pix_ml[c] + pix_mr[c] + pix_bl[c] +) <
+             EPSILON ? -1.0f * gradient[c] : gradient[c];
     }
     gradient[3] = pix_mm[3];
 
diff --git a/opencl/edge-laplace.cl.h b/opencl/edge-laplace.cl.h
index bd12a34..d227c26 100644
--- a/opencl/edge-laplace.cl.h
+++ b/opencl/edge-laplace.cl.h
@@ -1,5 +1,7 @@
 static const char* edge_laplace_cl_source =
-"#define LAPLACE_RADIUS 1                                                      \n"
+"#define LAPLACE_RADIUS 2                                                      \n"
+"#define EPSILON        1e-5f                                                  \n"
+"                                                                              \n"
 "void minmax(float x1, float x2, float x3,                                     \n"
 "            float x4, float x5,                                               \n"
 "            float *min_result,                                                \n"
@@ -100,9 +102,9 @@ static const char* edge_laplace_cl_source =
 "            fmax((maxval - pix_mm[c]),(pix_mm[c] - minval));                  \n"
 "        gradient[c] =                                                         \n"
 "            (pix_fl[c] + pix_fm[c] + pix_fr[c] +                              \n"
-"             pix_ml[c] + pix_mr[c] + pix_bl[c] +                              \n"
-"             pix_bm[c] + pix_br[c] - 8.0f * pix_mm[c]) >                      \n"
-"             0.0f ? gradient[c] : -1.0f * gradient[c];                        \n"
+"             pix_bm[c]  - 8.0f * pix_mm[c]+ pix_br[c]                         \n"
+"             pix_ml[c] + pix_mr[c] + pix_bl[c] +) <                           \n"
+"             EPSILON ? -1.0f * gradient[c] : gradient[c];                     \n"
 "    }                                                                         \n"
 "    gradient[3] = pix_mm[3];                                                  \n"
 "                                                                              \n"
diff --git a/operations/common/edge-laplace.c b/operations/common/edge-laplace.c
index 62b0e8a..f73f8b8 100644
--- a/operations/common/edge-laplace.c
+++ b/operations/common/edge-laplace.c
@@ -356,7 +356,7 @@ cl_process (GeglOperation       *operation,
                                              op_area->right,
                                              op_area->top,
                                              op_area->bottom,
-                                             GEGL_ABYSS_NONE);
+                                             GEGL_ABYSS_CLAMP);
 
   gint aux  = gegl_buffer_cl_iterator_add_2 (i,
                                              NULL,


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