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