From e616cd5706ef359aaed481db2e4d31a3fe16cd3b Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 3 May 2017 11:19:40 +0200 Subject: Cycles: Add utility function to convert float4 color from srgb to linear It will use SSE2 optimized version when is possible. --- intern/cycles/util/util_color.h | 44 +++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/intern/cycles/util/util_color.h b/intern/cycles/util/util_color.h index 4d673dc34d8..114f0f9bf79 100644 --- a/intern/cycles/util/util_color.h +++ b/intern/cycles/util/util_color.h @@ -158,16 +158,7 @@ ccl_device float3 xyz_to_rgb(float x, float y, float z) } #ifndef __KERNEL_OPENCL__ - -ccl_device float3 color_srgb_to_scene_linear(float3 c) -{ - return make_float3( - color_srgb_to_scene_linear(c.x), - color_srgb_to_scene_linear(c.y), - color_srgb_to_scene_linear(c.z)); -} - -#ifdef __KERNEL_SSE2__ +# ifdef __KERNEL_SSE2__ /* * Calculate initial guess for arg^exp based on float representation * This method gives a constant bias, which can be easily compensated by multiplication with bias_coeff. @@ -222,17 +213,40 @@ ccl_device ssef color_srgb_to_scene_linear(const ssef &c) ssef gte = fastpow24(gtebase); return select(cmp, lt, gte); } +# endif /* __KERNEL_SSE2__ */ + +ccl_device float3 color_srgb_to_scene_linear(float3 c) +{ + return make_float3(color_srgb_to_scene_linear(c.x), + color_srgb_to_scene_linear(c.y), + color_srgb_to_scene_linear(c.z)); +} + +ccl_device float4 color_srgb_to_scene_linear(float4 c) +{ +#ifdef __KERNEL_SSE2__ + ssef r_ssef; + float4 &r = (float4 &)r_ssef; + r = c; + r_ssef = color_srgb_to_scene_linear(r_ssef); + r.w = c.w; + return r; +#else + return make_float4(color_srgb_to_scene_linear(c.x), + color_srgb_to_scene_linear(c.y), + color_srgb_to_scene_linear(c.z), + c.w); #endif +} ccl_device float3 color_scene_linear_to_srgb(float3 c) { - return make_float3( - color_scene_linear_to_srgb(c.x), - color_scene_linear_to_srgb(c.y), - color_scene_linear_to_srgb(c.z)); + return make_float3(color_scene_linear_to_srgb(c.x), + color_scene_linear_to_srgb(c.y), + color_scene_linear_to_srgb(c.z)); } -#endif +#endif /* __KERNEL_OPENCL__ */ ccl_device float linear_rgb_to_gray(float3 c) { -- cgit v1.2.3