1572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams/* 2572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Copyright (C) 2012 The Android Open Source Project 3572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 4572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * you may not use this file except in compliance with the License. 6572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * You may obtain a copy of the License at 7572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 8572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * 10572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * Unless required by applicable law or agreed to in writing, software 11572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * See the License for the specific language governing permissions and 14572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams * limitations under the License. 15572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams */ 16572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 17572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#include "ip.rsh" 18572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams#pragma rs_fp_relaxed 19572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 20572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 21572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic rs_allocation gCube; 22572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic int4 gDims; 23572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsstatic int4 gCoordMul; 24572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 25572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 26572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsvoid setCube(rs_allocation c) { 27572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams gCube = c; 28572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams gDims.x = rsAllocationGetDimX(gCube); 29572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams gDims.y = rsAllocationGetDimY(gCube); 30572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams gDims.z = rsAllocationGetDimZ(gCube); 31572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams gDims.w = 0; 32572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 33572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams float4 m = (float4)(1.f / 255.f) * convert_float4(gDims - 1); 34572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams gCoordMul = convert_int4(m * (float4)0x10000); 35572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 36572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams rsDebug("dims", gDims); 37572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams rsDebug("gCoordMul", gCoordMul); 38572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 39572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 40572a5031a5d8602db0bec0b253428a034bd4dd59Jason Samsvoid root(const uchar4 *in, uchar4 *out, uint32_t x, uint32_t y) { 41572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("root", in); 42572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 43572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int4 baseCoord = convert_int4(*in) * gCoordMul; 44572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int4 coord1 = baseCoord >> (int4)16; 45572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int4 coord2 = min(coord1 + 1, gDims - 1); 46572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 47572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int4 weight2 = baseCoord & 0xffff; 48572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams int4 weight1 = (int4)0x10000 - weight2; 49572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 50572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams uint4 v000 = convert_uint4(rsGetElementAt_uchar4(gCube, coord1.x, coord1.y, coord1.z)); 51572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams uint4 v100 = convert_uint4(rsGetElementAt_uchar4(gCube, coord2.x, coord1.y, coord1.z)); 52572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams uint4 v010 = convert_uint4(rsGetElementAt_uchar4(gCube, coord1.x, coord2.y, coord1.z)); 53572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams uint4 v110 = convert_uint4(rsGetElementAt_uchar4(gCube, coord2.x, coord2.y, coord1.z)); 54572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams uint4 v001 = convert_uint4(rsGetElementAt_uchar4(gCube, coord1.x, coord1.y, coord2.z)); 55572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams uint4 v101 = convert_uint4(rsGetElementAt_uchar4(gCube, coord2.x, coord1.y, coord2.z)); 56572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams uint4 v011 = convert_uint4(rsGetElementAt_uchar4(gCube, coord1.x, coord2.y, coord2.z)); 57572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams uint4 v111 = convert_uint4(rsGetElementAt_uchar4(gCube, coord2.x, coord2.y, coord2.z)); 58572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 599f8accec83007fbbe856e9d91ac970a0bcf37d3aStephen Hines uint4 yz00 = ((v000 * weight1.x) + (v100 * weight2.x)) >> (uint4)8; 609f8accec83007fbbe856e9d91ac970a0bcf37d3aStephen Hines uint4 yz10 = ((v010 * weight1.x) + (v110 * weight2.x)) >> (uint4)8; 619f8accec83007fbbe856e9d91ac970a0bcf37d3aStephen Hines uint4 yz01 = ((v001 * weight1.x) + (v101 * weight2.x)) >> (uint4)8; 629f8accec83007fbbe856e9d91ac970a0bcf37d3aStephen Hines uint4 yz11 = ((v011 * weight1.x) + (v111 * weight2.x)) >> (uint4)8; 63572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 649f8accec83007fbbe856e9d91ac970a0bcf37d3aStephen Hines uint4 z0 = ((yz00 * weight1.y) + (yz10 * weight2.y)) >> (uint4)16; 659f8accec83007fbbe856e9d91ac970a0bcf37d3aStephen Hines uint4 z1 = ((yz01 * weight1.y) + (yz11 * weight2.y)) >> (uint4)16; 66572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 679f8accec83007fbbe856e9d91ac970a0bcf37d3aStephen Hines uint4 v = ((z0 * weight1.z) + (z1 * weight2.z)) >> (uint4)16; 689f8accec83007fbbe856e9d91ac970a0bcf37d3aStephen Hines uint4 v2 = (v + 0x7f) >> (uint4)8; 69572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 70572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams *out = convert_uchar4(v2); 71572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams out->a = 0xff; 72572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 73572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams #if 0 74572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams if (in->r != out->r) { 75572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams rsDebug("dr", in->r - out->r); 76572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("in", convert_int4(*in)); 77572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("coord1", coord1); 78572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("coord2", coord2); 79572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("weight1", weight1); 80572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("weight2", weight2); 81572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("yz00", yz00); 82572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("z0", z0); 83572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("v", v); 84572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("v2", v2); 85572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams //rsDebug("out", convert_int4(*out)); 86572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams } 87572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams #endif 88572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams} 89572a5031a5d8602db0bec0b253428a034bd4dd59Jason Sams 90