1d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams/* 2d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Copyright (C) 2012 The Android Open Source Project 3d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * 4d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * you may not use this file except in compliance with the License. 6d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * You may obtain a copy of the License at 7d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * 8d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * 10d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * Unless required by applicable law or agreed to in writing, software 11d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * See the License for the specific language governing permissions and 14d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams * limitations under the License. 15d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams */ 16d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 17d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 18d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams#include "rsdCore.h" 19d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams#include "rsdIntrinsics.h" 20d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams#include "rsdAllocation.h" 21d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 22d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams#include "rsdIntrinsicInlines.h" 23d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 24d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsusing namespace android; 25d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsusing namespace android::renderscript; 26d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 27d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstruct ConvolveParams { 28d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams ObjectBaseRef<Allocation> lut; 29d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams}; 30d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 31d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstatic void LUT_Bind(const Context *dc, const Script *script, 32d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams void * intrinsicData, uint32_t slot, Allocation *data) { 33d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams ConvolveParams *cp = (ConvolveParams *)intrinsicData; 34d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams rsAssert(slot == 0); 35d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams cp->lut.set(data); 36d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 37d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 38d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsstatic void LUT_uchar4(const RsForEachStubParamStruct *p, 39d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uint32_t xstart, uint32_t xend, 40d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uint32_t instep, uint32_t outstep) { 41d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams ConvolveParams *cp = (ConvolveParams *)p->usr; 42d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uchar4 *out = (uchar4 *)p->out; 43d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uchar4 *in = (uchar4 *)p->in; 44d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uint32_t x1 = xstart; 45d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uint32_t x2 = xend; 46d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 47d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams DrvAllocation *din = (DrvAllocation *)cp->lut->mHal.drv; 48d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams const uchar *tr = (const uchar *)din->lod[0].mallocPtr; 49d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams const uchar *tg = &tr[256]; 50d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams const uchar *tb = &tg[256]; 51d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams const uchar *ta = &tb[256]; 52d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 53d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams while (x1 < x2) { 54d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uchar4 p = *in; 55d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams uchar4 o = {tr[p.x], tg[p.y], tb[p.z], ta[p.w]}; 56d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams *out = o; 57d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams in++; 58d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams out++; 59d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams x1++; 60d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams } 61d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 62d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 63d85e283087ecd00760a0d8d0c9d8482cda845efcJason Samsvoid * rsdIntrinsic_InitLUT(const android::renderscript::Context *dc, 64d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams android::renderscript::Script *script, 65d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams RsdIntriniscFuncs_t *funcs) { 66d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 67d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams script->mHal.info.exportedVariableCount = 1; 6878b050ea1e13108110ce3b8ead63252e5ebe2468Jason Sams funcs->setVarObj = LUT_Bind; 69d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams funcs->root = LUT_uchar4; 70d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams ConvolveParams *cp = (ConvolveParams *)calloc(1, sizeof(ConvolveParams)); 71d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams return cp; 72d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams} 73d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 74d85e283087ecd00760a0d8d0c9d8482cda845efcJason Sams 75