From e3e23f774697782424647d8a12792dbc768501ad Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 19 May 2015 21:03:24 +0500 Subject: [PATCH] ImBuf: Make luminance calculation inlined Title actually tells it all, it is rather simple function which totally makes sense to be inlined. This gives up to 5% of speedup when updating scopes for a large image. Reviewers: campbellbarton Differential Revision: https://developer.blender.org/D1310 --- source/blender/blenlib/BLI_compiler_compat.h | 12 ++++ source/blender/blenlib/BLI_utildefines.h | 12 ---- source/blender/imbuf/CMakeLists.txt | 7 ++ source/blender/imbuf/IMB_colormanagement.h | 8 ++- .../imbuf/intern/IMB_colormanagement_intern.h | 2 + source/blender/imbuf/intern/colormanagement.c | 32 +-------- .../imbuf/intern/colormanagement_inline.c | 65 +++++++++++++++++++ 7 files changed, 94 insertions(+), 44 deletions(-) create mode 100644 source/blender/imbuf/intern/colormanagement_inline.c diff --git a/source/blender/blenlib/BLI_compiler_compat.h b/source/blender/blenlib/BLI_compiler_compat.h index 92928889c52..8edbc25bcbc 100644 --- a/source/blender/blenlib/BLI_compiler_compat.h +++ b/source/blender/blenlib/BLI_compiler_compat.h @@ -49,4 +49,16 @@ extern "C++" { } #endif +/* little macro so inline keyword works */ +#if defined(_MSC_VER) +# define BLI_INLINE static __forceinline +#else +# if (defined(__APPLE__) && defined(__ppc__)) +/* static inline __attribute__ here breaks osx ppc gcc42 build */ +# define BLI_INLINE static __attribute__((always_inline)) __attribute__((__unused__)) +# else +# define BLI_INLINE static inline __attribute__((always_inline)) __attribute__((__unused__)) +# endif +#endif + #endif /* __BLI_COMPILER_COMPAT_H__ */ diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 31852fa0f43..617634bb182 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -628,18 +628,6 @@ extern bool BLI_memory_is_zero(const void *arr, const size_t arr_size); # define UNUSED_VARS_NDEBUG UNUSED_VARS #endif -/*little macro so inline keyword works*/ -#if defined(_MSC_VER) -# define BLI_INLINE static __forceinline -#else -# if (defined(__APPLE__) && defined(__ppc__)) -/* static inline __attribute__ here breaks osx ppc gcc42 build */ -# define BLI_INLINE static __attribute__((always_inline)) __attribute__((__unused__)) -# else -# define BLI_INLINE static inline __attribute__((always_inline)) __attribute__((__unused__)) -# endif -#endif - /* BLI_assert(), default only to print * for aborting need to define WITH_ASSERT_ABORT diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt index c95f0abf3ca..abbc5a09040 100644 --- a/source/blender/imbuf/CMakeLists.txt +++ b/source/blender/imbuf/CMakeLists.txt @@ -46,6 +46,7 @@ set(SRC intern/bmp.c intern/cache.c intern/colormanagement.c + intern/colormanagement_inline.c intern/divers.c intern/filetype.c intern/filter.c @@ -187,4 +188,10 @@ if(WIN32) ) endif() +# no need to compile object files for inline headers. +set_source_files_properties( + intern/colormanagement_inline.c + PROPERTIES HEADER_FILE_ONLY TRUE +) + blender_add_lib(bf_imbuf "${SRC}" "${INC}" "${INC_SYS}") diff --git a/source/blender/imbuf/IMB_colormanagement.h b/source/blender/imbuf/IMB_colormanagement.h index 59df8334099..ab822f1cd55 100644 --- a/source/blender/imbuf/IMB_colormanagement.h +++ b/source/blender/imbuf/IMB_colormanagement.h @@ -36,9 +36,11 @@ */ #include "BLI_sys_types.h" +#include "BLI_compiler_compat.h" #define BCM_CONFIG_FILE "config.ocio" + struct bContext; struct ColorManagedColorspaceSettings; struct ColorManagedDisplaySettings; @@ -67,8 +69,8 @@ void IMB_colormanagement_assign_rect_colorspace(struct ImBuf *ibuf, const char * const char *IMB_colormanagement_get_float_colorspace(struct ImBuf *ibuf); const char *IMB_colormanagement_get_rect_colorspace(struct ImBuf *ibuf); -float IMB_colormanagement_get_luminance(const float rgb[3]); -unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char[3]); +BLI_INLINE float IMB_colormanagement_get_luminance(const float rgb[3]); +BLI_INLINE unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char[3]); /* ** Color space transformation functions ** */ void IMB_colormanagement_transform(float *buffer, int width, int height, int channels, @@ -206,4 +208,6 @@ enum { COLOR_ROLE_DEFAULT_FLOAT, }; +#include "intern/colormanagement_inline.c" + #endif /* __IMB_COLORMANAGEMENT_H__ */ diff --git a/source/blender/imbuf/intern/IMB_colormanagement_intern.h b/source/blender/imbuf/intern/IMB_colormanagement_intern.h index 710e70937e6..b75f12b239d 100644 --- a/source/blender/imbuf/intern/IMB_colormanagement_intern.h +++ b/source/blender/imbuf/intern/IMB_colormanagement_intern.h @@ -41,6 +41,8 @@ struct OCIO_ConstProcessorRcPtr; struct ImBuf; +extern float imbuf_luma_coefficients[3]; + #define MAX_COLORSPACE_NAME 64 #define MAX_COLORSPACE_DESCRIPTION 512 diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index 5a3d9b4c653..e4e93d3c4da 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -93,7 +93,7 @@ static int global_tot_looks = 0; /* Set to ITU-BT.709 / sRGB primaries weight. Brute force stupid, but only * option with no colormanagement in place. */ -static float luma_coefficients[3] = { 0.2126f, 0.7152f, 0.0722f }; +float imbuf_luma_coefficients[3] = { 0.2126f, 0.7152f, 0.0722f }; /* lock used by pre-cached processors getters, so processor wouldn't * be created several times @@ -552,7 +552,7 @@ static void colormanage_load_config(OCIO_ConstConfigRcPtr *config) } /* Load luminance coefficients. */ - OCIO_configGetDefaultLumaCoefs(config, luma_coefficients); + OCIO_configGetDefaultLumaCoefs(config, imbuf_luma_coefficients); } static void colormanage_free_config(void) @@ -1230,34 +1230,6 @@ const char *IMB_colormanagement_get_rect_colorspace(ImBuf *ibuf) return ibuf->rect_colorspace->name; } -/* Convert a float RGB triplet to the correct luminance weighted average. - * - * Grayscale, or Luma is a distillation of RGB data values down to a weighted average - * based on the luminance positions of the red, green, and blue primaries. - * Given that the internal reference space may be arbitrarily set, any - * effort to glean the luminance coefficients must be aware of the reference - * space primaries. - * - * See http://wiki.blender.org/index.php/User:Nazg-gul/ColorManagement#Luminance - */ - -float IMB_colormanagement_get_luminance(const float rgb[3]) -{ - return dot_v3v3(luma_coefficients, rgb); -} - -/* Byte equivalent of IMB_colormanagement_get_luminance(). */ -unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char rgb[3]) -{ - float rgbf[3]; - float val; - - rgb_uchar_to_float(rgbf, rgb); - val = dot_v3v3(luma_coefficients, rgbf); - - return FTOCHAR(val); -} - /*********************** Threaded display buffer transform routines *************************/ typedef struct DisplayBufferThread { diff --git a/source/blender/imbuf/intern/colormanagement_inline.c b/source/blender/imbuf/intern/colormanagement_inline.c new file mode 100644 index 00000000000..8382e2a9bfa --- /dev/null +++ b/source/blender/imbuf/intern/colormanagement_inline.c @@ -0,0 +1,65 @@ +/* + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * The Original Code is Copyright (C) 2015 by Blender Foundation. + * All rights reserved. + * + * Contributor(s): Sergey Sharybin + * + * ***** END GPL LICENSE BLOCK ***** + * + */ + +/** \file blender/imbuf/intern/colormanagement_inline.c + * \ingroup imbuf + */ + +#ifndef __IMB_COLORMANAGEMENT_INLINE_C__ +#define __IMB_COLORMANAGEMENT_INLINE_C__ + +#include "IMB_colormanagement_intern.h" +#include "BLI_math_vector.h" + +/* Convert a float RGB triplet to the correct luminance weighted average. + * + * Grayscale, or Luma is a distillation of RGB data values down to a weighted average + * based on the luminance positions of the red, green, and blue primaries. + * Given that the internal reference space may be arbitrarily set, any + * effort to glean the luminance coefficients must be aware of the reference + * space primaries. + * + * See http://wiki.blender.org/index.php/User:Nazg-gul/ColorManagement#Luminance + */ + +float IMB_colormanagement_get_luminance(const float rgb[3]) +{ + return dot_v3v3(imbuf_luma_coefficients, rgb); +} + +/* Byte equivalent of IMB_colormanagement_get_luminance(). */ +unsigned char IMB_colormanagement_get_luminance_byte(const unsigned char rgb[3]) +{ + float rgbf[3]; + float val; + + rgb_uchar_to_float(rgbf, rgb); + val = dot_v3v3(imbuf_luma_coefficients, rgbf); + + return FTOCHAR(val); +} + +#endif /* __IMB_COLORMANAGEMENT_INLINE_H__ */