101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams/*
2bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams * Copyright (C) 2013 The Android Open Source Project
301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams *
401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams * you may not use this file except in compliance with the License.
601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams * You may obtain a copy of the License at
701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams *
801f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams *
1001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams * Unless required by applicable law or agreed to in writing, software
1101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams * See the License for the specific language governing permissions and
1401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams * limitations under the License.
1501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams */
1601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
1701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
18709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsic.h"
19709a0978ae141198018ca9769f8d96292a8928e6Jason Sams#include "rsCpuIntrinsicInlines.h"
2001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
216b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#ifndef RS_COMPATIBILITY_LIB
226b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#include "hardware/gralloc.h"
236b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#endif
246b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
2501f03a04da629b9a3e3ff33287dd277b12c54148Jason Samsusing namespace android;
2601f03a04da629b9a3e3ff33287dd277b12c54148Jason Samsusing namespace android::renderscript;
2701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
28709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android {
29709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript {
30709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
31709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
32709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptIntrinsicYuvToRGB : public RsdCpuScriptIntrinsic {
33709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic:
34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void populateScript(Script *);
35709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void invokeFreeChildren();
36709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
37709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void setGlobalObj(uint32_t slot, ObjectBase *data);
38709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
39709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual ~RsdCpuScriptIntrinsicYuvToRGB();
40c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    RsdCpuScriptIntrinsicYuvToRGB(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e);
41709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
42709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected:
4301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    ObjectBaseRef<Allocation> alloc;
44709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    static void kernel(const RsForEachStubParamStruct *p,
46709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       uint32_t xstart, uint32_t xend,
47709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       uint32_t instep, uint32_t outstep);
4801f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams};
4901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
50709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
52709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
53709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
54709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::setGlobalObj(uint32_t slot, ObjectBase *data) {
5501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    rsAssert(slot == 0);
56709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    alloc.set(static_cast<Allocation *>(data));
5701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
5801f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
5901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
6001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
61709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
6201f03a04da629b9a3e3ff33287dd277b12c54148Jason Samsstatic uchar4 rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v) {
6301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    short Y = ((short)y) - 16;
6401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    short U = ((short)u) - 128;
6501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    short V = ((short)v) - 128;
6601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
6701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    short4 p;
680b575de8ed0b628d84d256f5846500b0385979bdTim Murray    p.x = (Y * 298 + V * 409 + 128) >> 8;
690b575de8ed0b628d84d256f5846500b0385979bdTim Murray    p.y = (Y * 298 - U * 100 - V * 208 + 128) >> 8;
700b575de8ed0b628d84d256f5846500b0385979bdTim Murray    p.z = (Y * 298 + U * 516 + 128) >> 8;
710b575de8ed0b628d84d256f5846500b0385979bdTim Murray    p.w = 255;
720b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.x < 0) {
730b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.x = 0;
7401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
750b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.x > 255) {
760b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.x = 255;
7701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
780b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.y < 0) {
790b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.y = 0;
8001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
810b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.y > 255) {
820b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.y = 255;
8301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
840b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.z < 0) {
850b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.z = 0;
8601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
870b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.z > 255) {
880b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.z = 255;
8901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
9001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
910b575de8ed0b628d84d256f5846500b0385979bdTim Murray    return (uchar4){p.x, p.y, p.z, p.w};
9201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
9301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
94915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams
95915aa964a1a312f5e06c115112a3aea14fd31b33Jason Samsstatic short YuvCoeff[] = {
96915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    298, 409, -100, 516,   -208, 255, 0, 0,
97915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    16, 16, 16, 16,        16, 16, 16, 16,
98915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    128, 128, 128, 128, 128, 128, 128, 128,
99915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    298, 298, 298, 298, 298, 298, 298, 298,
100915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    255, 255, 255, 255, 255, 255, 255, 255
101915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams
102915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams
103915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams};
104915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams
105915aa964a1a312f5e06c115112a3aea14fd31b33Jason Samsextern "C" void rsdIntrinsicYuv_K(void *dst, const uchar *Y, const uchar *uv, uint32_t count, const short *param);
1066b58909686d7e439dac6dbb48c7e2236cd33c68dJason Samsextern "C" void rsdIntrinsicYuv2_K(void *dst, const uchar *Y, const uchar *u, const uchar *v, uint32_t count, const short *param);
10701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
108709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::kernel(const RsForEachStubParamStruct *p,
109709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                           uint32_t xstart, uint32_t xend,
110709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                           uint32_t instep, uint32_t outstep) {
111709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptIntrinsicYuvToRGB *cp = (RsdCpuScriptIntrinsicYuvToRGB *)p->usr;
112b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams    if (!cp->alloc.get()) {
113b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams        ALOGE("YuvToRGB executed without input, skipping");
114b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams        return;
115b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams    }
116bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    const uchar *pinY = (const uchar *)cp->alloc->mHal.drvState.lod[0].mallocPtr;
117606e50048307530335b0885364ba888da436229bTim Murray
118606e50048307530335b0885364ba888da436229bTim Murray    size_t strideY = cp->alloc->mHal.drvState.lod[0].stride;
119606e50048307530335b0885364ba888da436229bTim Murray
120606e50048307530335b0885364ba888da436229bTim Murray    // calculate correct stride in legacy case
121606e50048307530335b0885364ba888da436229bTim Murray    if (cp->alloc->mHal.drvState.lod[0].dimY == 0) {
122606e50048307530335b0885364ba888da436229bTim Murray        strideY = p->dimX;
123606e50048307530335b0885364ba888da436229bTim Murray    }
124bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    const uchar *Y = pinY + (p->y * strideY);
12501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
126606e50048307530335b0885364ba888da436229bTim Murray    //    ALOGE("pinY, %p, Y, %p, p->y, %d, strideY, %d", pinY, Y, p->y, strideY);
127606e50048307530335b0885364ba888da436229bTim Murray    //    ALOGE("dimX, %d, dimY, %d", cp->alloc->mHal.drvState.lod[0].dimX, cp->alloc->mHal.drvState.lod[0].dimY);
128606e50048307530335b0885364ba888da436229bTim Murray    //    ALOGE("p->dimX, %d, p->dimY, %d", p->dimX, p->dimY);
129606e50048307530335b0885364ba888da436229bTim Murray
13001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uchar4 *out = (uchar4 *)p->out;
13101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uint32_t x1 = xstart;
13201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uint32_t x2 = xend;
13301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
1346b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    switch (cp->alloc->mHal.state.yuv) {
1356b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    // In API 17 there was no yuv format and the intrinsic treated everything as NV21
1366b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    case 0:
1376b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB)
1386b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    case HAL_PIXEL_FORMAT_YCrCb_420_SP:  // NV21
13901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams#endif
1406b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        {
1416b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *pinUV = (const uchar *)cp->alloc->mHal.drvState.lod[1].mallocPtr;
142606e50048307530335b0885364ba888da436229bTim Murray            size_t strideUV = cp->alloc->mHal.drvState.lod[1].stride;
1436b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *uv = pinUV + ((p->y >> 1) * strideUV);
1446b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
14506bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams            if (pinUV == NULL) {
14606bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams                // Legacy yuv support didn't fill in uv
147606e50048307530335b0885364ba888da436229bTim Murray                strideUV = strideY;
14806bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams                uv = ((uint8_t *)cp->alloc->mHal.drvState.lod[0].mallocPtr) +
149606e50048307530335b0885364ba888da436229bTim Murray                    (strideY * p->dimY) +
150606e50048307530335b0885364ba888da436229bTim Murray                    ((p->y >> 1) * strideUV);
15106bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams            }
15206bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams
1536b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            if(x2 > x1) {
1546b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        #if defined(ARCH_ARM_HAVE_NEON)
1556b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                int32_t len = (x2 - x1 - 1) >> 3;
1566b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                if(len > 0) {
157606e50048307530335b0885364ba888da436229bTim Murray                    //                    ALOGE("%p, %p, %p, %d, %p", out, Y, uv, len, YuvCoeff);
1586b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    rsdIntrinsicYuv_K(out, Y, uv, len, YuvCoeff);
1596b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1 += len << 3;
1606b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out += len << 3;
1616b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
1626b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        #endif
1636b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
1646b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams               // ALOGE("y %i  %i  %i", p->y, x1, x2);
1656b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                while(x1 < x2) {
1666b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    uchar u = uv[(x1 & 0xffffe) + 1];
1676b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    uchar v = uv[(x1 & 0xffffe) + 0];
1686b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    *out = rsYuvToRGBA_uchar4(Y[x1], u, v);
1696b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out++;
1706b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1++;
1716b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    *out = rsYuvToRGBA_uchar4(Y[x1], u, v);
1726b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out++;
1736b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1++;
1746b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
1756b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            }
1766b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        }
1776b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        break;
1786b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
1796b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB)
1806b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    case HAL_PIXEL_FORMAT_YV12:
1816b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        {
1826b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *pinU = (const uchar *)cp->alloc->mHal.drvState.lod[1].mallocPtr;
1836b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const size_t strideU = cp->alloc->mHal.drvState.lod[1].stride;
1846b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *u = pinU + ((p->y >> 1) * strideU);
1856b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
1866b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *pinV = (const uchar *)cp->alloc->mHal.drvState.lod[2].mallocPtr;
1876b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const size_t strideV = cp->alloc->mHal.drvState.lod[2].stride;
1886b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *v = pinV + ((p->y >> 1) * strideV);
1896b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
1906b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            if(x2 > x1) {
1916b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        #if defined(ARCH_ARM_HAVE_NEON)
1926b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                int32_t len = (x2 - x1 - 1) >> 3;
1936b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                if(len > 0) {
1946b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    rsdIntrinsicYuv2_K(out, Y, u, v, len, YuvCoeff);
1956b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1 += len << 3;
1966b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out += len << 3;
1976b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
1986b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        #endif
1996b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
2006b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams               // ALOGE("y %i  %i  %i", p->y, x1, x2);
2016b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                while(x1 < x2) {
2026b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    uchar ut = u[x1];
2036b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    uchar vt = v[x1];
2046b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    *out = rsYuvToRGBA_uchar4(Y[x1], ut, vt);
2056b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out++;
2066b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1++;
2076b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    *out = rsYuvToRGBA_uchar4(Y[x1], ut, vt);
2086b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out++;
2096b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1++;
2106b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
2116b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            }
21201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams        }
2136b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        break;
2146b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#endif
21501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
2166b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
21701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
21801f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
219709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicYuvToRGB::RsdCpuScriptIntrinsicYuvToRGB(
220c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            RsdCpuReferenceImpl *ctx, const Script *s, const Element *e)
221c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_YUV_TO_RGB) {
222709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
223709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootPtr = &kernel;
224709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
225709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
226709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicYuvToRGB::~RsdCpuScriptIntrinsicYuvToRGB() {
227709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
228709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
229709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::populateScript(Script *s) {
230709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.info.exportedVariableCount = 1;
231709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
232709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
233709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::invokeFreeChildren() {
234709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    alloc.clear();
235709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
236709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
23701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
238c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_YuvToRGB(RsdCpuReferenceImpl *ctx,
239c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                         const Script *s, const Element *e) {
240c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    return new RsdCpuScriptIntrinsicYuvToRGB(ctx, s, e);
24101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
24201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
24301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
244