rsAllocation.cpp revision 2e1a94df812f0caa42ff24eaefeba8f90fbdf1ac
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;
362e1a94df812f0caa42ff24eaefeba8f90fbdf1acTim Murray    mHal.state.userProvidedPtr = 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();
646146238d58f914547c89b3a8cda9cccaa34f84a0Jason Sams    mHal.state.eType = mHal.state.type->getElement()->getType();
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
67afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation::~Allocation() {
68c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams    freeChildrenUnlocked();
693522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    setSurfaceTexture(mRSC, NULL);
70eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    mRSC->mHal.funcs.allocation.destroy(mRSC, this);
71326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
72326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
73366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::syncAll(Context *rsc, RsAllocationUsageType src) {
74eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    rsc->mHal.funcs.allocation.syncAll(rsc, this, src);
75cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
76cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
774b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod,
786ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines                         uint32_t count, const void *data, size_t sizeBytes) {
796ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines    const size_t eSize = mHal.state.type->getElementSizeBytes();
809397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
81eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    if ((count * eSize) != sizeBytes) {
826ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines        ALOGE("Allocation::subData called with mismatched size expected %zu, got %zu",
83eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams             (count * eSize), sizeBytes);
84bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        mHal.state.type->dumpLOGV("type info");
859397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
869397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
87e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
88eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    rsc->mHal.funcs.allocation.data1D(rsc, this, xoff, lod, count, data, sizeBytes);
89eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    sendDirty(rsc);
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
91326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
924b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
93358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                      uint32_t w, uint32_t h, const void *data, size_t sizeBytes) {
94358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
956ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines    const size_t eSize = mHal.state.elementSizeBytes;
966ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines    const size_t lineSize = eSize * w;
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
98a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    if ((lineSize * h) != sizeBytes) {
996ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines        ALOGE("Allocation size mismatch, expected %zu, got %zu", (lineSize * h), sizeBytes);
1009397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        rsAssert(!"Allocation::subData called with mismatched size");
1019397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
1029397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
1039397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
104358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    this->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes, lineSize);
105358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
106358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
107358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
108358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                      uint32_t w, uint32_t h, const void *data, size_t sizeBytes, size_t stride) {
109358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    const size_t eSize = mHal.state.elementSizeBytes;
110358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    const size_t lineSize = eSize * w;
111358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
112358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    //ALOGE("data2d %p,  %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes);
113358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
114358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    rsc->mHal.funcs.allocation.data2D(rsc, this, xoff, yoff, lod, face, w, h, data, sizeBytes, stride);
115eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    sendDirty(rsc);
116326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
117326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
118236385b73f21ae65e756b9cb5738f1514d95ea3eJason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff,
119236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                      uint32_t lod, RsAllocationCubemapFace face,
1206ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines                      uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes) {
121326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
122326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
123807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid Allocation::read(Context *rsc, uint32_t xoff, uint32_t lod,
124358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                      uint32_t count, void *data, size_t sizeBytes) {
125807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    const size_t eSize = mHal.state.type->getElementSizeBytes();
126807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
127807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    if ((count * eSize) != sizeBytes) {
128807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        ALOGE("Allocation::read called with mismatched size expected %zu, got %zu",
129807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams             (count * eSize), sizeBytes);
130807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        mHal.state.type->dumpLOGV("type info");
131807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        return;
132807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    }
133807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
134807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    rsc->mHal.funcs.allocation.read1D(rsc, this, xoff, lod, count, data, sizeBytes);
135807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams}
136807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
137509ea5c832a865bc9083d53f1f058377a689bab3Tim Murrayvoid Allocation::readUnchecked(Context *rsc, uint32_t xoff, uint32_t lod,
138509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray                         uint32_t count, void *data, size_t sizeBytes) {
139509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    rsc->mHal.funcs.allocation.read1D(rsc, this, xoff, lod, count, data, sizeBytes);
140509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray}
141509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
142509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
143807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid Allocation::read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
144358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                      uint32_t w, uint32_t h, void *data, size_t sizeBytes) {
145807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    const size_t eSize = mHal.state.elementSizeBytes;
146807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    const size_t lineSize = eSize * w;
147807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
148807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    if ((lineSize * h) != sizeBytes) {
149807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        ALOGE("Allocation size mismatch, expected %zu, got %zu", (lineSize * h), sizeBytes);
150807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        rsAssert(!"Allocation::read called with mismatched size");
151807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        return;
152807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    }
153807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
154358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    read(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes, lineSize);
155358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray}
156358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
157358747a3118301c5faeee73c98dd5f839bbfb54aTim Murrayvoid Allocation::read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
158358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                      uint32_t w, uint32_t h, void *data, size_t sizeBytes, size_t stride) {
159358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    const size_t eSize = mHal.state.elementSizeBytes;
160358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    const size_t lineSize = eSize * w;
161358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    if (!stride) {
162358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray        stride = lineSize;
163358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    }
164358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray
165358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    rsc->mHal.funcs.allocation.read2D(rsc, this, xoff, yoff, lod, face, w, h, data, sizeBytes, stride);
166807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams}
167807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
168807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid Allocation::read(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff,
169807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                      uint32_t lod, RsAllocationCubemapFace face,
170807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                      uint32_t w, uint32_t h, uint32_t d, void *data, size_t sizeBytes) {
171807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams}
172807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
1734b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, const void *data,
1746ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines                                uint32_t cIdx, size_t sizeBytes) {
1756ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines    size_t eSize = mHal.state.elementSizeBytes;
1765f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
177bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (cIdx >= mHal.state.type->getElement()->getFieldCount()) {
178af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Error Allocation::subElementData component %i out of range.", cIdx);
1795f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
1805f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
1815f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
1825f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
183bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (x >= mHal.state.dimensionX) {
184af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
1855f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
1865f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
1875f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
1885f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
189bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    const Element * e = mHal.state.type->getElement()->getField(cIdx);
190769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk    uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx);
191769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk    if (sizeBytes != e->getSizeBytes() * elemArraySize) {
1926ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines        ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes());
1935f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
1945f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
1955f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
1965f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
197eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    rsc->mHal.funcs.allocation.elementData1D(rsc, this, x, data, cIdx, sizeBytes);
198eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    sendDirty(rsc);
1995f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
2005f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
2014b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, uint32_t y,
2026ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines                                const void *data, uint32_t cIdx, size_t sizeBytes) {
2036ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines    size_t eSize = mHal.state.elementSizeBytes;
2045f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
205bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (x >= mHal.state.dimensionX) {
206af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
2075f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
2085f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
2095f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
2105f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
211bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (y >= mHal.state.dimensionY) {
212af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Error Allocation::subElementData X offset %i out of range.", x);
2135f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
2145f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
2155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
2165f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
217bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    if (cIdx >= mHal.state.type->getElement()->getFieldCount()) {
218af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Error Allocation::subElementData component %i out of range.", cIdx);
2195f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
2205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
2215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
2225f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
223bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    const Element * e = mHal.state.type->getElement()->getField(cIdx);
224769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk    uint32_t elemArraySize = mHal.state.type->getElement()->getFieldArraySize(cIdx);
225769463262d655087ed39d9b823673e776a8af946Alex Sakhartchouk    if (sizeBytes != e->getSizeBytes() * elemArraySize) {
2266ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines        ALOGE("Error Allocation::subElementData data size %zu does not match field size %zu.", sizeBytes, e->getSizeBytes());
2275f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
2285f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
2295f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
2305f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
231eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    rsc->mHal.funcs.allocation.elementData2D(rsc, this, x, y, data, cIdx, sizeBytes);
232eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    sendDirty(rsc);
2335f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
2345f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
235afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::addProgramToDirty(const Program *p) {
236fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mToDirtyList.push(p);
2375c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
2385c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams
239afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::removeProgramToDirty(const Program *p) {
2405c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
2415c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        if (mToDirtyList[ct] == p) {
2425c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams            mToDirtyList.removeAt(ct);
2435c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams            return;
2445c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        }
2455c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    }
2465c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    rsAssert(0);
2475c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
248326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
249afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::dumpLOGV(const char *prefix) const {
250c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    ObjectBase::dumpLOGV(prefix);
251c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
252c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    String8 s(prefix);
253c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    s.append(" type ");
254064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    if (mHal.state.type) {
255bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams        mHal.state.type->dumpLOGV(s.string());
256c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    }
257c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
2586598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block    ALOGV("%s allocation ptr=%p  mUsageFlags=0x04%x, mMipmapControl=0x%04x",
259709a0978ae141198018ca9769f8d96292a8928e6Jason Sams         prefix, mHal.drvState.lod[0].mallocPtr, mHal.state.usageFlags, mHal.state.mipmapControl);
260c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams}
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
2622d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchoukuint32_t Allocation::getPackedSize() const {
2632d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t numItems = mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes();
2642d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    return numItems * mHal.state.type->getElement()->getSizeBytesUnpadded();
2652d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk}
2662d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
267e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Allocation::writePackedData(Context *rsc, const Type *type,
2682d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk                                 uint8_t *dst, const uint8_t *src, bool dstPadded) {
2692d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    const Element *elem = type->getElement();
2702d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t unpaddedBytes = elem->getSizeBytesUnpadded();
2712d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t paddedBytes = elem->getSizeBytes();
2722d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t numItems = type->getSizeBytes() / paddedBytes;
2732d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
2742d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t srcInc = !dstPadded ? paddedBytes : unpaddedBytes;
2752d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t dstInc =  dstPadded ? paddedBytes : unpaddedBytes;
2762d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
2772d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    // no sub-elements
2782d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t fieldCount = elem->getFieldCount();
2792d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    if (fieldCount == 0) {
2802d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        for (uint32_t i = 0; i < numItems; i ++) {
2812d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk            memcpy(dst, src, unpaddedBytes);
2822d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk            src += srcInc;
2832d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk            dst += dstInc;
2842d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        }
2852d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        return;
2862d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
2872d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
2882d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    // Cache offsets
2892d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t *offsetsPadded = new uint32_t[fieldCount];
2902d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t *offsetsUnpadded = new uint32_t[fieldCount];
2912d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t *sizeUnpadded = new uint32_t[fieldCount];
2922d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
2932d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    for (uint32_t i = 0; i < fieldCount; i++) {
2942d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        offsetsPadded[i] = elem->getFieldOffsetBytes(i);
2952d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        offsetsUnpadded[i] = elem->getFieldOffsetBytesUnpadded(i);
2962d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        sizeUnpadded[i] = elem->getField(i)->getSizeBytesUnpadded();
2972d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
2982d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
2992d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t *srcOffsets = !dstPadded ? offsetsPadded : offsetsUnpadded;
3002d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t *dstOffsets =  dstPadded ? offsetsPadded : offsetsUnpadded;
3012d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
3022d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    // complex elements, need to copy subelem after subelem
3032d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    for (uint32_t i = 0; i < numItems; i ++) {
3042d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        for (uint32_t fI = 0; fI < fieldCount; fI++) {
3052d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk            memcpy(dst + dstOffsets[fI], src + srcOffsets[fI], sizeUnpadded[fI]);
3062d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        }
3072d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        src += srcInc;
3082d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        dst += dstInc;
3092d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
3102d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
3112d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    delete[] offsetsPadded;
3122d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    delete[] offsetsUnpadded;
3132d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    delete[] sizeUnpadded;
3142d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk}
3152d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
316e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Allocation::unpackVec3Allocation(Context *rsc, const void *data, size_t dataSize) {
3172d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    const uint8_t *src = (const uint8_t*)data;
31861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    uint8_t *dst = (uint8_t *)rsc->mHal.funcs.allocation.lock1D(rsc, this);
3192d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
320e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    writePackedData(rsc, getType(), dst, src, true);
32161a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    rsc->mHal.funcs.allocation.unlock1D(rsc, this);
3222d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk}
3232d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
324e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Allocation::packVec3Allocation(Context *rsc, OStream *stream) const {
3252d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t paddedBytes = getType()->getElement()->getSizeBytes();
3262d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t unpaddedBytes = getType()->getElement()->getSizeBytesUnpadded();
3272d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t numItems = mHal.state.type->getSizeBytes() / paddedBytes;
3282d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
32961a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    const uint8_t *src = (const uint8_t*)rsc->mHal.funcs.allocation.lock1D(rsc, this);
3302d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint8_t *dst = new uint8_t[numItems * unpaddedBytes];
3312d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
332e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    writePackedData(rsc, getType(), dst, src, false);
3332d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    stream->addByteArray(dst, getPackedSize());
3342d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
3352d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    delete[] dst;
33661a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    rsc->mHal.funcs.allocation.unlock1D(rsc, this);
3372d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk}
3382d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
339e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid Allocation::serialize(Context *rsc, OStream *stream) const {
340fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
341fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
342fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
343fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
344fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
345fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
346fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First thing we need to serialize is the type object since it will be needed
347fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // to initialize the class
348e3150cfb3edb028407669e4a65e087eae77e718cJason Sams    mHal.state.type->serialize(rsc, stream);
349fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
350bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    uint32_t dataSize = mHal.state.type->getSizeBytes();
3512d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    // 3 element vectors are padded to 4 in memory, but padding isn't serialized
3522d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t packedSize = getPackedSize();
353fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Write how much data we are storing
3542d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    stream->addU32(packedSize);
3552d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    if (dataSize == packedSize) {
3562d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        // Now write the data
35761a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams        stream->addByteArray(rsc->mHal.funcs.allocation.lock1D(rsc, this), dataSize);
35861a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams        rsc->mHal.funcs.allocation.unlock1D(rsc, this);
3592d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    } else {
3602d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        // Now write the data
361e3150cfb3edb028407669e4a65e087eae77e718cJason Sams        packVec3Allocation(rsc, stream);
3622d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
363fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
364fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
365afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation *Allocation::createFromStream(Context *rsc, IStream *stream) {
366fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
367b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
368afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (classID != RS_A3D_CLASS_ID_ALLOCATION) {
369af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("allocation loading skipped due to invalid class id\n");
370fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
371fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
372fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
373fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
374fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
375fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
376fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Type *type = Type::createFromStream(rsc, stream);
377afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (!type) {
378fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
379fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
380fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->compute();
381fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
3822d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT);
3832d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    type->decUserRef();
3842d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk
385fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Number of bytes we wrote out for this allocation
386fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint32_t dataSize = stream->loadU32();
3872d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    // 3 element vectors are padded to 4 in memory, but padding isn't serialized
3882d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    uint32_t packedSize = alloc->getPackedSize();
3892d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    if (dataSize != type->getSizeBytes() &&
3902d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        dataSize != packedSize) {
391af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("failed to read allocation because numbytes written is not the same loaded type wants\n");
3922d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        ObjectBase::checkDelete(alloc);
393225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        ObjectBase::checkDelete(type);
394fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
395fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
396fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
397fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    alloc->setName(name.string(), name.size());
3984b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams
3992d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    if (dataSize == type->getSizeBytes()) {
4002d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        uint32_t count = dataSize / type->getElementSizeBytes();
4012d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        // Read in all of our allocation data
4022d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk        alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize);
4032d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    } else {
404e3150cfb3edb028407669e4a65e087eae77e718cJason Sams        alloc->unpackVec3Allocation(rsc, stream->getPtr() + stream->getPos(), dataSize);
4052d1220c27ae91f0b307f283fe66cb767b63dfe38Alex Sakhartchouk    }
406e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk    stream->reset(stream->getPos() + dataSize);
407fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
408fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return alloc;
409fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
410fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
411eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Samsvoid Allocation::sendDirty(const Context *rsc) const {
4125c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
4135c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        mToDirtyList[ct]->forceDirty();
4145c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    }
415eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    mRSC->mHal.funcs.allocation.markDirty(rsc, this);
4165c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
417326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
418afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const {
4199f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    mHal.state.type->incRefs(ptr, ct, startOff);
420e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
421e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
422afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const {
4235c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk    if (!mHal.state.hasReferences || !getIsScript()) {
4245c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk        return;
4255c4369a3a1b19eaeabb044af2cdeef05474f9069Alex Sakhartchouk    }
4269f70a4e63825afe9f786483722e1669b3625f5e9Stephen Hines    mHal.state.type->decRefs(ptr, ct, startOff);
427e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
428e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
429c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Samsvoid Allocation::freeChildrenUnlocked () {
43061a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    void *ptr = mRSC->mHal.funcs.allocation.lock1D(mRSC, this);
43161a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    decRefs(ptr, mHal.state.type->getSizeBytes() / mHal.state.type->getElementSizeBytes(), 0);
43261a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    mRSC->mHal.funcs.allocation.unlock1D(mRSC, this);
433c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams}
434c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams
435c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Samsbool Allocation::freeChildren() {
436c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams    if (mHal.state.hasReferences) {
437c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams        incSysRef();
438c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams        freeChildrenUnlocked();
439c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams        return decSysRef();
440c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams    }
441c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams    return false;
442c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams}
443c7cec1e3577cc77a5a73d5bd5a82733b1b9936a1Jason Sams
444afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) {
44596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
44696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
447afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize1D(Context *rsc, uint32_t dimX) {
448bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    uint32_t oldDimX = mHal.state.dimensionX;
44996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX == oldDimX) {
45096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        return;
45196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
45296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
453c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    ObjectBaseRef<Type> t = mHal.state.type->cloneAndResize1D(rsc, dimX);
45496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX < oldDimX) {
45561a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams        decRefs(rsc->mHal.funcs.allocation.lock1D(rsc, this), oldDimX - dimX, dimX);
45661a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams        rsc->mHal.funcs.allocation.unlock1D(rsc, this);
45796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
458c700e649ca44d0dcff8b271e42d949ea72fe3c63Alex Sakhartchouk    rsc->mHal.funcs.allocation.resize(rsc, this, t.get(), mHal.state.hasReferences);
459064aa7ed76db9564b041afcd4b75da5b3d12fabaAlex Sakhartchouk    setType(t.get());
460bad807405b2b9764372af1ad24bcfd4fb1f33d8eJason Sams    updateCache();
46196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
46296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
463afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) {
464af12ac6a08651464f8d823add667c706f993b587Steve Block    ALOGE("not implemented");
46596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
46696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
46741e373d91a60043afa0f9abd026218b49cbc1201Jason Samsint32_t Allocation::getSurfaceTextureID(const Context *rsc) {
46841e373d91a60043afa0f9abd026218b49cbc1201Jason Sams    int32_t id = rsc->mHal.funcs.allocation.initSurfaceTexture(rsc, this);
46941e373d91a60043afa0f9abd026218b49cbc1201Jason Sams    mHal.state.surfaceTextureID = id;
47041e373d91a60043afa0f9abd026218b49cbc1201Jason Sams    return id;
47141e373d91a60043afa0f9abd026218b49cbc1201Jason Sams}
47241e373d91a60043afa0f9abd026218b49cbc1201Jason Sams
4733522f40418fdf877f5a136475dbf75e57a3b7c77Jason Samsvoid Allocation::setSurfaceTexture(const Context *rsc, SurfaceTexture *st) {
4743522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    if(st != mHal.state.surfaceTexture) {
4753522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        if(mHal.state.surfaceTexture != NULL) {
4763522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams            mHal.state.surfaceTexture->decStrong(NULL);
4773522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        }
4783522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        mHal.state.surfaceTexture = st;
4793522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        if(mHal.state.surfaceTexture != NULL) {
4803522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams            mHal.state.surfaceTexture->incStrong(NULL);
4813522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams        }
4823522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    }
4833522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams}
4843522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams
4857ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::setSurface(const Context *rsc, RsNativeWindow sur) {
4867ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    ANativeWindow *nw = (ANativeWindow *)sur;
4877ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    ANativeWindow *old = mHal.state.wndSurface;
4887ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    if (nw) {
4897ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams        nw->incStrong(NULL);
4907ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    }
4917ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    rsc->mHal.funcs.allocation.setSurfaceTexture(rsc, this, nw);
4927ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    mHal.state.wndSurface = nw;
4937ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    if (old) {
4947ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams        old->decStrong(NULL);
4957ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    }
4967ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams}
4977ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
4987ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::ioSend(const Context *rsc) {
4997ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    rsc->mHal.funcs.allocation.ioSend(rsc, this);
5007ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams}
5017ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
5027ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid Allocation::ioReceive(const Context *rsc) {
5037ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    rsc->mHal.funcs.allocation.ioReceive(rsc, this);
5047ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams}
5057ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
5067ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
507326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////
508565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams//
5096a121811e5d2e56e94747b36d15c7613ab2aedd4Stephen Hines
510326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
511326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
512326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
513366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) {
514366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Allocation *a = static_cast<Allocation *>(va);
515eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    a->sendDirty(rsc);
516366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    a->syncAll(rsc, src);
517366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams}
518366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
519a23715148f7bda74e904fc553b70c9a49fd52a6eJason Samsvoid rsi_AllocationGenerateMipmaps(Context *rsc, RsAllocation va) {
52061a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    Allocation *alloc = static_cast<Allocation *>(va);
52161a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams    rsc->mHal.funcs.allocation.generateMipmaps(rsc, alloc);
52239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk}
52339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
524807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t sizeBytes) {
525807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    Allocation *a = static_cast<Allocation *>(va);
526807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    const Type * t = a->getType();
527807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    a->read(rsc, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
528807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams            t->getDimX(), t->getDimY(), data, sizeBytes);
529837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams}
530837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
5314b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod,
532b81a0eb8180791e4eaab1253b59fa8bd562b046bAlex Sakhartchouk                          uint32_t count, const void *data, size_t sizeBytes) {
533326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
5344b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->data(rsc, xoff, lod, count, data, sizeBytes);
5355f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
5365f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
5374b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, uint32_t lod, RsAllocationCubemapFace face,
5386ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines                                 const void *data, size_t sizeBytes, size_t eoff) {
5395f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    Allocation *a = static_cast<Allocation *>(va);
5404b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->elementData(rsc, x, y, data, eoff, sizeBytes);
5415f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
5425f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
5434b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t lod,
5446ae039baf797915d46f3b3901d1b7f5cc83feaceStephen Hines                                 const void *data, size_t sizeBytes, size_t eoff) {
5455f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    Allocation *a = static_cast<Allocation *>(va);
5464b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->elementData(rsc, x, data, eoff, sizeBytes);
547326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
548326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
5494b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
550358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                          uint32_t w, uint32_t h, const void *data, size_t sizeBytes, size_t stride) {
551326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
552358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes, stride);
553326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
554326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
555807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Samsvoid rsi_AllocationRead(Context *rsc, RsAllocation va, void *data, size_t sizeBytes) {
556e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams    Allocation *a = static_cast<Allocation *>(va);
557807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    const Type * t = a->getType();
558807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    if(t->getDimY()) {
559807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        a->read(rsc, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
560807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                t->getDimX(), t->getDimY(), data, sizeBytes);
561807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    } else {
562807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams        a->read(rsc, 0, 0, t->getDimX(), data, sizeBytes);
563807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    }
564807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams
565e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams}
566e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams
567afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) {
56896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Allocation *a = static_cast<Allocation *>(va);
56996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    a->resize1D(rsc, dimX);
57096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
57196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
572afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) {
57396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Allocation *a = static_cast<Allocation *>(va);
57496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    a->resize2D(rsc, dimX, dimY);
57596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
57696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
577c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCreateTyped(Context *rsc, RsType vtype,
578c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                                       RsAllocationMipmapControl mips,
579179e9a457095fea4c9e6d366c269754b882d05ddJason Sams                                       uint32_t usages, uint32_t ptr) {
580179e9a457095fea4c9e6d366c269754b882d05ddJason Sams    Allocation * alloc = Allocation::createAllocation(rsc, static_cast<Type *>(vtype), usages, mips, (void *)ptr);
581eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    if (!alloc) {
582eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams        return NULL;
583eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    }
584f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    alloc->incUserRef();
585f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    return alloc;
586f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams}
587f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
588c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype,
589c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                                            RsAllocationMipmapControl mips,
590807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                            const void *data, size_t sizeBytes, uint32_t usages) {
591366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Type *t = static_cast<Type *>(vtype);
592f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
593179e9a457095fea4c9e6d366c269754b882d05ddJason Sams    RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0);
594f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
595f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    if (texAlloc == NULL) {
596af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Memory allocation failure");
597f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        return NULL;
598f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
599f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
600807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams    texAlloc->data(rsc, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X,
601807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                   t->getDimX(), t->getDimY(), data, sizeBytes);
602ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
60361a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams        rsc->mHal.funcs.allocation.generateMipmaps(rsc, texAlloc);
604f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
605f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
606eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    texAlloc->sendDirty(rsc);
607f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    return texAlloc;
608f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams}
60984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
610c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason SamsRsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype,
611c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams                                                RsAllocationMipmapControl mips,
612807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                                                const void *data, size_t sizeBytes, uint32_t usages) {
613366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Type *t = static_cast<Type *>(vtype);
61484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
61584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Cubemap allocation's faces should be Width by Width each.
61684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Source data should have 6 * Width by Width pixels
61784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Error checking is done in the java layer
618179e9a457095fea4c9e6d366c269754b882d05ddJason Sams    RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mips, usages, 0);
61984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
62084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    if (texAlloc == NULL) {
621af12ac6a08651464f8d823add667c706f993b587Steve Block        ALOGE("Memory allocation failure");
62284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        return NULL;
62384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
62484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
6259f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t faceSize = t->getDimX();
6269f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes();
6279f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t copySize = faceSize * t->getElementSizeBytes();
6289f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk
62984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    uint8_t *sourcePtr = (uint8_t*)data;
630366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    for (uint32_t face = 0; face < 6; face ++) {
6319f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        for (uint32_t dI = 0; dI < faceSize; dI ++) {
632807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams            texAlloc->data(rsc, 0, dI, 0, (RsAllocationCubemapFace)face,
633807fdc4b6f3fb893015ee136565d6151bb2332d3Jason Sams                           t->getDimX(), 1, sourcePtr + strideBytes * dI, copySize);
6349f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        }
635366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
636366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        // Move the data pointer to the next cube face
6379f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        sourcePtr += copySize;
638f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    }
639366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
640f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
64161a4bb734b91ced09fbfee4214c6f253cb66e5f0Jason Sams        rsc->mHal.funcs.allocation.generateMipmaps(rsc, texAlloc);
64284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
64384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
644eb4fe18dd88634330f9566cbb9e785d8c7ec5813Jason Sams    texAlloc->sendDirty(rsc);
64584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    return texAlloc;
64684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
647099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
64874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukvoid rsi_AllocationCopy2DRange(Context *rsc,
64974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                               RsAllocation dstAlloc,
65074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                               uint32_t dstXoff, uint32_t dstYoff,
65174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                               uint32_t dstMip, uint32_t dstFace,
65274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                               uint32_t width, uint32_t height,
65374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                               RsAllocation srcAlloc,
65474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                               uint32_t srcXoff, uint32_t srcYoff,
65574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                               uint32_t srcMip, uint32_t srcFace) {
65674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk    Allocation *dst = static_cast<Allocation *>(dstAlloc);
65774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk    Allocation *src= static_cast<Allocation *>(srcAlloc);
65874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk    rsc->mHal.funcs.allocation.allocData2D(rsc, dst, dstXoff, dstYoff, dstMip,
65974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                                           (RsAllocationCubemapFace)dstFace,
66074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                                           width, height,
66174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                                           src, srcXoff, srcYoff,srcMip,
66274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                                           (RsAllocationCubemapFace)srcFace);
66374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk}
66474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
66541e373d91a60043afa0f9abd026218b49cbc1201Jason Samsint32_t rsi_AllocationGetSurfaceTextureID(Context *rsc, RsAllocation valloc) {
66641e373d91a60043afa0f9abd026218b49cbc1201Jason Sams    Allocation *alloc = static_cast<Allocation *>(valloc);
66741e373d91a60043afa0f9abd026218b49cbc1201Jason Sams    return alloc->getSurfaceTextureID(rsc);
66841e373d91a60043afa0f9abd026218b49cbc1201Jason Sams}
66941e373d91a60043afa0f9abd026218b49cbc1201Jason Sams
6703522f40418fdf877f5a136475dbf75e57a3b7c77Jason Samsvoid rsi_AllocationGetSurfaceTextureID2(Context *rsc, RsAllocation valloc, void *vst, size_t len) {
6713522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    Allocation *alloc = static_cast<Allocation *>(valloc);
6723522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams    alloc->setSurfaceTexture(rsc, static_cast<SurfaceTexture *>(vst));
6733522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams}
6743522f40418fdf877f5a136475dbf75e57a3b7c77Jason Sams
6757ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationSetSurface(Context *rsc, RsAllocation valloc, RsNativeWindow sur) {
6767ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    Allocation *alloc = static_cast<Allocation *>(valloc);
6777ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    alloc->setSurface(rsc, sur);
6787ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams}
6797ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
6807ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationIoSend(Context *rsc, RsAllocation valloc) {
6817ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    Allocation *alloc = static_cast<Allocation *>(valloc);
6827ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    alloc->ioSend(rsc);
6837ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams}
6847ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
6857ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Samsvoid rsi_AllocationIoReceive(Context *rsc, RsAllocation valloc) {
6867ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    Allocation *alloc = static_cast<Allocation *>(valloc);
6877ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams    alloc->ioReceive(rsc);
6887ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams}
6897ac2a4dda4d20ca1f1b714e129a3a08f63178c18Jason Sams
690509ea5c832a865bc9083d53f1f058377a689bab3Tim Murrayvoid rsi_Allocation1DRead(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod,
691509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray                          uint32_t count, void *data, size_t sizeBytes) {
692509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    Allocation *a = static_cast<Allocation *>(va);
693509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray    a->readUnchecked(rsc, xoff, lod, count, data, sizeBytes);
694509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray}
695509ea5c832a865bc9083d53f1f058377a689bab3Tim Murray
6967b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murrayvoid rsi_Allocation2DRead(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff,
6977b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray                          uint32_t lod, RsAllocationCubemapFace face, uint32_t w,
698358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray                          uint32_t h, void *data, size_t sizeBytes, size_t stride) {
6997b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray    Allocation *a = static_cast<Allocation *>(va);
700358747a3118301c5faeee73c98dd5f839bbfb54aTim Murray    a->read(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes, stride);
7017b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray}
7027b3e3093f745134345dadf89498ad16e1f9c0e71Tim Murray
703c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams}
704c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams}
705c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
706c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Samsconst void * rsaAllocationGetType(RsContext con, RsAllocation va) {
707c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    Allocation *a = static_cast<Allocation *>(va);
708c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    a->getType()->incUserRef();
709c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams
710c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams    return a->getType();
711c975cf4a71b63ccbd20f1f3b3341c5f2e6025b45Jason Sams}
712