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