1e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams/*
2e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * Copyright (C) 2012 The Android Open Source Project
3e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams *
4e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * you may not use this file except in compliance with the License.
6e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * You may obtain a copy of the License at
7e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams *
8e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams *
10e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * Unless required by applicable law or agreed to in writing, software
11e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * See the License for the specific language governing permissions and
14e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams * limitations under the License.
15e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams */
16e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
17e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
18e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
19e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uint8_t uchar;
20e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uint16_t ushort;
21e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uint32_t uint;
22e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
23e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef float float2 __attribute__((ext_vector_type(2)));
24e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef float float3 __attribute__((ext_vector_type(3)));
25e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef float float4 __attribute__((ext_vector_type(4)));
26e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uchar uchar2 __attribute__((ext_vector_type(2)));
27e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uchar uchar3 __attribute__((ext_vector_type(3)));
28e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uchar uchar4 __attribute__((ext_vector_type(4)));
29e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef ushort ushort2 __attribute__((ext_vector_type(2)));
30e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef ushort ushort3 __attribute__((ext_vector_type(3)));
31e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef ushort ushort4 __attribute__((ext_vector_type(4)));
32e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uint uint2 __attribute__((ext_vector_type(2)));
33e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uint uint3 __attribute__((ext_vector_type(3)));
34e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef uint uint4 __attribute__((ext_vector_type(4)));
35e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef char char2 __attribute__((ext_vector_type(2)));
36e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef char char3 __attribute__((ext_vector_type(3)));
37e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef char char4 __attribute__((ext_vector_type(4)));
38e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef short short2 __attribute__((ext_vector_type(2)));
39e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef short short3 __attribute__((ext_vector_type(3)));
40e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef short short4 __attribute__((ext_vector_type(4)));
41e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef int int2 __attribute__((ext_vector_type(2)));
42e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef int int3 __attribute__((ext_vector_type(3)));
43e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef int int4 __attribute__((ext_vector_type(4)));
44e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef long long2 __attribute__((ext_vector_type(2)));
45e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef long long3 __attribute__((ext_vector_type(3)));
46e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samstypedef long long4 __attribute__((ext_vector_type(4)));
47e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
48e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samsenum IntrinsicEnums {
49e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    INTRINSIC_UNDEFINED,
50e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    INTRINSIC_CONVOLVE_3x3,
51e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    INTRINXIC_COLORMATRIX
52e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
53e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams};
54e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
553b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams#define CVT_FUNC_2(typeout, typein)                             \
563b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Samsstatic inline typeout##2 __attribute__((const, overloadable))   \
573b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    convert_##typeout##2(typein##2 i) {                         \
5870404fa9781f13a8ca07d621f74f3810daab9704Jason Sams        return __builtin_convertvector(i, typeout##2);          \
593b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    }                                                           \
603b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Samsstatic inline typeout##3 __attribute__((const, overloadable))   \
613b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    convert_##typeout##3(typein##3 i) {                         \
6270404fa9781f13a8ca07d621f74f3810daab9704Jason Sams        return __builtin_convertvector(i, typeout##3);          \
633b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    }                                                           \
643b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Samsstatic inline typeout##4 __attribute__((const, overloadable))   \
653b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    convert_##typeout##4(typein##4 i) {                         \
6670404fa9781f13a8ca07d621f74f3810daab9704Jason Sams        return __builtin_convertvector(i, typeout##4);          \
673b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    }
683b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams#define CVT_FUNC(type)  CVT_FUNC_2(type, uchar)     \
693b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams                        CVT_FUNC_2(type, char)      \
703b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams                        CVT_FUNC_2(type, ushort)    \
713b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams                        CVT_FUNC_2(type, short)     \
723b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams                        CVT_FUNC_2(type, uint)      \
733b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams                        CVT_FUNC_2(type, int)       \
743b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams                        CVT_FUNC_2(type, float)
7570404fa9781f13a8ca07d621f74f3810daab9704Jason Sams
763b35d775a777c36a178ce3fc97ff1e169aab3f1eJason SamsCVT_FUNC(char)
773b35d775a777c36a178ce3fc97ff1e169aab3f1eJason SamsCVT_FUNC(uchar)
783b35d775a777c36a178ce3fc97ff1e169aab3f1eJason SamsCVT_FUNC(short)
793b35d775a777c36a178ce3fc97ff1e169aab3f1eJason SamsCVT_FUNC(ushort)
803b35d775a777c36a178ce3fc97ff1e169aab3f1eJason SamsCVT_FUNC(int)
813b35d775a777c36a178ce3fc97ff1e169aab3f1eJason SamsCVT_FUNC(uint)
823b35d775a777c36a178ce3fc97ff1e169aab3f1eJason SamsCVT_FUNC(float)
83537c4411b57ba30b688f437a663120e7f9c4f4e0Jason Sams
84e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
85e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Samsstatic inline int4 clamp(int4 amount, int low, int high) {
86e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    int4 r;
87e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
88e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
89e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
90e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
91e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams    return r;
92e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams}
93e1e08b4c9cc80c51224fdaf3aeab0804daf073e6Jason Sams
94d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstatic inline float4 clamp(float4 amount, float low, float high) {
95d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    float4 r;
96d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
97d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
98d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    r.z = amount.z < low ? low : (amount.z > high ? high : amount.z);
99d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    r.w = amount.w < low ? low : (amount.w > high ? high : amount.w);
100d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    return r;
101d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams}
102d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
1033b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Samsstatic inline int2 clamp(int2 amount, int low, int high) {
1043b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    int2 r;
1053b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
1063b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
1073b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    return r;
1083b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams}
1093b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams
1103b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Samsstatic inline float2 clamp(float2 amount, float low, float high) {
1113b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    float2 r;
1123b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    r.x = amount.x < low ? low : (amount.x > high ? high : amount.x);
1133b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    r.y = amount.y < low ? low : (amount.y > high ? high : amount.y);
1143b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    return r;
1153b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams}
1163b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams
1173b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Samsstatic inline int clamp(int amount, int low, int high) {
1183b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    return amount < low ? low : (amount > high ? high : amount);
1193b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams}
1203b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams
1213b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Samsstatic inline float clamp(float amount, float low, float high) {
1223b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams    return amount < low ? low : (amount > high ? high : amount);
1233b35d775a777c36a178ce3fc97ff1e169aab3f1eJason Sams}
124d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
125