Cycles: Add utility function to convert float4 color from srgb to linear

It will use SSE2 optimized version when is possible.
This commit is contained in:
Sergey Sharybin
2017-05-03 11:19:40 +02:00
parent d187014675
commit e616cd5706

View File

@@ -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)
{