Rawtherapee: Build fails for PPC , ARM and i586

Created on 8 Jan 2018  路  11Comments  路  Source: Beep6581/RawTherapee

Hi,
I can't build packages for aarch64, armv7l, ppc64le, ppc64 and ppc because of errors.
Sample logs are available:
https://build.opensuse.org/public/build/home:rawtherapee/openSUSE_Factory_ARM/aarch64/rawtherapee-unstable/_log
https://build.opensuse.org/public/build/home:rawtherapee/openSUSE_Factory_ARM/armv7l/rawtherapee-unstable/_log
https://build.opensuse.org/public/build/home:rawtherapee/openSUSE_Factory_PowerPC/ppc/rawtherapee-unstable/_log

Most helpful comment

@mbajor Marcin, here's a patch:

diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc
index 7552cf52..d57294f2 100644
--- a/rtengine/improcfun.cc
+++ b/rtengine/improcfun.cc
@@ -1965,7 +1965,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw
         const float pow1 = pow_F ( 1.64f - pow_F ( 0.29f, n ), 0.73f );
         float nj, nbbj, ncbj, czj, awj, flj;
         Ciecam02::initcam2float (gamu, yb2, pilotout, f2,  la2,  xw2,  yw2,  zw2, nj, dj, nbbj, ncbj, czj, awj, flj);
+#ifdef __SSE2__
         const float reccmcz = 1.f / (c2 * czj);
+#endif
         const float pow1n = pow_F ( 1.64f - pow_F ( 0.29f, nj ), 0.73f );

         const float epsil = 0.0001f;
@@ -2530,7 +2532,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw
                             Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz,
                                                               J,  C, h,
                                                               xw2, yw2,  zw2,
-                                                              f2,  c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj);
+                                                              c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj);
                             float x, y, z;
                             x = xx * 655.35f;
                             y = yy * 655.35f;
@@ -2541,10 +2543,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw

                             // gamut control in Lab mode; I must study how to do with cIECAM only
                             if (gamu == 1) {
-                                float HH, Lprov1, Chprov1;
+                                float Lprov1, Chprov1;
                                 Lprov1 = Ll / 327.68f;
                                 Chprov1 = sqrtf (SQR (aa) + SQR (bb)) / 327.68f;
-                                HH = xatan2f (bb, aa);
                                 float2  sincosval;

                                 if (Chprov1 == 0.0f) {
@@ -2874,7 +2875,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw
                         Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz,
                                                           ncie->J_p[i][j],  ncie_C_p, ncie->h_p[i][j],
                                                           xw2, yw2,  zw2,
-                                                          f2,  c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj);
+                                                          c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj);
                         float x = (float)xx * 655.35f;
                         float y = (float)yy * 655.35f;
                         float z = (float)zz * 655.35f;

Could you provide me with the PPC log even if this patch resolves your issues? There are a couple of other warnings (mainly due to the unsigned nature of char), I'd like to tackle.

Best,
Fl枚ssie

All 11 comments

@mbajor you appear to be trying to compile 1854147c? Why not the latest dev?

It's an non-SSE2 issue. Looking...

@mbajor Marcin, here's a patch:

diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc
index 7552cf52..d57294f2 100644
--- a/rtengine/improcfun.cc
+++ b/rtengine/improcfun.cc
@@ -1965,7 +1965,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw
         const float pow1 = pow_F ( 1.64f - pow_F ( 0.29f, n ), 0.73f );
         float nj, nbbj, ncbj, czj, awj, flj;
         Ciecam02::initcam2float (gamu, yb2, pilotout, f2,  la2,  xw2,  yw2,  zw2, nj, dj, nbbj, ncbj, czj, awj, flj);
+#ifdef __SSE2__
         const float reccmcz = 1.f / (c2 * czj);
+#endif
         const float pow1n = pow_F ( 1.64f - pow_F ( 0.29f, nj ), 0.73f );

         const float epsil = 0.0001f;
@@ -2530,7 +2532,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw
                             Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz,
                                                               J,  C, h,
                                                               xw2, yw2,  zw2,
-                                                              f2,  c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj);
+                                                              c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj);
                             float x, y, z;
                             x = xx * 655.35f;
                             y = yy * 655.35f;
@@ -2541,10 +2543,9 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw

                             // gamut control in Lab mode; I must study how to do with cIECAM only
                             if (gamu == 1) {
-                                float HH, Lprov1, Chprov1;
+                                float Lprov1, Chprov1;
                                 Lprov1 = Ll / 327.68f;
                                 Chprov1 = sqrtf (SQR (aa) + SQR (bb)) / 327.68f;
-                                HH = xatan2f (bb, aa);
                                 float2  sincosval;

                                 if (Chprov1 == 0.0f) {
@@ -2874,7 +2875,7 @@ void ImProcFunctions::ciecam_02float (CieImage* ncie, float adap, int pW, int pw
                         Ciecam02::jch2xyz_ciecam02float ( xx, yy, zz,
                                                           ncie->J_p[i][j],  ncie_C_p, ncie->h_p[i][j],
                                                           xw2, yw2,  zw2,
-                                                          f2,  c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj);
+                                                          c2, nc2, gamu, pow1n, nbbj, ncbj, flj, czj, dj, awj);
                         float x = (float)xx * 655.35f;
                         float y = (float)yy * 655.35f;
                         float z = (float)zz * 655.35f;

Could you provide me with the PPC log even if this patch resolves your issues? There are a couple of other warnings (mainly due to the unsigned nature of char), I'd like to tackle.

Best,
Fl枚ssie

@Floessie To complete ARM and PPC fix below patch is necessary
I use this patch in OBS

--- rtengine/alignedbuffer.h.orig   2018-01-08 13:51:19.000000000 +0100
+++ rtengine/alignedbuffer.h    2018-01-08 15:00:03.011463821 +0100
@@ -20,6 +20,7 @@
 #define _ALIGNEDBUFFER_
 #include <cstdlib>
 #include <utility>
+#include <cstdint>

 inline size_t padToAlignment(size_t size, size_t align = 16) {
     return align * ((size + align - 1) / align);

Please add it in next commit.
All ARM and PPC builds compiled with success.

But...I've updated source code (@Beep6581) and now all i586 builds failed.
https://build.opensuse.org/public/build/home:rawtherapee/openSUSE_Leap_42.1/i586/rawtherapee-unstable/_log
I don't know if it is new bug or patch is the reason.

@mbajor This should fix it:

diff --git a/rtengine/color.cc b/rtengine/color.cc
index dbabb217..706d0f36 100644
--- a/rtengine/color.cc
+++ b/rtengine/color.cc
@@ -1786,7 +1786,7 @@ void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &
 void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const float wp[3][3], int width)
 {

-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
     vfloat maxvalfv = F2V(MAXVALF);
     vfloat c116v = F2V(116.f);
     vfloat c5242d88v = F2V(5242.88f);
@@ -1794,7 +1794,7 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b,
     vfloat c200v = F2V(200.f);
 #endif
     int i = 0;
-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
     for(;i < width - 3; i+=4) {
         const vfloat rv = LVFU(R[i]);
         const vfloat gv = LVFU(G[i]);

@mbajor

Please add it in next commit.

I'll push it tonight. Thanks for the pointer. 馃憤

@mbajor last patch was incomplete. This one is better:

diff --git a/rtengine/color.cc b/rtengine/color.cc
index dbabb217..706d0f36 100644
--- a/rtengine/color.cc
+++ b/rtengine/color.cc
@@ -1786,7 +1786,7 @@ void Color::Lab2XYZ(vfloat L, vfloat a, vfloat b, vfloat &x, vfloat &y, vfloat &
 void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b, const float wp[3][3], int width)
 {

-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
     vfloat maxvalfv = F2V(MAXVALF);
     vfloat c116v = F2V(116.f);
     vfloat c5242d88v = F2V(5242.88f);
@@ -1794,7 +1794,7 @@ void Color::RGB2Lab(float *R, float *G, float *B, float *L, float *a, float *b,
     vfloat c200v = F2V(200.f);
 #endif
     int i = 0;
-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
     for(;i < width - 3; i+=4) {
         const vfloat rv = LVFU(R[i]);
         const vfloat gv = LVFU(G[i]);
diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc
index 7e8e153b..6d885f2f 100644
--- a/rtengine/improcfun.cc
+++ b/rtengine/improcfun.cc
@@ -54,7 +54,7 @@ using namespace rtengine;
 // begin of helper function for rgbProc()
 void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize) {

-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
     vfloat cr = F2V(0.299f);
     vfloat cg = F2V(0.587f);
     vfloat cb = F2V(0.114f);
@@ -62,7 +62,7 @@ void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float

     for (int i = istart, ti = 0; i < tH; i++, ti++) {
         int j = jstart, tj = 0;
-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
         for (; j < tW - 3; j+=4, tj+=4) {

             vfloat rv = LVF(rtemp[ti * tileSize + tj]);
@@ -95,14 +95,14 @@ void shadowToneCurve(const LUTf &shtonecurve, float *rtemp, float *gtemp, float

 void highlightToneCurve(const LUTf &hltonecurve, float *rtemp, float *gtemp, float *btemp, int istart, int tH, int jstart, int tW, int tileSize, float exp_scale, float comp, float hlrange) {

-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
     vfloat threev = F2V(3.f);
     vfloat maxvalfv = F2V(MAXVALF);
 #endif

     for (int i = istart, ti = 0; i < tH; i++, ti++) {
         int j = jstart, tj = 0;
-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
         for (; j < tW - 3; j+=4, tj+=4) {

             vfloat rv = LVF(rtemp[ti * tileSize + tj]);
@@ -159,7 +159,7 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH,
     // this is a hack to avoid the blue=>black bug (Issue 2141)
     for (int i = istart, ti = 0; i < tH; i++, ti++) {
         int j = jstart, tj = 0;
-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
         for (; j < tW - 3; j+=4, tj+=4) {
             vfloat rv = LVF(rtemp[ti * tileSize + tj]);
             vfloat gv = LVF(gtemp[ti * tileSize + tj]);
@@ -3762,7 +3762,7 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer
                 } else {
                     for (int i = istart, ti = 0; i < tH; i++, ti++) {
                         int j = jstart, tj = 0;
-#ifdef __SSE2__
+#if defined( __SSE2__ ) && defined( __x86_64__ )
                         for (; j < tW - 3; j+=4, tj+=4) {
                             //brightness/contrast
                             STVF(rtemp[ti * TS + tj], tonecurve(LVF(rtemp[ti * TS + tj])));

@Floessie Can you include my patch in your next commit, please?

@heckflosse New patch fixed issue. Thanks!

@mbajor Thanks for reporting and testing!

With those patches, Windows 32 builds are again feasible

Was this page helpful?
0 / 5 - 0 ratings

Related issues

elecprog picture elecprog  路  5Comments

Beep6581 picture Beep6581  路  5Comments

heckflosse picture heckflosse  路  4Comments

heckflosse picture heckflosse  路  3Comments

Beep6581 picture Beep6581  路  4Comments