rsCpuIntrinsicYuvToRGB.cpp revision aa782376e05c47141bc3f90966d609cfc69ebc39
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);
1106b58909686d7e439dac6dbb48c7e2236cd33c68dJason Samsextern "C" void rsdIntrinsicYuv2_K(void *dst, const uchar *Y, const uchar *u, const uchar *v, uint32_t count, const short *param);
11101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
112709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::kernel(const RsForEachStubParamStruct *p,
113709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                           uint32_t xstart, uint32_t xend,
114709a0978ae141198018ca9769f8d96292a8928e6Jason Sams                                           uint32_t instep, uint32_t outstep) {
115709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    RsdCpuScriptIntrinsicYuvToRGB *cp = (RsdCpuScriptIntrinsicYuvToRGB *)p->usr;
116b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams    if (!cp->alloc.get()) {
117b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams        ALOGE("YuvToRGB executed without input, skipping");
118b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams        return;
119b801b949e286275b5d19a33135235ba68d3a19a9Jason Sams    }
120bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    const uchar *pinY = (const uchar *)cp->alloc->mHal.drvState.lod[0].mallocPtr;
121606e50048307530335b0885364ba888da436229bTim Murray
122606e50048307530335b0885364ba888da436229bTim Murray    size_t strideY = cp->alloc->mHal.drvState.lod[0].stride;
123606e50048307530335b0885364ba888da436229bTim Murray
124606e50048307530335b0885364ba888da436229bTim Murray    // calculate correct stride in legacy case
125606e50048307530335b0885364ba888da436229bTim Murray    if (cp->alloc->mHal.drvState.lod[0].dimY == 0) {
126606e50048307530335b0885364ba888da436229bTim Murray        strideY = p->dimX;
127606e50048307530335b0885364ba888da436229bTim Murray    }
128bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams    const uchar *Y = pinY + (p->y * strideY);
12901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
130606e50048307530335b0885364ba888da436229bTim Murray    //    ALOGE("pinY, %p, Y, %p, p->y, %d, strideY, %d", pinY, Y, p->y, strideY);
131606e50048307530335b0885364ba888da436229bTim Murray    //    ALOGE("dimX, %d, dimY, %d", cp->alloc->mHal.drvState.lod[0].dimX, cp->alloc->mHal.drvState.lod[0].dimY);
132606e50048307530335b0885364ba888da436229bTim Murray    //    ALOGE("p->dimX, %d, p->dimY, %d", p->dimX, p->dimY);
133606e50048307530335b0885364ba888da436229bTim Murray
13401f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uchar4 *out = (uchar4 *)p->out;
13501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uint32_t x1 = xstart;
13601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    uint32_t x2 = xend;
13701f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
1386b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    switch (cp->alloc->mHal.state.yuv) {
1396b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    // In API 17 there was no yuv format and the intrinsic treated everything as NV21
1406b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    case 0:
141aa782376e05c47141bc3f90966d609cfc69ebc39Tim Murray#if !defined(RS_SERVER)
1426b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    case HAL_PIXEL_FORMAT_YCrCb_420_SP:  // NV21
14301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams#endif
1446b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        {
1456b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *pinUV = (const uchar *)cp->alloc->mHal.drvState.lod[1].mallocPtr;
146606e50048307530335b0885364ba888da436229bTim Murray            size_t strideUV = cp->alloc->mHal.drvState.lod[1].stride;
1476b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *uv = pinUV + ((p->y >> 1) * strideUV);
1486b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
14906bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams            if (pinUV == NULL) {
15006bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams                // Legacy yuv support didn't fill in uv
151606e50048307530335b0885364ba888da436229bTim Murray                strideUV = strideY;
15206bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams                uv = ((uint8_t *)cp->alloc->mHal.drvState.lod[0].mallocPtr) +
153606e50048307530335b0885364ba888da436229bTim Murray                    (strideY * p->dimY) +
154606e50048307530335b0885364ba888da436229bTim Murray                    ((p->y >> 1) * strideUV);
15506bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams            }
15606bd91ecb6ba59c5c19b2ad1325b30bd9344832dJason Sams
1576b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            if(x2 > x1) {
158f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                if (gArchUseSIMD) {
159f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams            #if defined(ARCH_ARM_HAVE_VFP)
160f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                    int32_t len = (x2 - x1 - 1) >> 3;
161f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                    if(len > 0) {
162f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                        //                    ALOGE("%p, %p, %p, %d, %p", out, Y, uv, len, YuvCoeff);
163f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                        rsdIntrinsicYuv_K(out, Y, uv, len, YuvCoeff);
164f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                        x1 += len << 3;
165f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                        out += len << 3;
166f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                    }
167f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams            #endif
1686b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
1696b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
1706b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams               // ALOGE("y %i  %i  %i", p->y, x1, x2);
1716b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                while(x1 < x2) {
1726b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    uchar u = uv[(x1 & 0xffffe) + 1];
1736b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    uchar v = uv[(x1 & 0xffffe) + 0];
1746b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    *out = rsYuvToRGBA_uchar4(Y[x1], u, v);
1756b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out++;
1766b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1++;
1776b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    *out = rsYuvToRGBA_uchar4(Y[x1], u, v);
1786b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out++;
1796b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1++;
1806b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
1816b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            }
1826b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        }
1836b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        break;
1846b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
185aa782376e05c47141bc3f90966d609cfc69ebc39Tim Murray#if !defined(RS_SERVER)
1866b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams    case HAL_PIXEL_FORMAT_YV12:
1876b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        {
1886b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *pinU = (const uchar *)cp->alloc->mHal.drvState.lod[1].mallocPtr;
1896b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const size_t strideU = cp->alloc->mHal.drvState.lod[1].stride;
1906b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *u = pinU + ((p->y >> 1) * strideU);
1916b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
1926b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *pinV = (const uchar *)cp->alloc->mHal.drvState.lod[2].mallocPtr;
1936b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const size_t strideV = cp->alloc->mHal.drvState.lod[2].stride;
1946b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            const uchar *v = pinV + ((p->y >> 1) * strideV);
1956b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
1966b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            if(x2 > x1) {
197f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams        #if defined(ARCH_ARM_HAVE_VFP)
198f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                if (gArchUseSIMD) {
199f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                    int32_t len = (x2 - x1 - 1) >> 3;
200f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                    if(len > 0) {
201f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                        rsdIntrinsicYuv2_K(out, Y, u, v, len, YuvCoeff);
202f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                        x1 += len << 3;
203f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                        out += len << 3;
204f5ef8df639ba6363aa5d546e57ce872d04144cb6Jason Sams                    }
2056b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
2066b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        #endif
2076b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
2086b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams               // ALOGE("y %i  %i  %i", p->y, x1, x2);
2096b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                while(x1 < x2) {
2106b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    uchar ut = u[x1];
2116b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    uchar vt = v[x1];
2126b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    *out = rsYuvToRGBA_uchar4(Y[x1], ut, vt);
2136b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out++;
2146b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1++;
2156b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    *out = rsYuvToRGBA_uchar4(Y[x1], ut, vt);
2166b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    out++;
2176b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                    x1++;
2186b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams                }
2196b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams            }
22001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams        }
2216b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams        break;
2226b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams#endif
22301f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams    }
2246b58909686d7e439dac6dbb48c7e2236cd33c68dJason Sams
22501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
22601f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
227709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicYuvToRGB::RsdCpuScriptIntrinsicYuvToRGB(
228c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            RsdCpuReferenceImpl *ctx, const Script *s, const Element *e)
229c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams            : RsdCpuScriptIntrinsic(ctx, s, e, RS_SCRIPT_INTRINSIC_ID_YUV_TO_RGB) {
230709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
231709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    mRootPtr = &kernel;
232709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
233709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
234709a0978ae141198018ca9769f8d96292a8928e6Jason SamsRsdCpuScriptIntrinsicYuvToRGB::~RsdCpuScriptIntrinsicYuvToRGB() {
235709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
236709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
237709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::populateScript(Script *s) {
238709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    s->mHal.info.exportedVariableCount = 1;
239709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
240709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
241709a0978ae141198018ca9769f8d96292a8928e6Jason Samsvoid RsdCpuScriptIntrinsicYuvToRGB::invokeFreeChildren() {
242709a0978ae141198018ca9769f8d96292a8928e6Jason Sams    alloc.clear();
243709a0978ae141198018ca9769f8d96292a8928e6Jason Sams}
244709a0978ae141198018ca9769f8d96292a8928e6Jason Sams
24501f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
246c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason SamsRsdCpuScriptImpl * rsdIntrinsic_YuvToRGB(RsdCpuReferenceImpl *ctx,
247c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams                                         const Script *s, const Element *e) {
248c905efd76fdcc1b8846b229bf7d991d185a7b4b7Jason Sams    return new RsdCpuScriptIntrinsicYuvToRGB(ctx, s, e);
24901f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams}
25001f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
25101f03a04da629b9a3e3ff33287dd277b12c54148Jason Sams
252