Home | History | Annotate | Download | only in cpu_ref
      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