170404fa9781f13a8ca07d621f74f3810daab9704Jason Sams/*
270404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * Copyright (C) 2014 The Android Open Source Project
370404fa9781f13a8ca07d621f74f3810daab9704Jason Sams *
470404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
570404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * you may not use this file except in compliance with the License.
670404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * You may obtain a copy of the License at
770404fa9781f13a8ca07d621f74f3810daab9704Jason Sams *
870404fa9781f13a8ca07d621f74f3810daab9704Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
970404fa9781f13a8ca07d621f74f3810daab9704Jason Sams *
1070404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * Unless required by applicable law or agreed to in writing, software
1170404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1270404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1370404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * See the License for the specific language governing permissions and
1470404fa9781f13a8ca07d621f74f3810daab9704Jason Sams * limitations under the License.
1570404fa9781f13a8ca07d621f74f3810daab9704Jason Sams */
1670404fa9781f13a8ca07d621f74f3810daab9704Jason Sams
1770404fa9781f13a8ca07d621f74f3810daab9704Jason Sams#include "rs_core.rsh"
1870404fa9781f13a8ca07d621f74f3810daab9704Jason Sams
1970404fa9781f13a8ca07d621f74f3810daab9704Jason Sams
2070404fa9781f13a8ca07d621f74f3810daab9704Jason Sams#define CVT_FUNC_2(typeout, typein)                             \
2170404fa9781f13a8ca07d621f74f3810daab9704Jason Samsextern typeout##2 __attribute__((const, overloadable))   \
2270404fa9781f13a8ca07d621f74f3810daab9704Jason Sams    convert_##typeout##2(typein##2 i) {                         \
2370404fa9781f13a8ca07d621f74f3810daab9704Jason Sams        return __builtin_convertvector(i, typeout##2);          \
2470404fa9781f13a8ca07d621f74f3810daab9704Jason Sams    }                                                           \
2570404fa9781f13a8ca07d621f74f3810daab9704Jason Samsextern typeout##3 __attribute__((const, overloadable))   \
2670404fa9781f13a8ca07d621f74f3810daab9704Jason Sams    convert_##typeout##3(typein##3 i) {                         \
2770404fa9781f13a8ca07d621f74f3810daab9704Jason Sams        return __builtin_convertvector(i, typeout##3);          \
2870404fa9781f13a8ca07d621f74f3810daab9704Jason Sams    }                                                           \
2970404fa9781f13a8ca07d621f74f3810daab9704Jason Samsextern typeout##4 __attribute__((const, overloadable))   \
3070404fa9781f13a8ca07d621f74f3810daab9704Jason Sams    convert_##typeout##4(typein##4 i) {                         \
3170404fa9781f13a8ca07d621f74f3810daab9704Jason Sams        return __builtin_convertvector(i, typeout##4);          \
3270404fa9781f13a8ca07d621f74f3810daab9704Jason Sams    }
3370404fa9781f13a8ca07d621f74f3810daab9704Jason Sams#define CVT_FUNC(type)  CVT_FUNC_2(type, uchar)     \
3470404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, char)      \
3570404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, ushort)    \
3670404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, short)     \
3770404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, uint)      \
3870404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, int)       \
3970404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, ulong)     \
4070404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, long)      \
4154cd5d1771ea5c95e181befc66ef8e2a2c1b78cdPirama Arumuga Nainar                        CVT_FUNC_2(type, half)      \
4270404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, float)     \
4370404fa9781f13a8ca07d621f74f3810daab9704Jason Sams                        CVT_FUNC_2(type, double)
4470404fa9781f13a8ca07d621f74f3810daab9704Jason Sams
4570404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(char)
4670404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(uchar)
4770404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(short)
4870404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(ushort)
4970404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(int)
5070404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(uint)
5170404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(long)
5270404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(ulong)
5354cd5d1771ea5c95e181befc66ef8e2a2c1b78cdPirama Arumuga NainarCVT_FUNC(half)
5470404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(float)
5570404fa9781f13a8ca07d621f74f3810daab9704Jason SamsCVT_FUNC(double)
5670404fa9781f13a8ca07d621f74f3810daab9704Jason Sams
57c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang
58c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang/*
59c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang * YUV float4 version
60c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang */
61c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang
62c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wangstatic float4 yuv_U_values = {0.f, -0.392f * 0.003921569f, +2.02 * 0.003921569f, 0.f};
63c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wangstatic float4 yuv_V_values = {1.603f * 0.003921569f, -0.815f * 0.003921569f, 0.f, 0.f};
64c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang
65c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wangextern float4 __attribute__((overloadable)) rsYuvToRGBA_float4(uchar y, uchar u, uchar v) {
66c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang    float4 color = (float)y * 0.003921569f;
67c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang    float4 fU = ((float)u) - 128.f;
68c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang    float4 fV = ((float)v) - 128.f;
69c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang
70c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang    color += fU * yuv_U_values;
71c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang    color += fV * yuv_V_values;
72c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang    color = clamp(color, 0.f, 1.f);
73c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang    return color;
74c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang}
75c5ce430172dd0a1d3d78c79c95bbdf3f1b8c0c3eMiao Wang
76