commit cd68fd482abdd4921f461ca4870c76c2af4d0974 Author: Gert Wollny Date: Mon Oct 9 07:44:33 2017 +0200 Engine/Shader/Private/ACES.ush: move C5/C9 corfs into float2 arrays By moving the coefficients in float2 arrays, interleaving low and high coefficients as x and y, the number of arrays reserved by this shader is reduced making it possible to be compiled and linked by mesa for AMD R600 class hardware where it would otherwise trigger a "translation to TGSI failed" error because it requires more registers then supported by this hardware. diff --git a/Engine/Shaders/Private/ACES.ush b/Engine/Shaders/Private/ACES.ush index 8df7ca91f5..97b952b91e 100644 --- a/Engine/Shaders/Private/ACES.ush +++ b/Engine/Shaders/Private/ACES.ush @@ -243,21 +243,17 @@ float cubic_basis_shaper int j = knot_coord; float t = knot_coord - j; - float monomials[4] = { t*t*t, t*t, t, 1.0 }; + float4 monomials = { t*t*t, t*t, t, 1.0 }; // (if/else structure required for compatibility with CTL < v1.5.) if ( j == 3) { - y = monomials[0] * M[0][0] + monomials[1] * M[1][0] + - monomials[2] * M[2][0] + monomials[3] * M[3][0]; - } else if ( j == 2) { - y = monomials[0] * M[0][1] + monomials[1] * M[1][1] + - monomials[2] * M[2][1] + monomials[3] * M[3][1]; + y = dot(monomials, M[0]); + } else if ( j == 2) { + y = dot(monomials, M[1]); } else if ( j == 1) { - y = monomials[0] * M[0][2] + monomials[1] * M[1][2] + - monomials[2] * M[2][2] + monomials[3] * M[3][2]; + y = dot(monomials, M[2]); } else if ( j == 0) { - y = monomials[0] * M[0][3] + monomials[1] * M[1][3] + - monomials[2] * M[2][3] + monomials[3] * M[3][3]; + y = dot(monomials, M[3]); } else { y = 0.0; } @@ -287,8 +283,8 @@ static const float3x3 M = struct SegmentedSplineParams_c5 { - float coefsLow[6]; // coefs for B-spline between minPoint and midPoint (units of log luminance) - float coefsHigh[6]; // coefs for B-spline between midPoint and maxPoint (units of log luminance) + float2 coefs[6]; // coefs for B-spline between: x = minPoint and midPoint, + // y = midPoint and maxPoint (units of log luminance) float2 minPoint; // {luminance, luminance} linear extension below this float2 midPoint; // {luminance, luminance} float2 maxPoint; // {luminance, luminance} linear extension above this @@ -298,8 +294,8 @@ struct SegmentedSplineParams_c5 struct SegmentedSplineParams_c9 { - float coefsLow[10]; // coefs for B-spline between minPoint and midPoint (units of log luminance) - float coefsHigh[10]; // coefs for B-spline between midPoint and maxPoint (units of log luminance) + float2 coefs[10]; // coefs for B-spline between: x = minPoint and midPoint, + // y = midPoint and maxPoint (units of log luminance) float2 minPoint; // {luminance, luminance} linear extension below this float2 midPoint; // {luminance, luminance} float2 maxPoint; // {luminance, luminance} linear extension above this @@ -312,10 +308,9 @@ float segmented_spline_c5_fwd( float x ) // RRT_PARAMS const SegmentedSplineParams_c5 C = { - // coefsLow[6] - { -4.0000000000, -4.0000000000, -3.1573765773, -0.4852499958, 1.8477324706, 1.8477324706 }, - // coefsHigh[6] - { -0.7185482425, 2.0810307172, 3.6681241237, 4.0000000000, 4.0000000000, 4.0000000000 }, + // coefs[6] + { {-4.0000000000, -0.7185482425}, {-4.0000000000,3.6681241237}, {-3.1573765773,2.0810307172}, + {-0.4852499958, 4.0000000000}, {1.8477324706, 4.0000000000}, {1.8477324706, 4.0000000000}}, { 0.18*exp2(-15.0), 0.0001}, // minPoint { 0.18, 4.8}, // midPoint { 0.18*exp2(18.0), 10000.}, // maxPoint @@ -333,35 +328,35 @@ float segmented_spline_c5_fwd( float x ) float logx = log10( xCheck); float logy; - if ( logx <= log10(C.minPoint.x) ) + if ( logx < log10(C.minPoint.x) ) { - logy = logx * C.slopeLow + ( log10(C.minPoint.y) - C.slopeLow * log10(C.minPoint.x) ); + logy = log10(C.minPoint.y) ; } - else if (( logx > log10(C.minPoint.x) ) && ( logx < log10(C.midPoint.x) )) + else if (logx < log10(C.midPoint.x)) { float knot_coord = (N_KNOTS_LOW-1) * (logx-log10(C.minPoint.x))/(log10(C.midPoint.x)-log10(C.minPoint.x)); int j = knot_coord; float t = knot_coord - j; - float3 cf = { C.coefsLow[ j], C.coefsLow[ j + 1], C.coefsLow[ j + 2]}; + float3 cf = { C.coefs[ j].x, C.coefs[ j + 1].x, C.coefs[ j + 2].x }; float3 monomials = { t * t, t, 1.0 }; logy = dot( monomials, mul( cf, M)); } - else if (( logx >= log10(C.midPoint.x) ) && ( logx < log10(C.maxPoint.x) )) + else if (logx < log10(C.maxPoint.x)) { float knot_coord = (N_KNOTS_HIGH-1) * (logx-log10(C.midPoint.x))/(log10(C.maxPoint.x)-log10(C.midPoint.x)); int j = knot_coord; float t = knot_coord - j; - float3 cf = { C.coefsHigh[ j], C.coefsHigh[ j + 1], C.coefsHigh[ j + 2]}; + float3 cf = { C.coefs[ j].y, C.coefs[ j + 1].y, C.coefs[ j + 2].y}; float3 monomials = { t * t, t, 1.0 }; logy = dot( monomials, mul( cf, M)); } else { //if ( logIn >= log10(C.maxPoint.x) ) { - logy = logx * C.slopeHigh + ( log10(C.maxPoint.y) - C.slopeHigh * log10(C.maxPoint.x) ); + logy = log10(C.maxPoint.y); } return pow( 10, logy ); @@ -373,9 +368,8 @@ float segmented_spline_c5_rev( float y ) const SegmentedSplineParams_c5 C = { // coefsLow[6] - { -4.0000000000, -4.0000000000, -3.1573765773, -0.4852499958, 1.8477324706, 1.8477324706 }, - // coefsHigh[6] - { -0.7185482425, 2.0810307172, 3.6681241237, 4.0000000000, 4.0000000000, 4.0000000000 }, + {{-4.0000000000, -0.7185482425}, {-4.0000000000,3.6681241237}, {-3.1573765773,2.0810307172}, + {-0.4852499958, 4.0000000000}, {1.8477324706, 4.0000000000}, {1.8477324706, 4.0000000000}}, { 0.18*exp2(-15.0), 0.0001}, // minPoint { 0.18, 4.8}, // midPoint { 0.18*exp2(18.0), 10000.}, // maxPoint @@ -392,16 +386,10 @@ float segmented_spline_c5_rev( float y ) int i; // KNOT_Y is luminance of the spline at each knot - float KNOT_Y_LOW[N_KNOTS_LOW]; + float2 KNOT_Y[N_KNOTS_LOW]; for (i = 0; i < N_KNOTS_LOW; i = i+1) { - KNOT_Y_LOW[i] = (C.coefsLow[i] + C.coefsLow[i+1]) / 2.; - }; - - float KNOT_Y_HIGH[N_KNOTS_HIGH]; - for (i = 0; i < N_KNOTS_HIGH; i = i+1) - { - KNOT_Y_HIGH[i] = ( C.coefsHigh[i] + C.coefsHigh[i+1]) / 2.; + KNOT_Y[i].xy = (C.coefs[i].xy + C.coefs[i+1].xy) / 2.; }; float logy = log10(max(y,1e-10)); @@ -411,16 +399,18 @@ float segmented_spline_c5_rev( float y ) { logx = log10(C.minPoint.x); } - else if ( (logy > log10(C.minPoint.y)) && (logy <= log10(C.midPoint.y)) ) + else if ( logy <= log10(C.midPoint.y) ) { uint j; float3 cf; - if (logy > KNOT_Y_LOW[ 0] && logy <= KNOT_Y_LOW[ 1]) { - cf[ 0] = C.coefsLow[0]; cf[ 1] = C.coefsLow[1]; cf[ 2] = C.coefsLow[2]; j = 0; - } else if ( logy > KNOT_Y_LOW[ 1] && logy <= KNOT_Y_LOW[ 2]) { - cf[ 0] = C.coefsLow[1]; cf[ 1] = C.coefsLow[2]; cf[ 2] = C.coefsLow[3]; j = 1; - } else if ( logy > KNOT_Y_LOW[ 2] && logy <= KNOT_Y_LOW[ 3]) { - cf[ 0] = C.coefsLow[2]; cf[ 1] = C.coefsLow[3]; cf[ 2] = C.coefsLow[4]; j = 2; + if (logy > KNOT_Y[ 0].x && logy <= KNOT_Y[ 1].x) { + cf[ 0] = C.coefs[0].x; cf[ 1] = C.coefs[1].x; cf[ 2] = C.coefs[2].x; j = 0; + } else if ( logy > KNOT_Y[ 1].x && logy <= KNOT_Y[ 2].x) { + cf[ 0] = C.coefs[1].x; cf[ 1] = C.coefs[2].x; cf[ 2] = C.coefs[3].x; j = 1; + } else if ( logy > KNOT_Y[ 2].x && logy <= KNOT_Y[ 3].x) { + cf[ 0] = C.coefs[2].x; cf[ 1] = C.coefs[3].x; cf[ 2] = C.coefs[4].x; j = 2; + } else { + cf[ 0] = C.coefs[3].x; cf[ 1] = C.coefs[4].x; cf[ 2] = C.coefs[5].x; j = 3; } const float3 tmp = mul( cf, M); @@ -436,17 +426,20 @@ float segmented_spline_c5_rev( float y ) logx = log10(C.minPoint.x) + ( t + j) * KNOT_INC_LOW; } - else if ( (logy > log10(C.midPoint.y)) && (logy < log10(C.maxPoint.y)) ) + else if ( logy < log10(C.maxPoint.y) ) { uint j; float3 cf; - if ( logy > KNOT_Y_HIGH[ 0] && logy <= KNOT_Y_HIGH[ 1]) { - cf[ 0] = C.coefsHigh[0]; cf[ 1] = C.coefsHigh[1]; cf[ 2] = C.coefsHigh[2]; j = 0; - } else if ( logy > KNOT_Y_HIGH[ 1] && logy <= KNOT_Y_HIGH[ 2]) { - cf[ 0] = C.coefsHigh[1]; cf[ 1] = C.coefsHigh[2]; cf[ 2] = C.coefsHigh[3]; j = 1; - } else if ( logy > KNOT_Y_HIGH[ 2] && logy <= KNOT_Y_HIGH[ 3]) { - cf[ 0] = C.coefsHigh[2]; cf[ 1] = C.coefsHigh[3]; cf[ 2] = C.coefsHigh[4]; j = 2; - } + if ( logy > KNOT_Y[ 0].y && logy <= KNOT_Y[ 1].y) { + cf[ 0] = C.coefs[0].y; cf[ 1] = C.coefs[1].y; cf[ 2] = C.coefs[2].y; j = 0; + } else if ( logy > KNOT_Y[ 1].y && logy <= KNOT_Y[ 2].y) { + cf[ 0] = C.coefs[1].y; cf[ 1] = C.coefs[2].y; cf[ 2] = C.coefs[3].y; j = 1; + } else if ( logy > KNOT_Y[ 2].y && logy <= KNOT_Y[ 3].y) { + cf[ 0] = C.coefs[2].y; cf[ 1] = C.coefs[3].y; cf[ 2] = C.coefs[4].y; j = 2; + } else { + cf[ 0] = C.coefs[3].y; cf[ 1] = C.coefs[4].y; cf[ 2] = C.coefs[5].y; j = 3; + } + const float3 tmp = mul( cf, M); @@ -491,7 +484,7 @@ float segmented_spline_c9_fwd( float x, const SegmentedSplineParams_c9 C ) int j = knot_coord; float t = knot_coord - j; - float3 cf = { C.coefsLow[j], C.coefsLow[j + 1], C.coefsLow[j + 2] }; + float3 cf = { C.coefs[j].x, C.coefs[j + 1].x, C.coefs[j + 2].x }; float3 monomials = { t * t, t, 1.0 }; logy = dot(monomials, mul(cf, M)); @@ -502,7 +495,7 @@ float segmented_spline_c9_fwd( float x, const SegmentedSplineParams_c9 C ) int j = knot_coord; float t = knot_coord - j; - float3 cf = { C.coefsHigh[j], C.coefsHigh[j + 1], C.coefsHigh[j + 2] }; + float3 cf = { C.coefs[j].y, C.coefs[j + 1].y, C.coefs[j + 2].y }; float3 monomials = { t * t, t, 1.0 }; logy = dot(monomials, mul(cf, M)); @@ -528,12 +521,12 @@ float segmented_spline_c9_rev( float y, const SegmentedSplineParams_c9 C ) // KNOT_Y is luminance of the spline at each knot float KNOT_Y_LOW[ N_KNOTS_LOW]; for (i = 0; i < N_KNOTS_LOW; i = i+1) { - KNOT_Y_LOW[ i] = ( C.coefsLow[i] + C.coefsLow[i+1]) / 2.; + KNOT_Y_LOW[ i] = ( C.coefs[i].x + C.coefs[i+1].x) / 2.; }; float KNOT_Y_HIGH[ N_KNOTS_HIGH]; for (i = 0; i < N_KNOTS_HIGH; i = i+1) { - KNOT_Y_HIGH[ i] = ( C.coefsHigh[i] + C.coefsHigh[i+1]) / 2.; + KNOT_Y_HIGH[ i] = ( C.coefs[i].y + C.coefs[i+1]).y / 2.; }; float logy = log10( max( y, 1e-10)); @@ -545,19 +538,21 @@ float segmented_spline_c9_rev( float y, const SegmentedSplineParams_c9 C ) uint j; float3 cf; if ( logy > KNOT_Y_LOW[ 0] && logy <= KNOT_Y_LOW[ 1]) { - cf[ 0] = C.coefsLow[0]; cf[ 1] = C.coefsLow[1]; cf[ 2] = C.coefsLow[2]; j = 0; + cf[ 0] = C.coefs[0].x; cf[ 1] = C.coefs[1].x; cf[ 2] = C.coefs[2].x; j = 0; } else if ( logy > KNOT_Y_LOW[ 1] && logy <= KNOT_Y_LOW[ 2]) { - cf[ 0] = C.coefsLow[1]; cf[ 1] = C.coefsLow[2]; cf[ 2] = C.coefsLow[3]; j = 1; + cf[ 0] = C.coefs[1].x; cf[ 1] = C.coefs[2].x; cf[ 2] = C.coefs[3].x; j = 1; } else if ( logy > KNOT_Y_LOW[ 2] && logy <= KNOT_Y_LOW[ 3]) { - cf[ 0] = C.coefsLow[2]; cf[ 1] = C.coefsLow[3]; cf[ 2] = C.coefsLow[4]; j = 2; + cf[ 0] = C.coefs[2].x; cf[ 1] = C.coefs[3].x; cf[ 2] = C.coefs[4].x; j = 2; } else if ( logy > KNOT_Y_LOW[ 3] && logy <= KNOT_Y_LOW[ 4]) { - cf[ 0] = C.coefsLow[3]; cf[ 1] = C.coefsLow[4]; cf[ 2] = C.coefsLow[5]; j = 3; + cf[ 0] = C.coefs[3].x; cf[ 1] = C.coefs[4].x; cf[ 2] = C.coefs[5].x; j = 3; } else if ( logy > KNOT_Y_LOW[ 4] && logy <= KNOT_Y_LOW[ 5]) { - cf[ 0] = C.coefsLow[4]; cf[ 1] = C.coefsLow[5]; cf[ 2] = C.coefsLow[6]; j = 4; + cf[ 0] = C.coefs[4].x; cf[ 1] = C.coefs[5].x; cf[ 2] = C.coefs[6].x; j = 4; } else if ( logy > KNOT_Y_LOW[ 5] && logy <= KNOT_Y_LOW[ 6]) { - cf[ 0] = C.coefsLow[5]; cf[ 1] = C.coefsLow[6]; cf[ 2] = C.coefsLow[7]; j = 5; + cf[ 0] = C.coefs[5].x; cf[ 1] = C.coefs[6].x; cf[ 2] = C.coefs[7].x; j = 5; } else if ( logy > KNOT_Y_LOW[ 6] && logy <= KNOT_Y_LOW[ 7]) { - cf[ 0] = C.coefsLow[6]; cf[ 1] = C.coefsLow[7]; cf[ 2] = C.coefsLow[8]; j = 6; + cf[ 0] = C.coefs[6].x; cf[ 1] = C.coefs[7].x; cf[ 2] = C.coefs[8].x; j = 6; + } else { + cf[ 0] = C.coefs[7].x; cf[ 1] = C.coefs[8].x; cf[ 2] = C.coefs[9].x; j = 7; } const float3 tmp = mul( cf, M); @@ -576,19 +571,21 @@ float segmented_spline_c9_rev( float y, const SegmentedSplineParams_c9 C ) uint j; float3 cf; if ( logy > KNOT_Y_HIGH[ 0] && logy <= KNOT_Y_HIGH[ 1]) { - cf[ 0] = C.coefsHigh[0]; cf[ 1] = C.coefsHigh[1]; cf[ 2] = C.coefsHigh[2]; j = 0; + cf[ 0] = C.coefs[0].y; cf[ 1] = C.coefs[1].y; cf[ 2] = C.coefs[2].y; j = 0; } else if ( logy > KNOT_Y_HIGH[ 1] && logy <= KNOT_Y_HIGH[ 2]) { - cf[ 0] = C.coefsHigh[1]; cf[ 1] = C.coefsHigh[2]; cf[ 2] = C.coefsHigh[3]; j = 1; + cf[ 0] = C.coefs[1].y; cf[ 1] = C.coefs[2].y; cf[ 2] = C.coefs[3].y; j = 1; } else if ( logy > KNOT_Y_HIGH[ 2] && logy <= KNOT_Y_HIGH[ 3]) { - cf[ 0] = C.coefsHigh[2]; cf[ 1] = C.coefsHigh[3]; cf[ 2] = C.coefsHigh[4]; j = 2; + cf[ 0] = C.coefs[2].y; cf[ 1] = C.coefs[3].y; cf[ 2] = C.coefs[4].y; j = 2; } else if ( logy > KNOT_Y_HIGH[ 3] && logy <= KNOT_Y_HIGH[ 4]) { - cf[ 0] = C.coefsHigh[3]; cf[ 1] = C.coefsHigh[4]; cf[ 2] = C.coefsHigh[5]; j = 3; + cf[ 0] = C.coefs[3].y; cf[ 1] = C.coefs[4].y; cf[ 2] = C.coefs[5].y; j = 3; } else if ( logy > KNOT_Y_HIGH[ 4] && logy <= KNOT_Y_HIGH[ 5]) { - cf[ 0] = C.coefsHigh[4]; cf[ 1] = C.coefsHigh[5]; cf[ 2] = C.coefsHigh[6]; j = 4; + cf[ 0] = C.coefs[4].y; cf[ 1] = C.coefs[5].y; cf[ 2] = C.coefs[6].y; j = 4; } else if ( logy > KNOT_Y_HIGH[ 5] && logy <= KNOT_Y_HIGH[ 6]) { - cf[ 0] = C.coefsHigh[5]; cf[ 1] = C.coefsHigh[6]; cf[ 2] = C.coefsHigh[7]; j = 5; + cf[ 0] = C.coefs[5].y; cf[ 1] = C.coefs[6].y; cf[ 2] = C.coefs[7].y; j = 5; } else if ( logy > KNOT_Y_HIGH[ 6] && logy <= KNOT_Y_HIGH[ 7]) { - cf[ 0] = C.coefsHigh[6]; cf[ 1] = C.coefsHigh[7]; cf[ 2] = C.coefsHigh[8]; j = 6; + cf[ 0] = C.coefs[6].y; cf[ 1] = C.coefs[7].y; cf[ 2] = C.coefs[8].y; j = 6; + }else { + cf[ 0] = C.coefs[7].y; cf[ 1] = C.coefs[8].y; cf[ 2] = C.coefs[9].y; j = 7; } const float3 tmp = mul( cf, M); @@ -933,10 +930,17 @@ float3 ODT_sRGB_D65( float3 oces ) const SegmentedSplineParams_c9 ODT_48nits = { - // coefsLow[10] - { -1.6989700043, -1.6989700043, -1.4779000000, -1.2291000000, -0.8648000000, -0.4480000000, 0.0051800000, 0.4511080334, 0.9113744414, 0.9113744414}, - // coefsHigh[10] - { 0.5154386965, 0.8470437783, 1.1358000000, 1.3802000000, 1.5197000000, 1.5985000000, 1.6467000000, 1.6746091357, 1.6878733390, 1.6878733390 }, + // coefs[10] + {{ -1.6989700043, 0.5154386965}, + {-1.6989700043, 0.8470437783}, + {-1.4779000000, 1.1358000000}, + {-1.2291000000, 1.3802000000 }, + {-0.8648000000, 1.5197000000 }, + {-0.4480000000, 1.5985000000 }, + {0.0051800000, 1.6467000000 }, + {0.4511080334, 1.6746091357}, + {0.9113744414, 1.6878733390 }, + {0.9113744414, 1.6878733390}}, {segmented_spline_c5_fwd( 0.18*exp2(-6.5) ), 0.02}, // minPoint {segmented_spline_c5_fwd( 0.18 ), 4.8}, // midPoint {segmented_spline_c5_fwd( 0.18*exp2(6.5) ), 48.0}, // maxPoint @@ -1039,10 +1043,17 @@ float3 Inverse_ODT_sRGB_D65(float3 linearCV) const SegmentedSplineParams_c9 ODT_48nits = { - // coefsLow[10] - { -1.6989700043, -1.6989700043, -1.4779000000, -1.2291000000, -0.8648000000, -0.4480000000, 0.0051800000, 0.4511080334, 0.9113744414, 0.9113744414}, - // coefsHigh[10] - { 0.5154386965, 0.8470437783, 1.1358000000, 1.3802000000, 1.5197000000, 1.5985000000, 1.6467000000, 1.6746091357, 1.6878733390, 1.6878733390 }, + // coefs[10] + {{ -1.6989700043, 0.5154386965}, + {-1.6989700043, 0.8470437783 }, + {-1.4779000000, 1.1358000000 }, + {-1.2291000000, 1.3802000000 }, + {-0.8648000000, 1.5197000000 }, + {-0.4480000000, 1.5985000000 }, + {0.0051800000, 1.6467000000 }, + {0.4511080334, 1.6746091357}, + {0.9113744414, 1.6878733390 }, + {0.9113744414, 1.6878733390 }}, {segmented_spline_c5_fwd( 0.18*pow(2.,-6.5) ), 0.02}, // minPoint {segmented_spline_c5_fwd( 0.18 ), 4.8}, // midPoint {segmented_spline_c5_fwd( 0.18*pow(2.,6.5) ), 48.0}, // maxPoint @@ -1103,9 +1114,16 @@ float3 ODT_1000nits( float3 oces ) const SegmentedSplineParams_c9 ODT_1000nits = { // coefsLow[10] - { -4.9706219331, -3.0293780669, -2.1262, -1.5105, -1.0578, -0.4668, 0.11938, 0.7088134201, 1.2911865799, 1.2911865799 }, - // coefsHigh[10] - { 0.8089132070, 1.1910867930, 1.5683, 1.9483, 2.3083, 2.6384, 2.8595, 2.9872608805, 3.0127391195, 3.0127391195 }, + {{ -4.9706219331, 0.8089132070 }, + {-3.0293780669, 1.1910867930 }, + {-2.1262, 1.5683 }, + {-1.5105, 1.9483 }, + {-1.0578, 2.3083 }, + {-0.4668, 2.6384 }, + {0.11938, 2.8595 }, + {0.7088134201, 2.9872608805 }, + {1.2911865799, 3.0127391195 }, + {1.2911865799, 3.0127391195 }}, {segmented_spline_c5_fwd( 0.18*pow(2.,-12.) ), 0.0001}, // minPoint {segmented_spline_c5_fwd( 0.18 ), 10.0}, // midPoint {segmented_spline_c5_fwd( 0.18*pow(2.,10.) ), 1000.0}, // maxPoint @@ -1167,9 +1185,17 @@ float3 ODT_2000nits( float3 oces ) const SegmentedSplineParams_c9 ODT_2000nits = { // coefsLow[10] - { -2.3010299957, -2.3010299957, -1.9312000000, -1.5205000000, -1.0578000000, -0.4668000000, 0.1193800000, 0.7088134201, 1.2911865799, 1.2911865799 }, - // coefsHigh[10] - { 0.8019952042, 1.1980047958, 1.5943000000, 1.9973000000, 2.3783000000, 2.7684000000, 3.0515000000, 3.2746293562, 3.3274306351, 3.3274306351 }, + {{ -2.3010299957, 0.8019952042 }, + {-2.3010299957, 1.1980047958 }, + {-1.9312000000, 1.5943000000 }, + {-1.5205000000, 1.9973000000 }, + {-1.0578000000, 2.3783000000 }, + {-0.4668000000, 2.7684000000 }, + {0.1193800000, 3.0515000000 }, + {0.7088134201, 3.2746293562 }, + {1.2911865799, 3.3274306351 }, + {1.2911865799, 3.3274306351 }}, + {segmented_spline_c5_fwd( 0.18*pow(2.,-12.) ), 0.005}, // minPoint {segmented_spline_c5_fwd( 0.18 ), 10.0}, // midPoint {segmented_spline_c5_fwd( 0.18*pow(2.,11.) ), 2000.0}, // maxPoint