1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/*
269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams * Copyright (C) 2012 The Android Open Source Project
3221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams *
4221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * you may not use this file except in compliance with the License.
6221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * You may obtain a copy of the License at
7221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams *
8221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams *
10221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Unless required by applicable law or agreed to in writing, software
11221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * See the License for the specific language governing permissions and
14221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * limitations under the License.
15221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */
16221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
17221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <malloc.h>
18221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include <string.h>
19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
20221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h"
21eeaf7142d7e06efb3e0ddc7ef542884ab1d527dcTim Murray#include "rsCppInternal.h"
22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
23eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray// from system/graphics.h
24eb4426dfb63983559cf903b2ea984569e990c4fdTim Murrayenum {
25eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    HAL_PIXEL_FORMAT_YV12   = 0x32315659, // YCrCb 4:2:0 Planar
26eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    HAL_PIXEL_FORMAT_YCrCb_420_SP       = 0x11, // NV21
27eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray};
28eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray
2969cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android;
309eb7f4b90120ebe4be74343856e86b46495f72dfTim Murrayusing namespace RSC;
3169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::calcElementCount() {
33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    bool hasLod = hasMipmaps();
34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t x = getX();
35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t y = getY();
36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t z = getZ();
37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t faces = 1;
38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (hasFaces()) {
39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        faces = 6;
40221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
41221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (x == 0) {
42221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        x = 1;
43221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (y == 0) {
45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        y = 1;
46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (z == 0) {
48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        z = 1;
49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
51221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    uint32_t count = x * y * z * faces;
52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    while (hasLod && ((x > 1) || (y > 1) || (z > 1))) {
53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if(x > 1) {
54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            x >>= 1;
55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if(y > 1) {
57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            y >>= 1;
58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if(z > 1) {
60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            z >>= 1;
61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        count += x * y * z * faces;
64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mElementCount = count;
66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
67221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
6984bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayType::Type(void *id, sp<RS> rs) : BaseObj(id, rs) {
70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimX = 0;
71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimY = 0;
72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimZ = 0;
73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimMipmaps = false;
74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimFaces = false;
75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mElement = NULL;
76eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    mYuvFormat = RS_YUV_NONE;
77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::updateFromNative() {
80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    // We have 6 integer to obtain mDimX; mDimY; mDimZ;
81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    // mDimLOD; mDimFaces; mElement;
82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    /*
84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int[] dataBuffer = new int[6];
85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.nTypeGetNativeData(getID(), dataBuffer);
86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimX = dataBuffer[0];
88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimY = dataBuffer[1];
89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimZ = dataBuffer[2];
90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimMipmaps = dataBuffer[3] == 1 ? true : false;
91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimFaces = dataBuffer[4] == 1 ? true : false;
92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int elementID = dataBuffer[5];
94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(elementID != 0) {
95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mElement = new Element(elementID, mRS);
96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mElement.updateFromNative();
97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    calcElementCount();
99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    */
100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
10296267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murraysp<const Type> Type::create(sp<RS> rs, sp<const Element> e, uint32_t dimX, uint32_t dimY, uint32_t dimZ) {
103a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray    void * id = RS::dispatch->TypeCreate(rs->getContext(), e->getID(), dimX, dimY, dimZ, false, false, 0);
10496267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    Type *t = new Type(id, rs);
10596267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray
10696267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    t->mElement = e;
10796267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    t->mDimX = dimX;
10896267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    t->mDimY = dimY;
10996267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    t->mDimZ = dimZ;
11096267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    t->mDimMipmaps = false;
11196267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    t->mDimFaces = false;
11296267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray
11396267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    t->calcElementCount();
11496267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray
11596267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray    return t;
11696267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray}
11796267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray
11884bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayType::Builder::Builder(sp<RS> rs, sp<const Element> e) {
1197758a5b899bc8d230aff12e15c3283ea8c248609Tim Murray    mRS = rs.get();
120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mElement = e;
121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimX = 0;
122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimY = 0;
123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimZ = 0;
124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimMipmaps = false;
125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimFaces = false;
126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setX(uint32_t value) {
129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(value < 1) {
130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Values of less than 1 for Dimension X are not valid.");
131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimX = value;
133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
1357d1b757c0be2622b72b3d3a10826752adb3e5182Stephen Hinesvoid Type::Builder::setY(uint32_t value) {
136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(value < 1) {
137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Values of less than 1 for Dimension Y are not valid.");
138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimY = value;
140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
142eb4426dfb63983559cf903b2ea984569e990c4fdTim Murrayvoid Type::Builder::setZ(uint32_t value) {
143eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    if(value < 1) {
144eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        ALOGE("Values of less than 1 for Dimension Z are not valid.");
145eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    }
146eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    mDimZ = value;
147eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray}
148eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray
149eb4426dfb63983559cf903b2ea984569e990c4fdTim Murrayvoid Type::Builder::setYuvFormat(RSYuvFormat format) {
150eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    if (format != RS_YUV_NONE && !(mElement->isCompatible(Element::YUV(mRS)))) {
151eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        ALOGE("Invalid element for use with YUV.");
152eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        return;
153eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    }
154eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray
155eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    if (format >= RS_YUV_MAX) {
156eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        ALOGE("Invalid YUV format.");
157eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        return;
158eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    }
159eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    mYuvFormat = format;
160eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray}
161eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray
162eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray
163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setMipmaps(bool value) {
164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimMipmaps = value;
165221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Type::Builder::setFaces(bool value) {
168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mDimFaces = value;
169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
17169cccdf0659a193d6a75420ec745421fb5c436e6Jason Samssp<const Type> Type::Builder::create() {
172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mDimZ > 0) {
173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if ((mDimX < 1) || (mDimY < 1)) {
174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Both X and Y dimension required when Z is present.");
175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
176221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (mDimFaces) {
177221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Cube maps not supported with 3D types.");
178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
179221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mDimY > 0) {
181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (mDimX < 1) {
182221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("X dimension required when Y is present.");
183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
184221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
185221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mDimFaces) {
186221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (mDimY < 1) {
187221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Cube maps require 2D Types.");
188221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
189221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
190221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
191eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    uint32_t nativeYuv;
192eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    switch(mYuvFormat) {
193eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    case(RS_YUV_YV12):
194eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        nativeYuv = HAL_PIXEL_FORMAT_YV12;
195eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        break;
196eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    case (RS_YUV_NV21):
197eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        nativeYuv = HAL_PIXEL_FORMAT_YCrCb_420_SP;
198eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        break;
199eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    default:
200eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray        nativeYuv = 0;
201eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray    }
202eb4426dfb63983559cf903b2ea984569e990c4fdTim Murray
203a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray    void * id = RS::dispatch->TypeCreate(mRS->getContext(), mElement->getID(), mDimX, mDimY, mDimZ,
204a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray                                         mDimMipmaps, mDimFaces, 0);
205221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    Type *t = new Type(id, mRS);
206221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mElement = mElement;
207221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimX = mDimX;
208221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimY = mDimY;
209221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimZ = mDimZ;
210221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimMipmaps = mDimMipmaps;
211221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->mDimFaces = mDimFaces;
212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    t->calcElementCount();
214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return t;
215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
217