1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/*
210913a5c37ba119bef335320d3e8be25212c05adTim Murray * Copyright (C) 2013 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 "RenderScript.h"
1810913a5c37ba119bef335320d3e8be25212c05adTim Murray#include "rsCppInternal.h"
19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
20dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::Allocation;
21dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::sp;
22dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::Surface;
2309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang
24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid * Allocation::getIDSafe() const {
25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return getID();
26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
27221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid Allocation::updateCacheInfo(const sp<const Type>& t) {
29221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimX = t->getX();
30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimY = t->getY();
31221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimZ = t->getZ();
32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentCount = mCurrentDimX;
33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mCurrentDimY > 1) {
34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mCurrentCount *= mCurrentDimY;
35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mCurrentDimZ > 1) {
37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mCurrentCount *= mCurrentDimZ;
38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
40221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
4184bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayAllocation::Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage) :
42baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray    BaseObj(id, rs), mSelectedY(0), mSelectedZ(0), mSelectedLOD(0),
43baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray    mSelectedFace(RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X) {
4469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT |
46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_VERTEX |
48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS |
49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET |
50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_IO_INPUT |
5196267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray                   RS_ALLOCATION_USAGE_IO_OUTPUT |
52f82b626e0479ce4a23ebff1fc088e073dcabaa30Jason Sams                   RS_ALLOCATION_USAGE_OEM |
5396267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray                   RS_ALLOCATION_USAGE_SHARED)) != 0) {
54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Unknown usage specified.");
55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
573522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) {
58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mWriteAllowed = false;
593522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT |
60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       RS_ALLOCATION_USAGE_SCRIPT)) != 0) {
62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Invalid usage combination.");
63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = t;
67221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mUsage = usage;
68e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    mAutoPadding = false;
6944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (t != nullptr) {
70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
7289daad6bae798779e57f252e9da4fe4e62337124Tim Murray
73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
7589daad6bae798779e57f252e9da4fe4e62337124Tim Murray
76e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangvoid Allocation::validateIsInt64() {
77e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    RsDataType dt = mType->getElement()->getDataType();
78e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if ((dt == RS_TYPE_SIGNED_64) || (dt == RS_TYPE_UNSIGNED_64)) {
79e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        return;
80e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
81e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    ALOGE("64 bit integer source does not match allocation type %i", dt);
82e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
8389daad6bae798779e57f252e9da4fe4e62337124Tim Murray
84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt32() {
85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) {
87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit integer source does not match allocation type %i", dt);
90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt16() {
93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) {
95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("16 bit integer source does not match allocation type %i", dt);
98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt8() {
101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) {
103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("8 bit integer source does not match allocation type %i", dt);
106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsFloat32() {
109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (dt == RS_TYPE_FLOAT_32) {
111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit float source does not match allocation type %i", dt);
114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
116e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangvoid Allocation::validateIsFloat64() {
117e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    RsDataType dt = mType->getElement()->getDataType();
118e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (dt == RS_TYPE_FLOAT_64) {
119e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        return;
120e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
121e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    ALOGE("64 bit float source does not match allocation type %i", dt);
122e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
123e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsObject() {
125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_ELEMENT) ||
127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_TYPE) ||
128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_ALLOCATION) ||
129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SAMPLER) ||
130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SCRIPT) ||
131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_MESH) ||
132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_FRAGMENT) ||
133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_VERTEX) ||
134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_RASTER) ||
135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_STORE)) {
136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("Object source does not match allocation type %i", dt);
139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::updateFromNative() {
142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    BaseObj::updateFromNative();
143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
144a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray    const void *typeID = RS::dispatch->AllocationGetType(mRS->getContext(), getID());
14544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if(typeID != nullptr) {
14669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<Type> t = new Type((void *)typeID, mRS);
147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        t->updateFromNative();
148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mType = t;
150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::syncAll(RsAllocationUsageType srcLocation) {
154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    switch (srcLocation) {
155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_SCRIPT:
156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS:
157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE:
158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX:
15910913a5c37ba119bef335320d3e8be25212c05adTim Murray    case RS_ALLOCATION_USAGE_SHARED:
160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        break;
161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    default:
16210913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Source must be exactly one usage type.");
16310913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
16510913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation));
166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
168b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Samsvoid * Allocation::getPointer(size_t *stride) {
16944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    void *p = nullptr;
170b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams    if (!(mUsage & RS_ALLOCATION_USAGE_SHARED)) {
171b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Allocation does not support USAGE_SHARED.");
17244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
173b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams    }
174b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams
175b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams    // FIXME: decide if lack of getPointer should cause compat mode
17644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (RS::dispatch->AllocationGetPointer == nullptr) {
177b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams        mRS->throwError(RS_ERROR_RUNTIME_ERROR, "Can't use getPointer on older APIs");
17844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
179b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams    }
180b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams
181b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams    p = RS::dispatch->AllocationGetPointer(mRS->getContext(), getIDSafe(), 0,
18294280f817b502caf0b4e40cbcbe300f5178b7473Miao Wang                                           RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0, stride, sizeof(size_t));
183b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams    if (mRS->getError() != RS_SUCCESS) {
184b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams        mRS->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation lock failed");
18544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        p = nullptr;
186b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams    }
187b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams    return p;
188221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
189221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
190e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang// ---------------------------------------------------------------------------
191e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang//Functions needed for autopadding & unpadding
192e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangstatic void copyWithPadding(void* ptr, const void* srcPtr, int mSize, int count) {
193e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    int sizeBytesPad = mSize * 4;
194e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    int sizeBytes = mSize * 3;
195e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
196e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    const uint8_t *src = static_cast<const uint8_t *>(srcPtr);
197e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    for (int i = 0; i < count; i++) {
198e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        memcpy(dst, src, sizeBytes);
199e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        dst += sizeBytesPad;
200e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        src += sizeBytes;
201e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
202e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
203e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
204e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangstatic void copyWithUnPadding(void* ptr, const void* srcPtr, int mSize, int count) {
205e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    int sizeBytesPad = mSize * 4;
206e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    int sizeBytes = mSize * 3;
207e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    uint8_t *dst = static_cast<uint8_t *>(ptr);
208e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    const uint8_t *src = static_cast<const uint8_t *>(srcPtr);
209e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    for (int i = 0; i < count; i++) {
210e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        memcpy(dst, src, sizeBytes);
211e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        dst += sizeBytes;
212e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        src += sizeBytesPad;
213e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
214e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
215e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang// ---------------------------------------------------------------------------
216e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang
2170b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const void *data) {
21869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(count < 1) {
22010913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1.");
221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
223221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if((off + count) > mCurrentCount) {
224e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray        ALOGE("Overflow, Available count %u, got %zu at offset %u.", mCurrentCount, count, off);
22510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified");
226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
228e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
229e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        size_t eSize = mType->getElement()->getSizeBytes();
230e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        void *ptr = malloc(eSize * count);
231e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        copyWithPadding(ptr, data, eSize / 4, count);
232e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
233e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        count, ptr, count * mType->getElement()->getSizeBytes()));
234e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        free(ptr);
235e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    } else {
236e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
237e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        count, data, count * mType->getElement()->getSizeBytes()));
238e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
239221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
240221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2410b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeTo(uint32_t off, size_t count, void *data) {
242509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if(count < 1) {
24310913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1.");
244509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
245509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
246509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if((off + count) > mCurrentCount) {
247e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray        ALOGE("Overflow, Available count %u, got %zu at offset %u.", mCurrentCount, count, off);
24810913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified");
249509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
250509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
251e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
252e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        size_t eSize = mType->getElement()->getSizeBytes();
253e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        void *ptr = malloc(eSize * count);
254e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
255e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        count, ptr, count * mType->getElement()->getSizeBytes()));
256e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        copyWithUnPadding(data, ptr, eSize / 4, count);
257e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        free(ptr);
258e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    } else {
259e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
260e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        count, data, count * mType->getElement()->getSizeBytes()));
261e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
262509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray}
263509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
26445768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const sp<const Allocation>& data,
265a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray                                 uint32_t dataOff) {
26669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
26710913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0,
26810913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         mSelectedLOD, mSelectedFace,
26910913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         count, 1, data->getIDSafe(), dataOff, 0,
27010913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         data->mSelectedLOD, data->mSelectedFace));
271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2730b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DFrom(const void* data) {
2740b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    copy1DRangeFrom(0, mCurrentCount, data);
2750b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray}
2760b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
2770b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DTo(void* data) {
2780b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    copy1DRangeTo(0, mCurrentCount, data);
2790b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray}
2800b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
2810b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) {
28344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (mAdaptedAllocation != nullptr) {
284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    } else {
286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
28710913a5c37ba119bef335320d3e8be25212c05adTim Murray            mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Updated region larger than allocation.");
288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2930b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                                 const void *data) {
294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
295e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
296e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        size_t eSize = mType->getElement()->getSizeBytes();
297e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        void *ptr = malloc(eSize * w * h);
298e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        copyWithPadding(ptr, data, eSize / 4, w * h);
299e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff,
300e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        yoff, mSelectedLOD, mSelectedFace,
301e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w, h, ptr, w * h * mType->getElement()->getSizeBytes(),
302e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * mType->getElement()->getSizeBytes()));
303e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        free(ptr);
304e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    } else {
305e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff,
306e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        yoff, mSelectedLOD, mSelectedFace,
307e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w, h, data, w * h * mType->getElement()->getSizeBytes(),
308e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * mType->getElement()->getSizeBytes()));
309e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
312221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
31345768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsieh                                 const sp<const Allocation>& data, uint32_t dataXoff, uint32_t dataYoff) {
314221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
31510913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff,
31610913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         mSelectedLOD, mSelectedFace,
31710913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         w, h, data->getIDSafe(), dataXoff, dataYoff,
31810913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         data->mSelectedLOD, data->mSelectedFace));
319221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
3217b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murrayvoid Allocation::copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
3227b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray                               void* data) {
3237b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray    validate2DRange(xoff, yoff, w, h);
324e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
325e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        size_t eSize = mType->getElement()->getSizeBytes();
326e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        void *ptr = malloc(eSize * w * h);
327e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff,
328e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        mSelectedLOD, mSelectedFace, w, h, ptr,
329e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * h * mType->getElement()->getSizeBytes(),
330e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * mType->getElement()->getSizeBytes()));
331e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        copyWithUnPadding(data, ptr, eSize / 4, w * h);
332e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        free(ptr);
333e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    } else {
334e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff,
335e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        mSelectedLOD, mSelectedFace, w, h, data,
336e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * h * mType->getElement()->getSizeBytes(),
337e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * mType->getElement()->getSizeBytes()));
338e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
3397b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray}
3407b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray
341358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
342358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                                   const void *data, size_t stride) {
343358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    validate2DRange(xoff, yoff, w, h);
34410913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff,
34510913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    mSelectedLOD, mSelectedFace, w, h, data,
34610913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    w * h * mType->getElement()->getSizeBytes(), stride));
347358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
348358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
349358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(const void* data, size_t stride) {
350358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    copy2DStridedFrom(0, 0, mCurrentDimX, mCurrentDimY, data, stride);
351358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
352358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
353358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
354358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                                 void *data, size_t stride) {
355358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    validate2DRange(xoff, yoff, w, h);
35610913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff,
35710913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    mSelectedLOD, mSelectedFace, w, h, data,
35810913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    w * h * mType->getElement()->getSizeBytes(), stride));
359358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
360358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
361358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(void* data, size_t stride) {
362358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    copy2DStridedTo(0, 0, mCurrentDimX, mCurrentDimY, data, stride);
363358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
364358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
3659d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murrayvoid Allocation::validate3DRange(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w,
3669d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray                                 uint32_t h, uint32_t d) {
36744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes    if (mAdaptedAllocation != nullptr) {
3689d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray
3699d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray    } else {
3709d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray        if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY) || ((zoff + d) > mCurrentDimZ)) {
3719d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray            mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Updated region larger than allocation.");
3729d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray        }
3739d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray    }
3749d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray}
3759d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray
3769d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murrayvoid Allocation::copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w,
3779d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray                                 uint32_t h, uint32_t d, const void* data) {
3789d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray    validate3DRange(xoff, yoff, zoff, w, h, d);
379e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
380e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        size_t eSize = mType->getElement()->getSizeBytes();
381e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        void *ptr = malloc(eSize * w * h * d);
382e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        copyWithPadding(ptr, data, eSize / 4, w * h * d);
383e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation3DData(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
384e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        mSelectedLOD, w, h, d, ptr,
385e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * h * d * mType->getElement()->getSizeBytes(),
386e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * mType->getElement()->getSizeBytes()));
387e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        free(ptr);
388e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    } else {
389e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation3DData(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
390e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        mSelectedLOD, w, h, d, data,
391e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * h * d * mType->getElement()->getSizeBytes(),
392e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * mType->getElement()->getSizeBytes()));
393e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
3949d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray}
3959d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray
3969d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murrayvoid Allocation::copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w, uint32_t h, uint32_t d,
39745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsieh                                 const sp<const Allocation>& data, uint32_t dataXoff, uint32_t dataYoff, uint32_t dataZoff) {
398e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    validate3DRange(xoff, yoff, zoff, w, h, d);
3999d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray    tryDispatch(mRS, RS::dispatch->AllocationCopy3DRange(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
4009d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray                                                         mSelectedLOD, w, h, d, data->getIDSafe(),
4019d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray                                                         dataXoff, dataYoff, dataZoff, data->mSelectedLOD));
4029d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray}
4039d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray
404e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangvoid Allocation::copy3DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w,
405e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                 uint32_t h, uint32_t d, void* data) {
406e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    validate3DRange(xoff, yoff, zoff, w, h, d);
407e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
408e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        size_t eSize = mType->getElement()->getSizeBytes();
409e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        void *ptr = malloc(eSize * w * h * d);
410e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation3DRead(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
411e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        mSelectedLOD, w, h, d, ptr,
412e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * h * d * mType->getElement()->getSizeBytes(),
413e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * mType->getElement()->getSizeBytes()));
414e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        copyWithUnPadding(data, ptr, eSize / 4, w * h * d);
415e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        free(ptr);
416e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    } else {
417e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang        tryDispatch(mRS, RS::dispatch->Allocation3DRead(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
418e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        mSelectedLOD, w, h, d, data,
419e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * h * d * mType->getElement()->getSizeBytes(),
420e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang                                                        w * mType->getElement()->getSizeBytes()));
421e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang    }
422e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang}
4239d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray
42445768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type,
4258f615d682f9e7e2cd4de2e4478e0e76fc359922cStephen Hines                                    RsAllocationMipmapControl mipmaps, uint32_t usage) {
42610913a5c37ba119bef335320d3e8be25212c05adTim Murray    void *id = 0;
42710913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (rs->getError() == RS_SUCCESS) {
4288f615d682f9e7e2cd4de2e4478e0e76fc359922cStephen Hines        id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mipmaps, usage, 0);
42910913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
430221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
43110913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed");
43244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
433221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
434221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
435221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
436221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
43745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type,
4388f615d682f9e7e2cd4de2e4478e0e76fc359922cStephen Hines                                    RsAllocationMipmapControl mipmaps, uint32_t usage,
43989daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                    void *pointer) {
44010913a5c37ba119bef335320d3e8be25212c05adTim Murray    void *id = 0;
44110913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (rs->getError() == RS_SUCCESS) {
4428f615d682f9e7e2cd4de2e4478e0e76fc359922cStephen Hines        id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mipmaps, usage,
44310913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                 (uintptr_t)pointer);
44410913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
445221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
44610913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed");
44744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes        return nullptr;
448221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
449221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
450221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
451221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
45245768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type,
45389daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                    uint32_t usage) {
454221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage);
455221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
456221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
45745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createSized(const sp<RS>& rs, const sp<const Element>& e,
45889daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                    size_t count, uint32_t usage) {
459221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    Type::Builder b(rs, e);
460221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    b.setX(count);
46169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    sp<const Type> t = b.create();
462221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
463684726cbbd177ee4ee9000e9422058547acd237fTim Murray    return createTyped(rs, t, usage);
464684726cbbd177ee4ee9000e9422058547acd237fTim Murray}
465684726cbbd177ee4ee9000e9422058547acd237fTim Murray
46645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createSized2D(const sp<RS>& rs, const sp<const Element>& e,
46789daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                      size_t x, size_t y, uint32_t usage) {
468684726cbbd177ee4ee9000e9422058547acd237fTim Murray    Type::Builder b(rs, e);
469684726cbbd177ee4ee9000e9422058547acd237fTim Murray    b.setX(x);
470684726cbbd177ee4ee9000e9422058547acd237fTim Murray    b.setY(y);
471684726cbbd177ee4ee9000e9422058547acd237fTim Murray    sp<const Type> t = b.create();
472684726cbbd177ee4ee9000e9422058547acd237fTim Murray
473684726cbbd177ee4ee9000e9422058547acd237fTim Murray    return createTyped(rs, t, usage);
474221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
47509d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang
47609d2dd26af70a16de928e7450ef500a61c5b810aMiao Wangvoid Allocation::ioSendOutput() {
47709d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#ifndef RS_COMPATIBILITY_LIB
47809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) {
47909d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only send buffer if IO_OUTPUT usage specified.");
48009d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang        return;
48109d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    }
48209d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    tryDispatch(mRS, RS::dispatch->AllocationIoSend(mRS->getContext(), getID()));
48309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#endif
48409d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang}
48509d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang
48609d2dd26af70a16de928e7450ef500a61c5b810aMiao Wangvoid Allocation::ioGetInput() {
48709d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#ifndef RS_COMPATIBILITY_LIB
48809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) {
48909d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only get buffer if IO_INPUT usage specified.");
49009d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang        return;
49109d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    }
49209d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    tryDispatch(mRS, RS::dispatch->AllocationIoReceive(mRS->getContext(), getID()));
49309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#endif
49409d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang}
49509d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang
49662237219e567b9f972c86e7ca4e96f9b3d5ad4deMiao Wang#ifndef RS_COMPATIBILITY_LIB
49709d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#include <gui/Surface.h>
49809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang
499dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehsp<Surface> Allocation::getSurface() {
50009d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) {
50109d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only get Surface if IO_INPUT usage specified.");
50209d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang        return nullptr;
50309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    }
504e9d41e527fd3320f69c9534a04a10fead4b88229Miao Wang    ANativeWindow *anw = (ANativeWindow *)RS::dispatch->AllocationGetSurface(mRS->getContext(),
505e9d41e527fd3320f69c9534a04a10fead4b88229Miao Wang                                                                             getID());
506e9d41e527fd3320f69c9534a04a10fead4b88229Miao Wang    sp<Surface> surface(static_cast<Surface*>(anw));
507e9d41e527fd3320f69c9534a04a10fead4b88229Miao Wang    return surface;
50809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang}
50909d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang
510dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehvoid Allocation::setSurface(const sp<Surface>& s) {
51109d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) {
51209d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only set Surface if IO_OUTPUT usage specified.");
51309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang        return;
51409d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    }
51509d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang    tryDispatch(mRS, RS::dispatch->AllocationSetSurface(mRS->getContext(), getID(),
51609d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang                                                        static_cast<ANativeWindow *>(s.get())));
51709d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang}
51809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang
51909d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#endif
52009d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang
521