Allocation.cpp revision b206acefa7ef03e02d3e8e161f8a1493329246b3
1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/* 23522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams * Copyright (C) 2012 The Android Open Source Project 3221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 4221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * you may not use this file except in compliance with the License. 6221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * You may obtain a copy of the License at 7221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 8221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * 10221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * Unless required by applicable law or agreed to in writing, software 11221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * See the License for the specific language governing permissions and 14221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams * limitations under the License. 15221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams */ 16221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 17221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams#include "RenderScript.h" 18b206acefa7ef03e02d3e8e161f8a1493329246b3Tim Murray#include <rs.h> 19221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2069cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsusing namespace android; 219eb7f4b90120ebe4be74343856e86b46495f72dfTim Murrayusing namespace RSC; 22221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 23221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid * Allocation::getIDSafe() const { 24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return getID(); 25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2769cccdf0659a193d6a75420ec745421fb5c436e6Jason Samsvoid Allocation::updateCacheInfo(sp<const Type> t) { 28221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentDimX = t->getX(); 29221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentDimY = t->getY(); 30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentDimZ = t->getZ(); 31221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentCount = mCurrentDimX; 32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mCurrentDimY > 1) { 33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentCount *= mCurrentDimY; 34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mCurrentDimZ > 1) { 36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentCount *= mCurrentDimZ; 37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 4084bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayAllocation::Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage) : 41baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray BaseObj(id, rs), mSelectedY(0), mSelectedZ(0), mSelectedLOD(0), 42baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray mSelectedFace(RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X) { 4369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 44221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT | 45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE | 46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_VERTEX | 47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS | 48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET | 49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_IO_INPUT | 5096267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray RS_ALLOCATION_USAGE_IO_OUTPUT | 5196267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray RS_ALLOCATION_USAGE_SHARED)) != 0) { 52221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Unknown usage specified."); 53221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 553522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) { 56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mWriteAllowed = false; 573522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT | 58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE | 59221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_SCRIPT)) != 0) { 60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Invalid usage combination."); 61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = t; 65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mUsage = usage; 66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 6769cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams if (t.get() != NULL) { 68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateCacheInfo(t); 69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt32() { 73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) { 75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 76221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("32 bit integer source does not match allocation type %i", dt); 78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt16() { 81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) { 83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("16 bit integer source does not match allocation type %i", dt); 86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt8() { 89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) { 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("8 bit integer source does not match allocation type %i", dt); 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsFloat32() { 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_FLOAT_32) { 99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("32 bit float source does not match allocation type %i", dt); 102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsObject() { 105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_ELEMENT) || 107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_TYPE) || 108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_ALLOCATION) || 109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_SAMPLER) || 110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_SCRIPT) || 111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_MESH) || 112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_FRAGMENT) || 113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_VERTEX) || 114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_RASTER) || 115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_STORE)) { 116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 118221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Object source does not match allocation type %i", dt); 119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::updateFromNative() { 122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj::updateFromNative(); 123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 12484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray const void *typeID = rsaAllocationGetType(mRS->getContext(), getID()); 125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(typeID != NULL) { 12669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<const Type> old = mType; 12769cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<Type> t = new Type((void *)typeID, mRS); 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->updateFromNative(); 129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateCacheInfo(t); 130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = t; 131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::syncAll(RsAllocationUsageType srcLocation) { 135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch (srcLocation) { 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_SCRIPT: 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS: 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE: 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX: 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Source must be exactly one usage type."); 143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 14484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray rsAllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation); 145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 146221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioSendOutput() { 148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) { 149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Can only send buffer if IO_OUTPUT usage specified."); 150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 15184bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray rsAllocationIoSend(mRS->getContext(), getID()); 152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioGetInput() { 155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) { 156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Can only send buffer if IO_OUTPUT usage specified."); 157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 15884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray rsAllocationIoReceive(mRS->getContext(), getID()); 159221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::generateMipmaps() { 16284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray rsAllocationGenerateMipmaps(mRS->getContext(), getID()); 163221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 1650b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const void *data) { 16669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(count < 1) { 168221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Count must be >= 1."); 169221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if((off + count) > mCurrentCount) { 172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off); 173221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 1760b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray rsAllocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD, count, data, 1770b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray count * mType->getElement()->getSizeBytes()); 178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 179221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 1800b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeTo(uint32_t off, size_t count, void *data) { 181509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray if(count < 1) { 182509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray ALOGE("Count must be >= 1."); 183509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray return; 184509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray } 185509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray if((off + count) > mCurrentCount) { 186509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off); 187509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray return; 188509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray } 1890b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 1900b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray rsAllocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD, count, data, 1910b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray count * mType->getElement()->getSizeBytes()); 192509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray} 193509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray 194a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, 195a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray uint32_t dataOff) { 19669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 19784bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0, 198221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSelectedLOD, mSelectedFace, 199221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams count, 1, data->getIDSafe(), dataOff, 0, 200221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams data->mSelectedLOD, data->mSelectedFace); 201221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 202221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2030b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DFrom(const void* data) { 2040b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray copy1DRangeFrom(0, mCurrentCount, data); 2050b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray} 2060b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 2070b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DTo(void* data) { 2080b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray copy1DRangeTo(0, mCurrentCount, data); 2090b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray} 2100b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 2110b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 212221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) { 213221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mAdaptedAllocation != NULL) { 214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 216221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) { 217221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Updated region larger than allocation."); 218221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 220221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 2230b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray const void *data) { 224221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams validate2DRange(xoff, yoff, w, h); 22584bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, 226358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray w, h, data, w * h * mType->getElement()->getSizeBytes(), w * mType->getElement()->getSizeBytes()); 227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 2300b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff) { 231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams validate2DRange(xoff, yoff, w, h); 23284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray rsAllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff, 233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mSelectedLOD, mSelectedFace, 234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams w, h, data->getIDSafe(), dataXoff, dataYoff, 235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams data->mSelectedLOD, data->mSelectedFace); 236221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2387b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murrayvoid Allocation::copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 2397b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray void* data) { 2407b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray validate2DRange(xoff, yoff, w, h); 2417b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray rsAllocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, 242358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray w, h, data, w * h * mType->getElement()->getSizeBytes(), w * mType->getElement()->getSizeBytes()); 2437b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray} 2447b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray 245358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 246358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray const void *data, size_t stride) { 247358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray validate2DRange(xoff, yoff, w, h); 248358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray rsAllocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, 249358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray w, h, data, w * h * mType->getElement()->getSizeBytes(), stride); 250358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 251358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 252358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(const void* data, size_t stride) { 253358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray copy2DStridedFrom(0, 0, mCurrentDimX, mCurrentDimY, data, stride); 254358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 255358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 256358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 257358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray void *data, size_t stride) { 258358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray validate2DRange(xoff, yoff, w, h); 259358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray rsAllocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, mSelectedLOD, mSelectedFace, 260358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray w, h, data, w * h * mType->getElement()->getSizeBytes(), stride); 261358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 262358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 263358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(void* data, size_t stride) { 264358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray copy2DStridedTo(0, 0, mCurrentDimX, mCurrentDimY, data, stride); 265358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 266358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 267358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 268221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/* 269221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid resize(int dimX) { 270221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((mType.getY() > 0)|| (mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) { 271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams throw new RSInvalidStateException("Resize only support for 1D allocations at this time."); 272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 273221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.nAllocationResize1D(getID(), dimX); 274221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.finish(); // Necessary because resize is fifoed and update is async. 275221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 276221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int typeID = mRS.nAllocationGetType(getID()); 277221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = new Type(typeID, mRS); 278221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType.updateFromNative(); 279221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateCacheInfo(mType); 280221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 281221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid resize(int dimX, int dimY) { 283221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((mType.getZ() > 0) || mType.hasFaces() || mType.hasMipmaps()) { 284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams throw new RSInvalidStateException( 285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams "Resize only support for 2D allocations at this time."); 286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 287221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mType.getY() == 0) { 288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams throw new RSInvalidStateException( 289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams "Resize only support for 2D allocations at this time."); 290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.nAllocationResize2D(getID(), dimX, dimY); 292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mRS.finish(); // Necessary because resize is fifoed and update is async. 293221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams int typeID = mRS.nAllocationGetType(getID()); 295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = new Type(typeID, mRS); 296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType.updateFromNative(); 297221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateCacheInfo(mType); 298221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 299221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams*/ 300221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 301221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 30284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, 303684726cbbd177ee4ee9000e9422058547acd237fTim Murray RsAllocationMipmapControl mips, uint32_t usage) { 30484bf2b877024aaa154b66e0f2338d54bdabd855aTim Murray void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 0); 305221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (id == 0) { 306221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Allocation creation failed."); 307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 308221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 309221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Allocation(id, rs, type, usage); 310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 31284bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, 313684726cbbd177ee4ee9000e9422058547acd237fTim Murray RsAllocationMipmapControl mips, uint32_t usage, 314684726cbbd177ee4ee9000e9422058547acd237fTim Murray void *pointer) { 315684726cbbd177ee4ee9000e9422058547acd237fTim Murray void *id = rsAllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 316684726cbbd177ee4ee9000e9422058547acd237fTim Murray (uint32_t)pointer); 317221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (id == 0) { 318221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Allocation creation failed."); 319221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Allocation(id, rs, type, usage); 321221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 32384bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, 324684726cbbd177ee4ee9000e9422058547acd237fTim Murray uint32_t usage) { 325221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage); 326221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 327221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 32884bf2b877024aaa154b66e0f2338d54bdabd855aTim Murrayandroid::sp<Allocation> Allocation::createSized(sp<RS> rs, sp<const Element> e, 329684726cbbd177ee4ee9000e9422058547acd237fTim Murray size_t count, uint32_t usage) { 330221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Type::Builder b(rs, e); 331221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams b.setX(count); 33269cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<const Type> t = b.create(); 333221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 334684726cbbd177ee4ee9000e9422058547acd237fTim Murray return createTyped(rs, t, usage); 335684726cbbd177ee4ee9000e9422058547acd237fTim Murray} 336684726cbbd177ee4ee9000e9422058547acd237fTim Murray 337684726cbbd177ee4ee9000e9422058547acd237fTim Murrayandroid::sp<Allocation> Allocation::createSized2D(sp<RS> rs, sp<const Element> e, 338684726cbbd177ee4ee9000e9422058547acd237fTim Murray size_t x, size_t y, uint32_t usage) { 339684726cbbd177ee4ee9000e9422058547acd237fTim Murray Type::Builder b(rs, e); 340684726cbbd177ee4ee9000e9422058547acd237fTim Murray b.setX(x); 341684726cbbd177ee4ee9000e9422058547acd237fTim Murray b.setY(y); 342684726cbbd177ee4ee9000e9422058547acd237fTim Murray sp<const Type> t = b.create(); 343684726cbbd177ee4ee9000e9422058547acd237fTim Murray 344684726cbbd177ee4ee9000e9422058547acd237fTim Murray return createTyped(rs, t, usage); 345221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 346