rsAllocation.cpp revision 3522f40418fdf877f5a136475dbf75e57a3b7c77
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 26ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines * Copyright (C) 2009-2012 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 227ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams#include "system/window.h" 233522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams#include "gui/SurfaceTexture.h" 2439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 26326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 27326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 28a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex SakhartchoukAllocation::Allocation(Context *rsc, const Type *type, uint32_t usages, 29179e9a457095fea4c9e6d366c269754b882d05ddJason Sams RsAllocationMipmapControl mc, void * ptr) 30a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk : ObjectBase(rsc) { 31fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 32eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams memset(&mHal, 0, sizeof(mHal)); 33eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mHal.state.mipmapControl = RS_ALLOCATION_MIPMAP_NONE; 34bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.usageFlags = usages; 35bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.mipmapControl = mc; 36179e9a457095fea4c9e6d366c269754b882d05ddJason Sams mHal.state.usrPtr = ptr; 37366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 38064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk setType(type); 39eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams updateCache(); 40fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams} 41fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 42eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason SamsAllocation * Allocation::createAllocation(Context *rsc, const Type *type, uint32_t usages, 43179e9a457095fea4c9e6d366c269754b882d05ddJason Sams RsAllocationMipmapControl mc, void * ptr) { 44179e9a457095fea4c9e6d366c269754b882d05ddJason Sams Allocation *a = new Allocation(rsc, type, usages, mc, ptr); 45fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 46eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (!rsc->mHal.funcs.allocation.init(rsc, a, type->getElement()->getHasReferences())) { 47eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->setError(RS_ERROR_FATAL_DRIVER, "Allocation::Allocation, alloc failure"); 48eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams delete a; 49eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return NULL; 50eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 517ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 52eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return a; 53bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams} 54fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 55bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsvoid Allocation::updateCache() { 56064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk const Type *type = mHal.state.type; 57bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.dimensionX = type->getDimX(); 58bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.dimensionY = type->getDimY(); 59bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.dimensionZ = type->getDimZ(); 60bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasFaces = type->getDimFaces(); 61bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasMipmaps = type->getDimLOD(); 62bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.elementSizeBytes = type->getElementSizeBytes(); 63bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasReferences = mHal.state.type->getElement()->getHasReferences(); 64326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 66afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation::~Allocation() { 67c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams freeChildrenUnlocked(); 683522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams setSurfaceTexture(mRSC, NULL); 69eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mRSC->mHal.funcs.allocation.destroy(mRSC, this); 70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 72366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::syncAll(Context *rsc, RsAllocationUsageType src) { 73eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.syncAll(rsc, this, src); 74cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams} 75cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams 76afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::read(void *data) { 77eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams memcpy(data, getPtr(), mHal.state.type->getSizeBytes()); 78e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams} 79e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams 804b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod, 816ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines uint32_t count, const void *data, size_t sizeBytes) { 826ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const size_t eSize = mHal.state.type->getElementSizeBytes(); 839397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 84eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if ((count * eSize) != sizeBytes) { 856ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines ALOGE("Allocation::subData called with mismatched size expected %zu, got %zu", 86eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams (count * eSize), sizeBytes); 87bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type->dumpLOGV("type info"); 889397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams return; 899397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 90e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 91eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.data1D(rsc, this, xoff, lod, count, data, sizeBytes); 92eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 954b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, 966ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines uint32_t w, uint32_t h, const void *data, size_t sizeBytes) { 976ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const size_t eSize = mHal.state.elementSizeBytes; 986ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const size_t lineSize = eSize * w; 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 100af12ac6a08651464f8d823add667c706f993b587Steve Block //ALOGE("data2d %p, %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes); 1019397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 102a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams if ((lineSize * h) != sizeBytes) { 1036ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines ALOGE("Allocation size mismatch, expected %zu, got %zu", (lineSize * h), sizeBytes); 1049397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(!"Allocation::subData called with mismatched size"); 1059397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams return; 1069397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 1079397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 108eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.data2D(rsc, this, xoff, yoff, lod, face, w, h, data, sizeBytes); 109eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 111326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 112236385b73f21ae65e756b9cb5738f1514d95ea3eJason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, 113236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams uint32_t lod, RsAllocationCubemapFace face, 1146ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes) { 115326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1174b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, const void *data, 1186ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines uint32_t cIdx, size_t sizeBytes) { 1196ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines size_t eSize = mHal.state.elementSizeBytes; 1205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 121bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (cIdx >= mHal.state.type->getElement()->getFieldCount()) { 122af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData component %i out of range.", cIdx); 1235f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); 1245f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1255f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1265f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 127bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (x >= mHal.state.dimensionX) { 128af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData X offset %i out of range.", x); 1295f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 1305f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1315f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1325f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 133bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element * e = mHal.state.type->getElement()->getField(cIdx); 134769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx); 135769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk if (sizeBytes != e->getSizeBytes() * elemArraySize) { 1366ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes()); 1375f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); 1385f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1395f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1405f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 141eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.elementData1D(rsc, this, x, data, cIdx, sizeBytes); 142eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 1435f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 1445f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 1454b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, uint32_t y, 1466ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const void *data, uint32_t cIdx, size_t sizeBytes) { 1476ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines size_t eSize = mHal.state.elementSizeBytes; 1485f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 149bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (x >= mHal.state.dimensionX) { 150af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData X offset %i out of range.", x); 1515f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 1525f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1535f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1545f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 155bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (y >= mHal.state.dimensionY) { 156af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData X offset %i out of range.", x); 1575f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 1585f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1595f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1605f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 161bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (cIdx >= mHal.state.type->getElement()->getFieldCount()) { 162af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Error Allocation::subElementData component %i out of range.", cIdx); 1635f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); 1645f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1655f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1665f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 167bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element * e = mHal.state.type->getElement()->getField(cIdx); 168769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx); 169769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk if (sizeBytes != e->getSizeBytes() * elemArraySize) { 1706ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes()); 1715f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); 1725f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1735f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1745f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 175eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.elementData2D(rsc, this, x, y, data, cIdx, sizeBytes); 176eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 1775f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 1785f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 179afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::addProgramToDirty(const Program *p) { 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mToDirtyList.push(p); 1815c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 1825c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams 183afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::removeProgramToDirty(const Program *p) { 1845c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams for (size_t ct=0; ct < mToDirtyList.size(); ct++) { 1855c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams if (mToDirtyList[ct] == p) { 1865c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams mToDirtyList.removeAt(ct); 1875c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams return; 1885c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 1895c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 1905c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams rsAssert(0); 1915c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 192326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 193afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::dumpLOGV(const char *prefix) const { 194c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams ObjectBase::dumpLOGV(prefix); 195c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 196c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams String8 s(prefix); 197c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams s.append(" type "); 198064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk if (mHal.state.type) { 199bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type->dumpLOGV(s.string()); 200c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams } 201c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 2026598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("%s allocation ptr=%p mUsageFlags=0x04%x, mMipmapControl=0x%04x", 203eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams prefix, getPtr(), mHal.state.usageFlags, mHal.state.mipmapControl); 204c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams} 205326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 2062d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchoukuint32_t Allocation::getPackedSize() const { 2072d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t numItems = mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes(); 2082d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return numItems * mHal.state.type->getElement()->getSizeBytesUnpadded(); 2092d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 2102d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2112d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchoukvoid Allocation::writePackedData(const Type *type, 2122d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint8_t *dst, const uint8_t *src, bool dstPadded) { 2132d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk const Element *elem = type->getElement(); 2142d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t unpaddedBytes = elem->getSizeBytesUnpadded(); 2152d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t paddedBytes = elem->getSizeBytes(); 2162d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t numItems = type->getSizeBytes() / paddedBytes; 2172d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2182d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t srcInc = !dstPadded ? paddedBytes : unpaddedBytes; 2192d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t dstInc = dstPadded ? paddedBytes : unpaddedBytes; 2202d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2212d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // no sub-elements 2222d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t fieldCount = elem->getFieldCount(); 2232d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (fieldCount == 0) { 2242d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (uint32_t i = 0; i < numItems; i ++) { 2252d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk memcpy(dst, src, unpaddedBytes); 2262d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk src += srcInc; 2272d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk dst += dstInc; 2282d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2292d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk return; 2302d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2312d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2322d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // Cache offsets 2332d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *offsetsPadded = new uint32_t[fieldCount]; 2342d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *offsetsUnpadded = new uint32_t[fieldCount]; 2352d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *sizeUnpadded = new uint32_t[fieldCount]; 2362d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2372d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (uint32_t i = 0; i < fieldCount; i++) { 2382d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk offsetsPadded[i] = elem->getFieldOffsetBytes(i); 2392d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk offsetsUnpadded[i] = elem->getFieldOffsetBytesUnpadded(i); 2402d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk sizeUnpadded[i] = elem->getField(i)->getSizeBytesUnpadded(); 2412d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2422d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2432d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *srcOffsets = !dstPadded ? offsetsPadded : offsetsUnpadded; 2442d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t *dstOffsets = dstPadded ? offsetsPadded : offsetsUnpadded; 2452d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2462d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // complex elements, need to copy subelem after subelem 2472d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (uint32_t i = 0; i < numItems; i ++) { 2482d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk for (uint32_t fI = 0; fI < fieldCount; fI++) { 2492d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk memcpy(dst + dstOffsets[fI], src + srcOffsets[fI], sizeUnpadded[fI]); 2502d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2512d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk src += srcInc; 2522d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk dst += dstInc; 2532d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 2542d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2552d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk delete[] offsetsPadded; 2562d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk delete[] offsetsUnpadded; 2572d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk delete[] sizeUnpadded; 2582d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 2592d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2606ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hinesvoid Allocation::unpackVec3Allocation(const void *data, size_t dataSize) { 2612d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk const uint8_t *src = (const uint8_t*)data; 2622d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint8_t *dst = (uint8_t*)getPtr(); 2632d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2642d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk writePackedData(getType(), dst, src, true); 2652d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 2662d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2672d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchoukvoid Allocation::packVec3Allocation(OStream *stream) const { 2682d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t paddedBytes = getType()->getElement()->getSizeBytes(); 2692d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t unpaddedBytes = getType()->getElement()->getSizeBytesUnpadded(); 2702d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t numItems = mHal.state.type->getSizeBytes() / paddedBytes; 2712d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2722d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk const uint8_t *src = (const uint8_t*)getPtr(); 2732d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint8_t *dst = new uint8_t[numItems * unpaddedBytes]; 2742d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2752d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk writePackedData(getType(), dst, src, false); 2762d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk stream->addByteArray(dst, getPackedSize()); 2772d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 2782d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk delete[] dst; 2792d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk} 2802d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 281afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::serialize(OStream *stream) const { 282fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 283fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 284fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 285fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 286fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 287fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 288fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First thing we need to serialize is the type object since it will be needed 289fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // to initialize the class 290bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type->serialize(stream); 291fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 292bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams uint32_t dataSize = mHal.state.type->getSizeBytes(); 2932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // 3 element vectors are padded to 4 in memory, but padding isn't serialized 2942d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t packedSize = getPackedSize(); 295fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write how much data we are storing 2962d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk stream->addU32(packedSize); 2972d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (dataSize == packedSize) { 2982d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // Now write the data 2992d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk stream->addByteArray(getPtr(), dataSize); 3002d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } else { 3012d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // Now write the data 3022d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk packVec3Allocation(stream); 3032d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 304fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 305fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 306afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation *Allocation::createFromStream(Context *rsc, IStream *stream) { 307fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 308b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 309afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (classID != RS_A3D_CLASS_ID_ALLOCATION) { 310af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("allocation loading skipped due to invalid class id\n"); 311fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 312fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 313fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 314fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 315fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 316fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 317fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Type *type = Type::createFromStream(rsc, stream); 318afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!type) { 319fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 320fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 321fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk type->compute(); 322fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 3232d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT); 3242d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk type->decUserRef(); 3252d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk 326fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Number of bytes we wrote out for this allocation 327fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t dataSize = stream->loadU32(); 3282d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // 3 element vectors are padded to 4 in memory, but padding isn't serialized 3292d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t packedSize = alloc->getPackedSize(); 3302d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (dataSize != type->getSizeBytes() && 3312d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk dataSize != packedSize) { 332af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("failed to read allocation because numbytes written is not the same loaded type wants\n"); 3332d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk ObjectBase::checkDelete(alloc); 334225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ObjectBase::checkDelete(type); 335fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 336fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 337fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 338fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk alloc->setName(name.string(), name.size()); 3394b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams 3402d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk if (dataSize == type->getSizeBytes()) { 3412d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk uint32_t count = dataSize / type->getElementSizeBytes(); 3422d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk // Read in all of our allocation data 3432d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize); 3442d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } else { 3452d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk alloc->unpackVec3Allocation(stream->getPtr() + stream->getPos(), dataSize); 3462d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk } 347e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk stream->reset(stream->getPos() + dataSize); 348fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 349fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return alloc; 350fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 351fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 352eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Samsvoid Allocation::sendDirty(const Context *rsc) const { 3535c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams for (size_t ct=0; ct < mToDirtyList.size(); ct++) { 3545c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams mToDirtyList[ct]->forceDirty(); 3555c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 356eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mRSC->mHal.funcs.allocation.markDirty(rsc, this); 3575c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 358326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 359afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const { 360e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 361bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element *e = mHal.state.type->getElement(); 362e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t stride = e->getSizeBytes(); 363e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 36496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams p += stride * startOff; 365e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams while (ct > 0) { 366e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->incRefs(p); 367e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ct --; 368e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams p += stride; 369e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 370e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 371e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 372afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const { 3735c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk if (!mHal.state.hasReferences || !getIsScript()) { 3745c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk return; 3755c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk } 376e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 377bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element *e = mHal.state.type->getElement(); 378e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t stride = e->getSizeBytes(); 379e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 38096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams p += stride * startOff; 381e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams while (ct > 0) { 382e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->decRefs(p); 383e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ct --; 384e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams p += stride; 385e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 386e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 387e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 388c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Samsvoid Allocation::freeChildrenUnlocked () { 389c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams decRefs(getPtr(), mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes(), 0); 390c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams} 391c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams 392c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Samsbool Allocation::freeChildren() { 393c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams if (mHal.state.hasReferences) { 394c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams incSysRef(); 395c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams freeChildrenUnlocked(); 396c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams return decSysRef(); 397c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams } 398c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams return false; 399c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams} 400c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams 401afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) { 40296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 40396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 404afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize1D(Context *rsc, uint32_t dimX) { 405bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams uint32_t oldDimX = mHal.state.dimensionX; 40696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX == oldDimX) { 40796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams return; 40896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 40996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 410c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk ObjectBaseRef<Type> t = mHal.state.type->cloneAndResize1D(rsc, dimX); 41196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX < oldDimX) { 412eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams decRefs(getPtr(), oldDimX - dimX, dimX); 41396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 414c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk rsc->mHal.funcs.allocation.resize(rsc, this, t.get(), mHal.state.hasReferences); 415064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk setType(t.get()); 416bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams updateCache(); 41796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 41896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 419afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) { 420af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("not implemented"); 42196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 42296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 42341e373d91a60043afa0f9abd026218b49cbc1201Jason Samsint32_t Allocation::getSurfaceTextureID(const Context *rsc) { 42441e373d91a60043afa0f9abd026218b49cbc1201Jason Sams int32_t id = rsc->mHal.funcs.allocation.initSurfaceTexture(rsc, this); 42541e373d91a60043afa0f9abd026218b49cbc1201Jason Sams mHal.state.surfaceTextureID = id; 42641e373d91a60043afa0f9abd026218b49cbc1201Jason Sams return id; 42741e373d91a60043afa0f9abd026218b49cbc1201Jason Sams} 42841e373d91a60043afa0f9abd026218b49cbc1201Jason Sams 4293522f40418fdf877f5a136475dbf75e57a3b7c77Jason Samsvoid Allocation::setSurfaceTexture(const Context *rsc, SurfaceTexture *st) { 4303522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams if(st != mHal.state.surfaceTexture) { 4313522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams if(mHal.state.surfaceTexture != NULL) { 4323522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams mHal.state.surfaceTexture->decStrong(NULL); 4333522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams } 4343522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams mHal.state.surfaceTexture = st; 4353522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams if(mHal.state.surfaceTexture != NULL) { 4363522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams mHal.state.surfaceTexture->incStrong(NULL); 4373522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams } 4383522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams } 4393522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams} 4403522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams 4417ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::setSurface(const Context *rsc, RsNativeWindow sur) { 4427ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams ANativeWindow *nw = (ANativeWindow *)sur; 4437ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams ANativeWindow *old = mHal.state.wndSurface; 4447ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams if (nw) { 4457ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams nw->incStrong(NULL); 4467ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams } 4477ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams rsc->mHal.funcs.allocation.setSurfaceTexture(rsc, this, nw); 4487ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams mHal.state.wndSurface = nw; 4497ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams if (old) { 4507ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams old->decStrong(NULL); 4517ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams } 4527ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 4537ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 4547ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::ioSend(const Context *rsc) { 4557ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams rsc->mHal.funcs.allocation.ioSend(rsc, this); 4567ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 4577ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 4587ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::ioReceive(const Context *rsc) { 4597ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams rsc->mHal.funcs.allocation.ioReceive(rsc, this); 4607ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 4617ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 4627ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 463326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////// 464565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams// 4656a121811e5d2e56e94747b36d15c7613ab2aedd4Stephen Hines 466326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 467326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 468326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 469c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsstatic void AllocationGenerateScriptMips(RsContext con, RsAllocation va); 470c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 471afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip565(const Adapter2D &out, const Adapter2D &in) { 472326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t w = out.getDimX(); 473326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t h = out.getDimY(); 474326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 475e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t y=0; y < h; y++) { 476326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint16_t *oPtr = static_cast<uint16_t *>(out.getElement(0, y)); 477326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint16_t *i1 = static_cast<uint16_t *>(in.getElement(0, y*2)); 478326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint16_t *i2 = static_cast<uint16_t *>(in.getElement(0, y*2+1)); 479326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 480e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t x=0; x < w; x++) { 481565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]); 482565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams oPtr ++; 483565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams i1 += 2; 484565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams i2 += 2; 485565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 486565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 487565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams} 488565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 489afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8888(const Adapter2D &out, const Adapter2D &in) { 490565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t w = out.getDimX(); 491565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t h = out.getDimY(); 492565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 493e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t y=0; y < h; y++) { 494565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t *oPtr = static_cast<uint32_t *>(out.getElement(0, y)); 495565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams const uint32_t *i1 = static_cast<uint32_t *>(in.getElement(0, y*2)); 496565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams const uint32_t *i2 = static_cast<uint32_t *>(in.getElement(0, y*2+1)); 497565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 498e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t x=0; x < w; x++) { 499565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]); 500326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams oPtr ++; 501326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams i1 += 2; 502326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams i2 += 2; 503326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 504326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 505326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 506326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 507afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8(const Adapter2D &out, const Adapter2D &in) { 5082f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint32_t w = out.getDimX(); 5092f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint32_t h = out.getDimY(); 5102f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 5112f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams for (uint32_t y=0; y < h; y++) { 5122f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint8_t *oPtr = static_cast<uint8_t *>(out.getElement(0, y)); 5132f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams const uint8_t *i1 = static_cast<uint8_t *>(in.getElement(0, y*2)); 5142f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams const uint8_t *i2 = static_cast<uint8_t *>(in.getElement(0, y*2+1)); 5152f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 5162f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams for (uint32_t x=0; x < w; x++) { 5172f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f); 5182f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams oPtr ++; 5192f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams i1 += 2; 5202f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams i2 += 2; 5212f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams } 5222f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams } 5232f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams} 5242f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 525afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip(const Adapter2D &out, const Adapter2D &in) { 526afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (out.getBaseType()->getElement()->getSizeBits()) { 527e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams case 32: 528e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams mip8888(out, in); 529e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams break; 530e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams case 16: 531e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams mip565(out, in); 532e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams break; 5332f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams case 8: 5342f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams mip8(out, in); 5352f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams break; 536e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams } 537e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams} 538326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 539366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) { 540366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Allocation *a = static_cast<Allocation *>(va); 541eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams a->sendDirty(rsc); 542366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams a->syncAll(rsc, src); 543366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams} 544366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 545a23715148f7bda74e904fc553b70c9a49fd52a6eJason Samsvoid rsi_AllocationGenerateMipmaps(Context *rsc, RsAllocation va) { 54639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(va); 547c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams AllocationGenerateScriptMips(rsc, texAlloc); 54839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk} 54939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 550837e388700a48084489ba59d1d8cc5ece68b1535Jason Samsvoid rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t dataLen) { 551837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams Allocation *texAlloc = static_cast<Allocation *>(va); 552837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams const Type * t = texAlloc->getType(); 553837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 554837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams size_t s = t->getDimX() * t->getDimY() * t->getElementSizeBytes(); 555837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams if (s != dataLen) { 556837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size"); 557837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams return; 558837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams } 559837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 560837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams memcpy(data, texAlloc->getPtr(), s); 561837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams} 562837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 5634b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod, 564b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk uint32_t count, const void *data, size_t sizeBytes) { 565326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 5664b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->data(rsc, xoff, lod, count, data, sizeBytes); 5675f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 5685f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 5694b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, uint32_t lod, RsAllocationCubemapFace face, 5706ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const void *data, size_t sizeBytes, size_t eoff) { 5715f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams Allocation *a = static_cast<Allocation *>(va); 5724b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->elementData(rsc, x, y, data, eoff, sizeBytes); 5735f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 5745f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 5754b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t lod, 5766ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines const void *data, size_t sizeBytes, size_t eoff) { 5775f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams Allocation *a = static_cast<Allocation *>(va); 5784b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->elementData(rsc, x, data, eoff, sizeBytes); 579326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 580326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 5814b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, 582b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk uint32_t w, uint32_t h, const void *data, size_t sizeBytes) { 583326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 5844b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes); 585326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 586326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 58770b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchoukvoid rsi_AllocationRead(Context *rsc, RsAllocation va, void *data, size_t data_length) { 588e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams Allocation *a = static_cast<Allocation *>(va); 589e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams a->read(data); 590e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams} 591e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams 592afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) { 59396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Allocation *a = static_cast<Allocation *>(va); 59496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams a->resize1D(rsc, dimX); 59596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 59696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 597afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) { 59896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Allocation *a = static_cast<Allocation *>(va); 59996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams a->resize2D(rsc, dimX, dimY); 60096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 60196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 602c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsstatic void AllocationGenerateScriptMips(RsContext con, RsAllocation va) { 603f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk Context *rsc = static_cast<Context *>(con); 604f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(va); 605f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk uint32_t numFaces = texAlloc->getType()->getDimFaces() ? 6 : 1; 606f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk for (uint32_t face = 0; face < numFaces; face ++) { 607f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk Adapter2D adapt(rsc, texAlloc); 608f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk Adapter2D adapt2(rsc, texAlloc); 609f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk adapt.setFace(face); 610f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk adapt2.setFace(face); 611f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) { 612f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk adapt.setLOD(lod); 613f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk adapt2.setLOD(lod + 1); 614f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk mip(adapt2, adapt); 615f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk } 616f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk } 617f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk} 618f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk 619c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype, 620c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 621179e9a457095fea4c9e6d366c269754b882d05ddJason Sams uint32_t usages, uint32_t ptr) { 622179e9a457095fea4c9e6d366c269754b882d05ddJason Sams Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips, (void *)ptr); 623eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (!alloc) { 624eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return NULL; 625eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 626f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams alloc->incUserRef(); 627f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return alloc; 628f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 629f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 630c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype, 631c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 632c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const void *data, size_t data_length, uint32_t usages) { 633366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Type *t = static_cast<Type *>(vtype); 634f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 635179e9a457095fea4c9e6d366c269754b882d05ddJason Sams RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); 636f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); 637f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (texAlloc == NULL) { 638af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Memory allocation failure"); 639f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return NULL; 640f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 641f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 642366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams memcpy(texAlloc->getPtr(), data, t->getDimX() * t->getDimY() * t->getElementSizeBytes()); 643ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (mips == RS_ALLOCATION_MIPMAP_FULL) { 644c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams AllocationGenerateScriptMips(rsc, texAlloc); 645f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 646f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 647eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams texAlloc->sendDirty(rsc); 648f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return texAlloc; 649f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 65084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 651c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype, 652c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 653c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const void *data, size_t data_length, uint32_t usages) { 654366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Type *t = static_cast<Type *>(vtype); 65584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 65684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Cubemap allocation's faces should be Width by Width each. 65784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Source data should have 6 * Width by Width pixels 65884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Error checking is done in the java layer 659179e9a457095fea4c9e6d366c269754b882d05ddJason Sams RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0); 66084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); 66184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (texAlloc == NULL) { 662af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Memory allocation failure"); 66384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return NULL; 66484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 66584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 6669f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t faceSize = t->getDimX(); 6679f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes(); 6689f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t copySize = faceSize * t->getElementSizeBytes(); 6699f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk 67084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint8_t *sourcePtr = (uint8_t*)data; 671366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams for (uint32_t face = 0; face < 6; face ++) { 672366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Adapter2D faceAdapter(rsc, texAlloc); 673366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams faceAdapter.setFace(face); 674366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 6759f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk for (uint32_t dI = 0; dI < faceSize; dI ++) { 6769f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk memcpy(faceAdapter.getElement(0, dI), sourcePtr + strideBytes * dI, copySize); 6779f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk } 678366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 679366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams // Move the data pointer to the next cube face 6809f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk sourcePtr += copySize; 681f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk } 682366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 683f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk if (mips == RS_ALLOCATION_MIPMAP_FULL) { 684c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams AllocationGenerateScriptMips(rsc, texAlloc); 68584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 68684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 687eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams texAlloc->sendDirty(rsc); 68884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return texAlloc; 68984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk} 690099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 69174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukvoid rsi_AllocationCopy2DRange(Context *rsc, 69274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk RsAllocation dstAlloc, 69374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstXoff, uint32_t dstYoff, 69474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstMip, uint32_t dstFace, 69574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t width, uint32_t height, 69674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk RsAllocation srcAlloc, 69774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcXoff, uint32_t srcYoff, 69874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcMip, uint32_t srcFace) { 69974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk Allocation *dst = static_cast<Allocation *>(dstAlloc); 70074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk Allocation *src= static_cast<Allocation *>(srcAlloc); 70174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk rsc->mHal.funcs.allocation.allocData2D(rsc, dst, dstXoff, dstYoff, dstMip, 70274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk (RsAllocationCubemapFace)dstFace, 70374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk width, height, 70474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk src, srcXoff, srcYoff,srcMip, 70574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk (RsAllocationCubemapFace)srcFace); 70674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk} 70774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk 70841e373d91a60043afa0f9abd026218b49cbc1201Jason Samsint32_t rsi_AllocationGetSurfaceTextureID(Context *rsc, RsAllocation valloc) { 70941e373d91a60043afa0f9abd026218b49cbc1201Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 71041e373d91a60043afa0f9abd026218b49cbc1201Jason Sams return alloc->getSurfaceTextureID(rsc); 71141e373d91a60043afa0f9abd026218b49cbc1201Jason Sams} 71241e373d91a60043afa0f9abd026218b49cbc1201Jason Sams 7133522f40418fdf877f5a136475dbf75e57a3b7c77Jason Samsvoid rsi_AllocationGetSurfaceTextureID2(Context *rsc, RsAllocation valloc, void *vst, size_t len) { 7143522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 7153522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams alloc->setSurfaceTexture(rsc, static_cast<SurfaceTexture *>(vst)); 7163522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams} 7173522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams 7187ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationSetSurface(Context *rsc, RsAllocation valloc, RsNativeWindow sur) { 7197ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 7207ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams alloc->setSurface(rsc, sur); 7217ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 7227ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 7237ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationIoSend(Context *rsc, RsAllocation valloc) { 7247ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 7257ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams alloc->ioSend(rsc); 7267ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 7277ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 7287ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationIoReceive(Context *rsc, RsAllocation valloc) { 7297ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams Allocation *alloc = static_cast<Allocation *>(valloc); 7307ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams alloc->ioReceive(rsc); 7317ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams} 7327ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams 733c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 734c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 735c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 736c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsconst void * rsaAllocationGetType(RsContext con, RsAllocation va) { 737c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams Allocation *a = static_cast<Allocation *>(va); 738c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams a->getType()->incUserRef(); 739c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 740c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams return a->getType(); 741c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 742