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 20dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::Allocation; 21dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::RSC::sp; 22dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehusing android::Surface; 2309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang 24221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid * Allocation::getIDSafe() const { 25221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return getID(); 26221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 27221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2845768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid Allocation::updateCacheInfo(const sp<const Type>& t) { 29221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentDimX = t->getX(); 30221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentDimY = t->getY(); 31221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentDimZ = t->getZ(); 32221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentCount = mCurrentDimX; 33221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mCurrentDimY > 1) { 34221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentCount *= mCurrentDimY; 35221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 36221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (mCurrentDimZ > 1) { 37221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mCurrentCount *= mCurrentDimZ; 38221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 39221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 40221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 4184bf2b877024aaa154b66e0f2338d54bdabd855aTim MurrayAllocation::Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage) : 42baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray BaseObj(id, rs), mSelectedY(0), mSelectedZ(0), mSelectedLOD(0), 43baca6c3c3d79a324c7976ba873afdded0b6bcfb5Tim Murray mSelectedFace(RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X) { 4469cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 45221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((usage & ~(RS_ALLOCATION_USAGE_SCRIPT | 46221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE | 47221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_VERTEX | 48221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS | 49221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_RENDER_TARGET | 50221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_IO_INPUT | 5196267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray RS_ALLOCATION_USAGE_IO_OUTPUT | 52f82b626e0479ce4a23ebff1fc088e073dcabaa30Jason Sams RS_ALLOCATION_USAGE_OEM | 5396267c2ff0133c20cc5643419a3ed3b1e75fe568Tim Murray RS_ALLOCATION_USAGE_SHARED)) != 0) { 54221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Unknown usage specified."); 55221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 56221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 573522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams if ((usage & RS_ALLOCATION_USAGE_IO_INPUT) != 0) { 58221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mWriteAllowed = false; 593522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams if ((usage & ~(RS_ALLOCATION_USAGE_IO_INPUT | 60221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE | 61221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RS_ALLOCATION_USAGE_SCRIPT)) != 0) { 62221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Invalid usage combination."); 63221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 64221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 65221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 66221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = t; 67221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mUsage = usage; 68e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mAutoPadding = false; 6944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (t != nullptr) { 70221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateCacheInfo(t); 71221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 7289daad6bae798779e57f252e9da4fe4e62337124Tim Murray 73221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 74221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 7589daad6bae798779e57f252e9da4fe4e62337124Tim Murray 76e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangvoid Allocation::validateIsInt64() { 77e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang RsDataType dt = mType->getElement()->getDataType(); 78e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if ((dt == RS_TYPE_SIGNED_64) || (dt == RS_TYPE_UNSIGNED_64)) { 79e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang return; 80e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 81e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang ALOGE("64 bit integer source does not match allocation type %i", dt); 82e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 8389daad6bae798779e57f252e9da4fe4e62337124Tim Murray 84221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt32() { 85221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 86221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_32) || (dt == RS_TYPE_UNSIGNED_32)) { 87221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 88221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 89221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("32 bit integer source does not match allocation type %i", dt); 90221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 91221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 92221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt16() { 93221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 94221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_16) || (dt == RS_TYPE_UNSIGNED_16)) { 95221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 96221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 97221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("16 bit integer source does not match allocation type %i", dt); 98221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 99221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 100221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsInt8() { 101221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 102221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_SIGNED_8) || (dt == RS_TYPE_UNSIGNED_8)) { 103221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 104221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 105221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("8 bit integer source does not match allocation type %i", dt); 106221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 107221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 108221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsFloat32() { 109221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 110221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (dt == RS_TYPE_FLOAT_32) { 111221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 112221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 113221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("32 bit float source does not match allocation type %i", dt); 114221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 115221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 116e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangvoid Allocation::validateIsFloat64() { 117e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang RsDataType dt = mType->getElement()->getDataType(); 118e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (dt == RS_TYPE_FLOAT_64) { 119e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang return; 120e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 121e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang ALOGE("64 bit float source does not match allocation type %i", dt); 122e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 123e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 124221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validateIsObject() { 125221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams RsDataType dt = mType->getElement()->getDataType(); 126221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if ((dt == RS_TYPE_ELEMENT) || 127221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_TYPE) || 128221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_ALLOCATION) || 129221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_SAMPLER) || 130221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_SCRIPT) || 131221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_MESH) || 132221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_FRAGMENT) || 133221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_VERTEX) || 134221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_RASTER) || 135221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams (dt == RS_TYPE_PROGRAM_STORE)) { 136221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 137221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 138221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams ALOGE("Object source does not match allocation type %i", dt); 139221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 140221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 141221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::updateFromNative() { 142221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams BaseObj::updateFromNative(); 143221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 144a423096c0d49e5cfe13a400b4323a76f89c6885cTim Murray const void *typeID = RS::dispatch->AllocationGetType(mRS->getContext(), getID()); 14544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if(typeID != nullptr) { 14669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<Type> t = new Type((void *)typeID, mRS); 147221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams t->updateFromNative(); 148221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams updateCacheInfo(t); 149221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams mType = t; 150221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 151221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 152221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 153221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::syncAll(RsAllocationUsageType srcLocation) { 154221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams switch (srcLocation) { 155221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_SCRIPT: 156221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_CONSTANTS: 157221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE: 158221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams case RS_ALLOCATION_USAGE_GRAPHICS_VERTEX: 15910913a5c37ba119bef335320d3e8be25212c05adTim Murray case RS_ALLOCATION_USAGE_SHARED: 160221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams break; 161221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams default: 16210913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Source must be exactly one usage type."); 16310913a5c37ba119bef335320d3e8be25212c05adTim Murray return; 164221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 16510913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationSyncAll(mRS->getContext(), getIDSafe(), srcLocation)); 166221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 167221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 168b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Samsvoid * Allocation::getPointer(size_t *stride) { 16944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes void *p = nullptr; 170b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams if (!(mUsage & RS_ALLOCATION_USAGE_SHARED)) { 171b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Allocation does not support USAGE_SHARED."); 17244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 173b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams } 174b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams 175b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams // FIXME: decide if lack of getPointer should cause compat mode 17644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (RS::dispatch->AllocationGetPointer == nullptr) { 177b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams mRS->throwError(RS_ERROR_RUNTIME_ERROR, "Can't use getPointer on older APIs"); 17844bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 179b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams } 180b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams 181b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams p = RS::dispatch->AllocationGetPointer(mRS->getContext(), getIDSafe(), 0, 18294280f817b502caf0b4e40cbcbe300f5178b7473Miao Wang RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0, stride, sizeof(size_t)); 183b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams if (mRS->getError() != RS_SUCCESS) { 184b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams mRS->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation lock failed"); 18544bef6fba6244292b751387f3d6c31cca96c28adChris Wailes p = nullptr; 186b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams } 187b8a94e26c0a5e8f58d5b6ed04e46b411e95b77a4Jason Sams return p; 188221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 189221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 190e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang// --------------------------------------------------------------------------- 191e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang//Functions needed for autopadding & unpadding 192e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangstatic void copyWithPadding(void* ptr, const void* srcPtr, int mSize, int count) { 193e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang int sizeBytesPad = mSize * 4; 194e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang int sizeBytes = mSize * 3; 195e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang uint8_t *dst = static_cast<uint8_t *>(ptr); 196e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang const uint8_t *src = static_cast<const uint8_t *>(srcPtr); 197e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang for (int i = 0; i < count; i++) { 198e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang memcpy(dst, src, sizeBytes); 199e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang dst += sizeBytesPad; 200e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang src += sizeBytes; 201e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 202e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 203e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 204e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangstatic void copyWithUnPadding(void* ptr, const void* srcPtr, int mSize, int count) { 205e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang int sizeBytesPad = mSize * 4; 206e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang int sizeBytes = mSize * 3; 207e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang uint8_t *dst = static_cast<uint8_t *>(ptr); 208e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang const uint8_t *src = static_cast<const uint8_t *>(srcPtr); 209e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang for (int i = 0; i < count; i++) { 210e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang memcpy(dst, src, sizeBytes); 211e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang dst += sizeBytes; 212e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang src += sizeBytesPad; 213e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 214e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 215e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang// --------------------------------------------------------------------------- 216e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang 2170b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const void *data) { 21869cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 219221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if(count < 1) { 22010913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1."); 221221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 222221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 223221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if((off + count) > mCurrentCount) { 224e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray ALOGE("Overflow, Available count %u, got %zu at offset %u.", mCurrentCount, count, off); 22510913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified"); 226221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return; 227221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 228e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) { 229e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang size_t eSize = mType->getElement()->getSizeBytes(); 230e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang void *ptr = malloc(eSize * count); 231e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang copyWithPadding(ptr, data, eSize / 4, count); 232e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD, 233e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang count, ptr, count * mType->getElement()->getSizeBytes())); 234e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang free(ptr); 235e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } else { 236e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation1DData(mRS->getContext(), getIDSafe(), off, mSelectedLOD, 237e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang count, data, count * mType->getElement()->getSizeBytes())); 238e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 239221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 240221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2410b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DRangeTo(uint32_t off, size_t count, void *data) { 242509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray if(count < 1) { 24310913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Count must be >= 1."); 244509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray return; 245509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray } 246509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray if((off + count) > mCurrentCount) { 247e195a3f57ace3b66d313a6ee88c6e93d5c9d87f4Tim Murray ALOGE("Overflow, Available count %u, got %zu at offset %u.", mCurrentCount, count, off); 24810913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Invalid copy specified"); 249509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray return; 250509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray } 251e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) { 252e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang size_t eSize = mType->getElement()->getSizeBytes(); 253e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang void *ptr = malloc(eSize * count); 254e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD, 255e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang count, ptr, count * mType->getElement()->getSizeBytes())); 256e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang copyWithUnPadding(data, ptr, eSize / 4, count); 257e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang free(ptr); 258e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } else { 259e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation1DRead(mRS->getContext(), getIDSafe(), off, mSelectedLOD, 260e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang count, data, count * mType->getElement()->getSizeBytes())); 261e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 262509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray} 263509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray 26445768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehvoid Allocation::copy1DRangeFrom(uint32_t off, size_t count, const sp<const Allocation>& data, 265a4cbc2b0cf0f6fbdb21e84a3e17585eda1885e3eTim Murray uint32_t dataOff) { 26669cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams 26710913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), off, 0, 26810913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, 26910913a5c37ba119bef335320d3e8be25212c05adTim Murray count, 1, data->getIDSafe(), dataOff, 0, 27010913a5c37ba119bef335320d3e8be25212c05adTim Murray data->mSelectedLOD, data->mSelectedFace)); 271221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 272221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 2730b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DFrom(const void* data) { 2740b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray copy1DRangeFrom(0, mCurrentCount, data); 2750b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray} 2760b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 2770b93e30c8c64fb2f985218adfaceff777f62a42fTim Murrayvoid Allocation::copy1DTo(void* data) { 2780b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray copy1DRangeTo(0, mCurrentCount, data); 2790b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray} 2800b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 2810b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray 282221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h) { 28344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (mAdaptedAllocation != nullptr) { 284221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 285221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } else { 286221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY)) { 28710913a5c37ba119bef335320d3e8be25212c05adTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Updated region larger than allocation."); 288221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 289221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 290221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 291221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 292221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 2930b93e30c8c64fb2f985218adfaceff777f62a42fTim Murray const void *data) { 294221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams validate2DRange(xoff, yoff, w, h); 295e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) { 296e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang size_t eSize = mType->getElement()->getSizeBytes(); 297e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang void *ptr = malloc(eSize * w * h); 298e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang copyWithPadding(ptr, data, eSize / 4, w * h); 299e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff, 300e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang yoff, mSelectedLOD, mSelectedFace, 301e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w, h, ptr, w * h * mType->getElement()->getSizeBytes(), 302e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * mType->getElement()->getSizeBytes())); 303e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang free(ptr); 304e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } else { 305e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff, 306e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang yoff, mSelectedLOD, mSelectedFace, 307e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w, h, data, w * h * mType->getElement()->getSizeBytes(), 308e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * mType->getElement()->getSizeBytes())); 309e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 310221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 311221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 312221a4b17cda03916a0599628fcbb5f48605a0e5aJason Samsvoid Allocation::copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 31345768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsieh const sp<const Allocation>& data, uint32_t dataXoff, uint32_t dataYoff) { 314221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams validate2DRange(xoff, yoff, w, h); 31510913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->AllocationCopy2DRange(mRS->getContext(), getIDSafe(), xoff, yoff, 31610913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, 31710913a5c37ba119bef335320d3e8be25212c05adTim Murray w, h, data->getIDSafe(), dataXoff, dataYoff, 31810913a5c37ba119bef335320d3e8be25212c05adTim Murray data->mSelectedLOD, data->mSelectedFace)); 319221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 320221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 3217b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murrayvoid Allocation::copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 3227b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray void* data) { 3237b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray validate2DRange(xoff, yoff, w, h); 324e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) { 325e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang size_t eSize = mType->getElement()->getSizeBytes(); 326e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang void *ptr = malloc(eSize * w * h); 327e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, 328e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mSelectedLOD, mSelectedFace, w, h, ptr, 329e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * h * mType->getElement()->getSizeBytes(), 330e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * mType->getElement()->getSizeBytes())); 331e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang copyWithUnPadding(data, ptr, eSize / 4, w * h); 332e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang free(ptr); 333e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } else { 334e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, 335e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mSelectedLOD, mSelectedFace, w, h, data, 336e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * h * mType->getElement()->getSizeBytes(), 337e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * mType->getElement()->getSizeBytes())); 338e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 3397b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray} 3407b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray 341358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 342358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray const void *data, size_t stride) { 343358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray validate2DRange(xoff, yoff, w, h); 34410913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->Allocation2DData(mRS->getContext(), getIDSafe(), xoff, yoff, 34510913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, w, h, data, 34610913a5c37ba119bef335320d3e8be25212c05adTim Murray w * h * mType->getElement()->getSizeBytes(), stride)); 347358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 348358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 349358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedFrom(const void* data, size_t stride) { 350358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray copy2DStridedFrom(0, 0, mCurrentDimX, mCurrentDimY, data, stride); 351358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 352358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 353358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 354358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray void *data, size_t stride) { 355358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray validate2DRange(xoff, yoff, w, h); 35610913a5c37ba119bef335320d3e8be25212c05adTim Murray tryDispatch(mRS, RS::dispatch->Allocation2DRead(mRS->getContext(), getIDSafe(), xoff, yoff, 35710913a5c37ba119bef335320d3e8be25212c05adTim Murray mSelectedLOD, mSelectedFace, w, h, data, 35810913a5c37ba119bef335320d3e8be25212c05adTim Murray w * h * mType->getElement()->getSizeBytes(), stride)); 359358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 360358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 361358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::copy2DStridedTo(void* data, size_t stride) { 362358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray copy2DStridedTo(0, 0, mCurrentDimX, mCurrentDimY, data, stride); 363358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 364358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 3659d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murrayvoid Allocation::validate3DRange(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w, 3669d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray uint32_t h, uint32_t d) { 36744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes if (mAdaptedAllocation != nullptr) { 3689d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray 3699d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray } else { 3709d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray if (((xoff + w) > mCurrentDimX) || ((yoff + h) > mCurrentDimY) || ((zoff + d) > mCurrentDimZ)) { 3719d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Updated region larger than allocation."); 3729d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray } 3739d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray } 3749d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray} 3759d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray 3769d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murrayvoid Allocation::copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w, 3779d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray uint32_t h, uint32_t d, const void* data) { 3789d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray validate3DRange(xoff, yoff, zoff, w, h, d); 379e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) { 380e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang size_t eSize = mType->getElement()->getSizeBytes(); 381e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang void *ptr = malloc(eSize * w * h * d); 382e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang copyWithPadding(ptr, data, eSize / 4, w * h * d); 383e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation3DData(mRS->getContext(), getIDSafe(), xoff, yoff, zoff, 384e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mSelectedLOD, w, h, d, ptr, 385e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * h * d * mType->getElement()->getSizeBytes(), 386e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * mType->getElement()->getSizeBytes())); 387e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang free(ptr); 388e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } else { 389e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation3DData(mRS->getContext(), getIDSafe(), xoff, yoff, zoff, 390e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mSelectedLOD, w, h, d, data, 391e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * h * d * mType->getElement()->getSizeBytes(), 392e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * mType->getElement()->getSizeBytes())); 393e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 3949d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray} 3959d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray 3969d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murrayvoid Allocation::copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w, uint32_t h, uint32_t d, 39745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsieh const sp<const Allocation>& data, uint32_t dataXoff, uint32_t dataYoff, uint32_t dataZoff) { 398e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang validate3DRange(xoff, yoff, zoff, w, h, d); 3999d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray tryDispatch(mRS, RS::dispatch->AllocationCopy3DRange(mRS->getContext(), getIDSafe(), xoff, yoff, zoff, 4009d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray mSelectedLOD, w, h, d, data->getIDSafe(), 4019d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray dataXoff, dataYoff, dataZoff, data->mSelectedLOD)); 4029d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray} 4039d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray 404e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wangvoid Allocation::copy3DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w, 405e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang uint32_t h, uint32_t d, void* data) { 406e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang validate3DRange(xoff, yoff, zoff, w, h, d); 407e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang if (mAutoPadding && (mType->getElement()->getVectorSize() == 3)) { 408e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang size_t eSize = mType->getElement()->getSizeBytes(); 409e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang void *ptr = malloc(eSize * w * h * d); 410e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation3DRead(mRS->getContext(), getIDSafe(), xoff, yoff, zoff, 411e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mSelectedLOD, w, h, d, ptr, 412e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * h * d * mType->getElement()->getSizeBytes(), 413e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * mType->getElement()->getSizeBytes())); 414e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang copyWithUnPadding(data, ptr, eSize / 4, w * h * d); 415e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang free(ptr); 416e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } else { 417e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang tryDispatch(mRS, RS::dispatch->Allocation3DRead(mRS->getContext(), getIDSafe(), xoff, yoff, zoff, 418e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang mSelectedLOD, w, h, d, data, 419e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * h * d * mType->getElement()->getSizeBytes(), 420e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang w * mType->getElement()->getSizeBytes())); 421e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang } 422e5428e661ce6f9d24f838cab0a8fb0fa8c76dbcaMiao Wang} 4239d24ae621bdfdaf09406b099a2ae055e33d1089aTim Murray 42445768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type, 4258f615d682f9e7e2cd4de2e4478e0e76fc359922cStephen Hines RsAllocationMipmapControl mipmaps, uint32_t usage) { 42610913a5c37ba119bef335320d3e8be25212c05adTim Murray void *id = 0; 42710913a5c37ba119bef335320d3e8be25212c05adTim Murray if (rs->getError() == RS_SUCCESS) { 4288f615d682f9e7e2cd4de2e4478e0e76fc359922cStephen Hines id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mipmaps, usage, 0); 42910913a5c37ba119bef335320d3e8be25212c05adTim Murray } 430221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (id == 0) { 43110913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed"); 43244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 433221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 434221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Allocation(id, rs, type, usage); 435221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 436221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 43745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type, 4388f615d682f9e7e2cd4de2e4478e0e76fc359922cStephen Hines RsAllocationMipmapControl mipmaps, uint32_t usage, 43989daad6bae798779e57f252e9da4fe4e62337124Tim Murray void *pointer) { 44010913a5c37ba119bef335320d3e8be25212c05adTim Murray void *id = 0; 44110913a5c37ba119bef335320d3e8be25212c05adTim Murray if (rs->getError() == RS_SUCCESS) { 4428f615d682f9e7e2cd4de2e4478e0e76fc359922cStephen Hines id = RS::dispatch->AllocationCreateTyped(rs->getContext(), type->getID(), mipmaps, usage, 44310913a5c37ba119bef335320d3e8be25212c05adTim Murray (uintptr_t)pointer); 44410913a5c37ba119bef335320d3e8be25212c05adTim Murray } 445221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams if (id == 0) { 44610913a5c37ba119bef335320d3e8be25212c05adTim Murray rs->throwError(RS_ERROR_RUNTIME_ERROR, "Allocation creation failed"); 44744bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 448221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams } 449221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return new Allocation(id, rs, type, usage); 450221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 451221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 45245768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createTyped(const sp<RS>& rs, const sp<const Type>& type, 45389daad6bae798779e57f252e9da4fe4e62337124Tim Murray uint32_t usage) { 454221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams return createTyped(rs, type, RS_ALLOCATION_MIPMAP_NONE, usage); 455221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 456221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 45745768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createSized(const sp<RS>& rs, const sp<const Element>& e, 45889daad6bae798779e57f252e9da4fe4e62337124Tim Murray size_t count, uint32_t usage) { 459221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams Type::Builder b(rs, e); 460221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams b.setX(count); 46169cccdf0659a193d6a75420ec745421fb5c436e6Jason Sams sp<const Type> t = b.create(); 462221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams 463684726cbbd177ee4ee9000e9422058547acd237fTim Murray return createTyped(rs, t, usage); 464684726cbbd177ee4ee9000e9422058547acd237fTim Murray} 465684726cbbd177ee4ee9000e9422058547acd237fTim Murray 46645768e1663714702c0c2b7adf14fdbd80dae71f5Chih-Hung Hsiehsp<Allocation> Allocation::createSized2D(const sp<RS>& rs, const sp<const Element>& e, 46789daad6bae798779e57f252e9da4fe4e62337124Tim Murray size_t x, size_t y, uint32_t usage) { 468684726cbbd177ee4ee9000e9422058547acd237fTim Murray Type::Builder b(rs, e); 469684726cbbd177ee4ee9000e9422058547acd237fTim Murray b.setX(x); 470684726cbbd177ee4ee9000e9422058547acd237fTim Murray b.setY(y); 471684726cbbd177ee4ee9000e9422058547acd237fTim Murray sp<const Type> t = b.create(); 472684726cbbd177ee4ee9000e9422058547acd237fTim Murray 473684726cbbd177ee4ee9000e9422058547acd237fTim Murray return createTyped(rs, t, usage); 474221a4b17cda03916a0599628fcbb5f48605a0e5aJason Sams} 47509d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang 47609d2dd26af70a16de928e7450ef500a61c5b810aMiao Wangvoid Allocation::ioSendOutput() { 47709d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#ifndef RS_COMPATIBILITY_LIB 47809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) { 47909d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only send buffer if IO_OUTPUT usage specified."); 48009d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang return; 48109d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang } 48209d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang tryDispatch(mRS, RS::dispatch->AllocationIoSend(mRS->getContext(), getID())); 48309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#endif 48409d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang} 48509d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang 48609d2dd26af70a16de928e7450ef500a61c5b810aMiao Wangvoid Allocation::ioGetInput() { 48709d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#ifndef RS_COMPATIBILITY_LIB 48809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) { 48909d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only get buffer if IO_INPUT usage specified."); 49009d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang return; 49109d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang } 49209d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang tryDispatch(mRS, RS::dispatch->AllocationIoReceive(mRS->getContext(), getID())); 49309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#endif 49409d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang} 49509d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang 49662237219e567b9f972c86e7ca4e96f9b3d5ad4deMiao Wang#ifndef RS_COMPATIBILITY_LIB 49709d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#include <gui/Surface.h> 49809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang 499dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehsp<Surface> Allocation::getSurface() { 50009d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang if ((mUsage & RS_ALLOCATION_USAGE_IO_INPUT) == 0) { 50109d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only get Surface if IO_INPUT usage specified."); 50209d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang return nullptr; 50309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang } 504e9d41e527fd3320f69c9534a04a10fead4b88229Miao Wang ANativeWindow *anw = (ANativeWindow *)RS::dispatch->AllocationGetSurface(mRS->getContext(), 505e9d41e527fd3320f69c9534a04a10fead4b88229Miao Wang getID()); 506e9d41e527fd3320f69c9534a04a10fead4b88229Miao Wang sp<Surface> surface(static_cast<Surface*>(anw)); 507e9d41e527fd3320f69c9534a04a10fead4b88229Miao Wang return surface; 50809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang} 50909d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang 510dfcfabfccad8a8f2f42f83081638c7e5c9bfb4b9Chih-Hung Hsiehvoid Allocation::setSurface(const sp<Surface>& s) { 51109d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang if ((mUsage & RS_ALLOCATION_USAGE_IO_OUTPUT) == 0) { 51209d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang mRS->throwError(RS_ERROR_INVALID_PARAMETER, "Can only set Surface if IO_OUTPUT usage specified."); 51309d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang return; 51409d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang } 51509d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang tryDispatch(mRS, RS::dispatch->AllocationSetSurface(mRS->getContext(), getID(), 51609d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang static_cast<ANativeWindow *>(s.get()))); 51709d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang} 51809d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang 51909d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang#endif 52009d2dd26af70a16de928e7450ef500a61c5b810aMiao Wang 521