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
21aa782376e05c47141bc3f90966d609cfc69ebc39Tim Murray#ifdef RS_COMPATIBILITY_LIB
22aa782376e05c47141bc3f90966d609cfc69ebc39Tim Murray#include "rsCompatibilityLib.h"
23aa782376e05c47141bc3f90966d609cfc69ebc39Tim Murray#endif
24aa782376e05c47141bc3f90966d609cfc69ebc39Tim Murray
256b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#ifndef RS_COMPATIBILITY_LIB
266b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#include "hardware/gralloc.h"
276b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#endif
286b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
2901f03a04da629b9a3e3ff33287dd277b12c54148Jason Samsusing namespace android;
3001f03a04da629b9a3e3ff33287dd277b12c54148Jason Samsusing namespace android::renderscript;
3101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
32709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace android {
33709a0978ae141198018ca9769f8d96292a8928e6Jason Samsnamespace renderscript {
34709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
35709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
36709a0978ae141198018ca9769f8d96292a8928e6Jason Samsclass RsdCpuScriptIntrinsicYuvToRGB : public RsdCpuScriptIntrinsic {
37709a0978ae141198018ca9769f8d96292a8928e6Jason Samspublic:
38709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void populateScript(Script *);
39709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void invokeFreeChildren();
40709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
41709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual void setGlobalObj(uint32_t slot, ObjectBase *data);
42709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
43709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    virtual ~RsdCpuScriptIntrinsicYuvToRGB();
44c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    RsdCpuScriptIntrinsicYuvToRGB(RsdCpuReferenceImpl *ctx, const Script *s, const Element *e);
45709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
46709a0978ae141198018ca9769f8d96292a8928e6Jason Samsprotected:
4701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    ObjectBaseRef<Allocation> alloc;
48709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
49709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    static void kernel(const RsForEachStubParamStruct *p,
50709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       uint32_t xstart, uint32_t xend,
51709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                       uint32_t instep, uint32_t outstep);
5201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams};
5301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
54709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
55709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
56709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
57709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
58709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::setGlobalObj(uint32_t slot, ObjectBase *data) {
5901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    rsAssert(slot == 0);
60709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    alloc.set(static_cast<Allocation *>(data));
6101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
6201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
6301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
6401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
65709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
6601f03a04da629b9a3e3ff33287dd277b12c54148Jason Samsstatic uchar4 rsYuvToRGBA_uchar4(uchar y, uchar u, uchar v) {
6701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    short Y = ((short)y) - 16;
6801f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    short U = ((short)u) - 128;
6901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    short V = ((short)v) - 128;
7001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
7101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    short4 p;
720b575de8ed0b628d84d256f5846500b0385979bdTim Murray    p.x = (Y * 298 + V * 409 + 128) >> 8;
730b575de8ed0b628d84d256f5846500b0385979bdTim Murray    p.y = (Y * 298 - U * 100 - V * 208 + 128) >> 8;
740b575de8ed0b628d84d256f5846500b0385979bdTim Murray    p.z = (Y * 298 + U * 516 + 128) >> 8;
750b575de8ed0b628d84d256f5846500b0385979bdTim Murray    p.w = 255;
760b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.x < 0) {
770b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.x = 0;
7801f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
790b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.x > 255) {
800b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.x = 255;
8101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
820b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.y < 0) {
830b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.y = 0;
8401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
850b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.y > 255) {
860b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.y = 255;
8701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
880b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.z < 0) {
890b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.z = 0;
9001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
910b575de8ed0b628d84d256f5846500b0385979bdTim Murray    if(p.z > 255) {
920b575de8ed0b628d84d256f5846500b0385979bdTim Murray        p.z = 255;
9301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
9401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
950b575de8ed0b628d84d256f5846500b0385979bdTim Murray    return (uchar4){p.x, p.y, p.z, p.w};
9601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
9701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
98915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams
99915aa964a1a312f5e06c115112a3aea14fd31b33Jason Samsstatic short YuvCoeff[] = {
100915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    298, 409, -100, 516,   -208, 255, 0, 0,
101915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    16, 16, 16, 16,        16, 16, 16, 16,
102915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    128, 128, 128, 128, 128, 128, 128, 128,
103915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    298, 298, 298, 298, 298, 298, 298, 298,
104915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams    255, 255, 255, 255, 255, 255, 255, 255
105915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams
106915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams
107915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams};
108915aa964a1a312f5e06c115112a3aea14fd31b33Jason Sams
109915aa964a1a312f5e06c115112a3aea14fd31b33Jason Samsextern "C" void rsdIntrinsicYuv_K(void *dst, const uchar *Y, const uchar *uv, uint32_t count, const short *param);
11061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Samsextern "C" void rsdIntrinsicYuvR_K(void *dst, const uchar *Y, const uchar *uv, uint32_t count, const short *param);
1116b58909686d7e439dac6dbb48c7e2236cd33c68dJason Samsextern "C" void rsdIntrinsicYuv2_K(void *dst, const uchar *Y, const uchar *u, const uchar *v, uint32_t count, const short *param);
11201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
113709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::kernel(const RsForEachStubParamStruct *p,
114709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                           uint32_t xstart, uint32_t xend,
115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                           uint32_t instep, uint32_t outstep) {
116709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptIntrinsicYuvToRGB *cp = (RsdCpuScriptIntrinsicYuvToRGB *)p->usr;
117b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams    if (!cp->alloc.get()) {
118b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams        ALOGE("YuvToRGB executed without input, skipping");
119b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams        return;
120b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams    }
121bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    const uchar *pinY = (const uchar *)cp->alloc->mHal.drvState.lod[0].mallocPtr;
122e99f3e21a0d88ca59eb9281699e8212a3a4205a3Jason Sams    if (pinY == NULL) {
123e99f3e21a0d88ca59eb9281699e8212a3a4205a3Jason Sams        ALOGE("YuvToRGB executed without data, skipping");
124e99f3e21a0d88ca59eb9281699e8212a3a4205a3Jason Sams        return;
125e99f3e21a0d88ca59eb9281699e8212a3a4205a3Jason Sams    }
126606e50048307530335b0885364ba888da436229bTim Murray
127606e50048307530335b0885364ba888da436229bTim Murray    size_t strideY = cp->alloc->mHal.drvState.lod[0].stride;
128606e50048307530335b0885364ba888da436229bTim Murray
129606e50048307530335b0885364ba888da436229bTim Murray    // calculate correct stride in legacy case
130606e50048307530335b0885364ba888da436229bTim Murray    if (cp->alloc->mHal.drvState.lod[0].dimY == 0) {
131606e50048307530335b0885364ba888da436229bTim Murray        strideY = p->dimX;
132606e50048307530335b0885364ba888da436229bTim Murray    }
133bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    const uchar *Y = pinY + (p->y * strideY);
13401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
13501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uchar4 *out = (uchar4 *)p->out;
13601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uint32_t x1 = xstart;
13701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uint32_t x2 = xend;
13801f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
1390052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    size_t cstep = cp->alloc->mHal.drvState.yuv.step;
14006bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams
14161656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const uchar *pinU = (const uchar *)cp->alloc->mHal.drvState.lod[1].mallocPtr;
14261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t strideU = cp->alloc->mHal.drvState.lod[1].stride;
14361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const uchar *u = pinU + ((p->y >> 1) * strideU);
1446b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
14561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const uchar *pinV = (const uchar *)cp->alloc->mHal.drvState.lod[2].mallocPtr;
14661656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const size_t strideV = cp->alloc->mHal.drvState.lod[2].stride;
14761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    const uchar *v = pinV + ((p->y >> 1) * strideV);
14861656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
1490052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    //ALOGE("pinY, %p, Y, %p, p->y, %d, strideY, %d", pinY, Y, p->y, strideY);
1500052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    //ALOGE("pinU, %p, U, %p, p->y, %d, strideU, %d", pinU, u, p->y, strideU);
1510052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    //ALOGE("pinV, %p, V, %p, p->y, %d, strideV, %d", pinV, v, p->y, strideV);
1520052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    //ALOGE("dimX, %d, dimY, %d", cp->alloc->mHal.drvState.lod[0].dimX, cp->alloc->mHal.drvState.lod[0].dimY);
1530052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams    //ALOGE("p->dimX, %d, p->dimY, %d", p->dimX, p->dimY);
1540052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams
15561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    if (pinU == NULL) {
15661656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams        // Legacy yuv support didn't fill in uv
15761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams        v = ((uint8_t *)cp->alloc->mHal.drvState.lod[0].mallocPtr) +
15861656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            (strideY * p->dimY) +
15961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            ((p->y >> 1) * strideY);
16061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams        u = v + 1;
1610052f8dcb5ebb5c9205a1d25445629fb5a772380Jason Sams        cstep = 2;
16261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    }
16361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
16461656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams#if defined(ARCH_ARM_HAVE_VFP)
16561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    if((x2 > x1) && gArchUseSIMD) {
1664a1495f3404b939459aa817f06ea9325ca1a4625Jason Sams        // The neon paths may over-read by up to 8 bytes
1674a1495f3404b939459aa817f06ea9325ca1a4625Jason Sams        int32_t len = (x2 - x1 - 8) >> 3;
16861656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams        if(len > 0) {
16961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            if (cstep == 1) {
17061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                rsdIntrinsicYuv2_K(out, Y, u, v, len, YuvCoeff);
17161656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                x1 += len << 3;
17261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                out += len << 3;
17361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            } else if (cstep == 2) {
17461656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                // Check for proper interleave
17561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                intptr_t ipu = (intptr_t)u;
17661656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                intptr_t ipv = (intptr_t)v;
17761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
17861656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                if (ipu == (ipv + 1)) {
17961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                    rsdIntrinsicYuv_K(out, Y, v, len, YuvCoeff);
18061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                    x1 += len << 3;
18161656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                    out += len << 3;
18261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                } else if (ipu == (ipv - 1)) {
18361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                    rsdIntrinsicYuvR_K(out, Y, u, len, YuvCoeff);
18461656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                    x1 += len << 3;
18561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams                    out += len << 3;
1866b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
18761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
1886b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            }
18901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams        }
19061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    }
1916b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#endif
19261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams
19361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams    if(x2 > x1) {
19461656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams       // ALOGE("y %i  %i  %i", p->y, x1, x2);
19561656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams        while(x1 < x2) {
19661656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            int cx = (x1 >> 1) * cstep;
19761656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            *out = rsYuvToRGBA_uchar4(Y[x1], u[cx], v[cx]);
19861656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            out++;
19961656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            x1++;
20061656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            *out = rsYuvToRGBA_uchar4(Y[x1], u[cx], v[cx]);
20161656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            out++;
20261656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams            x1++;
20361656a7c6fc13421679d0a1cdf8b5b861e286892Jason Sams        }
20401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
2056b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
20601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
20701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
208709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicYuvToRGB::RsdCpuScriptIntrinsicYuvToRGB(
209c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            RsdCpuReferenceImpl *ctx, const Script *s, const Element *e)
210c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_YUV_TO_RGB) {
211709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
212709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootPtr = &kernel;
213709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
214709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
215709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicYuvToRGB::~RsdCpuScriptIntrinsicYuvToRGB() {
216709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
217709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
218709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::populateScript(Script *s) {
219709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.info.exportedVariableCount = 1;
220709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
221709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
222709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::invokeFreeChildren() {
223709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    alloc.clear();
224709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
225709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
22601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
227c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_YuvToRGB(RsdCpuReferenceImpl *ctx,
228c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                         const Script *s, const Element *e) {
229c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    return new RsdCpuScriptIntrinsicYuvToRGB(ctx, s, e);
23001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
23101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
23201f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
233