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