1*e1eccf28SAndroid Build Coastguard Worker /*
2*e1eccf28SAndroid Build Coastguard Worker * Copyright (C) 2013 The Android Open Source Project
3*e1eccf28SAndroid Build Coastguard Worker *
4*e1eccf28SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*e1eccf28SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*e1eccf28SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*e1eccf28SAndroid Build Coastguard Worker *
8*e1eccf28SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*e1eccf28SAndroid Build Coastguard Worker *
10*e1eccf28SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*e1eccf28SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*e1eccf28SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*e1eccf28SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*e1eccf28SAndroid Build Coastguard Worker * limitations under the License.
15*e1eccf28SAndroid Build Coastguard Worker */
16*e1eccf28SAndroid Build Coastguard Worker
17*e1eccf28SAndroid Build Coastguard Worker #include "RenderScript.h"
18*e1eccf28SAndroid Build Coastguard Worker #include "rsCppInternal.h"
19*e1eccf28SAndroid Build Coastguard Worker
20*e1eccf28SAndroid Build Coastguard Worker using android::RSC::Allocation;
21*e1eccf28SAndroid Build Coastguard Worker using android::RSC::sp;
22*e1eccf28SAndroid Build Coastguard Worker
getIDSafe() const23*e1eccf28SAndroid Build Coastguard Worker void * Allocation::getIDSafe() const {
24*e1eccf28SAndroid Build Coastguard Worker return getID();
25*e1eccf28SAndroid Build Coastguard Worker }
26*e1eccf28SAndroid Build Coastguard Worker
updateCacheInfo(const sp<const Type> & t)27*e1eccf28SAndroid Build Coastguard Worker void Allocation::updateCacheInfo(const sp<const Type>& t) {
28*e1eccf28SAndroid Build Coastguard Worker mCurrentDimX = t->getX();
29*e1eccf28SAndroid Build Coastguard Worker mCurrentDimY = t->getY();
30*e1eccf28SAndroid Build Coastguard Worker mCurrentDimZ = t->getZ();
31*e1eccf28SAndroid Build Coastguard Worker mCurrentCount = mCurrentDimX;
32*e1eccf28SAndroid Build Coastguard Worker if (mCurrentDimY > 1) {
33*e1eccf28SAndroid Build Coastguard Worker mCurrentCount *= mCurrentDimY;
34*e1eccf28SAndroid Build Coastguard Worker }
35*e1eccf28SAndroid Build Coastguard Worker if (mCurrentDimZ > 1) {
36*e1eccf28SAndroid Build Coastguard Worker mCurrentCount *= mCurrentDimZ;
37*e1eccf28SAndroid Build Coastguard Worker }
38*e1eccf28SAndroid Build Coastguard Worker }
39*e1eccf28SAndroid Build Coastguard Worker
Allocation(void * id,sp<RS> rs,sp<const Type> t,uint32_t usage)40*e1eccf28SAndroid Build Coastguard Worker Allocation::Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage) :
41*e1eccf28SAndroid Build Coastguard Worker BaseObj(id, rs), mSelectedY(0), mSelectedZ(0), mSelectedLOD(0),
42*e1eccf28SAndroid Build Coastguard Worker mSelectedFace(RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X) {
43*e1eccf28SAndroid Build Coastguard Worker
44*e1eccf28SAndroid Build Coastguard Worker if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT |
45*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
46*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_GRAPHICS_VERTEX |
47*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS |
48*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET |
49*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_IO_INPUT |
50*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_IO_OUTPUT |
51*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_OEM |
52*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_SHARED)) != 0) {
53*e1eccf28SAndroid Build Coastguard Worker ALOGE("Unknown usage specified.");
54*e1eccf28SAndroid Build Coastguard Worker }
55*e1eccf28SAndroid Build Coastguard Worker
56*e1eccf28SAndroid Build Coastguard Worker if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) {
57*e1eccf28SAndroid Build Coastguard Worker mWriteAllowed = false;
58*e1eccf28SAndroid Build Coastguard Worker if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT |
59*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE |
60*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_USAGE_SCRIPT)) != 0) {
61*e1eccf28SAndroid Build Coastguard Worker ALOGE("Invalid usage combination.");
62*e1eccf28SAndroid Build Coastguard Worker }
63*e1eccf28SAndroid Build Coastguard Worker }
64*e1eccf28SAndroid Build Coastguard Worker
65*e1eccf28SAndroid Build Coastguard Worker mType = t;
66*e1eccf28SAndroid Build Coastguard Worker mUsage = usage;
67*e1eccf28SAndroid Build Coastguard Worker mAutoPadding = false;
68*e1eccf28SAndroid Build Coastguard Worker if (t != nullptr) {
69*e1eccf28SAndroid Build Coastguard Worker updateCacheInfo(t);
70*e1eccf28SAndroid Build Coastguard Worker }
71*e1eccf28SAndroid Build Coastguard Worker
72*e1eccf28SAndroid Build Coastguard Worker }
73*e1eccf28SAndroid Build Coastguard Worker
74*e1eccf28SAndroid Build Coastguard Worker
validateIsInt64()75*e1eccf28SAndroid Build Coastguard Worker void Allocation::validateIsInt64() {
76*e1eccf28SAndroid Build Coastguard Worker RsDataType dt = mType->getElement()->getDataType();
77*e1eccf28SAndroid Build Coastguard Worker if ((dt == RS_TYPE_SIGNED_64) || (dt == RS_TYPE_UNSIGNED_64)) {
78*e1eccf28SAndroid Build Coastguard Worker return;
79*e1eccf28SAndroid Build Coastguard Worker }
80*e1eccf28SAndroid Build Coastguard Worker ALOGE("64 bit integer source does not match allocation type %i", dt);
81*e1eccf28SAndroid Build Coastguard Worker }
82*e1eccf28SAndroid Build Coastguard Worker
validateIsInt32()83*e1eccf28SAndroid Build Coastguard Worker void Allocation::validateIsInt32() {
84*e1eccf28SAndroid Build Coastguard Worker RsDataType dt = mType->getElement()->getDataType();
85*e1eccf28SAndroid Build Coastguard Worker if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) {
86*e1eccf28SAndroid Build Coastguard Worker return;
87*e1eccf28SAndroid Build Coastguard Worker }
88*e1eccf28SAndroid Build Coastguard Worker ALOGE("32 bit integer source does not match allocation type %i", dt);
89*e1eccf28SAndroid Build Coastguard Worker }
90*e1eccf28SAndroid Build Coastguard Worker
validateIsInt16()91*e1eccf28SAndroid Build Coastguard Worker void Allocation::validateIsInt16() {
92*e1eccf28SAndroid Build Coastguard Worker RsDataType dt = mType->getElement()->getDataType();
93*e1eccf28SAndroid Build Coastguard Worker if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) {
94*e1eccf28SAndroid Build Coastguard Worker return;
95*e1eccf28SAndroid Build Coastguard Worker }
96*e1eccf28SAndroid Build Coastguard Worker ALOGE("16 bit integer source does not match allocation type %i", dt);
97*e1eccf28SAndroid Build Coastguard Worker }
98*e1eccf28SAndroid Build Coastguard Worker
validateIsInt8()99*e1eccf28SAndroid Build Coastguard Worker void Allocation::validateIsInt8() {
100*e1eccf28SAndroid Build Coastguard Worker RsDataType dt = mType->getElement()->getDataType();
101*e1eccf28SAndroid Build Coastguard Worker if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) {
102*e1eccf28SAndroid Build Coastguard Worker return;
103*e1eccf28SAndroid Build Coastguard Worker }
104*e1eccf28SAndroid Build Coastguard Worker ALOGE("8 bit integer source does not match allocation type %i", dt);
105*e1eccf28SAndroid Build Coastguard Worker }
106*e1eccf28SAndroid Build Coastguard Worker
validateIsFloat32()107*e1eccf28SAndroid Build Coastguard Worker void Allocation::validateIsFloat32() {
108*e1eccf28SAndroid Build Coastguard Worker RsDataType dt = mType->getElement()->getDataType();
109*e1eccf28SAndroid Build Coastguard Worker if (dt == RS_TYPE_FLOAT_32) {
110*e1eccf28SAndroid Build Coastguard Worker return;
111*e1eccf28SAndroid Build Coastguard Worker }
112*e1eccf28SAndroid Build Coastguard Worker ALOGE("32 bit float source does not match allocation type %i", dt);
113*e1eccf28SAndroid Build Coastguard Worker }
114*e1eccf28SAndroid Build Coastguard Worker
validateIsFloat64()115*e1eccf28SAndroid Build Coastguard Worker void Allocation::validateIsFloat64() {
116*e1eccf28SAndroid Build Coastguard Worker RsDataType dt = mType->getElement()->getDataType();
117*e1eccf28SAndroid Build Coastguard Worker if (dt == RS_TYPE_FLOAT_64) {
118*e1eccf28SAndroid Build Coastguard Worker return;
119*e1eccf28SAndroid Build Coastguard Worker }
120*e1eccf28SAndroid Build Coastguard Worker ALOGE("64 bit float source does not match allocation type %i", dt);
121*e1eccf28SAndroid Build Coastguard Worker }
122*e1eccf28SAndroid Build Coastguard Worker
validateIsObject()123*e1eccf28SAndroid Build Coastguard Worker void Allocation::validateIsObject() {
124*e1eccf28SAndroid Build Coastguard Worker RsDataType dt = mType->getElement()->getDataType();
125*e1eccf28SAndroid Build Coastguard Worker if ((dt == RS_TYPE_ELEMENT) ||
126*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_TYPE) ||
127*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_ALLOCATION) ||
128*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_SAMPLER) ||
129*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_SCRIPT) ||
130*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_MESH) ||
131*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_PROGRAM_FRAGMENT) ||
132*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_PROGRAM_VERTEX) ||
133*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_PROGRAM_RASTER) ||
134*e1eccf28SAndroid Build Coastguard Worker (dt == RS_TYPE_PROGRAM_STORE)) {
135*e1eccf28SAndroid Build Coastguard Worker return;
136*e1eccf28SAndroid Build Coastguard Worker }
137*e1eccf28SAndroid Build Coastguard Worker ALOGE("Object source does not match allocation type %i", dt);
138*e1eccf28SAndroid Build Coastguard Worker }
139*e1eccf28SAndroid Build Coastguard Worker
updateFromNative()140*e1eccf28SAndroid Build Coastguard Worker void Allocation::updateFromNative() {
141*e1eccf28SAndroid Build Coastguard Worker BaseObj::updateFromNative();
142*e1eccf28SAndroid Build Coastguard Worker
143*e1eccf28SAndroid Build Coastguard Worker const void *typeID = RS::dispatch->AllocationGetType(mRS->getContext(), getID());
144*e1eccf28SAndroid Build Coastguard Worker if(typeID != nullptr) {
145*e1eccf28SAndroid Build Coastguard Worker sp<Type> t = new Type((void *)typeID, mRS);
146*e1eccf28SAndroid Build Coastguard Worker t->updateFromNative();
147*e1eccf28SAndroid Build Coastguard Worker updateCacheInfo(t);
148*e1eccf28SAndroid Build Coastguard Worker mType = t;
149*e1eccf28SAndroid Build Coastguard Worker }
150*e1eccf28SAndroid Build Coastguard Worker }
151*e1eccf28SAndroid Build Coastguard Worker
syncAll(RsAllocationUsageType srcLocation)152*e1eccf28SAndroid Build Coastguard Worker void Allocation::syncAll(RsAllocationUsageType srcLocation) {
153*e1eccf28SAndroid Build Coastguard Worker switch (srcLocation) {
154*e1eccf28SAndroid Build Coastguard Worker case RS_ALLOCATION_USAGE_SCRIPT:
155*e1eccf28SAndroid Build Coastguard Worker case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS:
156*e1eccf28SAndroid Build Coastguard Worker case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE:
157*e1eccf28SAndroid Build Coastguard Worker case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX:
158*e1eccf28SAndroid Build Coastguard Worker case RS_ALLOCATION_USAGE_SHARED:
159*e1eccf28SAndroid Build Coastguard Worker break;
160*e1eccf28SAndroid Build Coastguard Worker default:
161*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Source must be exactly one usage type.");
162*e1eccf28SAndroid Build Coastguard Worker return;
163*e1eccf28SAndroid Build Coastguard Worker }
164*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->AllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation));
165*e1eccf28SAndroid Build Coastguard Worker }
166*e1eccf28SAndroid Build Coastguard Worker
getPointer(size_t * stride)167*e1eccf28SAndroid Build Coastguard Worker void * Allocation::getPointer(size_t *stride) {
168*e1eccf28SAndroid Build Coastguard Worker void *p = nullptr;
169*e1eccf28SAndroid Build Coastguard Worker if (!(mUsage & RS_ALLOCATION_USAGE_SHARED)) {
170*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Allocation does not support USAGE_SHARED.");
171*e1eccf28SAndroid Build Coastguard Worker return nullptr;
172*e1eccf28SAndroid Build Coastguard Worker }
173*e1eccf28SAndroid Build Coastguard Worker
174*e1eccf28SAndroid Build Coastguard Worker // FIXME: decide if lack of getPointer should cause compat mode
175*e1eccf28SAndroid Build Coastguard Worker if (RS::dispatch->AllocationGetPointer == nullptr) {
176*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_RUNTIME_ERROR, "Can't use getPointer on older APIs");
177*e1eccf28SAndroid Build Coastguard Worker return nullptr;
178*e1eccf28SAndroid Build Coastguard Worker }
179*e1eccf28SAndroid Build Coastguard Worker
180*e1eccf28SAndroid Build Coastguard Worker p = RS::dispatch->AllocationGetPointer(mRS->getContext(), getIDSafe(), 0,
181*e1eccf28SAndroid Build Coastguard Worker RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0, stride, sizeof(size_t));
182*e1eccf28SAndroid Build Coastguard Worker if (mRS->getError() != RS_SUCCESS) {
183*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation lock failed");
184*e1eccf28SAndroid Build Coastguard Worker p = nullptr;
185*e1eccf28SAndroid Build Coastguard Worker }
186*e1eccf28SAndroid Build Coastguard Worker return p;
187*e1eccf28SAndroid Build Coastguard Worker }
188*e1eccf28SAndroid Build Coastguard Worker
189*e1eccf28SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
190*e1eccf28SAndroid Build Coastguard Worker //Functions needed for autopadding & unpadding
copyWithPadding(void * ptr,const void * srcPtr,int mSize,int count)191*e1eccf28SAndroid Build Coastguard Worker static void copyWithPadding(void* ptr, const void* srcPtr, int mSize, int count) {
192*e1eccf28SAndroid Build Coastguard Worker int sizeBytesPad = mSize * 4;
193*e1eccf28SAndroid Build Coastguard Worker int sizeBytes = mSize * 3;
194*e1eccf28SAndroid Build Coastguard Worker uint8_t *dst = static_cast<uint8_t *>(ptr);
195*e1eccf28SAndroid Build Coastguard Worker const uint8_t *src = static_cast<const uint8_t *>(srcPtr);
196*e1eccf28SAndroid Build Coastguard Worker for (int i = 0; i < count; i++) {
197*e1eccf28SAndroid Build Coastguard Worker memcpy(dst, src, sizeBytes);
198*e1eccf28SAndroid Build Coastguard Worker dst += sizeBytesPad;
199*e1eccf28SAndroid Build Coastguard Worker src += sizeBytes;
200*e1eccf28SAndroid Build Coastguard Worker }
201*e1eccf28SAndroid Build Coastguard Worker }
202*e1eccf28SAndroid Build Coastguard Worker
copyWithUnPadding(void * ptr,const void * srcPtr,int mSize,int count)203*e1eccf28SAndroid Build Coastguard Worker static void copyWithUnPadding(void* ptr, const void* srcPtr, int mSize, int count) {
204*e1eccf28SAndroid Build Coastguard Worker int sizeBytesPad = mSize * 4;
205*e1eccf28SAndroid Build Coastguard Worker int sizeBytes = mSize * 3;
206*e1eccf28SAndroid Build Coastguard Worker uint8_t *dst = static_cast<uint8_t *>(ptr);
207*e1eccf28SAndroid Build Coastguard Worker const uint8_t *src = static_cast<const uint8_t *>(srcPtr);
208*e1eccf28SAndroid Build Coastguard Worker for (int i = 0; i < count; i++) {
209*e1eccf28SAndroid Build Coastguard Worker memcpy(dst, src, sizeBytes);
210*e1eccf28SAndroid Build Coastguard Worker dst += sizeBytes;
211*e1eccf28SAndroid Build Coastguard Worker src += sizeBytesPad;
212*e1eccf28SAndroid Build Coastguard Worker }
213*e1eccf28SAndroid Build Coastguard Worker }
214*e1eccf28SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
215*e1eccf28SAndroid Build Coastguard Worker
copy1DRangeFrom(uint32_t off,size_t count,const void * data)216*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const void *data) {
217*e1eccf28SAndroid Build Coastguard Worker
218*e1eccf28SAndroid Build Coastguard Worker if(count < 1) {
219*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1.");
220*e1eccf28SAndroid Build Coastguard Worker return;
221*e1eccf28SAndroid Build Coastguard Worker }
222*e1eccf28SAndroid Build Coastguard Worker if((off + count) > mCurrentCount) {
223*e1eccf28SAndroid Build Coastguard Worker ALOGE("Overflow, Available count %u, got %zu at offset %u.", mCurrentCount, count, off);
224*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified");
225*e1eccf28SAndroid Build Coastguard Worker return;
226*e1eccf28SAndroid Build Coastguard Worker }
227*e1eccf28SAndroid Build Coastguard Worker if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
228*e1eccf28SAndroid Build Coastguard Worker size_t eSize = mType->getElement()->getSizeBytes();
229*e1eccf28SAndroid Build Coastguard Worker void *ptr = malloc(eSize * count);
230*e1eccf28SAndroid Build Coastguard Worker copyWithPadding(ptr, data, eSize / 4, count);
231*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
232*e1eccf28SAndroid Build Coastguard Worker count, ptr, count * mType->getElement()->getSizeBytes()));
233*e1eccf28SAndroid Build Coastguard Worker free(ptr);
234*e1eccf28SAndroid Build Coastguard Worker } else {
235*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
236*e1eccf28SAndroid Build Coastguard Worker count, data, count * mType->getElement()->getSizeBytes()));
237*e1eccf28SAndroid Build Coastguard Worker }
238*e1eccf28SAndroid Build Coastguard Worker }
239*e1eccf28SAndroid Build Coastguard Worker
copy1DRangeTo(uint32_t off,size_t count,void * data)240*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy1DRangeTo(uint32_t off, size_t count, void *data) {
241*e1eccf28SAndroid Build Coastguard Worker if(count < 1) {
242*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1.");
243*e1eccf28SAndroid Build Coastguard Worker return;
244*e1eccf28SAndroid Build Coastguard Worker }
245*e1eccf28SAndroid Build Coastguard Worker if((off + count) > mCurrentCount) {
246*e1eccf28SAndroid Build Coastguard Worker ALOGE("Overflow, Available count %u, got %zu at offset %u.", mCurrentCount, count, off);
247*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified");
248*e1eccf28SAndroid Build Coastguard Worker return;
249*e1eccf28SAndroid Build Coastguard Worker }
250*e1eccf28SAndroid Build Coastguard Worker if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
251*e1eccf28SAndroid Build Coastguard Worker size_t eSize = mType->getElement()->getSizeBytes();
252*e1eccf28SAndroid Build Coastguard Worker void *ptr = malloc(eSize * count);
253*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
254*e1eccf28SAndroid Build Coastguard Worker count, ptr, count * mType->getElement()->getSizeBytes()));
255*e1eccf28SAndroid Build Coastguard Worker copyWithUnPadding(data, ptr, eSize / 4, count);
256*e1eccf28SAndroid Build Coastguard Worker free(ptr);
257*e1eccf28SAndroid Build Coastguard Worker } else {
258*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD,
259*e1eccf28SAndroid Build Coastguard Worker count, data, count * mType->getElement()->getSizeBytes()));
260*e1eccf28SAndroid Build Coastguard Worker }
261*e1eccf28SAndroid Build Coastguard Worker }
262*e1eccf28SAndroid Build Coastguard Worker
copy1DRangeFrom(uint32_t off,size_t count,const sp<const Allocation> & data,uint32_t dataOff)263*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy1DRangeFrom(uint32_t off, size_t count, const sp<const Allocation>& data,
264*e1eccf28SAndroid Build Coastguard Worker uint32_t dataOff) {
265*e1eccf28SAndroid Build Coastguard Worker
266*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0,
267*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, mSelectedFace,
268*e1eccf28SAndroid Build Coastguard Worker count, 1, data->getIDSafe(), dataOff, 0,
269*e1eccf28SAndroid Build Coastguard Worker data->mSelectedLOD, data->mSelectedFace));
270*e1eccf28SAndroid Build Coastguard Worker }
271*e1eccf28SAndroid Build Coastguard Worker
copy1DFrom(const void * data)272*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy1DFrom(const void* data) {
273*e1eccf28SAndroid Build Coastguard Worker copy1DRangeFrom(0, mCurrentCount, data);
274*e1eccf28SAndroid Build Coastguard Worker }
275*e1eccf28SAndroid Build Coastguard Worker
copy1DTo(void * data)276*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy1DTo(void* data) {
277*e1eccf28SAndroid Build Coastguard Worker copy1DRangeTo(0, mCurrentCount, data);
278*e1eccf28SAndroid Build Coastguard Worker }
279*e1eccf28SAndroid Build Coastguard Worker
280*e1eccf28SAndroid Build Coastguard Worker
validate2DRange(uint32_t xoff,uint32_t yoff,uint32_t w,uint32_t h)281*e1eccf28SAndroid Build Coastguard Worker void Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) {
282*e1eccf28SAndroid Build Coastguard Worker if (mAdaptedAllocation != nullptr) {
283*e1eccf28SAndroid Build Coastguard Worker
284*e1eccf28SAndroid Build Coastguard Worker } else {
285*e1eccf28SAndroid Build Coastguard Worker if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) {
286*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Updated region larger than allocation.");
287*e1eccf28SAndroid Build Coastguard Worker }
288*e1eccf28SAndroid Build Coastguard Worker }
289*e1eccf28SAndroid Build Coastguard Worker }
290*e1eccf28SAndroid Build Coastguard Worker
copy2DRangeFrom(uint32_t xoff,uint32_t yoff,uint32_t w,uint32_t h,const void * data)291*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
292*e1eccf28SAndroid Build Coastguard Worker const void *data) {
293*e1eccf28SAndroid Build Coastguard Worker validate2DRange(xoff, yoff, w, h);
294*e1eccf28SAndroid Build Coastguard Worker if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
295*e1eccf28SAndroid Build Coastguard Worker size_t eSize = mType->getElement()->getSizeBytes();
296*e1eccf28SAndroid Build Coastguard Worker void *ptr = malloc(eSize * w * h);
297*e1eccf28SAndroid Build Coastguard Worker copyWithPadding(ptr, data, eSize / 4, w * h);
298*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff,
299*e1eccf28SAndroid Build Coastguard Worker yoff, mSelectedLOD, mSelectedFace,
300*e1eccf28SAndroid Build Coastguard Worker w, h, ptr, w * h * mType->getElement()->getSizeBytes(),
301*e1eccf28SAndroid Build Coastguard Worker w * mType->getElement()->getSizeBytes()));
302*e1eccf28SAndroid Build Coastguard Worker free(ptr);
303*e1eccf28SAndroid Build Coastguard Worker } else {
304*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff,
305*e1eccf28SAndroid Build Coastguard Worker yoff, mSelectedLOD, mSelectedFace,
306*e1eccf28SAndroid Build Coastguard Worker w, h, data, w * h * mType->getElement()->getSizeBytes(),
307*e1eccf28SAndroid Build Coastguard Worker w * mType->getElement()->getSizeBytes()));
308*e1eccf28SAndroid Build Coastguard Worker }
309*e1eccf28SAndroid Build Coastguard Worker }
310*e1eccf28SAndroid Build Coastguard Worker
copy2DRangeFrom(uint32_t xoff,uint32_t yoff,uint32_t w,uint32_t h,const sp<const Allocation> & data,uint32_t dataXoff,uint32_t dataYoff)311*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
312*e1eccf28SAndroid Build Coastguard Worker const sp<const Allocation>& data, uint32_t dataXoff, uint32_t dataYoff) {
313*e1eccf28SAndroid Build Coastguard Worker validate2DRange(xoff, yoff, w, h);
314*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff,
315*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, mSelectedFace,
316*e1eccf28SAndroid Build Coastguard Worker w, h, data->getIDSafe(), dataXoff, dataYoff,
317*e1eccf28SAndroid Build Coastguard Worker data->mSelectedLOD, data->mSelectedFace));
318*e1eccf28SAndroid Build Coastguard Worker }
319*e1eccf28SAndroid Build Coastguard Worker
copy2DRangeTo(uint32_t xoff,uint32_t yoff,uint32_t w,uint32_t h,void * data)320*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
321*e1eccf28SAndroid Build Coastguard Worker void* data) {
322*e1eccf28SAndroid Build Coastguard Worker validate2DRange(xoff, yoff, w, h);
323*e1eccf28SAndroid Build Coastguard Worker if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
324*e1eccf28SAndroid Build Coastguard Worker size_t eSize = mType->getElement()->getSizeBytes();
325*e1eccf28SAndroid Build Coastguard Worker void *ptr = malloc(eSize * w * h);
326*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff,
327*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, mSelectedFace, w, h, ptr,
328*e1eccf28SAndroid Build Coastguard Worker w * h * mType->getElement()->getSizeBytes(),
329*e1eccf28SAndroid Build Coastguard Worker w * mType->getElement()->getSizeBytes()));
330*e1eccf28SAndroid Build Coastguard Worker copyWithUnPadding(data, ptr, eSize / 4, w * h);
331*e1eccf28SAndroid Build Coastguard Worker free(ptr);
332*e1eccf28SAndroid Build Coastguard Worker } else {
333*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff,
334*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, mSelectedFace, w, h, data,
335*e1eccf28SAndroid Build Coastguard Worker w * h * mType->getElement()->getSizeBytes(),
336*e1eccf28SAndroid Build Coastguard Worker w * mType->getElement()->getSizeBytes()));
337*e1eccf28SAndroid Build Coastguard Worker }
338*e1eccf28SAndroid Build Coastguard Worker }
339*e1eccf28SAndroid Build Coastguard Worker
copy2DStridedFrom(uint32_t xoff,uint32_t yoff,uint32_t w,uint32_t h,const void * data,size_t stride)340*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
341*e1eccf28SAndroid Build Coastguard Worker const void *data, size_t stride) {
342*e1eccf28SAndroid Build Coastguard Worker validate2DRange(xoff, yoff, w, h);
343*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff,
344*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, mSelectedFace, w, h, data,
345*e1eccf28SAndroid Build Coastguard Worker w * h * mType->getElement()->getSizeBytes(), stride));
346*e1eccf28SAndroid Build Coastguard Worker }
347*e1eccf28SAndroid Build Coastguard Worker
copy2DStridedFrom(const void * data,size_t stride)348*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy2DStridedFrom(const void* data, size_t stride) {
349*e1eccf28SAndroid Build Coastguard Worker copy2DStridedFrom(0, 0, mCurrentDimX, mCurrentDimY, data, stride);
350*e1eccf28SAndroid Build Coastguard Worker }
351*e1eccf28SAndroid Build Coastguard Worker
copy2DStridedTo(uint32_t xoff,uint32_t yoff,uint32_t w,uint32_t h,void * data,size_t stride)352*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h,
353*e1eccf28SAndroid Build Coastguard Worker void *data, size_t stride) {
354*e1eccf28SAndroid Build Coastguard Worker validate2DRange(xoff, yoff, w, h);
355*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff,
356*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, mSelectedFace, w, h, data,
357*e1eccf28SAndroid Build Coastguard Worker w * h * mType->getElement()->getSizeBytes(), stride));
358*e1eccf28SAndroid Build Coastguard Worker }
359*e1eccf28SAndroid Build Coastguard Worker
copy2DStridedTo(void * data,size_t stride)360*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy2DStridedTo(void* data, size_t stride) {
361*e1eccf28SAndroid Build Coastguard Worker copy2DStridedTo(0, 0, mCurrentDimX, mCurrentDimY, data, stride);
362*e1eccf28SAndroid Build Coastguard Worker }
363*e1eccf28SAndroid Build Coastguard Worker
validate3DRange(uint32_t xoff,uint32_t yoff,uint32_t zoff,uint32_t w,uint32_t h,uint32_t d)364*e1eccf28SAndroid Build Coastguard Worker void Allocation::validate3DRange(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w,
365*e1eccf28SAndroid Build Coastguard Worker uint32_t h, uint32_t d) {
366*e1eccf28SAndroid Build Coastguard Worker if (mAdaptedAllocation != nullptr) {
367*e1eccf28SAndroid Build Coastguard Worker
368*e1eccf28SAndroid Build Coastguard Worker } else {
369*e1eccf28SAndroid Build Coastguard Worker if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY) || ((zoff + d) > mCurrentDimZ)) {
370*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Updated region larger than allocation.");
371*e1eccf28SAndroid Build Coastguard Worker }
372*e1eccf28SAndroid Build Coastguard Worker }
373*e1eccf28SAndroid Build Coastguard Worker }
374*e1eccf28SAndroid Build Coastguard Worker
copy3DRangeFrom(uint32_t xoff,uint32_t yoff,uint32_t zoff,uint32_t w,uint32_t h,uint32_t d,const void * data)375*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w,
376*e1eccf28SAndroid Build Coastguard Worker uint32_t h, uint32_t d, const void* data) {
377*e1eccf28SAndroid Build Coastguard Worker validate3DRange(xoff, yoff, zoff, w, h, d);
378*e1eccf28SAndroid Build Coastguard Worker if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
379*e1eccf28SAndroid Build Coastguard Worker size_t eSize = mType->getElement()->getSizeBytes();
380*e1eccf28SAndroid Build Coastguard Worker void *ptr = malloc(eSize * w * h * d);
381*e1eccf28SAndroid Build Coastguard Worker copyWithPadding(ptr, data, eSize / 4, w * h * d);
382*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation3DData(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
383*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, w, h, d, ptr,
384*e1eccf28SAndroid Build Coastguard Worker w * h * d * mType->getElement()->getSizeBytes(),
385*e1eccf28SAndroid Build Coastguard Worker w * mType->getElement()->getSizeBytes()));
386*e1eccf28SAndroid Build Coastguard Worker free(ptr);
387*e1eccf28SAndroid Build Coastguard Worker } else {
388*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation3DData(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
389*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, w, h, d, data,
390*e1eccf28SAndroid Build Coastguard Worker w * h * d * mType->getElement()->getSizeBytes(),
391*e1eccf28SAndroid Build Coastguard Worker w * mType->getElement()->getSizeBytes()));
392*e1eccf28SAndroid Build Coastguard Worker }
393*e1eccf28SAndroid Build Coastguard Worker }
394*e1eccf28SAndroid Build Coastguard Worker
copy3DRangeFrom(uint32_t xoff,uint32_t yoff,uint32_t zoff,uint32_t w,uint32_t h,uint32_t d,const sp<const Allocation> & data,uint32_t dataXoff,uint32_t dataYoff,uint32_t dataZoff)395*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w, uint32_t h, uint32_t d,
396*e1eccf28SAndroid Build Coastguard Worker const sp<const Allocation>& data, uint32_t dataXoff, uint32_t dataYoff, uint32_t dataZoff) {
397*e1eccf28SAndroid Build Coastguard Worker validate3DRange(xoff, yoff, zoff, w, h, d);
398*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->AllocationCopy3DRange(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
399*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, w, h, d, data->getIDSafe(),
400*e1eccf28SAndroid Build Coastguard Worker dataXoff, dataYoff, dataZoff, data->mSelectedLOD));
401*e1eccf28SAndroid Build Coastguard Worker }
402*e1eccf28SAndroid Build Coastguard Worker
copy3DRangeTo(uint32_t xoff,uint32_t yoff,uint32_t zoff,uint32_t w,uint32_t h,uint32_t d,void * data)403*e1eccf28SAndroid Build Coastguard Worker void Allocation::copy3DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w,
404*e1eccf28SAndroid Build Coastguard Worker uint32_t h, uint32_t d, void* data) {
405*e1eccf28SAndroid Build Coastguard Worker validate3DRange(xoff, yoff, zoff, w, h, d);
406*e1eccf28SAndroid Build Coastguard Worker if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) {
407*e1eccf28SAndroid Build Coastguard Worker size_t eSize = mType->getElement()->getSizeBytes();
408*e1eccf28SAndroid Build Coastguard Worker void *ptr = malloc(eSize * w * h * d);
409*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation3DRead(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
410*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, w, h, d, ptr,
411*e1eccf28SAndroid Build Coastguard Worker w * h * d * mType->getElement()->getSizeBytes(),
412*e1eccf28SAndroid Build Coastguard Worker w * mType->getElement()->getSizeBytes()));
413*e1eccf28SAndroid Build Coastguard Worker copyWithUnPadding(data, ptr, eSize / 4, w * h * d);
414*e1eccf28SAndroid Build Coastguard Worker free(ptr);
415*e1eccf28SAndroid Build Coastguard Worker } else {
416*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->Allocation3DRead(mRS->getContext(), getIDSafe(), xoff, yoff, zoff,
417*e1eccf28SAndroid Build Coastguard Worker mSelectedLOD, w, h, d, data,
418*e1eccf28SAndroid Build Coastguard Worker w * h * d * mType->getElement()->getSizeBytes(),
419*e1eccf28SAndroid Build Coastguard Worker w * mType->getElement()->getSizeBytes()));
420*e1eccf28SAndroid Build Coastguard Worker }
421*e1eccf28SAndroid Build Coastguard Worker }
422*e1eccf28SAndroid Build Coastguard Worker
createTyped(const sp<RS> & rs,const sp<const Type> & type,RsAllocationMipmapControl mipmaps,uint32_t usage)423*e1eccf28SAndroid Build Coastguard Worker sp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type,
424*e1eccf28SAndroid Build Coastguard Worker RsAllocationMipmapControl mipmaps, uint32_t usage) {
425*e1eccf28SAndroid Build Coastguard Worker void *id = 0;
426*e1eccf28SAndroid Build Coastguard Worker if (rs->getError() == RS_SUCCESS) {
427*e1eccf28SAndroid Build Coastguard Worker id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mipmaps, usage, 0);
428*e1eccf28SAndroid Build Coastguard Worker }
429*e1eccf28SAndroid Build Coastguard Worker if (id == 0) {
430*e1eccf28SAndroid Build Coastguard Worker rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed");
431*e1eccf28SAndroid Build Coastguard Worker return nullptr;
432*e1eccf28SAndroid Build Coastguard Worker }
433*e1eccf28SAndroid Build Coastguard Worker return new Allocation(id, rs, type, usage);
434*e1eccf28SAndroid Build Coastguard Worker }
435*e1eccf28SAndroid Build Coastguard Worker
createTyped(const sp<RS> & rs,const sp<const Type> & type,RsAllocationMipmapControl mipmaps,uint32_t usage,void * pointer)436*e1eccf28SAndroid Build Coastguard Worker sp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type,
437*e1eccf28SAndroid Build Coastguard Worker RsAllocationMipmapControl mipmaps, uint32_t usage,
438*e1eccf28SAndroid Build Coastguard Worker void *pointer) {
439*e1eccf28SAndroid Build Coastguard Worker void *id = 0;
440*e1eccf28SAndroid Build Coastguard Worker if (rs->getError() == RS_SUCCESS) {
441*e1eccf28SAndroid Build Coastguard Worker id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mipmaps, usage,
442*e1eccf28SAndroid Build Coastguard Worker (uintptr_t)pointer);
443*e1eccf28SAndroid Build Coastguard Worker }
444*e1eccf28SAndroid Build Coastguard Worker if (id == 0) {
445*e1eccf28SAndroid Build Coastguard Worker rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed");
446*e1eccf28SAndroid Build Coastguard Worker return nullptr;
447*e1eccf28SAndroid Build Coastguard Worker }
448*e1eccf28SAndroid Build Coastguard Worker return new Allocation(id, rs, type, usage);
449*e1eccf28SAndroid Build Coastguard Worker }
450*e1eccf28SAndroid Build Coastguard Worker
createTyped(const sp<RS> & rs,const sp<const Type> & type,uint32_t usage)451*e1eccf28SAndroid Build Coastguard Worker sp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type,
452*e1eccf28SAndroid Build Coastguard Worker uint32_t usage) {
453*e1eccf28SAndroid Build Coastguard Worker return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage);
454*e1eccf28SAndroid Build Coastguard Worker }
455*e1eccf28SAndroid Build Coastguard Worker
createSized(const sp<RS> & rs,const sp<const Element> & e,size_t count,uint32_t usage)456*e1eccf28SAndroid Build Coastguard Worker sp<Allocation> Allocation::createSized(const sp<RS>& rs, const sp<const Element>& e,
457*e1eccf28SAndroid Build Coastguard Worker size_t count, uint32_t usage) {
458*e1eccf28SAndroid Build Coastguard Worker Type::Builder b(rs, e);
459*e1eccf28SAndroid Build Coastguard Worker b.setX(count);
460*e1eccf28SAndroid Build Coastguard Worker sp<const Type> t = b.create();
461*e1eccf28SAndroid Build Coastguard Worker
462*e1eccf28SAndroid Build Coastguard Worker return createTyped(rs, t, usage);
463*e1eccf28SAndroid Build Coastguard Worker }
464*e1eccf28SAndroid Build Coastguard Worker
createSized2D(const sp<RS> & rs,const sp<const Element> & e,size_t x,size_t y,uint32_t usage)465*e1eccf28SAndroid Build Coastguard Worker sp<Allocation> Allocation::createSized2D(const sp<RS>& rs, const sp<const Element>& e,
466*e1eccf28SAndroid Build Coastguard Worker size_t x, size_t y, uint32_t usage) {
467*e1eccf28SAndroid Build Coastguard Worker Type::Builder b(rs, e);
468*e1eccf28SAndroid Build Coastguard Worker b.setX(x);
469*e1eccf28SAndroid Build Coastguard Worker b.setY(y);
470*e1eccf28SAndroid Build Coastguard Worker sp<const Type> t = b.create();
471*e1eccf28SAndroid Build Coastguard Worker
472*e1eccf28SAndroid Build Coastguard Worker return createTyped(rs, t, usage);
473*e1eccf28SAndroid Build Coastguard Worker }
474*e1eccf28SAndroid Build Coastguard Worker
ioSendOutput()475*e1eccf28SAndroid Build Coastguard Worker void Allocation::ioSendOutput() {
476*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
477*e1eccf28SAndroid Build Coastguard Worker if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) {
478*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only send buffer if IO_OUTPUT usage specified.");
479*e1eccf28SAndroid Build Coastguard Worker return;
480*e1eccf28SAndroid Build Coastguard Worker }
481*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->AllocationIoSend(mRS->getContext(), getID()));
482*e1eccf28SAndroid Build Coastguard Worker #endif
483*e1eccf28SAndroid Build Coastguard Worker }
484*e1eccf28SAndroid Build Coastguard Worker
ioGetInput()485*e1eccf28SAndroid Build Coastguard Worker void Allocation::ioGetInput() {
486*e1eccf28SAndroid Build Coastguard Worker #ifndef RS_COMPATIBILITY_LIB
487*e1eccf28SAndroid Build Coastguard Worker if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) {
488*e1eccf28SAndroid Build Coastguard Worker mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only get buffer if IO_INPUT usage specified.");
489*e1eccf28SAndroid Build Coastguard Worker return;
490*e1eccf28SAndroid Build Coastguard Worker }
491*e1eccf28SAndroid Build Coastguard Worker tryDispatch(mRS, RS::dispatch->AllocationIoReceive(mRS->getContext(), getID()));
492*e1eccf28SAndroid Build Coastguard Worker #endif
493*e1eccf28SAndroid Build Coastguard Worker }
494