From 580f9e05cbcdc723c59469d6828f2ceae66b85f3 Mon Sep 17 00:00:00 2001 From: Joshua Ashton Date: Tue, 9 May 2023 02:52:35 +0000 Subject: [PATCH] color_helpers: Optimize pq_to_nits + nits_to_pq Make these take in vector types, saves ~0.4ms --- src/color_helpers.cpp | 4 ++-- src/color_helpers.h | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/color_helpers.cpp b/src/color_helpers.cpp index 15dbf04..b860b36 100644 --- a/src/color_helpers.cpp +++ b/src/color_helpers.cpp @@ -483,7 +483,7 @@ glm::vec3 calcEOTFToLinear( const glm::vec3 & input, EOTF eotf, const tonemappin } 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); @@ -502,7 +502,7 @@ glm::vec3 calcLinearToEOTF( const glm::vec3 & input, EOTF eotf, const tonemappin } 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); diff --git a/src/color_helpers.h b/src/color_helpers.h index a33f26d..8c2ec25 100644 --- a/src/color_helpers.h +++ b/src/color_helpers.h @@ -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; } -inline float pq_to_nits( float pq ) +template +inline T pq_to_nits( const T& pq ) { const float c1 = 0.8359375f; 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_m2 = 1.0f / 78.84375f; - float num = std::max(std::pow(pq, oo_m2) - c1, 0.0f); - float den = c2 - c3 * std::pow(pq, oo_m2); + T num = glm::max(glm::pow(pq, T(oo_m2)) - c1, T(0.0f)); + 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 +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 c2 = 18.8515625f; const float c3 = 18.6875f; const float m1 = 0.1593017578125f; const float m2 = 78.84375f; - float num = c1 + c2 * std::pow(y, m1); - float den = 1.0 + c3 * std::pow(y, m1); - float n = std::pow(num / den, m2); + T num = c1 + c2 * glm::pow(y, T(m1)); + T den = T(1.0) + c3 * glm::pow(y, T(m1)); + T n = glm::pow(num / den, T(m2)); return n; }