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