Allocation.cpp revision 10913a5c37ba119bef335320d3e8be25212c05ad
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
2069cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android;
219eb7f4b90120ebe4be74343856e86b46495f72dfTim Murrayusing namespace RSC;
22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
23221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid * Allocation::getIDSafe() const {
24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return getID();
25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2769cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsvoid Allocation::updateCacheInfo(sp<const Type> t) {
28221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimX = t->getX();
29221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimY = t->getY();
30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimZ = t->getZ();
31221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentCount = mCurrentDimX;
32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mCurrentDimY > 1) {
33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mCurrentCount *= mCurrentDimY;
34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mCurrentDimZ > 1) {
36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mCurrentCount *= mCurrentDimZ;
37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
4084bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayAllocation::Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage) :
41baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray    BaseObj(id, rs), mSelectedY(0), mSelectedZ(0), mSelectedLOD(0),
42baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray    mSelectedFace(RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X) {
4369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT |
45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_VERTEX |
47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS |
48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET |
49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_IO_INPUT |
5096267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray                   RS_ALLOCATION_USAGE_IO_OUTPUT |
5196267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray                   RS_ALLOCATION_USAGE_SHARED)) != 0) {
52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Unknown usage specified.");
53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
553522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) {
56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mWriteAllowed = false;
573522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT |
58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       RS_ALLOCATION_USAGE_SCRIPT)) != 0) {
60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Invalid usage combination.");
61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = t;
65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mUsage = usage;
66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
6789daad6bae798779e57f252e9da4fe4e62337124Tim Murray    if (t != NULL) {
68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
7089daad6bae798779e57f252e9da4fe4e62337124Tim Murray
71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
7389daad6bae798779e57f252e9da4fe4e62337124Tim Murray
7489daad6bae798779e57f252e9da4fe4e62337124Tim Murray
75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt32() {
76221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) {
78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit integer source does not match allocation type %i", dt);
81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt16() {
84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) {
86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("16 bit integer source does not match allocation type %i", dt);
89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt8() {
92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) {
94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("8 bit integer source does not match allocation type %i", dt);
97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsFloat32() {
100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (dt == RS_TYPE_FLOAT_32) {
102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit float source does not match allocation type %i", dt);
105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsObject() {
108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_ELEMENT) ||
110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_TYPE) ||
111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_ALLOCATION) ||
112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SAMPLER) ||
113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SCRIPT) ||
114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_MESH) ||
115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_FRAGMENT) ||
116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_VERTEX) ||
117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_RASTER) ||
118221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_STORE)) {
119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("Object source does not match allocation type %i", dt);
122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::updateFromNative() {
125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    BaseObj::updateFromNative();
126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
127a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray    const void *typeID = RS::dispatch->AllocationGetType(mRS->getContext(), getID());
128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(typeID != NULL) {
12969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<const Type> old = mType;
13069cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<Type> t = new Type((void *)typeID, mRS);
131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        t->updateFromNative();
132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mType = t;
134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::syncAll(RsAllocationUsageType srcLocation) {
138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    switch (srcLocation) {
139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_SCRIPT:
140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS:
141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE:
142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX:
14310913a5c37ba119bef335320d3e8be25212c05adTim Murray    case RS_ALLOCATION_USAGE_SHARED:
144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        break;
145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    default:
14610913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Source must be exactly one usage type.");
14710913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
14910913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation));
150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioSendOutput() {
1530b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_COMPATIBILITY_LIB
154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) {
15510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only send buffer if IO_OUTPUT usage specified.");
15610913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
15810913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationIoSend(mRS->getContext(), getID()));
1590b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
162221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioGetInput() {
1630b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_COMPATIBILITY_LIB
164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) {
16510913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only send buffer if IO_OUTPUT usage specified.");
16610913a5c37ba119bef335320d3e8be25212c05adTim Murray        return;
167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
16810913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationIoReceive(mRS->getContext(), getID()));
1690b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif
170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::generateMipmaps() {
17310913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationGenerateMipmaps(mRS->getContext(), getID()));
174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
1760b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const void *data) {
17769cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(count < 1) {
17910913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1.");
180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
182221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if((off + count) > mCurrentCount) {
183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off);
18410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified");
185221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
186221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
187221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
18810913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->Allocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
18910913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    count, data, count * mType->getElement()->getSizeBytes()));
190221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
191221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
1920b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeTo(uint32_t off, size_t count, void *data) {
193509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if(count < 1) {
19410913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1.");
195509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
196509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
197509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if((off + count) > mCurrentCount) {
198509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off);
19910913a5c37ba119bef335320d3e8be25212c05adTim Murray        mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified");
200509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
201509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
2020b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
20310913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->Allocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
20410913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    count, data, count * mType->getElement()->getSizeBytes()));
205509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray}
206509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
207a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data,
208a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray                                 uint32_t dataOff) {
20969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
21010913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0,
21110913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         mSelectedLOD, mSelectedFace,
21210913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         count, 1, data->getIDSafe(), dataOff, 0,
21310913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         data->mSelectedLOD, data->mSelectedFace));
214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2160b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DFrom(const void* data) {
2170b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    copy1DRangeFrom(0, mCurrentCount, data);
2180b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray}
2190b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
2200b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DTo(void* data) {
2210b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    copy1DRangeTo(0, mCurrentCount, data);
2220b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray}
2230b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
2240b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
225221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) {
226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mAdaptedAllocation != NULL) {
227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    } else {
229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
23010913a5c37ba119bef335320d3e8be25212c05adTim Murray            mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Updated region larger than allocation.");
231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
232221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2360b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                                 const void *data) {
237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
23810913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff,
23910913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    yoff, mSelectedLOD, mSelectedFace,
24010913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    w, h, data, w * h * mType->getElement()->getSizeBytes(),
24110913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    w * mType->getElement()->getSizeBytes()));
242221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
243221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
244221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2450b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                                 sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff) {
246221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
24710913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff,
24810913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         mSelectedLOD, mSelectedFace,
24910913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         w, h, data->getIDSafe(), dataXoff, dataYoff,
25010913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                         data->mSelectedLOD, data->mSelectedFace));
251221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
252221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2537b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murrayvoid Allocation::copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2547b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray                               void* data) {
2557b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray    validate2DRange(xoff, yoff, w, h);
25610913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff,
25710913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    mSelectedLOD, mSelectedFace, w, h, data,
25810913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    w * h * mType->getElement()->getSizeBytes(),
25910913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    w * mType->getElement()->getSizeBytes()));
2607b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray}
2617b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray
262358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
263358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                                   const void *data, size_t stride) {
264358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    validate2DRange(xoff, yoff, w, h);
26510913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff,
26610913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    mSelectedLOD, mSelectedFace, w, h, data,
26710913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    w * h * mType->getElement()->getSizeBytes(), stride));
268358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
269358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
270358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(const void* data, size_t stride) {
271358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    copy2DStridedFrom(0, 0, mCurrentDimX, mCurrentDimY, data, stride);
272358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
273358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
274358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
275358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                                 void *data, size_t stride) {
276358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    validate2DRange(xoff, yoff, w, h);
27710913a5c37ba119bef335320d3e8be25212c05adTim Murray    tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff,
27810913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    mSelectedLOD, mSelectedFace, w, h, data,
27910913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                    w * h * mType->getElement()->getSizeBytes(), stride));
280358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
281358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
282358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(void* data, size_t stride) {
283358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    copy2DStridedTo(0, 0, mCurrentDimX, mCurrentDimY, data, stride);
284358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
285358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
28689daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
28789daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                    RsAllocationMipmapControl mips, uint32_t usage) {
28810913a5c37ba119bef335320d3e8be25212c05adTim Murray    void *id = 0;
28910913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (rs->getError() == RS_SUCCESS) {
29010913a5c37ba119bef335320d3e8be25212c05adTim Murray        id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 0);
29110913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
29310913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed");
294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return NULL;
295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
297221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
298221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
29989daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
30089daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                    RsAllocationMipmapControl mips, uint32_t usage,
30189daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                    void *pointer) {
30210913a5c37ba119bef335320d3e8be25212c05adTim Murray    void *id = 0;
30310913a5c37ba119bef335320d3e8be25212c05adTim Murray    if (rs->getError() == RS_SUCCESS) {
30410913a5c37ba119bef335320d3e8be25212c05adTim Murray        id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mips, usage,
30510913a5c37ba119bef335320d3e8be25212c05adTim Murray                                                 (uintptr_t)pointer);
30610913a5c37ba119bef335320d3e8be25212c05adTim Murray    }
307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
30810913a5c37ba119bef335320d3e8be25212c05adTim Murray        rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed");
30910913a5c37ba119bef335320d3e8be25212c05adTim Murray        return NULL;
310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
312221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
313221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
31489daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
31589daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                    uint32_t usage) {
316221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage);
317221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
318221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
31989daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createSized(sp<RS> rs, sp<const Element> e,
32089daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                    size_t count, uint32_t usage) {
321221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    Type::Builder b(rs, e);
322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    b.setX(count);
32369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    sp<const Type> t = b.create();
324221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
325684726cbbd177ee4ee9000e9422058547acd237fTim Murray    return createTyped(rs, t, usage);
326684726cbbd177ee4ee9000e9422058547acd237fTim Murray}
327684726cbbd177ee4ee9000e9422058547acd237fTim Murray
32889daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createSized2D(sp<RS> rs, sp<const Element> e,
32989daad6bae798779e57f252e9da4fe4e62337124Tim Murray                                      size_t x, size_t y, uint32_t usage) {
330684726cbbd177ee4ee9000e9422058547acd237fTim Murray    Type::Builder b(rs, e);
331684726cbbd177ee4ee9000e9422058547acd237fTim Murray    b.setX(x);
332684726cbbd177ee4ee9000e9422058547acd237fTim Murray    b.setY(y);
333684726cbbd177ee4ee9000e9422058547acd237fTim Murray    sp<const Type> t = b.create();
334684726cbbd177ee4ee9000e9422058547acd237fTim Murray
335684726cbbd177ee4ee9000e9422058547acd237fTim Murray    return createTyped(rs, t, usage);
336221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
337