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 virtual void populateScript(Script *); 31 virtual void invokeFreeChildren(); 32 33 virtual void setGlobalObj(uint32_t slot, ObjectBase *data); 34 35 virtual ~RsdCpuScriptIntrinsicLUT(); 36 RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e); 37 38 protected: 39 ObjectBaseRef<Allocation> lut; 40 41 static void kernel(const RsForEachStubParamStruct *p, 42 uint32_t xstart, uint32_t xend, 43 uint32_t instep, 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 RsForEachStubParamStruct *p, 57 uint32_t xstart, uint32_t xend, 58 uint32_t instep, uint32_t outstep) { 59 RsdCpuScriptIntrinsicLUT *cp = (RsdCpuScriptIntrinsicLUT *)p->usr; 60 61 uchar4 *out = (uchar4 *)p->out; 62 uchar4 *in = (uchar4 *)p->in; 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 uchar4 p = *in; 73 uchar4 o = {tr[p.x], tg[p.y], tb[p.z], ta[p.w]}; 74 *out = o; 75 in++; 76 out++; 77 x1++; 78 } 79 } 80 81 RsdCpuScriptIntrinsicLUT::RsdCpuScriptIntrinsicLUT(RsdCpuReferenceImpl *ctx, 82 const Script *s, const Element *e) 83 : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_LUT) { 84 85 mRootPtr = &kernel; 86 } 87 88 RsdCpuScriptIntrinsicLUT::~RsdCpuScriptIntrinsicLUT() { 89 } 90 91 void RsdCpuScriptIntrinsicLUT::populateScript(Script *s) { 92 s->mHal.info.exportedVariableCount = 1; 93 } 94 95 void RsdCpuScriptIntrinsicLUT::invokeFreeChildren() { 96 lut.clear(); 97 } 98 99 100 RsdCpuScriptImpl * rsdIntrinsic_LUT(RsdCpuReferenceImpl *ctx, 101 const Script *s, const Element *e) { 102 103 return new RsdCpuScriptIntrinsicLUT(ctx, s, e); 104 } 105 106 107