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 Samsnamespace android {
22709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript {
23709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
24709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
25709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptIntrinsicLUT : public RsdCpuScriptIntrinsic {
26709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic:
27c060f1435e7b9405f3be8974417fa6f410f03753Stephen Hines    void populateScript(Script *) override;
28c060f1435e7b9405f3be8974417fa6f410f03753Stephen Hines    void invokeFreeChildren() override;
29709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
30c060f1435e7b9405f3be8974417fa6f410f03753Stephen Hines    void setGlobalObj(uint32_t slot, ObjectBase *data) override;
31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
32c060f1435e7b9405f3be8974417fa6f410f03753Stephen Hines    ~RsdCpuScriptIntrinsicLUT() override;
33c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e);
34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
35709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected:
36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    ObjectBaseRef<Allocation> lut;
37709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
38b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    static void kernel(const RsExpandKernelDriverInfo *info,
39709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       uint32_t xstart, uint32_t xend,
409ed79105cc6a8dbfaf959875249f36022cc2c798Chris Wailes                       uint32_t outstep);
41709a0978ae141198018ca9769f8d96292a8928e6Jason Sams};
42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
44709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicLUT::setGlobalObj(uint32_t slot, ObjectBase *data) {
45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    rsAssert(slot == 0);
46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    lut.set(static_cast<Allocation *>(data));
47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
49709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
50b0abb140ac51b93d1a85aadaa63fe057f2d29850David Grossvoid RsdCpuScriptIntrinsicLUT::kernel(const RsExpandKernelDriverInfo *info,
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                      uint32_t xstart, uint32_t xend,
529ed79105cc6a8dbfaf959875249f36022cc2c798Chris Wailes                                      uint32_t outstep) {
53b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    RsdCpuScriptIntrinsicLUT *cp = (RsdCpuScriptIntrinsicLUT *)info->usr;
54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
55b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    uchar *out = (uchar *)info->outPtr[0];
56b0abb140ac51b93d1a85aadaa63fe057f2d29850David Gross    const uchar *in = (uchar *)info->inPtr[0];
57709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t x1 = xstart;
58709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    uint32_t x2 = xend;
59709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const uchar *tr = (const uchar *)cp->lut->mHal.drvState.lod[0].mallocPtr;
61709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const uchar *tg = &tr[256];
62709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const uchar *tb = &tg[256];
63709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    const uchar *ta = &tb[256];
64709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    while (x1 < x2) {
66ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out[0] = tr[in[0]];
67ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out[1] = tg[in[1]];
68ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out[2] = tb[in[2]];
69ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out[3] = ta[in[3]];
70ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        in += 4;
71ed157c86dca0f671ea11d57a1b884cd15f76cdb2Jason Sams        out += 4;
72709a0978ae141198018ca9769f8d96292a8928e6Jason Sams        x1++;
73709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    }
74709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
75709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
76c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptIntrinsicLUT::RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl *ctx,
77c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                                   const Script *s, const Element *e)
78c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_LUT) {
79709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
80709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootPtr = &kernel;
81709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
82709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
83709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicLUT::~RsdCpuScriptIntrinsicLUT() {
84709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
85709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
86709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicLUT::populateScript(Script *s) {
87709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.info.exportedVariableCount = 1;
88709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
89709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
90709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicLUT::invokeFreeChildren() {
91709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    lut.clear();
92709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
93709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
94c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_LUT(RsdCpuReferenceImpl *ctx,
95c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                    const Script *s, const Element *e) {
96709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
97c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    return new RsdCpuScriptIntrinsicLUT(ctx, s, e);
98709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
99462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsieh
100462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsieh} // namespace renderscript
101462de21ac2e1773b99aedee012adb374e476ae36Chih-Hung Hsieh} // namespace android
102