Allocation.cpp revision baca6c3c3d79a324c7976ba873afdded0b6bcfb5
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) :
40baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray    BaseObj(id, rs), mSelectedY(0), mSelectedZ(0), mSelectedLOD(0),
41baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray    mSelectedFace(RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X) {
4269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
43221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT |
44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_VERTEX |
46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS |
47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET |
48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_IO_INPUT |
49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                   RS_ALLOCATION_USAGE_IO_OUTPUT)) != 0) {
50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Unknown usage specified.");
51221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
533522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) {
54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mWriteAllowed = false;
553522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT |
56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
57221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       RS_ALLOCATION_USAGE_SCRIPT)) != 0) {
58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Invalid usage combination.");
59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = t;
63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mUsage = usage;
64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
6569cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    if (t.get() != NULL) {
66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
67221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt32() {
71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) {
73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit integer source does not match allocation type %i", dt);
76221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt16() {
79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) {
81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("16 bit integer source does not match allocation type %i", dt);
84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt8() {
87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) {
89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("8 bit integer source does not match allocation type %i", dt);
92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsFloat32() {
95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (dt == RS_TYPE_FLOAT_32) {
97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("32 bit float source does not match allocation type %i", dt);
100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsObject() {
103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    RsDataType dt = mType->getElement()->getDataType();
104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((dt == RS_TYPE_ELEMENT) ||
105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_TYPE) ||
106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_ALLOCATION) ||
107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SAMPLER) ||
108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_SCRIPT) ||
109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_MESH) ||
110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_FRAGMENT) ||
111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_VERTEX) ||
112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_RASTER) ||
113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        (dt == RS_TYPE_PROGRAM_STORE)) {
114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    ALOGE("Object source does not match allocation type %i", dt);
117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
118221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::updateFromNative() {
120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    BaseObj::updateFromNative();
121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
12284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    const void *typeID = rsaAllocationGetType(mRS->getContext(), getID());
123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(typeID != NULL) {
12469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<const Type> old = mType;
12569cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        sp<Type> t = new Type((void *)typeID, mRS);
126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        t->updateFromNative();
127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        updateCacheInfo(t);
128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        mType = t;
129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::syncAll(RsAllocationUsageType srcLocation) {
133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    switch (srcLocation) {
134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_SCRIPT:
135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS:
136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE:
137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX:
138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        break;
139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    default:
140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Source must be exactly one usage type.");
141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
14284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation);
143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioSendOutput() {
146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) {
147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Can only send buffer if IO_OUTPUT usage specified.");
148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
14984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationIoSend(mRS->getContext(), getID());
150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioGetInput() {
153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) {
154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Can only send buffer if IO_OUTPUT usage specified.");
155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
15684bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationIoReceive(mRS->getContext(), getID());
157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
159221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::generateMipmaps() {
16084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationGenerateMipmaps(mRS->getContext(), getID());
161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
162221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
16369cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsvoid Allocation::copy1DRangeFromUnchecked(uint32_t off, size_t count, const void *data,
16469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        size_t dataLen) {
16569cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if(count < 1) {
167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Count must be >= 1.");
168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if((off + count) > mCurrentCount) {
171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off);
172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if((count * mType->getElement()->getSizeBytes()) > dataLen) {
175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Array too small for allocation type.");
176221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return;
177221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
17984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD, count, data, dataLen);
180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
182509ea5c832a865bc9083d53f1f058377a689bab3Tim Murrayvoid Allocation::copy1DRangeToUnchecked(uint32_t off, size_t count, void *data, size_t dataLen) {
183509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if(count < 1) {
184509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        ALOGE("Count must be >= 1.");
185509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
186509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
187509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if((off + count) > mCurrentCount) {
188509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off);
189509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
190509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
191509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    if((count * mType->getElement()->getSizeBytes()) > dataLen) {
192509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        ALOGE("Array too small for allocation type.");
193509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray        return;
194509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    }
195509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    rsAllocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD, count, data, dataLen);
196509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray}
197509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
198221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int32_t *d, size_t dataLen) {
199221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validateIsInt32();
200221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    copy1DRangeFromUnchecked(off, count, d, dataLen);
201221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
202221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
203221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int16_t *d, size_t dataLen) {
204221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validateIsInt16();
205221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    copy1DRangeFromUnchecked(off, count, d, dataLen);
206221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
207221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
208221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const int8_t *d, size_t dataLen) {
209221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validateIsInt8();
210221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    copy1DRangeFromUnchecked(off, count, d, dataLen);
211221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const float *d, size_t dataLen) {
214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validateIsFloat32();
215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    copy1DRangeFromUnchecked(off, count, d, dataLen);
216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
217221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
21869cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const Allocation *data,
21969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        uint32_t dataOff) {
22069cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
22184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0,
222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            mSelectedLOD, mSelectedFace,
223221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            count, 1, data->getIDSafe(), dataOff, 0,
224221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            data->mSelectedLOD, data->mSelectedFace);
225221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) {
228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mAdaptedAllocation != NULL) {
229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
230221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    } else {
231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
232221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            ALOGE("Updated region larger than allocation.");
233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        }
234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
236221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
238221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const int8_t *data, size_t dataLen) {
239221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
24084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
241221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       w, h, data, dataLen);
242221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
243221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
244221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
245221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const int16_t *data, size_t dataLen) {
246221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
24784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
248221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       w, h, data, dataLen);
249221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
250221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
251221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
252221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const int32_t *data, size_t dataLen) {
253221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
25484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
255221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       w, h, data, dataLen);
256221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
257221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
258221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
259221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const float *data, size_t dataLen) {
260221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
26184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace,
262221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                       w, h, data, dataLen);
263221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
264221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
265221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
266221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 const Allocation *data, size_t dataLen,
267221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                 uint32_t dataXoff, uint32_t dataYoff) {
268221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    validate2DRange(xoff, yoff, w, h);
26984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff,
270221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            mSelectedLOD, mSelectedFace,
271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            w, h, data->getIDSafe(), dataXoff, dataYoff,
272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                            data->mSelectedLOD, data->mSelectedFace);
273221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
274221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
275221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/*
276221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid resize(int dimX) {
277221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
278221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException("Resize only support for 1D allocations at this time.");
279221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
280221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.nAllocationResize1D(getID(), dimX);
281221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.finish();  // Necessary because resize is fifoed and update is async.
282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
283221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int typeID = mRS.nAllocationGetType(getID());
284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = new Type(typeID, mRS);
285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType.updateFromNative();
286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    updateCacheInfo(mType);
287221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid resize(int dimX, int dimY) {
290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if ((mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) {
291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException(
292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            "Resize only support for 2D allocations at this time.");
293221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (mType.getY() == 0) {
295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        throw new RSInvalidStateException(
296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams            "Resize only support for 2D allocations at this time.");
297221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
298221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.nAllocationResize2D(getID(), dimX, dimY);
299221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mRS.finish();  // Necessary because resize is fifoed and update is async.
300221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
301221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    int typeID = mRS.nAllocationGetType(getID());
302221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType = new Type(typeID, mRS);
303221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    mType.updateFromNative();
304221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    updateCacheInfo(mType);
305221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
306221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams*/
307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
308221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
30984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                        RsAllocationMipmapControl mips, uint32_t usage) {
31184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 0);
312221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
313221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Allocation creation failed.");
314221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        return NULL;
315221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
316221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
317221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
318221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
31984bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams                                    RsAllocationMipmapControl mips, uint32_t usage, void *pointer) {
32184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, (uint32_t)pointer);
322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
323221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Allocation creation failed.");
324221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
325221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, type, usage);
326221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
327221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
32884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type,
32969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        uint32_t usage) {
330221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage);
331221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
332221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
33384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createSized(sp<RS> rs, sp<const Element> e,
33469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        size_t count, uint32_t usage) {
33569cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams
336221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    Type::Builder b(rs, e);
337221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    b.setX(count);
33869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams    sp<const Type> t = b.create();
339221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams
34084bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray    void *id = rsAllocationCreateTyped(rs->getContext(), t->getID(),
34169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams        RS_ALLOCATION_MIPMAP_NONE, usage, 0);
342221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    if (id == 0) {
343221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams        ALOGE("Allocation creation failed.");
344221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    }
345221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams    return new Allocation(id, rs, t, usage);
346221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams}
347