1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2012 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker
18*e1eccf28SAndroid Build Coastguard Worker #include "rsCpuIntrinsic.h"
19*e1eccf28SAndroid Build Coastguard Worker #include "rsCpuIntrinsicInlines.h"
20*e1eccf28SAndroid Build Coastguard Worker
21*e1eccf28SAndroid Build Coastguard Worker namespace android {
22*e1eccf28SAndroid Build Coastguard Worker namespace renderscript {
23*e1eccf28SAndroid Build Coastguard Worker
24*e1eccf28SAndroid Build Coastguard Worker
25*e1eccf28SAndroid Build Coastguard Worker class RsdCpuScriptIntrinsicLUT : public RsdCpuScriptIntrinsic {
26*e1eccf28SAndroid Build Coastguard Worker public:
27*e1eccf28SAndroid Build Coastguard Worker void populateScript(Script *) override;
28*e1eccf28SAndroid Build Coastguard Worker void invokeFreeChildren() override;
29*e1eccf28SAndroid Build Coastguard Worker
30*e1eccf28SAndroid Build Coastguard Worker void setGlobalObj(uint32_t slot, ObjectBase *data) override;
31*e1eccf28SAndroid Build Coastguard Worker
32*e1eccf28SAndroid Build Coastguard Worker ~RsdCpuScriptIntrinsicLUT() override;
33*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e);
34*e1eccf28SAndroid Build Coastguard Worker
35*e1eccf28SAndroid Build Coastguard Worker protected:
36*e1eccf28SAndroid Build Coastguard Worker ObjectBaseRef<Allocation> lut;
37*e1eccf28SAndroid Build Coastguard Worker
38*e1eccf28SAndroid Build Coastguard Worker static void kernel(const RsExpandKernelDriverInfo *info,
39*e1eccf28SAndroid Build Coastguard Worker uint32_t xstart, uint32_t xend,
40*e1eccf28SAndroid Build Coastguard Worker uint32_t outstep);
41*e1eccf28SAndroid Build Coastguard Worker };
42*e1eccf28SAndroid Build Coastguard Worker
43*e1eccf28SAndroid Build Coastguard Worker
setGlobalObj(uint32_t slot,ObjectBase * data)44*e1eccf28SAndroid Build Coastguard Worker void RsdCpuScriptIntrinsicLUT::setGlobalObj(uint32_t slot, ObjectBase *data) {
45*e1eccf28SAndroid Build Coastguard Worker rsAssert(slot == 0);
46*e1eccf28SAndroid Build Coastguard Worker lut.set(static_cast<Allocation *>(data));
47*e1eccf28SAndroid Build Coastguard Worker }
48*e1eccf28SAndroid Build Coastguard Worker
49*e1eccf28SAndroid Build Coastguard Worker
kernel(const RsExpandKernelDriverInfo * info,uint32_t xstart,uint32_t xend,uint32_t outstep)50*e1eccf28SAndroid Build Coastguard Worker void RsdCpuScriptIntrinsicLUT::kernel(const RsExpandKernelDriverInfo *info,
51*e1eccf28SAndroid Build Coastguard Worker uint32_t xstart, uint32_t xend,
52*e1eccf28SAndroid Build Coastguard Worker uint32_t outstep) {
53*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptIntrinsicLUT *cp = (RsdCpuScriptIntrinsicLUT *)info->usr;
54*e1eccf28SAndroid Build Coastguard Worker
55*e1eccf28SAndroid Build Coastguard Worker uchar *out = (uchar *)info->outPtr[0];
56*e1eccf28SAndroid Build Coastguard Worker const uchar *in = (uchar *)info->inPtr[0];
57*e1eccf28SAndroid Build Coastguard Worker uint32_t x1 = xstart;
58*e1eccf28SAndroid Build Coastguard Worker uint32_t x2 = xend;
59*e1eccf28SAndroid Build Coastguard Worker
60*e1eccf28SAndroid Build Coastguard Worker const uchar *tr = (const uchar *)cp->lut->mHal.drvState.lod[0].mallocPtr;
61*e1eccf28SAndroid Build Coastguard Worker const uchar *tg = &tr[256];
62*e1eccf28SAndroid Build Coastguard Worker const uchar *tb = &tg[256];
63*e1eccf28SAndroid Build Coastguard Worker const uchar *ta = &tb[256];
64*e1eccf28SAndroid Build Coastguard Worker
65*e1eccf28SAndroid Build Coastguard Worker while (x1 < x2) {
66*e1eccf28SAndroid Build Coastguard Worker out[0] = tr[in[0]];
67*e1eccf28SAndroid Build Coastguard Worker out[1] = tg[in[1]];
68*e1eccf28SAndroid Build Coastguard Worker out[2] = tb[in[2]];
69*e1eccf28SAndroid Build Coastguard Worker out[3] = ta[in[3]];
70*e1eccf28SAndroid Build Coastguard Worker in += 4;
71*e1eccf28SAndroid Build Coastguard Worker out += 4;
72*e1eccf28SAndroid Build Coastguard Worker x1++;
73*e1eccf28SAndroid Build Coastguard Worker }
74*e1eccf28SAndroid Build Coastguard Worker }
75*e1eccf28SAndroid Build Coastguard Worker
RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl * ctx,const Script * s,const Element * e)76*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptIntrinsicLUT::RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl *ctx,
77*e1eccf28SAndroid Build Coastguard Worker const Script *s, const Element *e)
78*e1eccf28SAndroid Build Coastguard Worker : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_LUT) {
79*e1eccf28SAndroid Build Coastguard Worker
80*e1eccf28SAndroid Build Coastguard Worker mRootPtr = &kernel;
81*e1eccf28SAndroid Build Coastguard Worker }
82*e1eccf28SAndroid Build Coastguard Worker
~RsdCpuScriptIntrinsicLUT()83*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptIntrinsicLUT::~RsdCpuScriptIntrinsicLUT() {
84*e1eccf28SAndroid Build Coastguard Worker }
85*e1eccf28SAndroid Build Coastguard Worker
populateScript(Script * s)86*e1eccf28SAndroid Build Coastguard Worker void RsdCpuScriptIntrinsicLUT::populateScript(Script *s) {
87*e1eccf28SAndroid Build Coastguard Worker s->mHal.info.exportedVariableCount = 1;
88*e1eccf28SAndroid Build Coastguard Worker }
89*e1eccf28SAndroid Build Coastguard Worker
invokeFreeChildren()90*e1eccf28SAndroid Build Coastguard Worker void RsdCpuScriptIntrinsicLUT::invokeFreeChildren() {
91*e1eccf28SAndroid Build Coastguard Worker lut.clear();
92*e1eccf28SAndroid Build Coastguard Worker }
93*e1eccf28SAndroid Build Coastguard Worker
rsdIntrinsic_LUT(RsdCpuReferenceImpl * ctx,const Script * s,const Element * e)94*e1eccf28SAndroid Build Coastguard Worker RsdCpuScriptImpl * rsdIntrinsic_LUT(RsdCpuReferenceImpl *ctx,
95*e1eccf28SAndroid Build Coastguard Worker const Script *s, const Element *e) {
96*e1eccf28SAndroid Build Coastguard Worker
97*e1eccf28SAndroid Build Coastguard Worker return new RsdCpuScriptIntrinsicLUT(ctx, s, e);
98*e1eccf28SAndroid Build Coastguard Worker }
99*e1eccf28SAndroid Build Coastguard Worker
100*e1eccf28SAndroid Build Coastguard Worker } // namespace renderscript
101*e1eccf28SAndroid Build Coastguard Worker } // namespace android
102