rsAllocation.cpp revision 09aeb8ac1b0b976c2de40dd00da0c6841e4e882a
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 */
16fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
17326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams#include "rsContext.h"
18326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
191aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/gl.h>
207fabe1a3bf8de37d86021bb7f744c791db81aed3Jason Sams#include <GLES2/gl2.h>
211aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams#include <GLES/glext.h>
22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#else
23fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsContextHostStub.h"
24fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
25fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGL/gl.h>
26fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include <OpenGl/glext.h>
27fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#endif
281aa5a4eb81b8b88aeb5d2b6f4c47356fd0a62923Jason Sams
2939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk#include "utils/StopWatch.h"
3039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
31f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchoukstatic void rsaAllocationGenerateScriptMips(RsContext con, RsAllocation va);
32f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
34326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
35326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
36a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex SakhartchoukAllocation::Allocation(Context *rsc, const Type *type, uint32_t usages,
37a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk                       RsAllocationMipmapControl mc)
38a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk    : ObjectBase(rsc) {
39fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    init(rsc, type);
40fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
41366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    mUsageFlags = usages;
42a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk    mMipmapControl = mc;
43366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
44b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    allocScriptMemory();
4510e5e570bab66a6cd543c857b26c576795eb240fJason Sams    if (mType->getElement()->getHasReferences()) {
4610e5e570bab66a6cd543c857b26c576795eb240fJason Sams        memset(mPtr, 0, mType->getSizeBytes());
4710e5e570bab66a6cd543c857b26c576795eb240fJason Sams    }
48fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    if (!mPtr) {
49fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams        LOGE("Allocation::Allocation, alloc failure");
50fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    }
51fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams}
52fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
53fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
54afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::init(Context *rsc, const Type *type) {
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPtr = NULL;
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mCpuWrite = false;
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mCpuRead = false;
59326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mGpuWrite = false;
60326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mGpuRead = false;
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mReadWriteRatio = 0;
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mUpdateSize = 0;
64ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags = 0;
65ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mMipmapControl = RS_ALLOCATION_MIPMAP_NONE;
66326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
67326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTextureID = 0;
68326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mBufferID = 0;
69cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = false;
70326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
71fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mUserBitmapCallback = NULL;
72fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mUserBitmapCallbackData = NULL;
73fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mType.set(type);
75e5ffb879ae535a899a486285a23bea05e912480fJason Sams    rsAssert(type);
76fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
77fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mPtr = NULL;
78326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
79326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
80afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation::~Allocation() {
81fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    if (mUserBitmapCallback != NULL) {
82fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams        mUserBitmapCallback(mUserBitmapCallbackData);
83b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        mPtr = NULL;
84fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    }
85b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    freeScriptMemory();
86e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams
87e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    if (mBufferID) {
88e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        // Causes a SW crash....
89e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //LOGV(" mBufferID %i", mBufferID);
90e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //glDeleteBuffers(1, &mBufferID);
91e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //mBufferID = 0;
92e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    }
93e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    if (mTextureID) {
94e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        glDeleteTextures(1, &mTextureID);
95e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        mTextureID = 0;
96e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    }
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
99afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setCpuWritable(bool) {
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
102afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setGpuWritable(bool) {
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
105afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setCpuReadable(bool) {
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
108afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setGpuReadable(bool) {
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
111afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool Allocation::fixAllocation() {
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return false;
113326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
114326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
115b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::deferedUploadToTexture(const Context *rsc) {
116ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
117cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
118cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
119cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
12084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchoukuint32_t Allocation::getGLTarget() const {
121ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsTexture()) {
12284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        if (mType->getDimFaces()) {
12384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            return GL_TEXTURE_CUBE_MAP;
12484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        } else {
12584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            return GL_TEXTURE_2D;
12684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        }
12784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
128ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsBufferObject()) {
12984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        return GL_ARRAY_BUFFER;
13084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
13184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    return 0;
13284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
13384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
134b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::allocScriptMemory() {
135b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    rsAssert(!mPtr);
136b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    mPtr = malloc(mType->getSizeBytes());
137b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams}
138b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
139b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::freeScriptMemory() {
140b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    if (mPtr) {
141b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        free(mPtr);
142b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        mPtr = NULL;
143b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    }
144b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams}
145b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
146b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
147366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::syncAll(Context *rsc, RsAllocationUsageType src) {
148366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    rsAssert(src == RS_ALLOCATION_USAGE_SCRIPT);
149366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
150ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsTexture()) {
151366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        uploadToTexture(rsc);
152366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    }
153ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsBufferObject()) {
154366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        uploadToBufferObject(rsc);
155366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    }
156366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
157366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    mUploadDefered = false;
158366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams}
15984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
160afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::uploadToTexture(const Context *rsc) {
161cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
162ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
163d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    GLenum type = mType->getElement()->getComponent().getGLType();
164d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    GLenum format = mType->getElement()->getComponent().getGLFormat();
165565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
166565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    if (!type || !format) {
167565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return;
168565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
169565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
170b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    if (!mPtr) {
171b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        return;
172b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    }
173b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
17439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk    bool isFirstUpload = false;
17539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (!mTextureID) {
177326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glGenTextures(1, &mTextureID);
17813e2634a71a30d289ed8d821aef61c7d1687460eJason Sams
17913e2634a71a30d289ed8d821aef61c7d1687460eJason Sams        if (!mTextureID) {
18013e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // This should not happen, however, its likely the cause of the
18113e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // white sqare bug.
18213e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // Force a crash to 1: restart the app, 2: make sure we get a bugreport.
18313e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            LOGE("Upload to texture failed to gen mTextureID");
18413e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            rsc->dumpDebug();
185cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams            mUploadDefered = true;
186cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams            return;
18713e2634a71a30d289ed8d821aef61c7d1687460eJason Sams        }
18839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        isFirstUpload = true;
189326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
19084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
191bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    upload2DTexture(isFirstUpload);
19284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
193b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    if (!(mUsageFlags & RS_ALLOCATION_USAGE_SCRIPT)) {
194b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams        freeScriptMemory();
195b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    }
196b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams
19784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    rsc->checkError("Allocation::uploadToTexture");
19884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
19984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
200bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Samsconst static GLenum gFaceOrder[] = {
201bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_POSITIVE_X,
202bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
203bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
204bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
205bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
206bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
207bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams};
208bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams
209236385b73f21ae65e756b9cb5738f1514d95ea3eJason Samsvoid Allocation::update2DTexture(const void *ptr, uint32_t xoff, uint32_t yoff,
210236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                                 uint32_t lod, RsAllocationCubemapFace face,
211236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                                 uint32_t w, uint32_t h) {
212236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    GLenum type = mType->getElement()->getComponent().getGLType();
213236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    GLenum format = mType->getElement()->getComponent().getGLFormat();
214236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    GLenum target = (GLenum)getGLTarget();
215185b8b01f417488e2fbf6e6c00dfbd3d1d43d98aJason Sams    rsAssert(mTextureID);
216236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    glBindTexture(target, mTextureID);
217236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
218bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    GLenum t = GL_TEXTURE_2D;
219bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    if (mType->getDimFaces()) {
220bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams        t = gFaceOrder[face];
221b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    }
222bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams    glTexSubImage2D(t, lod, xoff, yoff, w, h, format, type, ptr);
22384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
2247fabe1a3bf8de37d86021bb7f744c791db81aed3Jason Sams
225bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Samsvoid Allocation::upload2DTexture(bool isFirstUpload) {
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#ifndef ANDROID_RS_BUILD_FOR_HOST
262b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams        glGenerateMipmap(target);
263b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams#endif //ANDROID_RS_BUILD_FOR_HOST
264b7e83bda41e66c966b98935b44140692bfe0c4caJason Sams    }
265326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
266326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
267afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::deferedUploadToBufferObject(const Context *rsc) {
268ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX;
269cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
270cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
271cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
272afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::uploadToBufferObject(const Context *rsc) {
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");
291326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
292326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
293366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::uploadCheck(Context *rsc) {
294cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    if (mUploadDefered) {
295366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        syncAll(rsc, RS_ALLOCATION_USAGE_SCRIPT);
296cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    }
297cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
298cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
299afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::read(void *data) {
300e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams    memcpy(data, mPtr, mType->getSizeBytes());
301e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams}
302e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams
3034b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t lod,
3044b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                         uint32_t count, const void *data, uint32_t sizeBytes) {
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t eSize = mType->getElementSizeBytes();
306326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
307326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ptr += eSize * xoff;
3089397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    uint32_t size = count * eSize;
3099397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
3109397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if (size != sizeBytes) {
3119397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        LOGE("Allocation::subData called with mismatched size expected %i, got %i", size, sizeBytes);
312e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        mType->dumpLOGV("type info");
3139397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
3149397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
315e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
316e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (mType->getElement()->getHasReferences()) {
317e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        incRefs(data, count);
318e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        decRefs(ptr, count);
319e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
320e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
3219397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    memcpy(ptr, data, size);
3225c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    sendDirty();
323cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
324326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
325326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3264b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
327afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk             uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes) {
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t eSize = mType->getElementSizeBytes();
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t lineSize = eSize * w;
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t destW = mType->getDimX();
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
332a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    //LOGE("data2d %p,  %i %i %i %i %i %i %p %i", this, xoff, yoff, lod, face, w, h, data, sizeBytes);
3339397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
334a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    if ((lineSize * h) != sizeBytes) {
335a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        LOGE("Allocation size mismatch, expected %i, got %i", (lineSize * h), sizeBytes);
3369397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        rsAssert(!"Allocation::subData called with mismatched size");
3379397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
3389397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
3399397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
340a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    if (mPtr) {
341a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        const uint8_t *src = static_cast<const uint8_t *>(data);
342a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        uint8_t *dst = static_cast<uint8_t *>(mPtr);
343bcac9340126b4b9fabf2015a2f6a984414d87c21Jason Sams        dst += mType->getLODFaceOffset(lod, face, xoff, yoff);
344a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams
345a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        //LOGE("            %p  %p  %i  ", dst, src, eSize);
346a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        for (uint32_t line=yoff; line < (yoff+h); line++) {
347a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            if (mType->getElement()->getHasReferences()) {
348a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams                incRefs(src, w);
349a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams                decRefs(dst, w);
350a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            }
351a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            memcpy(dst, src, lineSize);
352a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            src += lineSize;
353a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams            dst += destW * eSize;
354e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
355a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        sendDirty();
356a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams        mUploadDefered = true;
357a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    } else {
358236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams        update2DTexture(data, xoff, yoff, lod, face, w, h);
359326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
360326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
361326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
362236385b73f21ae65e756b9cb5738f1514d95ea3eJason Samsvoid Allocation::data(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff,
363236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                      uint32_t lod, RsAllocationCubemapFace face,
364236385b73f21ae65e756b9cb5738f1514d95ea3eJason Sams                      uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes) {
365326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
366326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3674b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, const void *data,
368afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                uint32_t cIdx, uint32_t sizeBytes) {
3695f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint32_t eSize = mType->getElementSizeBytes();
3705f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
3715f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += eSize * x;
3725f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3735f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (cIdx >= mType->getElement()->getFieldCount()) {
3745f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData component %i out of range.", cIdx);
3755f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
3765f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3775f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3785f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3795f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (x >= mType->getDimX()) {
3805f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
3815f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
3825f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3835f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3845f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3855f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    const Element * e = mType->getElement()->getField(cIdx);
3865f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += mType->getElement()->getFieldOffsetBytes(cIdx);
3875f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3885f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (sizeBytes != e->getSizeBytes()) {
3895f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData data size %i does not match field size %i.", sizeBytes, e->getSizeBytes());
3905f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
3915f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3925f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3935f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3945f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (e->getHasReferences()) {
3955f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->incRefs(data);
3965f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->decRefs(ptr);
3975f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3985f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3995f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    memcpy(ptr, data, sizeBytes);
4005f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    sendDirty();
4015f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    mUploadDefered = true;
4025f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
4035f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4044b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid Allocation::elementData(Context *rsc, uint32_t x, uint32_t y,
405afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                const void *data, uint32_t cIdx, uint32_t sizeBytes) {
4065f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint32_t eSize = mType->getElementSizeBytes();
4075f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
4085f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += eSize * (x + y * mType->getDimX());
4095f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4105f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (x >= mType->getDimX()) {
4115f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
4125f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
4135f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4145f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4165f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (y >= mType->getDimY()) {
4175f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
4185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
4195f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4225f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (cIdx >= mType->getElement()->getFieldCount()) {
4235f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData component %i out of range.", cIdx);
4245f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
4255f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4265f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4275f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4285f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    const Element * e = mType->getElement()->getField(cIdx);
4295f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += mType->getElement()->getFieldOffsetBytes(cIdx);
4305f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4315f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (sizeBytes != e->getSizeBytes()) {
4325f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData data size %i does not match field size %i.", sizeBytes, e->getSizeBytes());
4335f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
4345f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4355f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4365f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4375f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (e->getHasReferences()) {
4385f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->incRefs(data);
4395f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->decRefs(ptr);
4405f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4415f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4425f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    memcpy(ptr, data, sizeBytes);
4435f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    sendDirty();
4445f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    mUploadDefered = true;
4455f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
4465f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
447afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::addProgramToDirty(const Program *p) {
448fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mToDirtyList.push(p);
4495c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
4505c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams
451afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::removeProgramToDirty(const Program *p) {
4525c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
4535c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        if (mToDirtyList[ct] == p) {
4545c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams            mToDirtyList.removeAt(ct);
4555c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams            return;
4565c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        }
4575c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    }
4585c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    rsAssert(0);
4595c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
460326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
461afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::dumpLOGV(const char *prefix) const {
462c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    ObjectBase::dumpLOGV(prefix);
463c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
464c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    String8 s(prefix);
465c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    s.append(" type ");
466c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    if (mType.get()) {
467c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams        mType->dumpLOGV(s.string());
468c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    }
469c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
470c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    LOGV("%s allocation ptr=%p mCpuWrite=%i, mCpuRead=%i, mGpuWrite=%i, mGpuRead=%i",
471c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams          prefix, mPtr, mCpuWrite, mCpuRead, mGpuWrite, mGpuRead);
472c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
473ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    LOGV("%s allocation mUsageFlags=0x04%x, mMipmapControl=0x%04x, mTextureID=%i, mBufferID=%i",
474ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams          prefix, mUsageFlags, mMipmapControl, mTextureID, mBufferID);
475c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams}
476326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
477afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::serialize(OStream *stream) const {
478fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
479fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
480fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
481fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
482fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
483fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
484fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First thing we need to serialize is the type object since it will be needed
485fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // to initialize the class
486fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mType->serialize(stream);
487fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
488fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint32_t dataSize = mType->getSizeBytes();
489fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Write how much data we are storing
490fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(dataSize);
491fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Now write the data
492fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addByteArray(mPtr, dataSize);
493fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
494fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
495afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation *Allocation::createFromStream(Context *rsc, IStream *stream) {
496fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
497b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
498afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (classID != RS_A3D_CLASS_ID_ALLOCATION) {
499fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("allocation loading skipped due to invalid class id\n");
500fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
501fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
502fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
503fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
504fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
505fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
506fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Type *type = Type::createFromStream(rsc, stream);
507afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (!type) {
508fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
509fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
510fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->compute();
511fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
512fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Number of bytes we wrote out for this allocation
513fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint32_t dataSize = stream->loadU32();
514afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (dataSize != type->getSizeBytes()) {
515fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("failed to read allocation because numbytes written is not the same loaded type wants\n");
516225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        ObjectBase::checkDelete(type);
517fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
518fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
519fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
520ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    Allocation *alloc = new Allocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT);
521fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    alloc->setName(name.string(), name.size());
522fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
5234b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    uint32_t count = dataSize / type->getElementSizeBytes();
5244b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams
525fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Read in all of our allocation data
5264b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize);
527e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk    stream->reset(stream->getPos() + dataSize);
528fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
529fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return alloc;
530fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
531fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
532afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::sendDirty() const {
5335c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
5345c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        mToDirtyList[ct]->forceDirty();
5355c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    }
5365c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
537326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
538afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const {
539e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
540e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const Element *e = mType->getElement();
541e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    uint32_t stride = e->getSizeBytes();
542e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
54396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    p += stride * startOff;
544e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    while (ct > 0) {
545e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        e->incRefs(p);
546e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        ct --;
547e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        p += stride;
548e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
549e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
550e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
551afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const {
552e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
553e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const Element *e = mType->getElement();
554e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    uint32_t stride = e->getSizeBytes();
555e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
55696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    p += stride * startOff;
557e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    while (ct > 0) {
558e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        e->decRefs(p);
559e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        ct --;
560e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        p += stride;
561e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
562e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
563e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
564afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) {
56596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
56696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
567afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize1D(Context *rsc, uint32_t dimX) {
56896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Type *t = mType->cloneAndResize1D(rsc, dimX);
56996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
57096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    uint32_t oldDimX = mType->getDimX();
57196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX == oldDimX) {
57296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        return;
57396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
57496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
57596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX < oldDimX) {
57696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        decRefs(mPtr, oldDimX - dimX, dimX);
57796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
57896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    mPtr = realloc(mPtr, t->getSizeBytes());
57996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
58096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX > oldDimX) {
58196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        const Element *e = mType->getElement();
58296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        uint32_t stride = e->getSizeBytes();
58396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        memset(((uint8_t *)mPtr) + stride * oldDimX, 0, stride * (dimX - oldDimX));
58496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
58596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    mType.set(t);
58696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
58796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
588afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) {
58996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    LOGE("not implemented");
59096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
59196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
592326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////
593565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams//
594326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
595326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
596326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
597326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
598326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
599afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, bool genmip, uint32_t baseMipLevel) {
600326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *alloc = static_cast<Allocation *>(va);
601b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    alloc->deferedUploadToTexture(rsc);
602326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
603326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
604afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va) {
605326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *alloc = static_cast<Allocation *>(va);
606cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    alloc->deferedUploadToBufferObject(rsc);
607326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
608326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
609afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip565(const Adapter2D &out, const Adapter2D &in) {
610326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t w = out.getDimX();
611326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t h = out.getDimY();
612326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
613e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    for (uint32_t y=0; y < h; y++) {
614326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint16_t *oPtr = static_cast<uint16_t *>(out.getElement(0, y));
615326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const uint16_t *i1 = static_cast<uint16_t *>(in.getElement(0, y*2));
616326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const uint16_t *i2 = static_cast<uint16_t *>(in.getElement(0, y*2+1));
617326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
618e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        for (uint32_t x=0; x < w; x++) {
619565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]);
620565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            oPtr ++;
621565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            i1 += 2;
622565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            i2 += 2;
623565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
624565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
625565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams}
626565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
627afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8888(const Adapter2D &out, const Adapter2D &in) {
628565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t w = out.getDimX();
629565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t h = out.getDimY();
630565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
631e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    for (uint32_t y=0; y < h; y++) {
632565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        uint32_t *oPtr = static_cast<uint32_t *>(out.getElement(0, y));
633565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        const uint32_t *i1 = static_cast<uint32_t *>(in.getElement(0, y*2));
634565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        const uint32_t *i2 = static_cast<uint32_t *>(in.getElement(0, y*2+1));
635565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
636e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        for (uint32_t x=0; x < w; x++) {
637565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]);
638326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            oPtr ++;
639326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            i1 += 2;
640326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            i2 += 2;
641326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
642326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
643326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
644326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
645afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8(const Adapter2D &out, const Adapter2D &in) {
6462f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    uint32_t w = out.getDimX();
6472f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    uint32_t h = out.getDimY();
6482f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
6492f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    for (uint32_t y=0; y < h; y++) {
6502f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        uint8_t *oPtr = static_cast<uint8_t *>(out.getElement(0, y));
6512f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        const uint8_t *i1 = static_cast<uint8_t *>(in.getElement(0, y*2));
6522f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        const uint8_t *i2 = static_cast<uint8_t *>(in.getElement(0, y*2+1));
6532f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
6542f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        for (uint32_t x=0; x < w; x++) {
6552f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f);
6562f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            oPtr ++;
6572f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            i1 += 2;
6582f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            i2 += 2;
6592f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        }
6602f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    }
6612f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams}
6622f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
663afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip(const Adapter2D &out, const Adapter2D &in) {
664afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (out.getBaseType()->getElement()->getSizeBits()) {
665e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    case 32:
666e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        mip8888(out, in);
667e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        break;
668e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    case 16:
669e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        mip565(out, in);
670e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        break;
6712f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    case 8:
6722f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        mip8(out, in);
6732f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        break;
674e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    }
675e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams}
676326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
677fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
678fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
679366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) {
680366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Allocation *a = static_cast<Allocation *>(va);
681366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    a->syncAll(rsc, src);
68209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams    a->sendDirty();
683366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams}
684366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
685a23715148f7bda74e904fc553b70c9a49fd52a6eJason Samsvoid rsi_AllocationGenerateMipmaps(Context *rsc, RsAllocation va) {
68639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(va);
687a23715148f7bda74e904fc553b70c9a49fd52a6eJason Sams    rsaAllocationGenerateScriptMips(rsc, texAlloc);
68839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk}
68939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
690837e388700a48084489ba59d1d8cc5ece68b1535Jason Samsvoid rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t dataLen) {
691837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    Allocation *texAlloc = static_cast<Allocation *>(va);
692837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    const Type * t = texAlloc->getType();
693837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
694837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    size_t s = t->getDimX() * t->getDimY() * t->getElementSizeBytes();
695837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    if (s != dataLen) {
696837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size");
697837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        return;
698837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    }
699837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
700837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    memcpy(data, texAlloc->getPtr(), s);
701837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams}
702837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
7034b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod,
7044b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                          uint32_t count, const void *data, uint32_t sizeBytes) {
705326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
7064b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->data(rsc, xoff, lod, count, data, sizeBytes);
7075f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
7085f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
7094b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, uint32_t lod, RsAllocationCubemapFace face,
7104b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                                 const void *data, uint32_t eoff, uint32_t sizeBytes) {
7115f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    Allocation *a = static_cast<Allocation *>(va);
7124b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->elementData(rsc, x, y, data, eoff, sizeBytes);
7135f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
7145f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
7154b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation1DElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t lod,
7164b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                                 const void *data, uint32_t eoff, uint32_t sizeBytes) {
7175f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    Allocation *a = static_cast<Allocation *>(va);
7184b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->elementData(rsc, x, data, eoff, sizeBytes);
719326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
720326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
7214b45b8998e0d7038efaea80c70d23c086640b4e3Jason Samsvoid rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face,
7224b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams                          uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes) {
723326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
7244b45b8998e0d7038efaea80c70d23c086640b4e3Jason Sams    a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes);
725326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
726326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
727afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationRead(Context *rsc, RsAllocation va, void *data) {
728e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams    Allocation *a = static_cast<Allocation *>(va);
729e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams    a->read(data);
730e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams}
731e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams
732afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) {
73396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Allocation *a = static_cast<Allocation *>(va);
73496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    a->resize1D(rsc, dimX);
73596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
73696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
737afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) {
73896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Allocation *a = static_cast<Allocation *>(va);
73996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    a->resize2D(rsc, dimX, dimY);
74096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
74196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
742dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST
743dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
744dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
745dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
746dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
747f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchoukstatic void rsaAllocationGenerateScriptMips(RsContext con, RsAllocation va) {
748f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    Context *rsc = static_cast<Context *>(con);
749f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(va);
750f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    uint32_t numFaces = texAlloc->getType()->getDimFaces() ? 6 : 1;
751f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    for (uint32_t face = 0; face < numFaces; face ++) {
752f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        Adapter2D adapt(rsc, texAlloc);
753f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        Adapter2D adapt2(rsc, texAlloc);
754f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        adapt.setFace(face);
755f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        adapt2.setFace(face);
756f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) {
757f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk            adapt.setLOD(lod);
758f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk            adapt2.setLOD(lod + 1);
759f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk            mip(adapt2, adapt);
760f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        }
761f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    }
762f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk}
763f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk
764afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst void * rsaAllocationGetType(RsContext con, RsAllocation va) {
765d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    Allocation *a = static_cast<Allocation *>(va);
766d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    a->getType()->incUserRef();
767d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
768d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    return a->getType();
769d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk}
770d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
771366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCreateTyped(RsContext con, RsType vtype,
772ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                      RsAllocationMipmapControl mips,
773366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                      uint32_t usages) {
774f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    Context *rsc = static_cast<Context *>(con);
775a2aab8be7a980791fc9d4e6c4d050d703b20bcf6Alex Sakhartchouk    Allocation * alloc = new Allocation(rsc, static_cast<Type *>(vtype), usages, mips);
776f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    alloc->incUserRef();
777f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    return alloc;
778f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams}
779f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
780f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
781366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCreateFromBitmap(RsContext con, RsType vtype,
782ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                           RsAllocationMipmapControl mips,
783366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                           const void *data, uint32_t usages) {
784366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Context *rsc = static_cast<Context *>(con);
785366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Type *t = static_cast<Type *>(vtype);
786f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
787366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    RsAllocation vTexAlloc = rsaAllocationCreateTyped(rsc, vtype, mips, usages);
788f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
789f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    if (texAlloc == NULL) {
790f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        LOGE("Memory allocation failure");
791f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        return NULL;
792f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
793f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
794366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    memcpy(texAlloc->getPtr(), data, t->getDimX() * t->getDimY() * t->getElementSizeBytes());
795ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
796f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        rsaAllocationGenerateScriptMips(rsc, texAlloc);
797f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
798f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
799b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    texAlloc->deferedUploadToTexture(rsc);
800f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    return texAlloc;
801f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams}
80284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
803366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCubeCreateFromBitmap(RsContext con, RsType vtype,
804ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                               RsAllocationMipmapControl mips,
805366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                               const void *data, uint32_t usages) {
80684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    Context *rsc = static_cast<Context *>(con);
807366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Type *t = static_cast<Type *>(vtype);
80884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
80984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Cubemap allocation's faces should be Width by Width each.
81084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Source data should have 6 * Width by Width pixels
81184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Error checking is done in the java layer
812366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    RsAllocation vTexAlloc = rsaAllocationCreateTyped(rsc, t, mips, usages);
81384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
81484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    if (texAlloc == NULL) {
81584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        LOGE("Memory allocation failure");
81684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        return NULL;
81784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
81884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
8199f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t faceSize = t->getDimX();
8209f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes();
8219f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk    uint32_t copySize = faceSize * t->getElementSizeBytes();
8229f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk
82384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    uint8_t *sourcePtr = (uint8_t*)data;
824366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    for (uint32_t face = 0; face < 6; face ++) {
825366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        Adapter2D faceAdapter(rsc, texAlloc);
826366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        faceAdapter.setFace(face);
827366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
8289f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        for (uint32_t dI = 0; dI < faceSize; dI ++) {
8299f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk            memcpy(faceAdapter.getElement(0, dI), sourcePtr + strideBytes * dI, copySize);
8309f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        }
831366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
832366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        // Move the data pointer to the next cube face
8339f8bc4fb7e9e48088dc6b0496afb35b34fc4c5afAlex Sakhartchouk        sourcePtr += copySize;
834f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    }
835366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
836f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
837f8aafcfad92fcf37d4b55c749601de22441ac9bfAlex Sakhartchouk        rsaAllocationGenerateScriptMips(rsc, texAlloc);
83884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
83984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
840b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams    texAlloc->deferedUploadToTexture(rsc);
84184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    return texAlloc;
84284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
843