1709a0978ae141198018ca9769f8d96292a8928e6Jason Sams/*
2709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Copyright (C) 2012 The Android Open Source Project
3709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
4709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * you may not use this file except in compliance with the License.
6709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * You may obtain a copy of the License at
7709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
8709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9709a0978ae141198018ca9769f8d96292a8928e6Jason Sams *
10709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * Unless required by applicable law or agreed to in writing, software
11709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * See the License for the specific language governing permissions and
14709a0978ae141198018ca9769f8d96292a8928e6Jason Sams * limitations under the License.
15709a0978ae141198018ca9769f8d96292a8928e6Jason Sams */
16709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
17709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsic.h"
19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsicInlines.h"
20709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
21709a0978ae141198018ca9769f8d96292a8928e6Jason Samsusing namespace android;
22709a0978ae141198018ca9769f8d96292a8928e6Jason Samsusing namespace android::renderscript;
23709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
24709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android {
25709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript {
26709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
27709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
28709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptIntrinsicLUT : public RsdCpuScriptIntrinsic {
29709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic:
30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void populateScript(Script *);
31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void invokeFreeChildren();
32709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
33709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void setGlobalObj(uint32_t slot, ObjectBase *data);
34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
35709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual ~RsdCpuScriptIntrinsicLUT();
36c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e);
37709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
38709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected:
39709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ObjectBaseRef<Allocation> lut;
40709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
41709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    static void kernel(const RsForEachStubParamStruct *p,
42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       uint32_t xstart, uint32_t xend,
43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       uint32_t instep, uint32_t outstep);
44709a0978ae141198018ca9769f8d96292a8928e6Jason Sams};
45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
49709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
50709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicLUT::setGlobalObj(uint32_t slot, ObjectBase *data) {
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(slot == 0);
52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    lut.set(static_cast<Allocation *>(data));
53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
55709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
56709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicLUT::kernel(const RsForEachStubParamStruct *p,
57709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                      uint32_t xstart, uint32_t xend,
58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                      uint32_t instep, uint32_t outstep) {
59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptIntrinsicLUT *cp = (RsdCpuScriptIntrinsicLUT *)p->usr;
60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
61ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams    uchar *out = (uchar *)p->out;
62ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams    const uchar *in = (uchar *)p->in;
63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t x1 = xstart;
64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t x2 = xend;
65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
66709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const uchar *tr = (const uchar *)cp->lut->mHal.drvState.lod[0].mallocPtr;
67709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const uchar *tg = &tr[256];
68709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const uchar *tb = &tg[256];
69709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const uchar *ta = &tb[256];
70709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
71709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    while (x1 < x2) {
72ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out[0] = tr[in[0]];
73ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out[1] = tg[in[1]];
74ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out[2] = tb[in[2]];
75ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out[3] = ta[in[3]];
76ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        in += 4;
77ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out += 4;
78709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        x1++;
79709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
82c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptIntrinsicLUT::RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl *ctx,
83c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                                   const Script *s, const Element *e)
84c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_LUT) {
85709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
86709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootPtr = &kernel;
87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
89709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicLUT::~RsdCpuScriptIntrinsicLUT() {
90709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
91709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
92709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicLUT::populateScript(Script *s) {
93709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.info.exportedVariableCount = 1;
94709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
95709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
96709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicLUT::invokeFreeChildren() {
97709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    lut.clear();
98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
99709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
100709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
101c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_LUT(RsdCpuReferenceImpl *ctx,
102c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                    const Script *s, const Element *e) {
103709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
104c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    return new RsdCpuScriptIntrinsicLUT(ctx, s, e);
105709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
106709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
107709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
108