rsAllocation.cpp revision 74a827988567a9d65954bb0d825a3ba4a97e2947
1326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/* 2326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams * Copyright (C) 2009 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" 18eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams#include "rs_hal.h" 19eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams 2039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 21326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android; 22326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript; 23326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 24a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex SakhartchoukAllocation::Allocation(Context *rsc, const Type *type, uint32_t usages, 25a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk RsAllocationMipmapControl mc) 26a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk : ObjectBase(rsc) { 27fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 28eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams memset(&mHal, 0, sizeof(mHal)); 29eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mHal.state.mipmapControl = RS_ALLOCATION_MIPMAP_NONE; 30bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.usageFlags = usages; 31bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.mipmapControl = mc; 32366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 33eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mHal.state.type.set(type); 34eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams updateCache(); 35fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams} 36fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 37eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason SamsAllocation * Allocation::createAllocation(Context *rsc, const Type *type, uint32_t usages, 38eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams RsAllocationMipmapControl mc) { 39eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams Allocation *a = new Allocation(rsc, type, usages, mc); 40fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 41eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (!rsc->mHal.funcs.allocation.init(rsc, a, type->getElement()->getHasReferences())) { 42eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->setError(RS_ERROR_FATAL_DRIVER, "Allocation::Allocation, alloc failure"); 43eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams delete a; 44eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return NULL; 45eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 46eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return a; 47bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams} 48fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams 49bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Samsvoid Allocation::updateCache() { 50bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Type *type = mHal.state.type.get(); 51bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.dimensionX = type->getDimX(); 52bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.dimensionY = type->getDimY(); 53bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.dimensionZ = type->getDimZ(); 54bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasFaces = type->getDimFaces(); 55bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasMipmaps = type->getDimLOD(); 56bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.elementSizeBytes = type->getElementSizeBytes(); 57bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.hasReferences = mHal.state.type->getElement()->getHasReferences(); 58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 60afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation::~Allocation() { 61eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mRSC->mHal.funcs.allocation.destroy(mRSC, this); 62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 64366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::syncAll(Context *rsc, RsAllocationUsageType src) { 65eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.syncAll(rsc, this, src); 66cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams} 67cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams 68afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::read(void *data) { 69eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams memcpy(data, getPtr(), mHal.state.type->getSizeBytes()); 70e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams} 71e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams 724b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod, 734b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams uint32_t count, const void *data, uint32_t sizeBytes) { 74eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams const uint32_t eSize = mHal.state.type->getElementSizeBytes(); 759397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 76eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if ((count * eSize) != sizeBytes) { 77eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams LOGE("Allocation::subData called with mismatched size expected %i, got %i", 78eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams (count * eSize), sizeBytes); 79bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type->dumpLOGV("type info"); 809397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams return; 819397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 82e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 83eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.data1D(rsc, this, xoff, lod, count, data, sizeBytes); 84eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 85326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 86326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 874b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, 88afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes) { 89eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams const uint32_t eSize = mHal.state.elementSizeBytes; 90eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams const uint32_t lineSize = eSize * w; 91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 92a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams //LOGE("data2d %p, %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes); 939397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 94a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams if ((lineSize * h) != sizeBytes) { 95a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams LOGE("Allocation size mismatch, expected %i, got %i", (lineSize * h), sizeBytes); 969397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(!"Allocation::subData called with mismatched size"); 979397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams return; 989397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 999397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 100eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.data2D(rsc, this, xoff, yoff, lod, face, w, h, data, sizeBytes); 101eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 104236385b73f21ae65e756b9cb5738f1514d95ea3eJason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, 105236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams uint32_t lod, RsAllocationCubemapFace face, 106236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes) { 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 1094b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, const void *data, 110afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t cIdx, uint32_t sizeBytes) { 111bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams uint32_t eSize = mHal.state.elementSizeBytes; 1125f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 113bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (cIdx >= mHal.state.type->getElement()->getFieldCount()) { 1145f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData component %i out of range.", cIdx); 1155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); 1165f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1175f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 119bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (x >= mHal.state.dimensionX) { 1205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData X offset %i out of range.", x); 1215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 1225f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1235f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1245f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 125bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element * e = mHal.state.type->getElement()->getField(cIdx); 1265f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (sizeBytes != e->getSizeBytes()) { 127099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk LOGE("Error Allocation::subElementData data size %i does not match field size %zu.", sizeBytes, e->getSizeBytes()); 1285f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); 1295f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1305f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1315f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 132eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.elementData1D(rsc, this, x, data, cIdx, sizeBytes); 133eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 1345f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 1355f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 1364b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, uint32_t y, 137afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk const void *data, uint32_t cIdx, uint32_t sizeBytes) { 138bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams uint32_t eSize = mHal.state.elementSizeBytes; 1395f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 140bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (x >= mHal.state.dimensionX) { 1415f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData X offset %i out of range.", x); 1425f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 1435f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1445f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1455f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 146bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (y >= mHal.state.dimensionY) { 1475f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData X offset %i out of range.", x); 1485f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 1495f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1505f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1515f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 152bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (cIdx >= mHal.state.type->getElement()->getFieldCount()) { 1535f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData component %i out of range.", cIdx); 1545f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); 1555f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1565f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1575f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 158bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element * e = mHal.state.type->getElement()->getField(cIdx); 1595f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 1605f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (sizeBytes != e->getSizeBytes()) { 161099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk LOGE("Error Allocation::subElementData data size %i does not match field size %zu.", sizeBytes, e->getSizeBytes()); 1625f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); 1635f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 1645f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 1655f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 166eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.elementData2D(rsc, this, x, y, data, cIdx, sizeBytes); 167eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams sendDirty(rsc); 1685f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 1695f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 170afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::addProgramToDirty(const Program *p) { 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mToDirtyList.push(p); 1725c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 1735c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams 174afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::removeProgramToDirty(const Program *p) { 1755c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams for (size_t ct=0; ct < mToDirtyList.size(); ct++) { 1765c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams if (mToDirtyList[ct] == p) { 1775c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams mToDirtyList.removeAt(ct); 1785c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams return; 1795c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 1805c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 1815c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams rsAssert(0); 1825c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 184afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::dumpLOGV(const char *prefix) const { 185c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams ObjectBase::dumpLOGV(prefix); 186c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 187c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams String8 s(prefix); 188c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams s.append(" type "); 189bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams if (mHal.state.type.get()) { 190bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type->dumpLOGV(s.string()); 191c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams } 192c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 193eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams LOGV("%s allocation ptr=%p mUsageFlags=0x04%x, mMipmapControl=0x%04x", 194eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams prefix, getPtr(), mHal.state.usageFlags, mHal.state.mipmapControl); 195c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams} 196326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 197afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::serialize(OStream *stream) const { 198fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 200fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 201fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 202fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 204fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First thing we need to serialize is the type object since it will be needed 205fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // to initialize the class 206bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type->serialize(stream); 207fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 208bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams uint32_t dataSize = mHal.state.type->getSizeBytes(); 209fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write how much data we are storing 210fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(dataSize); 211fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write the data 212eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams stream->addByteArray(getPtr(), dataSize); 213fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 214fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 215afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation *Allocation::createFromStream(Context *rsc, IStream *stream) { 216fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 217b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 218afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (classID != RS_A3D_CLASS_ID_ALLOCATION) { 219fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("allocation loading skipped due to invalid class id\n"); 220fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 221fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 222fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 223fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 224fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 225fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 226fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Type *type = Type::createFromStream(rsc, stream); 227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!type) { 228fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 229fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 230fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk type->compute(); 231fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Number of bytes we wrote out for this allocation 233fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t dataSize = stream->loadU32(); 234afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (dataSize != type->getSizeBytes()) { 235fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("failed to read allocation because numbytes written is not the same loaded type wants\n"); 236225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ObjectBase::checkDelete(type); 237fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 238fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 239fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 240eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT); 241fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk alloc->setName(name.string(), name.size()); 242fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 2434b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams uint32_t count = dataSize / type->getElementSizeBytes(); 2444b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams 245fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Read in all of our allocation data 2464b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize); 247e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk stream->reset(stream->getPos() + dataSize); 248fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 249fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return alloc; 250fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 251fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 252eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Samsvoid Allocation::sendDirty(const Context *rsc) const { 2535c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams for (size_t ct=0; ct < mToDirtyList.size(); ct++) { 2545c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams mToDirtyList[ct]->forceDirty(); 2555c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 256eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams mRSC->mHal.funcs.allocation.markDirty(rsc, this); 2575c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 258326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 259afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const { 260e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 261bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element *e = mHal.state.type->getElement(); 262e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t stride = e->getSizeBytes(); 263e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 26496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams p += stride * startOff; 265e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams while (ct > 0) { 266e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->incRefs(p); 267e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ct --; 268e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams p += stride; 269e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 270e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 271e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 272afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const { 273e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 274bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams const Element *e = mHal.state.type->getElement(); 275e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t stride = e->getSizeBytes(); 276e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 27796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams p += stride * startOff; 278e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams while (ct > 0) { 279e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->decRefs(p); 280e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ct --; 281e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams p += stride; 282e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 283e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 284e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 285afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) { 28696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 28796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 288afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize1D(Context *rsc, uint32_t dimX) { 289bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams uint32_t oldDimX = mHal.state.dimensionX; 29096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX == oldDimX) { 29196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams return; 29296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 29396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 294eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams Type *t = mHal.state.type->cloneAndResize1D(rsc, dimX); 29596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX < oldDimX) { 296eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams decRefs(getPtr(), oldDimX - dimX, dimX); 29796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 298eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams rsc->mHal.funcs.allocation.resize(rsc, this, t, mHal.state.hasReferences); 299bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams mHal.state.type.set(t); 300bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams updateCache(); 30196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 30296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 303afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) { 30496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams LOGE("not implemented"); 30596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 30696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////// 308565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams// 3096a121811e5d2e56e94747b36d15c7613ab2aedd4Stephen Hines 310326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 311326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 312326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 313c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsstatic void AllocationGenerateScriptMips(RsContext con, RsAllocation va); 314c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 315afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip565(const Adapter2D &out, const Adapter2D &in) { 316326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t w = out.getDimX(); 317326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t h = out.getDimY(); 318326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 319e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t y=0; y < h; y++) { 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint16_t *oPtr = static_cast<uint16_t *>(out.getElement(0, y)); 321326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint16_t *i1 = static_cast<uint16_t *>(in.getElement(0, y*2)); 322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint16_t *i2 = static_cast<uint16_t *>(in.getElement(0, y*2+1)); 323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 324e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t x=0; x < w; x++) { 325565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]); 326565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams oPtr ++; 327565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams i1 += 2; 328565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams i2 += 2; 329565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 330565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 331565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams} 332565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 333afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8888(const Adapter2D &out, const Adapter2D &in) { 334565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t w = out.getDimX(); 335565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t h = out.getDimY(); 336565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 337e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t y=0; y < h; y++) { 338565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t *oPtr = static_cast<uint32_t *>(out.getElement(0, y)); 339565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams const uint32_t *i1 = static_cast<uint32_t *>(in.getElement(0, y*2)); 340565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams const uint32_t *i2 = static_cast<uint32_t *>(in.getElement(0, y*2+1)); 341565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 342e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t x=0; x < w; x++) { 343565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]); 344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams oPtr ++; 345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams i1 += 2; 346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams i2 += 2; 347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 348326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 351afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8(const Adapter2D &out, const Adapter2D &in) { 3522f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint32_t w = out.getDimX(); 3532f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint32_t h = out.getDimY(); 3542f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 3552f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams for (uint32_t y=0; y < h; y++) { 3562f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint8_t *oPtr = static_cast<uint8_t *>(out.getElement(0, y)); 3572f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams const uint8_t *i1 = static_cast<uint8_t *>(in.getElement(0, y*2)); 3582f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams const uint8_t *i2 = static_cast<uint8_t *>(in.getElement(0, y*2+1)); 3592f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 3602f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams for (uint32_t x=0; x < w; x++) { 3612f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f); 3622f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams oPtr ++; 3632f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams i1 += 2; 3642f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams i2 += 2; 3652f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams } 3662f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams } 3672f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams} 3682f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 369afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip(const Adapter2D &out, const Adapter2D &in) { 370afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (out.getBaseType()->getElement()->getSizeBits()) { 371e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams case 32: 372e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams mip8888(out, in); 373e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams break; 374e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams case 16: 375e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams mip565(out, in); 376e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams break; 3772f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams case 8: 3782f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams mip8(out, in); 3792f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams break; 380e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams } 381e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams} 382326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 383366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) { 384366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Allocation *a = static_cast<Allocation *>(va); 385eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams a->sendDirty(rsc); 386366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams a->syncAll(rsc, src); 387366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams} 388366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 389a23715148f7bda74e904fc553b70c9a49fd52a6eJason Samsvoid rsi_AllocationGenerateMipmaps(Context *rsc, RsAllocation va) { 39039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(va); 391c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams AllocationGenerateScriptMips(rsc, texAlloc); 39239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk} 39339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 394837e388700a48084489ba59d1d8cc5ece68b1535Jason Samsvoid rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t dataLen) { 395837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams Allocation *texAlloc = static_cast<Allocation *>(va); 396837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams const Type * t = texAlloc->getType(); 397837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 398837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams size_t s = t->getDimX() * t->getDimY() * t->getElementSizeBytes(); 399837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams if (s != dataLen) { 400837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size"); 401837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams return; 402837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams } 403837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 404837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams memcpy(data, texAlloc->getPtr(), s); 405837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams} 406837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 4074b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod, 408b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk uint32_t count, const void *data, size_t sizeBytes) { 409326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 4104b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->data(rsc, xoff, lod, count, data, sizeBytes); 4115f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 4125f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4134b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, uint32_t lod, RsAllocationCubemapFace face, 414b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk const void *data, size_t eoff, uint32_t sizeBytes) { // TODO: this seems wrong, eoff and sizeBytes may be swapped 4155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams Allocation *a = static_cast<Allocation *>(va); 4164b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->elementData(rsc, x, y, data, eoff, sizeBytes); 4175f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 4185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4194b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t lod, 420b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk const void *data, size_t eoff, uint32_t sizeBytes) { // TODO: this seems wrong, eoff and sizeBytes may be swapped 4215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams Allocation *a = static_cast<Allocation *>(va); 4224b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->elementData(rsc, x, data, eoff, sizeBytes); 423326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 424326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 4254b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, 426b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk uint32_t w, uint32_t h, const void *data, size_t sizeBytes) { 427326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 4284b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes); 429326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 430326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 43170b83c111beceaf8fbb700580833e7fec99272cfAlex Sakhartchoukvoid rsi_AllocationRead(Context *rsc, RsAllocation va, void *data, size_t data_length) { 432e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams Allocation *a = static_cast<Allocation *>(va); 433e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams a->read(data); 434e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams} 435e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams 436afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) { 43796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Allocation *a = static_cast<Allocation *>(va); 43896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams a->resize1D(rsc, dimX); 43996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 44096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 441afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) { 44296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Allocation *a = static_cast<Allocation *>(va); 44396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams a->resize2D(rsc, dimX, dimY); 44496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 44596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 446c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsstatic void AllocationGenerateScriptMips(RsContext con, RsAllocation va) { 447f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk Context *rsc = static_cast<Context *>(con); 448f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(va); 449f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk uint32_t numFaces = texAlloc->getType()->getDimFaces() ? 6 : 1; 450f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk for (uint32_t face = 0; face < numFaces; face ++) { 451f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk Adapter2D adapt(rsc, texAlloc); 452f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk Adapter2D adapt2(rsc, texAlloc); 453f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk adapt.setFace(face); 454f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk adapt2.setFace(face); 455f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) { 456f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk adapt.setLOD(lod); 457f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk adapt2.setLOD(lod + 1); 458f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk mip(adapt2, adapt); 459f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk } 460f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk } 461f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk} 462f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk 463c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype, 464c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 465c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams uint32_t usages) { 466eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips); 467eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams if (!alloc) { 468eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams return NULL; 469eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams } 470f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams alloc->incUserRef(); 471f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return alloc; 472f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 473f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 474c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype, 475c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 476c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const void *data, size_t data_length, uint32_t usages) { 477366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Type *t = static_cast<Type *>(vtype); 478f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 479c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages); 480f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); 481f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (texAlloc == NULL) { 482f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams LOGE("Memory allocation failure"); 483f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return NULL; 484f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 485f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 486366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams memcpy(texAlloc->getPtr(), data, t->getDimX() * t->getDimY() * t->getElementSizeBytes()); 487ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (mips == RS_ALLOCATION_MIPMAP_FULL) { 488c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams AllocationGenerateScriptMips(rsc, texAlloc); 489f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 490f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 491eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams texAlloc->sendDirty(rsc); 492f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return texAlloc; 493f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 49484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 495c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype, 496c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocationMipmapControl mips, 497c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams const void *data, size_t data_length, uint32_t usages) { 498366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Type *t = static_cast<Type *>(vtype); 49984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 50084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Cubemap allocation's faces should be Width by Width each. 50184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Source data should have 6 * Width by Width pixels 50284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Error checking is done in the java layer 503c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages); 50484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); 50584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (texAlloc == NULL) { 50684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk LOGE("Memory allocation failure"); 50784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return NULL; 50884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 50984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 5109f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t faceSize = t->getDimX(); 5119f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes(); 5129f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk uint32_t copySize = faceSize * t->getElementSizeBytes(); 5139f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk 51484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint8_t *sourcePtr = (uint8_t*)data; 515366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams for (uint32_t face = 0; face < 6; face ++) { 516366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Adapter2D faceAdapter(rsc, texAlloc); 517366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams faceAdapter.setFace(face); 518366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 5199f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk for (uint32_t dI = 0; dI < faceSize; dI ++) { 5209f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk memcpy(faceAdapter.getElement(0, dI), sourcePtr + strideBytes * dI, copySize); 5219f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk } 522366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 523366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams // Move the data pointer to the next cube face 5249f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk sourcePtr += copySize; 525f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk } 526366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 527f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk if (mips == RS_ALLOCATION_MIPMAP_FULL) { 528c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams AllocationGenerateScriptMips(rsc, texAlloc); 52984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 53084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 531eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams texAlloc->sendDirty(rsc); 53284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return texAlloc; 53384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk} 534099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk 53574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukvoid rsi_AllocationCopy2DRange(Context *rsc, 53674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk RsAllocation dstAlloc, 53774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstXoff, uint32_t dstYoff, 53874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t dstMip, uint32_t dstFace, 53974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t width, uint32_t height, 54074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk RsAllocation srcAlloc, 54174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcXoff, uint32_t srcYoff, 54274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk uint32_t srcMip, uint32_t srcFace) { 54374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk Allocation *dst = static_cast<Allocation *>(dstAlloc); 54474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk Allocation *src= static_cast<Allocation *>(srcAlloc); 54574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk rsc->mHal.funcs.allocation.allocData2D(rsc, dst, dstXoff, dstYoff, dstMip, 54674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk (RsAllocationCubemapFace)dstFace, 54774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk width, height, 54874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk src, srcXoff, srcYoff,srcMip, 54974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk (RsAllocationCubemapFace)srcFace); 55074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk} 55174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk 552c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 553c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 554c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 555c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsconst void * rsaAllocationGetType(RsContext con, RsAllocation va) { 556c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams Allocation *a = static_cast<Allocation *>(va); 557c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams a->getType()->incUserRef(); 558c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams 559c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams return a->getType(); 560c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams} 561