Allocation.cpp revision 84bf2b877024aaa154b66e0f2338d54bdabd855a
1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/*
23522f40418fdf877f5a136475dbf75e57a3b7c77Jason 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 "RenderScript.h"
18221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
1969cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android;
2069cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace renderscriptCpp;
21221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid * Allocation::getIDSafe() const {
23221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return getID();
24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2669cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsvoid Allocation::updateCacheInfo(sp<const Type> t) {
27221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimX = t->getX();
28221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimY = t->getY();
29221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentDimZ = t->getZ();
30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mCurrentCount = mCurrentDimX;
31221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mCurrentDimY > 1) {
32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mCurrentCount *= mCurrentDimY;
33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mCurrentDimZ > 1) {
35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mCurrentCount *= mCurrentDimZ;
36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
3984bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayAllocation::Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage) :
4069cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        BaseObj(id, rs) {
4169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
42221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT |
43221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_VERTEX |
45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS |
46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET |
47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_IO_INPUT |
48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_IO_OUTPUT)) != 0) {
49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Unknown usage specified.");
50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
51221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
523522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) {
53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mWriteAllowed = false;
543522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT |
55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       RS_ALLOCATION_USAGE_SCRIPT)) != 0) {
57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Invalid usage combination.");
58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = t;
62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mUsage = usage;
63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
6469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    if (t.get() != NULL) {
65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
67221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt32() {
70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) {
72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit integer source does not match allocation type %i", dt);
75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
76221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt16() {
78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) {
80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("16 bit integer source does not match allocation type %i", dt);
83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt8() {
86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) {
88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("8 bit integer source does not match allocation type %i", dt);
91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsFloat32() {
94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (dt == RS_TYPE_FLOAT_32) {
96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit float source does not match allocation type %i", dt);
99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsObject() {
102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_ELEMENT) ||
104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_TYPE) ||
105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_ALLOCATION) ||
106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SAMPLER) ||
107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SCRIPT) ||
108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_MESH) ||
109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_FRAGMENT) ||
110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_VERTEX) ||
111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_RASTER) ||
112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_STORE)) {
113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("Object source does not match allocation type %i", dt);
116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
118221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::updateFromNative() {
119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    BaseObj::updateFromNative();
120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
12184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    const void *typeID = rsaAllocationGetType(mRS->getContext(), getID());
122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(typeID != NULL) {
12369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<const Type> old = mType;
12469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<Type> t = new Type((void *)typeID, mRS);
125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        t->updateFromNative();
126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mType = t;
128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::syncAll(RsAllocationUsageType srcLocation) {
132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    switch (srcLocation) {
133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_SCRIPT:
134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS:
135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE:
136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX:
137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        break;
138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    default:
139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Source must be exactly one usage type.");
140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
14184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation);
142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioSendOutput() {
145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) {
146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Can only send buffer if IO_OUTPUT usage specified.");
147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
14884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationIoSend(mRS->getContext(), getID());
149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioGetInput() {
152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) {
153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Can only send buffer if IO_OUTPUT usage specified.");
154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
15584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationIoReceive(mRS->getContext(), getID());
156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::generateMipmaps() {
15984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationGenerateMipmaps(mRS->getContext(), getID());
160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
16269cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsvoid Allocation::copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data,
16369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        size_t dataLen) {
16469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
165221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(count < 1) {
166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Count must be >= 1.");
167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if((off + count) > mCurrentCount) {
170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off);
171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if((count * mType->getElement()->getSizeBytes()) > dataLen) {
174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Array too small for allocation type.");
175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
176221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
177221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
17884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD, count, data, dataLen);
179221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int32_t *d, size_t dataLen) {
182221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validateIsInt32();
183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    copy1DRangeFromUnchecked(off, count, d, dataLen);
184221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
185221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
186221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int16_t *d, size_t dataLen) {
187221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validateIsInt16();
188221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    copy1DRangeFromUnchecked(off, count, d, dataLen);
189221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
190221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
191221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int8_t *d, size_t dataLen) {
192221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validateIsInt8();
193221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    copy1DRangeFromUnchecked(off, count, d, dataLen);
194221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
195221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
196221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const float *d, size_t dataLen) {
197221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validateIsFloat32();
198221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    copy1DRangeFromUnchecked(off, count, d, dataLen);
199221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
200221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
20169cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data,
20269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        uint32_t dataOff) {
20369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
20484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0,
205221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            mSelectedLOD, mSelectedFace,
206221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            count, 1, data->getIDSafe(), dataOff, 0,
207221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            data->mSelectedLOD, data->mSelectedFace);
208221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
209221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
210221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) {
211221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mAdaptedAllocation != NULL) {
212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    } else {
214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Updated region larger than allocation.");
216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
217221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
218221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
220221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const int8_t *data, size_t dataLen) {
222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
22384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
224221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       w, h, data, dataLen);
225221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const int16_t *data, size_t dataLen) {
229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
23084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       w, h, data, dataLen);
232221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const int32_t *data, size_t dataLen) {
236221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
23784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
238221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       w, h, data, dataLen);
239221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
240221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
241221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
242221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const float *data, size_t dataLen) {
243221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
24484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
245221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       w, h, data, dataLen);
246221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
247221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
248221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
249221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const Allocation *data, size_t dataLen,
250221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 uint32_t dataXoff, uint32_t dataYoff) {
251221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
25284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff,
253221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            mSelectedLOD, mSelectedFace,
254221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            w, h, data->getIDSafe(), dataXoff, dataYoff,
255221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            data->mSelectedLOD, data->mSelectedFace);
256221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
257221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
258221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/*
259221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid resize(int dimX) {
260221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
261221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
262221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
263221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.nAllocationResize1D(getID(), dimX);
264221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.finish();  // Necessary because resize is fifoed and update is async.
265221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
266221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int typeID = mRS.nAllocationGetType(getID());
267221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = new Type(typeID, mRS);
268221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType.updateFromNative();
269221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    updateCacheInfo(mType);
270221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid resize(int dimX, int dimY) {
273221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
274221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException(
275221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            "Resize only support for 2D allocations at this time.");
276221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
277221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mType.getY() == 0) {
278221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException(
279221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            "Resize only support for 2D allocations at this time.");
280221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
281221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.nAllocationResize2D(getID(), dimX, dimY);
282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.finish();  // Necessary because resize is fifoed and update is async.
283221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int typeID = mRS.nAllocationGetType(getID());
285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = new Type(typeID, mRS);
286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType.updateFromNative();
287221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    updateCacheInfo(mType);
288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams*/
290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
29284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
293221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                        RsAllocationMipmapControl mips, uint32_t usage) {
29484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 0);
295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Allocation creation failed.");
297221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return NULL;
298221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
299221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
300221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
301221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
30284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
303221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                    RsAllocationMipmapControl mips, uint32_t usage, void *pointer) {
30484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, (uint32_t)pointer);
305221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
306221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Allocation creation failed.");
307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
308221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
309221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
31184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
31269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        uint32_t usage) {
313221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage);
314221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
315221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
31684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createSized(sp<RS> rs, sp<const Element> e,
31769cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        size_t count, uint32_t usage) {
31869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
319221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    Type::Builder b(rs, e);
320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    b.setX(count);
32169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    sp<const Type> t = b.create();
322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
32384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *id = rsAllocationCreateTyped(rs->getContext(), t->getID(),
32469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        RS_ALLOCATION_MIPMAP_NONE, usage, 0);
325221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
326221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Allocation creation failed.");
327221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
328221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, t, usage);
329221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
330