color_helpers: Optimize pq_to_nits + nits_to_pq

Make these take in vector types, saves ~0.4ms
This commit is contained in:
Joshua Ashton 2023-05-09 02:52:35 +00:00 committed by Joshie
parent acef4c24ed
commit 580f9e05cb
2 changed files with 13 additions and 11 deletions

View file

@ -483,7 +483,7 @@ glm::vec3 calcEOTFToLinear( const glm::vec3 & input, EOTF eotf, const tonemappin
} }
else if ( eotf == EOTF_PQ ) else if ( eotf == EOTF_PQ )
{ {
return glm::vec3( pq_to_nits( input.r ), pq_to_nits( input.g ), pq_to_nits( input.b ) ); return pq_to_nits( input );
} }
return glm::vec3(0); return glm::vec3(0);
@ -502,7 +502,7 @@ glm::vec3 calcLinearToEOTF( const glm::vec3 & input, EOTF eotf, const tonemappin
} }
else if ( eotf == EOTF_PQ ) else if ( eotf == EOTF_PQ )
{ {
return glm::vec3( nits_to_pq( input.r ), nits_to_pq( input.g ), nits_to_pq( input.b ) ); return glm::vec3( nits_to_pq(input) );
} }
return glm::vec3(0); return glm::vec3(0);

View file

@ -45,7 +45,8 @@ inline float linear_to_srgb( float fVal )
return ( fVal < 0.0031308f ) ? fVal * 12.92f : std::pow( fVal, 1.0f / 2.4f ) * 1.055f - 0.055f; return ( fVal < 0.0031308f ) ? fVal * 12.92f : std::pow( fVal, 1.0f / 2.4f ) * 1.055f - 0.055f;
} }
inline float pq_to_nits( float pq ) template <typename T>
inline T pq_to_nits( const T& pq )
{ {
const float c1 = 0.8359375f; const float c1 = 0.8359375f;
const float c2 = 18.8515625f; const float c2 = 18.8515625f;
@ -54,23 +55,24 @@ inline float pq_to_nits( float pq )
const float oo_m1 = 1.0f / 0.1593017578125f; const float oo_m1 = 1.0f / 0.1593017578125f;
const float oo_m2 = 1.0f / 78.84375f; const float oo_m2 = 1.0f / 78.84375f;
float num = std::max(std::pow(pq, oo_m2) - c1, 0.0f); T num = glm::max(glm::pow(pq, T(oo_m2)) - c1, T(0.0f));
float den = c2 - c3 * std::pow(pq, oo_m2); T den = c2 - c3 * glm::pow(pq, T(oo_m2));
return 10000.0f * std::pow(num / den, oo_m1); return glm::pow(num / den, T(oo_m1)) * 10000.0f;
} }
inline float nits_to_pq( float nits ) template <typename T>
inline T nits_to_pq( const T& nits )
{ {
float y = clamp(nits / 10000.0f, 0.0f, 1.0f); T y = glm::clamp(nits / 10000.0f, T(0.0f), T(1.0f));
const float c1 = 0.8359375f; const float c1 = 0.8359375f;
const float c2 = 18.8515625f; const float c2 = 18.8515625f;
const float c3 = 18.6875f; const float c3 = 18.6875f;
const float m1 = 0.1593017578125f; const float m1 = 0.1593017578125f;
const float m2 = 78.84375f; const float m2 = 78.84375f;
float num = c1 + c2 * std::pow(y, m1); T num = c1 + c2 * glm::pow(y, T(m1));
float den = 1.0 + c3 * std::pow(y, m1); T den = T(1.0) + c3 * glm::pow(y, T(m1));
float n = std::pow(num / den, m2); T n = glm::pow(num / den, T(m2));
return n; return n;
} }