Allocation.cpp revision 10913a5c37ba119bef335320d3e8be25212c05ad
1221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams/* 210913a5c37ba119bef335320d3e8be25212c05adTim Murray * Copyright (C) 2013 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" 1810913a5c37ba119bef335320d3e8be25212c05adTim Murray#include "rsCppInternal.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 6789daad6bae798779e57f252e9da4fe4e62337124Tim Murray if (t != NULL) { 68221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateCacheInfo(t); 69221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 7089daad6bae798779e57f252e9da4fe4e62337124Tim Murray 71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 72221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 7389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 7489daad6bae798779e57f252e9da4fe4e62337124Tim Murray 75221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt32() { 76221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 77221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) { 78221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 79221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 80221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("32 bit integer source does not match allocation type %i", dt); 81221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 82221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 83221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt16() { 84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) { 86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("16 bit integer source does not match allocation type %i", dt); 89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt8() { 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) { 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("8 bit integer source does not match allocation type %i", dt); 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsFloat32() { 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_FLOAT_32) { 102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("32 bit float source does not match allocation type %i", dt); 105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsObject() { 108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_ELEMENT) || 110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_TYPE) || 111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_ALLOCATION) || 112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_SAMPLER) || 113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_SCRIPT) || 114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_MESH) || 115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_FRAGMENT) || 116221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_VERTEX) || 117221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_RASTER) || 118221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_STORE)) { 119221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 120221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 121221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Object source does not match allocation type %i", dt); 122221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 123221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::updateFromNative() { 125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj::updateFromNative(); 126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 127a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray const void *typeID = RS::dispatch->AllocationGetType(mRS->getContext(), getID()); 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(typeID != NULL) { 12969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<const Type> old = mType; 13069cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<Type> t = new Type((void *)typeID, mRS); 131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->updateFromNative(); 132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateCacheInfo(t); 133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = t; 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::syncAll(RsAllocationUsageType srcLocation) { 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch (srcLocation) { 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_SCRIPT: 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS: 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE: 142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX: 14310913a5c37ba119bef335320d3e8be25212c05adTim Murray case RS_ALLOCATION_USAGE_SHARED: 144221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 145221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 14610913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Source must be exactly one usage type."); 14710913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 14910913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation)); 150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioSendOutput() { 1530b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_COMPATIBILITY_LIB 154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) { 15510913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only send buffer if IO_OUTPUT usage specified."); 15610913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 15810913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationIoSend(mRS->getContext(), getID())); 1590b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 162221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::ioGetInput() { 1630b575de8ed0b628d84d256f5846500b0385979bdTim Murray#ifndef RS_COMPATIBILITY_LIB 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) { 16510913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only send buffer if IO_OUTPUT usage specified."); 16610913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 16810913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationIoReceive(mRS->getContext(), getID())); 1690b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 170221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 171221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 172221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::generateMipmaps() { 17310913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationGenerateMipmaps(mRS->getContext(), getID())); 174221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 175221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 1760b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const void *data) { 17769cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 178221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(count < 1) { 17910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1."); 180221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 181221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 182221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if((off + count) > mCurrentCount) { 183221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off); 18410913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified"); 185221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 186221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 187221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 18810913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->Allocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD, 18910913a5c37ba119bef335320d3e8be25212c05adTim Murray count, data, count * mType->getElement()->getSizeBytes())); 190221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 191221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 1920b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeTo(uint32_t off, size_t count, void *data) { 193509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray if(count < 1) { 19410913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1."); 195509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray return; 196509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray } 197509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray if((off + count) > mCurrentCount) { 198509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray ALOGE("Overflow, Available count %zu, got %zu at offset %zu.", mCurrentCount, count, off); 19910913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified"); 200509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray return; 201509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray } 2020b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 20310913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->Allocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD, 20410913a5c37ba119bef335320d3e8be25212c05adTim Murray count, data, count * mType->getElement()->getSizeBytes())); 205509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray} 206509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray 207a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, sp<const Allocation> data, 208a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray uint32_t dataOff) { 20969cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 21010913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0, 21110913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, 21210913a5c37ba119bef335320d3e8be25212c05adTim Murray count, 1, data->getIDSafe(), dataOff, 0, 21310913a5c37ba119bef335320d3e8be25212c05adTim Murray data->mSelectedLOD, data->mSelectedFace)); 214221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 215221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2160b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DFrom(const void* data) { 2170b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray copy1DRangeFrom(0, mCurrentCount, data); 2180b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray} 2190b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 2200b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DTo(void* data) { 2210b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray copy1DRangeTo(0, mCurrentCount, data); 2220b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray} 2230b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 2240b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 225221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) { 226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mAdaptedAllocation != NULL) { 227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 228221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 229221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) { 23010913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Updated region larger than allocation."); 231221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 232221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 233221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 234221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 235221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 2360b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray const void *data) { 237221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams validate2DRange(xoff, yoff, w, h); 23810913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff, 23910913a5c37ba119bef335320d3e8be25212c05adTim Murray yoff, mSelectedLOD, mSelectedFace, 24010913a5c37ba119bef335320d3e8be25212c05adTim Murray w, h, data, w * h * mType->getElement()->getSizeBytes(), 24110913a5c37ba119bef335320d3e8be25212c05adTim Murray w * mType->getElement()->getSizeBytes())); 242221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 243221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 244221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 2450b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray sp<const Allocation> data, uint32_t dataXoff, uint32_t dataYoff) { 246221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams validate2DRange(xoff, yoff, w, h); 24710913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff, 24810913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, 24910913a5c37ba119bef335320d3e8be25212c05adTim Murray w, h, data->getIDSafe(), dataXoff, dataYoff, 25010913a5c37ba119bef335320d3e8be25212c05adTim Murray data->mSelectedLOD, data->mSelectedFace)); 251221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 252221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2537b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murrayvoid Allocation::copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 2547b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray void* data) { 2557b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray validate2DRange(xoff, yoff, w, h); 25610913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, 25710913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, w, h, data, 25810913a5c37ba119bef335320d3e8be25212c05adTim Murray w * h * mType->getElement()->getSizeBytes(), 25910913a5c37ba119bef335320d3e8be25212c05adTim Murray w * mType->getElement()->getSizeBytes())); 2607b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray} 2617b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray 262358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 263358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray const void *data, size_t stride) { 264358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray validate2DRange(xoff, yoff, w, h); 26510913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, 26610913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, w, h, data, 26710913a5c37ba119bef335320d3e8be25212c05adTim Murray w * h * mType->getElement()->getSizeBytes(), stride)); 268358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 269358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 270358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(const void* data, size_t stride) { 271358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray copy2DStridedFrom(0, 0, mCurrentDimX, mCurrentDimY, data, stride); 272358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 273358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 274358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 275358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray void *data, size_t stride) { 276358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray validate2DRange(xoff, yoff, w, h); 27710913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, 27810913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, w, h, data, 27910913a5c37ba119bef335320d3e8be25212c05adTim Murray w * h * mType->getElement()->getSizeBytes(), stride)); 280358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 281358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 282358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(void* data, size_t stride) { 283358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray copy2DStridedTo(0, 0, mCurrentDimX, mCurrentDimY, data, stride); 284358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 285358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 28689daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, 28789daad6bae798779e57f252e9da4fe4e62337124Tim Murray RsAllocationMipmapControl mips, uint32_t usage) { 28810913a5c37ba119bef335320d3e8be25212c05adTim Murray void *id = 0; 28910913a5c37ba119bef335320d3e8be25212c05adTim Murray if (rs->getError() == RS_SUCCESS) { 29010913a5c37ba119bef335320d3e8be25212c05adTim Murray id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 0); 29110913a5c37ba119bef335320d3e8be25212c05adTim Murray } 292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (id == 0) { 29310913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed"); 294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return NULL; 295221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 296221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Allocation(id, rs, type, usage); 297221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 298221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 29989daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, 30089daad6bae798779e57f252e9da4fe4e62337124Tim Murray RsAllocationMipmapControl mips, uint32_t usage, 30189daad6bae798779e57f252e9da4fe4e62337124Tim Murray void *pointer) { 30210913a5c37ba119bef335320d3e8be25212c05adTim Murray void *id = 0; 30310913a5c37ba119bef335320d3e8be25212c05adTim Murray if (rs->getError() == RS_SUCCESS) { 30410913a5c37ba119bef335320d3e8be25212c05adTim Murray id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mips, usage, 30510913a5c37ba119bef335320d3e8be25212c05adTim Murray (uintptr_t)pointer); 30610913a5c37ba119bef335320d3e8be25212c05adTim Murray } 307221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (id == 0) { 30810913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed"); 30910913a5c37ba119bef335320d3e8be25212c05adTim Murray return NULL; 310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Allocation(id, rs, type, usage); 312221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 313221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 31489daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createTyped(sp<RS> rs, sp<const Type> type, 31589daad6bae798779e57f252e9da4fe4e62337124Tim Murray uint32_t usage) { 316221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage); 317221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 318221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 31989daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createSized(sp<RS> rs, sp<const Element> e, 32089daad6bae798779e57f252e9da4fe4e62337124Tim Murray size_t count, uint32_t usage) { 321221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Type::Builder b(rs, e); 322221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams b.setX(count); 32369cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<const Type> t = b.create(); 324221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 325684726cbbd177ee4ee9000e9422058547acd237fTim Murray return createTyped(rs, t, usage); 326684726cbbd177ee4ee9000e9422058547acd237fTim Murray} 327684726cbbd177ee4ee9000e9422058547acd237fTim Murray 32889daad6bae798779e57f252e9da4fe4e62337124Tim Murraysp<Allocation> Allocation::createSized2D(sp<RS> rs, sp<const Element> e, 32989daad6bae798779e57f252e9da4fe4e62337124Tim Murray size_t x, size_t y, uint32_t usage) { 330684726cbbd177ee4ee9000e9422058547acd237fTim Murray Type::Builder b(rs, e); 331684726cbbd177ee4ee9000e9422058547acd237fTim Murray b.setX(x); 332684726cbbd177ee4ee9000e9422058547acd237fTim Murray b.setY(y); 333684726cbbd177ee4ee9000e9422058547acd237fTim Murray sp<const Type> t = b.create(); 334684726cbbd177ee4ee9000e9422058547acd237fTim Murray 335684726cbbd177ee4ee9000e9422058547acd237fTim Murray return createTyped(rs, t, usage); 336221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 337