rsAllocation.cpp revision 6a121811e5d2e56e94747b36d15c7613ab2aedd4
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"
1877d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h>
207fabe1a3bf8de37d86021bb7f744c791db81aed3Jason Sams#include <GLES2/gl2.h>
211aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h>
2277d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
2339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
24326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
25326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
26326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
27a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex SakhartchoukAllocation::Allocation(Context *rsc, const Type *type, uint32_t usages,
28a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk                       RsAllocationMipmapControl mc)
29a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk    : ObjectBase(rsc) {
30fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    init(rsc, type);
31fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
32366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    mUsageFlags = usages;
33a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk    mMipmapControl = mc;
34366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
35b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    allocScriptMemory();
3610e5e570bab66a6cd543c857b26c576795eb240fJason Sams    if (mType->getElement()->getHasReferences()) {
3710e5e570bab66a6cd543c857b26c576795eb240fJason Sams        memset(mPtr, 0, mType->getSizeBytes());
3810e5e570bab66a6cd543c857b26c576795eb240fJason Sams    }
39fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    if (!mPtr) {
40fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams        LOGE("Allocation::Allocation, alloc failure");
41fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    }
42fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams}
43fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
44fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::init(Context *rsc, const Type *type) {
46326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPtr = NULL;
47326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
48326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mCpuWrite = false;
49326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mCpuRead = false;
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mGpuWrite = false;
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mGpuRead = false;
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mReadWriteRatio = 0;
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mUpdateSize = 0;
55ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags = 0;
56ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mMipmapControl = RS_ALLOCATION_MIPMAP_NONE;
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTextureID = 0;
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mBufferID = 0;
60cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = false;
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
62fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mUserBitmapCallback = NULL;
63fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mUserBitmapCallbackData = NULL;
64fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mType.set(type);
66e5ffb879ae535a899a486285a23bea05e912480fJason Sams    rsAssert(type);
67fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
68fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mPtr = NULL;
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
71afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation::~Allocation() {
72fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    if (mUserBitmapCallback != NULL) {
73fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams        mUserBitmapCallback(mUserBitmapCallbackData);
74b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        mPtr = NULL;
75fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    }
76b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    freeScriptMemory();
7777d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
78e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    if (mBufferID) {
79e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        // Causes a SW crash....
80e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //LOGV(" mBufferID %i", mBufferID);
81e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //glDeleteBuffers(1, &mBufferID);
82e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //mBufferID = 0;
83e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    }
84e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    if (mTextureID) {
85e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        glDeleteTextures(1, &mTextureID);
86e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        mTextureID = 0;
87e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    }
8877d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
89326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
90326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
91afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setCpuWritable(bool) {
92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
94afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setGpuWritable(bool) {
95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
97afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setCpuReadable(bool) {
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
100afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setGpuReadable(bool) {
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
103afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool Allocation::fixAllocation() {
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return false;
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
107b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::deferedUploadToTexture(const Context *rsc) {
108ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
109cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
110cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
111cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
11284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchoukuint32_t Allocation::getGLTarget() const {
11377d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
114ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsTexture()) {
11584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        if (mType->getDimFaces()) {
11684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            return GL_TEXTURE_CUBE_MAP;
11784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        } else {
11884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            return GL_TEXTURE_2D;
11984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        }
12084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
121ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsBufferObject()) {
12284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        return GL_ARRAY_BUFFER;
12384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
12477d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
12584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    return 0;
12684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
12784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
128b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::allocScriptMemory() {
129b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    rsAssert(!mPtr);
130b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    mPtr = malloc(mType->getSizeBytes());
131b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams}
132b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
133b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::freeScriptMemory() {
134b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    if (mPtr) {
135b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        free(mPtr);
136b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        mPtr = NULL;
137b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    }
138b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams}
139b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
140b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
141366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::syncAll(Context *rsc, RsAllocationUsageType src) {
142366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    rsAssert(src == RS_ALLOCATION_USAGE_SCRIPT);
143366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
144ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsTexture()) {
145366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        uploadToTexture(rsc);
146366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    }
147ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsBufferObject()) {
148366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        uploadToBufferObject(rsc);
149366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    }
150366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
151366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    mUploadDefered = false;
152366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams}
15384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
154afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::uploadToTexture(const Context *rsc) {
15577d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
156ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
157d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    GLenum type = mType->getElement()->getComponent().getGLType();
158d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    GLenum format = mType->getElement()->getComponent().getGLFormat();
159565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
160565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    if (!type || !format) {
161565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return;
162565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
163565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
164b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    if (!mPtr) {
165b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        return;
166b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    }
167b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
16839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk    bool isFirstUpload = false;
16939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
170326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (!mTextureID) {
171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glGenTextures(1, &mTextureID);
17213e2634a71a30d289ed8d821aef61c7d1687460eJason Sams
17313e2634a71a30d289ed8d821aef61c7d1687460eJason Sams        if (!mTextureID) {
17413e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // This should not happen, however, its likely the cause of the
17513e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // white sqare bug.
17613e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // Force a crash to 1: restart the app, 2: make sure we get a bugreport.
17713e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            LOGE("Upload to texture failed to gen mTextureID");
17813e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            rsc->dumpDebug();
179cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams            mUploadDefered = true;
180cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams            return;
18113e2634a71a30d289ed8d821aef61c7d1687460eJason Sams        }
18239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        isFirstUpload = true;
183326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
18484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
185bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    upload2DTexture(isFirstUpload);
18684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
187b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    if (!(mUsageFlags & RS_ALLOCATION_USAGE_SCRIPT)) {
188b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        freeScriptMemory();
189b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    }
190b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
19184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    rsc->checkError("Allocation::uploadToTexture");
19277d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
19384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
19484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
19577d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
196bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Samsconst static GLenum gFaceOrder[] = {
197bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_POSITIVE_X,
198bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
199bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
200bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
201bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
202bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
203bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams};
20477d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
205bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams
206236385b73f21ae65e756b9cb5738f1514d95ea3eJason Samsvoid Allocation::update2DTexture(const void *ptr, uint32_t xoff, uint32_t yoff,
207236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                                 uint32_t lod, RsAllocationCubemapFace face,
208236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                                 uint32_t w, uint32_t h) {
20977d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
210236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    GLenum type = mType->getElement()->getComponent().getGLType();
211236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    GLenum format = mType->getElement()->getComponent().getGLFormat();
212236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    GLenum target = (GLenum)getGLTarget();
213185b8b01f417488e2fbf6e6c00dfbd3d1d43d98aJason Sams    rsAssert(mTextureID);
214236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    glBindTexture(target, mTextureID);
215236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
216bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GLenum t = GL_TEXTURE_2D;
217bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    if (mType->getDimFaces()) {
218bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams        t = gFaceOrder[face];
219b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    }
220bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    glTexSubImage2D(t, lod, xoff, yoff, w, h, format, type, ptr);
22177d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
22284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
2237fabe1a3bf8de37d86021bb7f744c791db81aed3Jason Sams
224bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Samsvoid Allocation::upload2DTexture(bool isFirstUpload) {
22577d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
22684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum type = mType->getElement()->getComponent().getGLType();
22784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum format = mType->getElement()->getComponent().getGLFormat();
22884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
229b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    GLenum target = (GLenum)getGLTarget();
230b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    glBindTexture(target, mTextureID);
231b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
232b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
233bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    uint32_t faceCount = 1;
234bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    if (mType->getDimFaces()) {
235bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams        faceCount = 6;
236bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    }
23784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
238bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    for (uint32_t face = 0; face < faceCount; face ++) {
239b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        for (uint32_t lod = 0; lod < mType->getLODCount(); lod++) {
240bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams            const uint8_t *p = (const uint8_t *)mPtr;
241bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams            p += mType->getLODFaceOffset(lod, (RsAllocationCubemapFace)face, 0, 0);
24284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
243bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams            GLenum t = GL_TEXTURE_2D;
244bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams            if (mType->getDimFaces()) {
245bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams                t = gFaceOrder[face];
246bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams            }
24784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
24884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            if (isFirstUpload) {
249bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams                glTexImage2D(t, lod, format,
250bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams                             mType->getLODDimX(lod), mType->getLODDimY(lod),
251bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams                             0, format, type, p);
25284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            } else {
253bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams                glTexSubImage2D(t, lod, 0, 0,
254bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams                                mType->getLODDimX(lod), mType->getLODDimY(lod),
255bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams                                format, type, p);
25684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            }
25784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        }
25884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
259b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams
260b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    if (mMipmapControl == RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE) {
261b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams        glGenerateMipmap(target);
262b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    }
26377d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
264326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
266afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::deferedUploadToBufferObject(const Context *rsc) {
267ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX;
268cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
269cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
270cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
271afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::uploadToBufferObject(const Context *rsc) {
27277d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
273326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(!mType->getDimY());
274326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(!mType->getDimZ());
275326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
276ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX;
277cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (!mBufferID) {
279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glGenBuffers(1, &mBufferID);
280326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
281cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    if (!mBufferID) {
282cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        LOGE("Upload to buffer object failed");
283cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        mUploadDefered = true;
284cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        return;
285cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    }
28684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum target = (GLenum)getGLTarget();
28784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    glBindBuffer(target, mBufferID);
28884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    glBufferData(target, mType->getSizeBytes(), getPtr(), GL_DYNAMIC_DRAW);
28984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    glBindBuffer(target, 0);
290c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams    rsc->checkError("Allocation::uploadToBufferObject");
29177d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
293326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
294366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::uploadCheck(Context *rsc) {
295cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    if (mUploadDefered) {
296366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        syncAll(rsc, RS_ALLOCATION_USAGE_SCRIPT);
297cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    }
298cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
299cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
300afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::read(void *data) {
301e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams    memcpy(data, mPtr, mType->getSizeBytes());
302e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams}
303e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams
3044b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod,
3054b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                         uint32_t count, const void *data, uint32_t sizeBytes) {
306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t eSize = mType->getElementSizeBytes();
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
308326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ptr += eSize * xoff;
3099397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    uint32_t size = count * eSize;
3109397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
3119397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if (size != sizeBytes) {
3129397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        LOGE("Allocation::subData called with mismatched size expected %i, got %i", size, sizeBytes);
313e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        mType->dumpLOGV("type info");
3149397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
3159397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
316e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
317e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (mType->getElement()->getHasReferences()) {
318e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        incRefs(data, count);
319e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        decRefs(ptr, count);
320e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
321e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
3229397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    memcpy(ptr, data, size);
3235c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    sendDirty();
324cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3274b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
328afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk             uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes) {
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t eSize = mType->getElementSizeBytes();
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t lineSize = eSize * w;
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t destW = mType->getDimX();
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
333a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    //LOGE("data2d %p,  %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes);
3349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
335a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    if ((lineSize * h) != sizeBytes) {
336a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        LOGE("Allocation size mismatch, expected %i, got %i", (lineSize * h), sizeBytes);
3379397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        rsAssert(!"Allocation::subData called with mismatched size");
3389397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
3399397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
3409397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
341a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    if (mPtr) {
342a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        const uint8_t *src = static_cast<const uint8_t *>(data);
343a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        uint8_t *dst = static_cast<uint8_t *>(mPtr);
344bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams        dst += mType->getLODFaceOffset(lod, face, xoff, yoff);
345a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams
346a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        //LOGE("            %p  %p  %i  ", dst, src, eSize);
347a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        for (uint32_t line=yoff; line < (yoff+h); line++) {
348a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            if (mType->getElement()->getHasReferences()) {
349a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams                incRefs(src, w);
350a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams                decRefs(dst, w);
351a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            }
352a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            memcpy(dst, src, lineSize);
353a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            src += lineSize;
354a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            dst += destW * eSize;
355e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
356a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        sendDirty();
357a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        mUploadDefered = true;
358a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    } else {
359236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams        update2DTexture(data, xoff, yoff, lod, face, w, h);
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
361326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
363236385b73f21ae65e756b9cb5738f1514d95ea3eJason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff,
364236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                      uint32_t lod, RsAllocationCubemapFace face,
365236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                      uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes) {
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3684b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, const void *data,
369afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                uint32_t cIdx, uint32_t sizeBytes) {
3705f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint32_t eSize = mType->getElementSizeBytes();
3715f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
3725f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += eSize * x;
3735f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3745f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (cIdx >= mType->getElement()->getFieldCount()) {
3755f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData component %i out of range.", cIdx);
3765f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
3775f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3785f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3795f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3805f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (x >= mType->getDimX()) {
3815f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
3825f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
3835f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3845f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3855f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3865f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    const Element * e = mType->getElement()->getField(cIdx);
3875f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += mType->getElement()->getFieldOffsetBytes(cIdx);
3885f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3895f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (sizeBytes != e->getSizeBytes()) {
390099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        LOGE("Error Allocation::subElementData data size %i does not match field size %zu.", sizeBytes, e->getSizeBytes());
3915f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
3925f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3935f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3945f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3955f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (e->getHasReferences()) {
3965f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->incRefs(data);
3975f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->decRefs(ptr);
3985f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3995f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4005f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    memcpy(ptr, data, sizeBytes);
4015f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    sendDirty();
4025f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    mUploadDefered = true;
4035f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
4045f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4054b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, uint32_t y,
406afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                const void *data, uint32_t cIdx, uint32_t sizeBytes) {
4075f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint32_t eSize = mType->getElementSizeBytes();
4085f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
4095f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += eSize * (x + y * mType->getDimX());
4105f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4115f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (x >= mType->getDimX()) {
4125f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
4135f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
4145f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4165f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4175f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (y >= mType->getDimY()) {
4185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
4195f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
4205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4225f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4235f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (cIdx >= mType->getElement()->getFieldCount()) {
4245f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData component %i out of range.", cIdx);
4255f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
4265f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4275f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4285f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4295f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    const Element * e = mType->getElement()->getField(cIdx);
4305f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += mType->getElement()->getFieldOffsetBytes(cIdx);
4315f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4325f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (sizeBytes != e->getSizeBytes()) {
433099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk        LOGE("Error Allocation::subElementData data size %i does not match field size %zu.", sizeBytes, e->getSizeBytes());
4345f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
4355f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4365f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4375f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4385f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (e->getHasReferences()) {
4395f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->incRefs(data);
4405f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->decRefs(ptr);
4415f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4425f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4435f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    memcpy(ptr, data, sizeBytes);
4445f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    sendDirty();
4455f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    mUploadDefered = true;
4465f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
4475f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
448afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::addProgramToDirty(const Program *p) {
44977d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
450fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mToDirtyList.push(p);
45177d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
4525c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
4535c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams
454afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::removeProgramToDirty(const Program *p) {
45577d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
4565c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
4575c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        if (mToDirtyList[ct] == p) {
4585c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams            mToDirtyList.removeAt(ct);
4595c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams            return;
4605c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        }
4615c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    }
4625c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    rsAssert(0);
46377d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
4645c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
465326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
466afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::dumpLOGV(const char *prefix) const {
467c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    ObjectBase::dumpLOGV(prefix);
468c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
469c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    String8 s(prefix);
470c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    s.append(" type ");
471c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    if (mType.get()) {
472c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams        mType->dumpLOGV(s.string());
473c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    }
474c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
475c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    LOGV("%s allocation ptr=%p mCpuWrite=%i, mCpuRead=%i, mGpuWrite=%i, mGpuRead=%i",
476c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams          prefix, mPtr, mCpuWrite, mCpuRead, mGpuWrite, mGpuRead);
477c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
478ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    LOGV("%s allocation mUsageFlags=0x04%x, mMipmapControl=0x%04x, mTextureID=%i, mBufferID=%i",
479ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams          prefix, mUsageFlags, mMipmapControl, mTextureID, mBufferID);
480c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams}
481326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
482afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::serialize(OStream *stream) const {
483fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
484fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
485fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
486fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
487fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
488fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
489fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First thing we need to serialize is the type object since it will be needed
490fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // to initialize the class
491fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mType->serialize(stream);
492fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
493fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint32_t dataSize = mType->getSizeBytes();
494fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Write how much data we are storing
495fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(dataSize);
496fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Now write the data
497fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addByteArray(mPtr, dataSize);
498fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
499fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
500afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation *Allocation::createFromStream(Context *rsc, IStream *stream) {
501fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
502b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
503afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (classID != RS_A3D_CLASS_ID_ALLOCATION) {
504fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("allocation loading skipped due to invalid class id\n");
505fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
506fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
507fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
508fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
509fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
510fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
511fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Type *type = Type::createFromStream(rsc, stream);
512afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (!type) {
513fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
514fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
515fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->compute();
516fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
517fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Number of bytes we wrote out for this allocation
518fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint32_t dataSize = stream->loadU32();
519afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (dataSize != type->getSizeBytes()) {
520fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("failed to read allocation because numbytes written is not the same loaded type wants\n");
521225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        ObjectBase::checkDelete(type);
522fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
523fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
524fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
525ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    Allocation *alloc = new Allocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT);
526fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    alloc->setName(name.string(), name.size());
527fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
5284b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    uint32_t count = dataSize / type->getElementSizeBytes();
5294b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams
530fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Read in all of our allocation data
5314b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize);
532e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk    stream->reset(stream->getPos() + dataSize);
533fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
534fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return alloc;
535fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
536fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
537afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::sendDirty() const {
53877d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
5395c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
5405c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        mToDirtyList[ct]->forceDirty();
5415c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    }
54277d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
5435c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
544326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
545afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const {
546e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
547e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const Element *e = mType->getElement();
548e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    uint32_t stride = e->getSizeBytes();
549e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
55096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    p += stride * startOff;
551e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    while (ct > 0) {
552e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        e->incRefs(p);
553e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        ct --;
554e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        p += stride;
555e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
556e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
557e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
558afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const {
559e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
560e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const Element *e = mType->getElement();
561e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    uint32_t stride = e->getSizeBytes();
562e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
56396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    p += stride * startOff;
564e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    while (ct > 0) {
565e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        e->decRefs(p);
566e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        ct --;
567e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        p += stride;
568e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
569e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
570e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
571afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) {
57296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
57396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
574afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize1D(Context *rsc, uint32_t dimX) {
57596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Type *t = mType->cloneAndResize1D(rsc, dimX);
57696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
57796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    uint32_t oldDimX = mType->getDimX();
57896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX == oldDimX) {
57996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        return;
58096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
58196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
58296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX < oldDimX) {
58396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        decRefs(mPtr, oldDimX - dimX, dimX);
58496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
58596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    mPtr = realloc(mPtr, t->getSizeBytes());
58696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
58796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX > oldDimX) {
58896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        const Element *e = mType->getElement();
58996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        uint32_t stride = e->getSizeBytes();
59096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        memset(((uint8_t *)mPtr) + stride * oldDimX, 0, stride * (dimX - oldDimX));
59196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
59296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    mType.set(t);
59396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
59496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
595afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) {
59696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    LOGE("not implemented");
59796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
59896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
599326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////
600565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams//
60177d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#ifndef ANDROID_RS_SERIALIZE
602326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
6036a121811e5d2e56e94747b36d15c7613ab2aedd4Stephen Hinesstatic void rsaAllocationGenerateScriptMips(RsContext con, RsAllocation va);
6046a121811e5d2e56e94747b36d15c7613ab2aedd4Stephen Hines
605326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
606326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
607326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
608afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, bool genmip, uint32_t baseMipLevel) {
609326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *alloc = static_cast<Allocation *>(va);
610b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    alloc->deferedUploadToTexture(rsc);
611326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
612326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
613afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va) {
614326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *alloc = static_cast<Allocation *>(va);
615cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    alloc->deferedUploadToBufferObject(rsc);
616326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
617326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
618afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip565(const Adapter2D &out, const Adapter2D &in) {
619326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t w = out.getDimX();
620326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t h = out.getDimY();
621326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
622e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    for (uint32_t y=0; y < h; y++) {
623326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint16_t *oPtr = static_cast<uint16_t *>(out.getElement(0, y));
624326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const uint16_t *i1 = static_cast<uint16_t *>(in.getElement(0, y*2));
625326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const uint16_t *i2 = static_cast<uint16_t *>(in.getElement(0, y*2+1));
626326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
627e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        for (uint32_t x=0; x < w; x++) {
628565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]);
629565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            oPtr ++;
630565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            i1 += 2;
631565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            i2 += 2;
632565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
633565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
634565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams}
635565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
636afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8888(const Adapter2D &out, const Adapter2D &in) {
637565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t w = out.getDimX();
638565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t h = out.getDimY();
639565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
640e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    for (uint32_t y=0; y < h; y++) {
641565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        uint32_t *oPtr = static_cast<uint32_t *>(out.getElement(0, y));
642565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        const uint32_t *i1 = static_cast<uint32_t *>(in.getElement(0, y*2));
643565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        const uint32_t *i2 = static_cast<uint32_t *>(in.getElement(0, y*2+1));
644565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
645e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        for (uint32_t x=0; x < w; x++) {
646565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]);
647326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            oPtr ++;
648326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            i1 += 2;
649326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            i2 += 2;
650326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
651326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
652326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
653326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
654afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8(const Adapter2D &out, const Adapter2D &in) {
6552f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    uint32_t w = out.getDimX();
6562f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    uint32_t h = out.getDimY();
6572f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
6582f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    for (uint32_t y=0; y < h; y++) {
6592f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        uint8_t *oPtr = static_cast<uint8_t *>(out.getElement(0, y));
6602f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        const uint8_t *i1 = static_cast<uint8_t *>(in.getElement(0, y*2));
6612f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        const uint8_t *i2 = static_cast<uint8_t *>(in.getElement(0, y*2+1));
6622f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
6632f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        for (uint32_t x=0; x < w; x++) {
6642f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f);
6652f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            oPtr ++;
6662f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            i1 += 2;
6672f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            i2 += 2;
6682f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        }
6692f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    }
6702f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams}
6712f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
672afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip(const Adapter2D &out, const Adapter2D &in) {
673afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (out.getBaseType()->getElement()->getSizeBits()) {
674e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    case 32:
675e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        mip8888(out, in);
676e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        break;
677e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    case 16:
678e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        mip565(out, in);
679e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        break;
6802f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    case 8:
6812f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        mip8(out, in);
6822f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        break;
683e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    }
684e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams}
685326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
686366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) {
687366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Allocation *a = static_cast<Allocation *>(va);
688366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    a->syncAll(rsc, src);
68909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams    a->sendDirty();
690366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams}
691366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
692a23715148f7bda74e904fc553b70c9a49fd52a6eJason Samsvoid rsi_AllocationGenerateMipmaps(Context *rsc, RsAllocation va) {
69339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(va);
694a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    rsaAllocationGenerateScriptMips(rsc, texAlloc);
69539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk}
69639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
697837e388700a48084489ba59d1d8cc5ece68b1535Jason Samsvoid rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t dataLen) {
698837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    Allocation *texAlloc = static_cast<Allocation *>(va);
699837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    const Type * t = texAlloc->getType();
700837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
701837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    size_t s = t->getDimX() * t->getDimY() * t->getElementSizeBytes();
702837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    if (s != dataLen) {
703837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size");
704837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        return;
705837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    }
706837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
707837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    memcpy(data, texAlloc->getPtr(), s);
708837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams}
709837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
7104b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod,
7114b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                          uint32_t count, const void *data, uint32_t sizeBytes) {
712326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
7134b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->data(rsc, xoff, lod, count, data, sizeBytes);
7145f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
7155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
7164b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, uint32_t lod, RsAllocationCubemapFace face,
7174b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                                 const void *data, uint32_t eoff, uint32_t sizeBytes) {
7185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    Allocation *a = static_cast<Allocation *>(va);
7194b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->elementData(rsc, x, y, data, eoff, sizeBytes);
7205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
7215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
7224b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t lod,
7234b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                                 const void *data, uint32_t eoff, uint32_t sizeBytes) {
7245f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    Allocation *a = static_cast<Allocation *>(va);
7254b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->elementData(rsc, x, data, eoff, sizeBytes);
726326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
727326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
7284b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
7294b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                          uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes) {
730326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
7314b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes);
732326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
733326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
734afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationRead(Context *rsc, RsAllocation va, void *data) {
735e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams    Allocation *a = static_cast<Allocation *>(va);
736e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams    a->read(data);
737e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams}
738e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams
739afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) {
74096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Allocation *a = static_cast<Allocation *>(va);
74196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    a->resize1D(rsc, dimX);
74296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
74396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
744afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) {
74596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Allocation *a = static_cast<Allocation *>(va);
74696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    a->resize2D(rsc, dimX, dimY);
74796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
74896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
749dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
750dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
751dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
752f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchoukstatic void rsaAllocationGenerateScriptMips(RsContext con, RsAllocation va) {
753f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    Context *rsc = static_cast<Context *>(con);
754f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(va);
755f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    uint32_t numFaces = texAlloc->getType()->getDimFaces() ? 6 : 1;
756f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    for (uint32_t face = 0; face < numFaces; face ++) {
757f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        Adapter2D adapt(rsc, texAlloc);
758f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        Adapter2D adapt2(rsc, texAlloc);
759f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        adapt.setFace(face);
760f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        adapt2.setFace(face);
761f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) {
762f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk            adapt.setLOD(lod);
763f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk            adapt2.setLOD(lod + 1);
764f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk            mip(adapt2, adapt);
765f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        }
766f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    }
767f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk}
768f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk
769afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst void * rsaAllocationGetType(RsContext con, RsAllocation va) {
770d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    Allocation *a = static_cast<Allocation *>(va);
771d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    a->getType()->incUserRef();
772d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
773d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    return a->getType();
774d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk}
775d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
776366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCreateTyped(RsContext con, RsType vtype,
777ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                      RsAllocationMipmapControl mips,
778366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                      uint32_t usages) {
779f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    Context *rsc = static_cast<Context *>(con);
780a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk    Allocation * alloc = new Allocation(rsc, static_cast<Type *>(vtype), usages, mips);
781f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    alloc->incUserRef();
782f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    return alloc;
783f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams}
784f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
785f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
786366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCreateFromBitmap(RsContext con, RsType vtype,
787ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                           RsAllocationMipmapControl mips,
788366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                           const void *data, uint32_t usages) {
789366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Context *rsc = static_cast<Context *>(con);
790366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Type *t = static_cast<Type *>(vtype);
791f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
792366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    RsAllocation vTexAlloc = rsaAllocationCreateTyped(rsc, vtype, mips, usages);
793f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
794f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    if (texAlloc == NULL) {
795f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        LOGE("Memory allocation failure");
796f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        return NULL;
797f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
798f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
799366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    memcpy(texAlloc->getPtr(), data, t->getDimX() * t->getDimY() * t->getElementSizeBytes());
800ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
801f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        rsaAllocationGenerateScriptMips(rsc, texAlloc);
802f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
803f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
804b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    texAlloc->deferedUploadToTexture(rsc);
805f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    return texAlloc;
806f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams}
80784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
808366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCubeCreateFromBitmap(RsContext con, RsType vtype,
809ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                               RsAllocationMipmapControl mips,
810366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                               const void *data, uint32_t usages) {
81184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    Context *rsc = static_cast<Context *>(con);
812366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Type *t = static_cast<Type *>(vtype);
81384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
81484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Cubemap allocation's faces should be Width by Width each.
81584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Source data should have 6 * Width by Width pixels
81684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Error checking is done in the java layer
817366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    RsAllocation vTexAlloc = rsaAllocationCreateTyped(rsc, t, mips, usages);
81884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
81984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    if (texAlloc == NULL) {
82084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        LOGE("Memory allocation failure");
82184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        return NULL;
82284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
82384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
8249f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t faceSize = t->getDimX();
8259f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes();
8269f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t copySize = faceSize * t->getElementSizeBytes();
8279f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk
82884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    uint8_t *sourcePtr = (uint8_t*)data;
829366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    for (uint32_t face = 0; face < 6; face ++) {
830366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        Adapter2D faceAdapter(rsc, texAlloc);
831366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        faceAdapter.setFace(face);
832366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
8339f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        for (uint32_t dI = 0; dI < faceSize; dI ++) {
8349f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk            memcpy(faceAdapter.getElement(0, dI), sourcePtr + strideBytes * dI, copySize);
8359f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        }
836366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
837366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        // Move the data pointer to the next cube face
8389f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        sourcePtr += copySize;
839f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    }
840366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
841f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
842f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        rsaAllocationGenerateScriptMips(rsc, texAlloc);
84384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
84484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
845b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    texAlloc->deferedUploadToTexture(rsc);
84684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    return texAlloc;
84784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
848099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk
84977d9f4bd05b2d2a161f30c12a2248f9c97eaac42Alex Sakhartchouk#endif //ANDROID_RS_SERIALIZE
850