Allocation.cpp revision b206acefa7ef03e02d3e8e161f8a1493329246b3
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"
18b206acefa7ef03e02d3e8e161f8a1493329246b3Tim Murray#include <rs.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
6769cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    if (t.get() != NULL) {
68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt32() {
73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) {
75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
76221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit integer source does not match allocation type %i", dt);
78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt16() {
81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) {
83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("16 bit integer source does not match allocation type %i", dt);
86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt8() {
89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) {
91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("8 bit integer source does not match allocation type %i", dt);
94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsFloat32() {
97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (dt == RS_TYPE_FLOAT_32) {
99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit float source does not match allocation type %i", dt);
102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsObject() {
105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_ELEMENT) ||
107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_TYPE) ||
108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_ALLOCATION) ||
109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SAMPLER) ||
110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SCRIPT) ||
111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_MESH) ||
112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_FRAGMENT) ||
113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_VERTEX) ||
114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_RASTER) ||
115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_STORE)) {
116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
118221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("Object source does not match allocation type %i", dt);
119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::updateFromNative() {
122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    BaseObj::updateFromNative();
123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
12484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    const void *typeID = rsaAllocationGetType(mRS->getContext(), getID());
125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(typeID != NULL) {
12669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<const Type> old = mType;
12769cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<Type> t = new Type((void *)typeID, mRS);
128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        t->updateFromNative();
129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mType = t;
131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::syncAll(RsAllocationUsageType srcLocation) {
135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    switch (srcLocation) {
136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_SCRIPT:
137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS:
138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE:
139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX:
140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        break;
141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    default:
142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Source must be exactly one usage type.");
143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
14484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation);
145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioSendOutput() {
148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) {
149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Can only send buffer if IO_OUTPUT usage specified.");
150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
15184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationIoSend(mRS->getContext(), getID());
152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioGetInput() {
155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) {
156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Can only send buffer if IO_OUTPUT usage specified.");
157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
15884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationIoReceive(mRS->getContext(), getID());
159221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::generateMipmaps() {
16284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationGenerateMipmaps(mRS->getContext(), getID());
163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
1650b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const void *data) {
16669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(count < 1) {
168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Count must be >= 1.");
169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if((off + count) > mCurrentCount) {
172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off);
173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
1760b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    rsAllocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD, count, data,
1770b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                       count * mType->getElement()->getSizeBytes());
178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
179221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
1800b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeTo(uint32_t off, size_t count, void *data) {
181509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if(count < 1) {
182509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        ALOGE("Count must be >= 1.");
183509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
184509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
185509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if((off + count) > mCurrentCount) {
186509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off);
187509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
188509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
1890b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
1900b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    rsAllocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD, count, data,
1910b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                       count * mType->getElement()->getSizeBytes());
192509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray}
193509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
194a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data,
195a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray                                 uint32_t dataOff) {
19669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
19784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0,
198221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            mSelectedLOD, mSelectedFace,
199221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            count, 1, data->getIDSafe(), dataOff, 0,
200221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            data->mSelectedLOD, data->mSelectedFace);
201221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
202221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2030b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DFrom(const void* data) {
2040b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    copy1DRangeFrom(0, mCurrentCount, data);
2050b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray}
2060b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
2070b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DTo(void* data) {
2080b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray    copy1DRangeTo(0, mCurrentCount, data);
2090b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray}
2100b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
2110b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray
212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) {
213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mAdaptedAllocation != NULL) {
214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    } else {
216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
217221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Updated region larger than allocation.");
218221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
220221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2230b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                                 const void *data) {
224221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
22584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
226358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                       w, h, data, w * h * mType->getElement()->getSizeBytes(), w * mType->getElement()->getSizeBytes());
227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2300b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray                                 sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff) {
231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
23284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff,
233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            mSelectedLOD, mSelectedFace,
234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            w, h, data->getIDSafe(), dataXoff, dataYoff,
235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            data->mSelectedLOD, data->mSelectedFace);
236221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
2387b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murrayvoid Allocation::copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
2397b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray                               void* data) {
2407b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray    validate2DRange(xoff, yoff, w, h);
2417b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray    rsAllocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
242358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                       w, h, data, w * h * mType->getElement()->getSizeBytes(), w * mType->getElement()->getSizeBytes());
2437b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray}
2447b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray
245358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
246358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                                   const void *data, size_t stride) {
247358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    validate2DRange(xoff, yoff, w, h);
248358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
249358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                       w, h, data, w * h * mType->getElement()->getSizeBytes(), stride);
250358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
251358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
252358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(const void* data, size_t stride) {
253358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    copy2DStridedFrom(0, 0, mCurrentDimX, mCurrentDimY, data, stride);
254358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
255358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
256358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
257358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                                 void *data, size_t stride) {
258358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    validate2DRange(xoff, yoff, w, h);
259358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    rsAllocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
260358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                       w, h, data, w * h * mType->getElement()->getSizeBytes(), stride);
261358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
262358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
263358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(void* data, size_t stride) {
264358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    copy2DStridedTo(0, 0, mCurrentDimX, mCurrentDimY, data, stride);
265358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
266358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
267358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
268221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/*
269221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid resize(int dimX) {
270221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
273221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.nAllocationResize1D(getID(), dimX);
274221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.finish();  // Necessary because resize is fifoed and update is async.
275221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
276221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int typeID = mRS.nAllocationGetType(getID());
277221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = new Type(typeID, mRS);
278221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType.updateFromNative();
279221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    updateCacheInfo(mType);
280221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
281221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid resize(int dimX, int dimY) {
283221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException(
285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            "Resize only support for 2D allocations at this time.");
286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
287221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mType.getY() == 0) {
288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException(
289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            "Resize only support for 2D allocations at this time.");
290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.nAllocationResize2D(getID(), dimX, dimY);
292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.finish();  // Necessary because resize is fifoed and update is async.
293221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int typeID = mRS.nAllocationGetType(getID());
295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = new Type(typeID, mRS);
296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType.updateFromNative();
297221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    updateCacheInfo(mType);
298221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
299221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams*/
300221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
301221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
30284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
303684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                                RsAllocationMipmapControl mips, uint32_t usage) {
30484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 0);
305221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
306221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Allocation creation failed.");
307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return NULL;
308221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
309221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
31284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
313684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                                RsAllocationMipmapControl mips, uint32_t usage,
314684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                                void *pointer) {
315684726cbbd177ee4ee9000e9422058547acd237fTim Murray    void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage,
316684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                       (uint32_t)pointer);
317221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
318221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Allocation creation failed.");
319221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
321221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
32384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
324684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                                uint32_t usage) {
325221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage);
326221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
327221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
32884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createSized(sp<RS> rs, sp<const Element> e,
329684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                                size_t count, uint32_t usage) {
330221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    Type::Builder b(rs, e);
331221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    b.setX(count);
33269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    sp<const Type> t = b.create();
333221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
334684726cbbd177ee4ee9000e9422058547acd237fTim Murray    return createTyped(rs, t, usage);
335684726cbbd177ee4ee9000e9422058547acd237fTim Murray}
336684726cbbd177ee4ee9000e9422058547acd237fTim Murray
337684726cbbd177ee4ee9000e9422058547acd237fTim Murrayandroid::sp<Allocation> Allocation::createSized2D(sp<RS> rs, sp<const Element> e,
338684726cbbd177ee4ee9000e9422058547acd237fTim Murray                                                  size_t x, size_t y, uint32_t usage) {
339684726cbbd177ee4ee9000e9422058547acd237fTim Murray    Type::Builder b(rs, e);
340684726cbbd177ee4ee9000e9422058547acd237fTim Murray    b.setX(x);
341684726cbbd177ee4ee9000e9422058547acd237fTim Murray    b.setY(y);
342684726cbbd177ee4ee9000e9422058547acd237fTim Murray    sp<const Type> t = b.create();
343684726cbbd177ee4ee9000e9422058547acd237fTim Murray
344684726cbbd177ee4ee9000e9422058547acd237fTim Murray    return createTyped(rs, t, usage);
345221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
346