1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2bc0ca6ba4e31239bf77060578d0bdf1a10e04168Jason Sams * Copyright (C) 2013 The Android Open Source Project 3326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 4326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * you may not use this file except in compliance with the License. 6326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * You may obtain a copy of the License at 7326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 8326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * 10326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Unless required by applicable law or agreed to in writing, software 11326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * See the License for the specific language governing permissions and 14326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * limitations under the License. 15326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams */ 16326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1777d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#include "rsContext.h" 184edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsAllocation.h" 194edf030cbb7c6ac08dc563335c2af73c20f6e2e5Alex Sakhartchouk#include "rsAdapter.h" 20eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams#include "rs_hal.h" 21eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams 22b0934b67b95cc27e2358c2aa4db5f7c1067c8f9bStephen Hines#if !defined(RS_SERVER) && !defined(RS_COMPATIBILITY_LIB) 237ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams#include "system/window.h" 2458fd6a5f10480551786739280d56dfa620c80b39Andy McFadden#include "gui/GLConsumer.h" 250b575de8ed0b628d84d256f5846500b0385979bdTim Murray#endif 2639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 28326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 29326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 30a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex SakhartchoukAllocation::Allocation(Context *rsc, const Type *type, uint32_t usages, 31179e9a457095fea4c9e6d366c269754b882d05ddJason Sams RsAllocationMipmapControl mc, void * ptr) 32a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk : ObjectBase(rsc) { 33fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 34eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams memset(&mHal, 0, sizeof(mHal)); 35eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mHal.state.mipmapControl = RS_ALLOCATION_MIPMAP_NONE; 36bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.usageFlags = usages; 37bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.mipmapControl = mc; 382e1a94df812f0caa42ff24eaefeba8f90fbdf1acTim Murray mHal.state.userProvidedPtr = ptr; 39366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 40064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk setType(type); 41eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams updateCache(); 42fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams} 43fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 4434689388556747b52c3c2f1c894929fb44580898Tim Murrayvoid Allocation::operator delete(void* ptr) { 4534689388556747b52c3c2f1c894929fb44580898Tim Murray if (ptr) { 4634689388556747b52c3c2f1c894929fb44580898Tim Murray Allocation *a = (Allocation*) ptr; 4734689388556747b52c3c2f1c894929fb44580898Tim Murray a->getContext()->mHal.funcs.freeRuntimeMem(ptr); 4834689388556747b52c3c2f1c894929fb44580898Tim Murray } 4934689388556747b52c3c2f1c894929fb44580898Tim Murray} 5034689388556747b52c3c2f1c894929fb44580898Tim Murray 51eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason SamsAllocation * Allocation::createAllocation(Context *rsc, const Type *type, uint32_t usages, 52179e9a457095fea4c9e6d366c269754b882d05ddJason Sams RsAllocationMipmapControl mc, void * ptr) { 5334689388556747b52c3c2f1c894929fb44580898Tim Murray // Allocation objects must use allocator specified by the driver 5434689388556747b52c3c2f1c894929fb44580898Tim Murray void* allocMem = rsc->mHal.funcs.allocRuntimeMem(sizeof(Allocation), 0); 5534689388556747b52c3c2f1c894929fb44580898Tim Murray 5634689388556747b52c3c2f1c894929fb44580898Tim Murray if (!allocMem) { 5734689388556747b52c3c2f1c894929fb44580898Tim Murray rsc->setError(RS_ERROR_FATAL_DRIVER, "Couldn't allocate memory for Allocation"); 5834689388556747b52c3c2f1c894929fb44580898Tim Murray return NULL; 5934689388556747b52c3c2f1c894929fb44580898Tim Murray } 6034689388556747b52c3c2f1c894929fb44580898Tim Murray 6134689388556747b52c3c2f1c894929fb44580898Tim Murray Allocation *a = new (allocMem) Allocation(rsc, type, usages, mc, ptr); 62fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 63eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (!rsc->mHal.funcs.allocation.init(rsc, a, type->getElement()->getHasReferences())) { 64eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->setError(RS_ERROR_FATAL_DRIVER, "Allocation::Allocation, alloc failure"); 65eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams delete a; 66eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return NULL; 67eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 687ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 69eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return a; 70bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams} 71fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 72bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsvoid Allocation::updateCache() { 73064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk const Type *type = mHal.state.type; 74a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams mHal.state.yuv = type->getDimYuv(); 75bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasFaces = type->getDimFaces(); 76bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasMipmaps = type->getDimLOD(); 77bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.elementSizeBytes = type->getElementSizeBytes(); 78bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasReferences = mHal.state.type->getElement()->getHasReferences(); 79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 80326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 81afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation::~Allocation() { 82c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams freeChildrenUnlocked(); 83eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mRSC->mHal.funcs.allocation.destroy(mRSC, this); 84326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 86366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::syncAll(Context *rsc, RsAllocationUsageType src) { 87eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.syncAll(rsc, this, src); 88cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams} 89cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams 904b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod, 916ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines uint32_t count, const void *data, size_t sizeBytes) { 926ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const size_t eSize = mHal.state.type->getElementSizeBytes(); 939397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 94eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if ((count * eSize) != sizeBytes) { 956ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines ALOGE("Allocation::subData called with mismatched size expected %zu, got %zu", 96eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams (count * eSize), sizeBytes); 97bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type->dumpLOGV("type info"); 989397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams return; 999397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 100e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 101eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.data1D(rsc, this, xoff, lod, count, data, sizeBytes); 102eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1054b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, 106358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray uint32_t w, uint32_t h, const void *data, size_t sizeBytes, size_t stride) { 107358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray rsc->mHal.funcs.allocation.data2D(rsc, this, xoff, yoff, lod, face, w, h, data, sizeBytes, stride); 108eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 111236385b73f21ae65e756b9cb5738f1514d95ea3eJason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, 1123bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t lod, 1133bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes, size_t stride) { 1143bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams rsc->mHal.funcs.allocation.data3D(rsc, this, xoff, yoff, zoff, lod, w, h, d, data, sizeBytes, stride); 1153bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams sendDirty(rsc); 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 118807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid Allocation::read(Context *rsc, uint32_t xoff, uint32_t lod, 119358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray uint32_t count, void *data, size_t sizeBytes) { 120807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams const size_t eSize = mHal.state.type->getElementSizeBytes(); 121807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams 122807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams if ((count * eSize) != sizeBytes) { 123807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams ALOGE("Allocation::read called with mismatched size expected %zu, got %zu", 124807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams (count * eSize), sizeBytes); 125807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams mHal.state.type->dumpLOGV("type info"); 126807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams return; 127807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams } 128807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams 129807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams rsc->mHal.funcs.allocation.read1D(rsc, this, xoff, lod, count, data, sizeBytes); 130807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams} 131807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams 132807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid Allocation::read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, 1333bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t w, uint32_t h, void *data, size_t sizeBytes, size_t stride) { 134807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams const size_t eSize = mHal.state.elementSizeBytes; 135807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams const size_t lineSize = eSize * w; 1363bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams if (!stride) { 1373bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams stride = lineSize; 1383bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams } else { 1393bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams if ((lineSize * h) != sizeBytes) { 1403bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams ALOGE("Allocation size mismatch, expected %zu, got %zu", (lineSize * h), sizeBytes); 1413bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams rsAssert(!"Allocation::read called with mismatched size"); 1423bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams return; 1433bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams } 144807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams } 145807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams 1463bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams rsc->mHal.funcs.allocation.read2D(rsc, this, xoff, yoff, lod, face, w, h, data, sizeBytes, stride); 147358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray} 148358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 1493bbc0fd40264ddae1592706d9023865b7b3e3195Jason Samsvoid Allocation::read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, 1503bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes, size_t stride) { 151358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray const size_t eSize = mHal.state.elementSizeBytes; 152358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray const size_t lineSize = eSize * w; 153358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray if (!stride) { 154358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray stride = lineSize; 155358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray } 156358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray 1573bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams rsc->mHal.funcs.allocation.read3D(rsc, this, xoff, yoff, zoff, lod, w, h, d, data, sizeBytes, stride); 158807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams 159807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams} 160807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams 1614b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, const void *data, 1626ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines uint32_t cIdx, size_t sizeBytes) { 1636ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines size_t eSize = mHal.state.elementSizeBytes; 1645f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 165bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (cIdx >= mHal.state.type->getElement()->getFieldCount()) { 166af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData component %i out of range.", cIdx); 1675f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); 1685f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1695f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1705f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 171a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams if (x >= mHal.drvState.lod[0].dimX) { 172af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData X offset %i out of range.", x); 1735f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 1745f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1755f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1765f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 177bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element * e = mHal.state.type->getElement()->getField(cIdx); 178769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx); 179769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk if (sizeBytes != e->getSizeBytes() * elemArraySize) { 1806ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes()); 1815f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); 1825f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1835f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1845f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 185eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.elementData1D(rsc, this, x, data, cIdx, sizeBytes); 186eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 1875f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 1885f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 1894b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, uint32_t y, 1906ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const void *data, uint32_t cIdx, size_t sizeBytes) { 1916ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines size_t eSize = mHal.state.elementSizeBytes; 1925f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 193a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams if (x >= mHal.drvState.lod[0].dimX) { 194af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData X offset %i out of range.", x); 1955f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 1965f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1975f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1985f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 199a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams if (y >= mHal.drvState.lod[0].dimY) { 200af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData X offset %i out of range.", x); 2015f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 2025f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 2035f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 2045f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 205bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (cIdx >= mHal.state.type->getElement()->getFieldCount()) { 206af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData component %i out of range.", cIdx); 2075f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); 2085f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 2095f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 2105f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 211bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element * e = mHal.state.type->getElement()->getField(cIdx); 212769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx); 213769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk if (sizeBytes != e->getSizeBytes() * elemArraySize) { 2146ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes()); 2155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); 2165f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 2175f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 2185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 219eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.elementData2D(rsc, this, x, y, data, cIdx, sizeBytes); 220eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 2215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 2225f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 223afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::addProgramToDirty(const Program *p) { 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mToDirtyList.push(p); 2255c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 2265c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams 227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::removeProgramToDirty(const Program *p) { 2285c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams for (size_t ct=0; ct < mToDirtyList.size(); ct++) { 2295c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams if (mToDirtyList[ct] == p) { 2305c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams mToDirtyList.removeAt(ct); 2315c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams return; 2325c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 2335c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 2345c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams rsAssert(0); 2355c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 236326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 237afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::dumpLOGV(const char *prefix) const { 238c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams ObjectBase::dumpLOGV(prefix); 239c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 240c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams String8 s(prefix); 241c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams s.append(" type "); 242064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.type) { 243bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type->dumpLOGV(s.string()); 244c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams } 245c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 2466598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("%s allocation ptr=%p mUsageFlags=0x04%x, mMipmapControl=0x%04x", 247709a0978ae141198018ca9769f8d96292a8928e6Jason Sams prefix, mHal.drvState.lod[0].mallocPtr, mHal.state.usageFlags, mHal.state.mipmapControl); 248c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams} 249326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2502d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchoukuint32_t Allocation::getPackedSize() const { 2512d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t numItems = mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes(); 2522d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return numItems * mHal.state.type->getElement()->getSizeBytesUnpadded(); 2532d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 2542d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 255e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Allocation::writePackedData(Context *rsc, const Type *type, 2562d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint8_t *dst, const uint8_t *src, bool dstPadded) { 2572d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk const Element *elem = type->getElement(); 2582d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t unpaddedBytes = elem->getSizeBytesUnpadded(); 2592d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t paddedBytes = elem->getSizeBytes(); 2602d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t numItems = type->getSizeBytes() / paddedBytes; 2612d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2622d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t srcInc = !dstPadded ? paddedBytes : unpaddedBytes; 2632d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t dstInc = dstPadded ? paddedBytes : unpaddedBytes; 2642d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2652d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // no sub-elements 2662d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t fieldCount = elem->getFieldCount(); 2672d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (fieldCount == 0) { 2682d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (uint32_t i = 0; i < numItems; i ++) { 2692d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk memcpy(dst, src, unpaddedBytes); 2702d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk src += srcInc; 2712d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk dst += dstInc; 2722d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2732d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return; 2742d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2752d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2762d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // Cache offsets 2772d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *offsetsPadded = new uint32_t[fieldCount]; 2782d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *offsetsUnpadded = new uint32_t[fieldCount]; 2792d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *sizeUnpadded = new uint32_t[fieldCount]; 2802d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2812d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (uint32_t i = 0; i < fieldCount; i++) { 2822d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk offsetsPadded[i] = elem->getFieldOffsetBytes(i); 2832d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk offsetsUnpadded[i] = elem->getFieldOffsetBytesUnpadded(i); 2842d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk sizeUnpadded[i] = elem->getField(i)->getSizeBytesUnpadded(); 2852d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2862d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2872d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *srcOffsets = !dstPadded ? offsetsPadded : offsetsUnpadded; 2882d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *dstOffsets = dstPadded ? offsetsPadded : offsetsUnpadded; 2892d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2902d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // complex elements, need to copy subelem after subelem 2912d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (uint32_t i = 0; i < numItems; i ++) { 2922d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (uint32_t fI = 0; fI < fieldCount; fI++) { 2932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk memcpy(dst + dstOffsets[fI], src + srcOffsets[fI], sizeUnpadded[fI]); 2942d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2952d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk src += srcInc; 2962d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk dst += dstInc; 2972d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2982d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2992d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk delete[] offsetsPadded; 3002d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk delete[] offsetsUnpadded; 3012d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk delete[] sizeUnpadded; 3022d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 3032d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 304e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Allocation::unpackVec3Allocation(Context *rsc, const void *data, size_t dataSize) { 3052d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk const uint8_t *src = (const uint8_t*)data; 30661a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams uint8_t *dst = (uint8_t *)rsc->mHal.funcs.allocation.lock1D(rsc, this); 3072d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 308e3150cfb3edb028407669e4a65e087eae77e718cJason Sams writePackedData(rsc, getType(), dst, src, true); 30961a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, this); 3102d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 3112d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 312e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Allocation::packVec3Allocation(Context *rsc, OStream *stream) const { 3132d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t paddedBytes = getType()->getElement()->getSizeBytes(); 3142d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t unpaddedBytes = getType()->getElement()->getSizeBytesUnpadded(); 3152d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t numItems = mHal.state.type->getSizeBytes() / paddedBytes; 3162d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 31761a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams const uint8_t *src = (const uint8_t*)rsc->mHal.funcs.allocation.lock1D(rsc, this); 3182d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint8_t *dst = new uint8_t[numItems * unpaddedBytes]; 3192d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 320e3150cfb3edb028407669e4a65e087eae77e718cJason Sams writePackedData(rsc, getType(), dst, src, false); 3212d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk stream->addByteArray(dst, getPackedSize()); 3222d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 3232d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk delete[] dst; 32461a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, this); 3252d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 3262d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 327e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Allocation::serialize(Context *rsc, OStream *stream) const { 328fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 329fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 330fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 331fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 332fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 333fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 334fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First thing we need to serialize is the type object since it will be needed 335fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // to initialize the class 336e3150cfb3edb028407669e4a65e087eae77e718cJason Sams mHal.state.type->serialize(rsc, stream); 337fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 338bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams uint32_t dataSize = mHal.state.type->getSizeBytes(); 3392d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // 3 element vectors are padded to 4 in memory, but padding isn't serialized 3402d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t packedSize = getPackedSize(); 341fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write how much data we are storing 3422d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk stream->addU32(packedSize); 3432d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (dataSize == packedSize) { 3442d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // Now write the data 34561a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams stream->addByteArray(rsc->mHal.funcs.allocation.lock1D(rsc, this), dataSize); 34661a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, this); 3472d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } else { 3482d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // Now write the data 349e3150cfb3edb028407669e4a65e087eae77e718cJason Sams packVec3Allocation(rsc, stream); 3502d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 351fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 352fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 353afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation *Allocation::createFromStream(Context *rsc, IStream *stream) { 354fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 355b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 356afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (classID != RS_A3D_CLASS_ID_ALLOCATION) { 357af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("allocation loading skipped due to invalid class id\n"); 358fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 359fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 360fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 361fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 362fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 363fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 364fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Type *type = Type::createFromStream(rsc, stream); 365afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!type) { 366fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 367fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 368fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk type->compute(); 369fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 3702d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT); 3712d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk type->decUserRef(); 3722d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 373fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Number of bytes we wrote out for this allocation 374fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t dataSize = stream->loadU32(); 3752d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // 3 element vectors are padded to 4 in memory, but padding isn't serialized 3762d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t packedSize = alloc->getPackedSize(); 3772d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (dataSize != type->getSizeBytes() && 3782d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk dataSize != packedSize) { 379af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("failed to read allocation because numbytes written is not the same loaded type wants\n"); 3802d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk ObjectBase::checkDelete(alloc); 381225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ObjectBase::checkDelete(type); 382fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 383fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 384fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 385fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk alloc->setName(name.string(), name.size()); 3864b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams 3872d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (dataSize == type->getSizeBytes()) { 3882d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t count = dataSize / type->getElementSizeBytes(); 3892d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // Read in all of our allocation data 3902d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize); 3912d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } else { 392e3150cfb3edb028407669e4a65e087eae77e718cJason Sams alloc->unpackVec3Allocation(rsc, stream->getPtr() + stream->getPos(), dataSize); 3932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 394e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk stream->reset(stream->getPos() + dataSize); 395fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 396fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return alloc; 397fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 398fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 399eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Samsvoid Allocation::sendDirty(const Context *rsc) const { 40093eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#ifndef RS_COMPATIBILITY_LIB 4015c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams for (size_t ct=0; ct < mToDirtyList.size(); ct++) { 4025c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams mToDirtyList[ct]->forceDirty(); 4035c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 40493eacc7ce0aad4314b4cb41a281f59ce54bb3286Jason Sams#endif 405eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mRSC->mHal.funcs.allocation.markDirty(rsc, this); 4065c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 407326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 408afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const { 4099f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines mHal.state.type->incRefs(ptr, ct, startOff); 410e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 411e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 412afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const { 4135c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk if (!mHal.state.hasReferences || !getIsScript()) { 4145c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk return; 4155c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk } 4169f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines mHal.state.type->decRefs(ptr, ct, startOff); 417e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 418e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 419c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Samsvoid Allocation::freeChildrenUnlocked () { 42061a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams void *ptr = mRSC->mHal.funcs.allocation.lock1D(mRSC, this); 42161a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams decRefs(ptr, mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes(), 0); 42261a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams mRSC->mHal.funcs.allocation.unlock1D(mRSC, this); 423c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams} 424c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams 425c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Samsbool Allocation::freeChildren() { 426c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams if (mHal.state.hasReferences) { 427c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams incSysRef(); 428c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams freeChildrenUnlocked(); 429c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams return decSysRef(); 430c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams } 431c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams return false; 432c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams} 433c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams 434afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) { 43596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 43696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 437afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize1D(Context *rsc, uint32_t dimX) { 438a572aca4eb4ddb32c10baa1f529431cfefd756b8Jason Sams uint32_t oldDimX = mHal.drvState.lod[0].dimX; 43996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX == oldDimX) { 44096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams return; 44196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 44296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 443c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<Type> t = mHal.state.type->cloneAndResize1D(rsc, dimX); 44496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX < oldDimX) { 44561a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams decRefs(rsc->mHal.funcs.allocation.lock1D(rsc, this), oldDimX - dimX, dimX); 44661a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.unlock1D(rsc, this); 44796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 448c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk rsc->mHal.funcs.allocation.resize(rsc, this, t.get(), mHal.state.hasReferences); 449064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk setType(t.get()); 450bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams updateCache(); 45196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 45296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 453afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) { 454af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("not implemented"); 45596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 45696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 457733396b67724162844ea2785c7495115dc5ee8d8Jason Samsvoid * Allocation::getSurface(const Context *rsc) { 458733396b67724162844ea2785c7495115dc5ee8d8Jason Sams return rsc->mHal.funcs.allocation.getSurface(rsc, this); 45941e373d91a60043afa0f9abd026218b49cbc1201Jason Sams} 46041e373d91a60043afa0f9abd026218b49cbc1201Jason Sams 4617ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::setSurface(const Context *rsc, RsNativeWindow sur) { 4627ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams ANativeWindow *nw = (ANativeWindow *)sur; 463733396b67724162844ea2785c7495115dc5ee8d8Jason Sams rsc->mHal.funcs.allocation.setSurface(rsc, this, nw); 4647ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 4657ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 4667ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::ioSend(const Context *rsc) { 4677ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams rsc->mHal.funcs.allocation.ioSend(rsc, this); 4687ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 4697ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 4707ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::ioReceive(const Context *rsc) { 4717ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams rsc->mHal.funcs.allocation.ioReceive(rsc, this); 4727ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 4737ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 4747ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 475326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////// 476565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams// 4776a121811e5d2e56e94747b36d15c7613ab2aedd4Stephen Hines 478326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 479326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 480326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 481366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) { 482366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Allocation *a = static_cast<Allocation *>(va); 483eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams a->sendDirty(rsc); 484366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams a->syncAll(rsc, src); 485366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams} 486366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 487a23715148f7bda74e904fc553b70c9a49fd52a6eJason Samsvoid rsi_AllocationGenerateMipmaps(Context *rsc, RsAllocation va) { 48861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams Allocation *alloc = static_cast<Allocation *>(va); 48961a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.generateMipmaps(rsc, alloc); 49039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk} 49139f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 492807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t sizeBytes) { 493807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams Allocation *a = static_cast<Allocation *>(va); 494807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams const Type * t = a->getType(); 495807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams a->read(rsc, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 4963bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams t->getDimX(), t->getDimY(), data, sizeBytes, 0); 497837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams} 498837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 4994b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod, 500b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk uint32_t count, const void *data, size_t sizeBytes) { 501326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 5024b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->data(rsc, xoff, lod, count, data, sizeBytes); 5035f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 5045f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 5054b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, uint32_t lod, RsAllocationCubemapFace face, 5066ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const void *data, size_t sizeBytes, size_t eoff) { 5075f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams Allocation *a = static_cast<Allocation *>(va); 5084b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->elementData(rsc, x, y, data, eoff, sizeBytes); 5095f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 5105f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 5114b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t lod, 5126ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const void *data, size_t sizeBytes, size_t eoff) { 5135f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams Allocation *a = static_cast<Allocation *>(va); 5144b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->elementData(rsc, x, data, eoff, sizeBytes); 515326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 516326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 5174b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, 518358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray uint32_t w, uint32_t h, const void *data, size_t sizeBytes, size_t stride) { 519326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 520358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes, stride); 521326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 522326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 5233bbc0fd40264ddae1592706d9023865b7b3e3195Jason Samsvoid rsi_Allocation3DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, 5243bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes, size_t stride) { 5253bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams Allocation *a = static_cast<Allocation *>(va); 5263bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams a->data(rsc, xoff, yoff, zoff, lod, w, h, d, data, sizeBytes, stride); 5273bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams} 5283bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams 5293bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams 530807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid rsi_AllocationRead(Context *rsc, RsAllocation va, void *data, size_t sizeBytes) { 531e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams Allocation *a = static_cast<Allocation *>(va); 532807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams const Type * t = a->getType(); 533807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams if(t->getDimY()) { 534807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams a->read(rsc, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 5353bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams t->getDimX(), t->getDimY(), data, sizeBytes, 0); 536807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams } else { 537807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams a->read(rsc, 0, 0, t->getDimX(), data, sizeBytes); 538807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams } 539807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams 540e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams} 541e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams 542afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) { 54396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Allocation *a = static_cast<Allocation *>(va); 54496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams a->resize1D(rsc, dimX); 54596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 54696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 547afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) { 54896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Allocation *a = static_cast<Allocation *>(va); 54996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams a->resize2D(rsc, dimX, dimY); 55096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 55196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 552c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype, 553c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 554099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray uint32_t usages, uintptr_t ptr) { 555099bc262f862cdeb547cf8a78fe9e0e92560f437Tim Murray Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips, (void*)ptr); 556eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (!alloc) { 557eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return NULL; 558eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 559f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams alloc->incUserRef(); 560f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return alloc; 561f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 562f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 563c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype, 564c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 565807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams const void *data, size_t sizeBytes, uint32_t usages) { 566366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Type *t = static_cast<Type *>(vtype); 567f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 568179e9a457095fea4c9e6d366c269754b882d05ddJason Sams RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); 569f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); 570f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (texAlloc == NULL) { 571af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Memory allocation failure"); 572f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return NULL; 573f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 574f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 575807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams texAlloc->data(rsc, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 57660c2796d821d9296003d4e5db025f8734d971a71Tim Murray t->getDimX(), t->getDimY(), data, sizeBytes, 0); 577ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (mips == RS_ALLOCATION_MIPMAP_FULL) { 57861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.generateMipmaps(rsc, texAlloc); 579f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 580f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 581eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams texAlloc->sendDirty(rsc); 582f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return texAlloc; 583f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 58484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 585c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype, 586c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 587807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams const void *data, size_t sizeBytes, uint32_t usages) { 588366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Type *t = static_cast<Type *>(vtype); 58984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 59084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Cubemap allocation's faces should be Width by Width each. 59184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Source data should have 6 * Width by Width pixels 59284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Error checking is done in the java layer 593179e9a457095fea4c9e6d366c269754b882d05ddJason Sams RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); 59484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); 59584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (texAlloc == NULL) { 596af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Memory allocation failure"); 59784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return NULL; 59884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 59984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 6009f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t faceSize = t->getDimX(); 6019f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes(); 6029f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t copySize = faceSize * t->getElementSizeBytes(); 6039f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk 60484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint8_t *sourcePtr = (uint8_t*)data; 605366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams for (uint32_t face = 0; face < 6; face ++) { 6069f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk for (uint32_t dI = 0; dI < faceSize; dI ++) { 607807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams texAlloc->data(rsc, 0, dI, 0, (RsAllocationCubemapFace)face, 60860c2796d821d9296003d4e5db025f8734d971a71Tim Murray t->getDimX(), 1, sourcePtr + strideBytes * dI, copySize, 0); 6099f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk } 610366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 611366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams // Move the data pointer to the next cube face 6129f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk sourcePtr += copySize; 613f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk } 614366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 615f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk if (mips == RS_ALLOCATION_MIPMAP_FULL) { 61661a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams rsc->mHal.funcs.allocation.generateMipmaps(rsc, texAlloc); 61784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 61884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 619eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams texAlloc->sendDirty(rsc); 62084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return texAlloc; 62184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk} 622099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 62374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukvoid rsi_AllocationCopy2DRange(Context *rsc, 62474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk RsAllocation dstAlloc, 62574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstXoff, uint32_t dstYoff, 62674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstMip, uint32_t dstFace, 62774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t width, uint32_t height, 62874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk RsAllocation srcAlloc, 62974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcXoff, uint32_t srcYoff, 63074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcMip, uint32_t srcFace) { 63174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk Allocation *dst = static_cast<Allocation *>(dstAlloc); 63274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk Allocation *src= static_cast<Allocation *>(srcAlloc); 63374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk rsc->mHal.funcs.allocation.allocData2D(rsc, dst, dstXoff, dstYoff, dstMip, 63474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk (RsAllocationCubemapFace)dstFace, 63574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk width, height, 63674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk src, srcXoff, srcYoff,srcMip, 63774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk (RsAllocationCubemapFace)srcFace); 63874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk} 63974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk 6403bbc0fd40264ddae1592706d9023865b7b3e3195Jason Samsvoid rsi_AllocationCopy3DRange(Context *rsc, 6413bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams RsAllocation dstAlloc, 6423bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff, 6433bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t dstMip, 6443bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t width, uint32_t height, uint32_t depth, 6453bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams RsAllocation srcAlloc, 6463bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff, 6473bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams uint32_t srcMip) { 6483bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams Allocation *dst = static_cast<Allocation *>(dstAlloc); 6493bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams Allocation *src= static_cast<Allocation *>(srcAlloc); 6503bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams rsc->mHal.funcs.allocation.allocData3D(rsc, dst, dstXoff, dstYoff, dstZoff, dstMip, 6513bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams width, height, depth, 6523bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams src, srcXoff, srcYoff, srcZoff, srcMip); 6533bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams} 6543bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams 6553bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams 656733396b67724162844ea2785c7495115dc5ee8d8Jason Samsvoid * rsi_AllocationGetSurface(Context *rsc, RsAllocation valloc) { 65741e373d91a60043afa0f9abd026218b49cbc1201Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 658733396b67724162844ea2785c7495115dc5ee8d8Jason Sams void *s = alloc->getSurface(rsc); 659733396b67724162844ea2785c7495115dc5ee8d8Jason Sams return s; 6603522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams} 6613522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams 6627ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationSetSurface(Context *rsc, RsAllocation valloc, RsNativeWindow sur) { 6637ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 6647ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams alloc->setSurface(rsc, sur); 6657ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 6667ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 6677ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationIoSend(Context *rsc, RsAllocation valloc) { 6687ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 6697ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams alloc->ioSend(rsc); 6707ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 6717ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 6727ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationIoReceive(Context *rsc, RsAllocation valloc) { 6737ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 6747ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams alloc->ioReceive(rsc); 6757ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 6767ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 677509ea5c832a865bc9083d53f1f058377a689bab3Tim Murrayvoid rsi_Allocation1DRead(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod, 678509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray uint32_t count, void *data, size_t sizeBytes) { 679509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray Allocation *a = static_cast<Allocation *>(va); 6803bbc0fd40264ddae1592706d9023865b7b3e3195Jason Sams rsc->mHal.funcs.allocation.read1D(rsc, a, xoff, lod, count, data, sizeBytes); 681509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray} 682509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray 6837b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murrayvoid rsi_Allocation2DRead(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, 6847b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray uint32_t lod, RsAllocationCubemapFace face, uint32_t w, 685358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray uint32_t h, void *data, size_t sizeBytes, size_t stride) { 6867b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray Allocation *a = static_cast<Allocation *>(va); 687358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray a->read(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes, stride); 6887b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray} 6897b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray 690c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 691c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 692c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 693c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsconst void * rsaAllocationGetType(RsContext con, RsAllocation va) { 694c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams Allocation *a = static_cast<Allocation *>(va); 695c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams a->getType()->incUserRef(); 696c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 697c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams return a->getType(); 698c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 699