1d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams/*
2d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Copyright (C) 2012 The Android Open Source Project
3d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams *
4d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * you may not use this file except in compliance with the License.
6d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * You may obtain a copy of the License at
7d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams *
8d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams *
10d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Unless required by applicable law or agreed to in writing, software
11d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * See the License for the specific language governing permissions and
14d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * limitations under the License.
15d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams */
16d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
17d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
18d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams#include "rsdCore.h"
19d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams#include "rsdIntrinsics.h"
20d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams#include "rsdAllocation.h"
21d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
22d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams#include "rsdIntrinsicInlines.h"
23d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
24d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsusing namespace android;
25d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsusing namespace android::renderscript;
26d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
27d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstruct ConvolveParams {
28d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    ObjectBaseRef<Allocation> lut;
29d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams};
30d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
31d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstatic void LUT_Bind(const Context *dc, const Script *script,
32d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams                             void * intrinsicData, uint32_t slot, Allocation *data) {
33d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    ConvolveParams *cp = (ConvolveParams *)intrinsicData;
34d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    rsAssert(slot == 0);
35d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    cp->lut.set(data);
36d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams}
37d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
38d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstatic void LUT_uchar4(const RsForEachStubParamStruct *p,
39d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams                                    uint32_t xstart, uint32_t xend,
40d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams                                    uint32_t instep, uint32_t outstep) {
41d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    ConvolveParams *cp = (ConvolveParams *)p->usr;
42d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    uchar4 *out = (uchar4 *)p->out;
43d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    uchar4 *in = (uchar4 *)p->in;
44d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    uint32_t x1 = xstart;
45d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    uint32_t x2 = xend;
46d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
47d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    DrvAllocation *din = (DrvAllocation *)cp->lut->mHal.drv;
48d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    const uchar *tr = (const uchar *)din->lod[0].mallocPtr;
49d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    const uchar *tg = &tr[256];
50d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    const uchar *tb = &tg[256];
51d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    const uchar *ta = &tb[256];
52d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
53d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    while (x1 < x2) {
54d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams        uchar4 p = *in;
55d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams        uchar4 o = {tr[p.x], tg[p.y], tb[p.z], ta[p.w]};
56d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams        *out = o;
57d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams        in++;
58d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams        out++;
59d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams        x1++;
60d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    }
61d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams}
62d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
63d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsvoid * rsdIntrinsic_InitLUT(const android::renderscript::Context *dc,
64d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams                                    android::renderscript::Script *script,
65d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams                                    RsdIntriniscFuncs_t *funcs) {
66d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
67d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    script->mHal.info.exportedVariableCount = 1;
6878b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams    funcs->setVarObj = LUT_Bind;
69d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    funcs->root = LUT_uchar4;
70d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    ConvolveParams *cp = (ConvolveParams *)calloc(1, sizeof(ConvolveParams));
71d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams    return cp;
72d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams}
73d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
74d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams
75