rsAllocation.cpp revision ebc5019400a129b1f1e57bd1fe8200a21f8da00b
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
31326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android;
32326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsusing namespace android::renderscript;
33326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
34366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsAllocation::Allocation(Context *rsc, const Type *type, uint32_t usages) : ObjectBase(rsc) {
35fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    init(rsc, type);
36fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
37366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    mUsageFlags = usages;
38366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
39fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mPtr = malloc(mType->getSizeBytes());
4010e5e570bab66a6cd543c857b26c576795eb240fJason Sams    if (mType->getElement()->getHasReferences()) {
4110e5e570bab66a6cd543c857b26c576795eb240fJason Sams        memset(mPtr, 0, mType->getSizeBytes());
4210e5e570bab66a6cd543c857b26c576795eb240fJason Sams    }
43fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    if (!mPtr) {
44fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams        LOGE("Allocation::Allocation, alloc failure");
45fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    }
46fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams}
47fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
48fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
49afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::init(Context *rsc, const Type *type) {
50326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mPtr = NULL;
51326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
52326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mCpuWrite = false;
53326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mCpuRead = false;
54326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mGpuWrite = false;
55326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mGpuRead = false;
56326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
57326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mReadWriteRatio = 0;
58326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mUpdateSize = 0;
59ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags = 0;
60ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mMipmapControl = RS_ALLOCATION_MIPMAP_NONE;
61326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
62326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mTextureID = 0;
63326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mBufferID = 0;
64cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = false;
65326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
66fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mUserBitmapCallback = NULL;
67fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mUserBitmapCallbackData = NULL;
68fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
69326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    mType.set(type);
70e5ffb879ae535a899a486285a23bea05e912480fJason Sams    rsAssert(type);
71fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams
72fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    mPtr = NULL;
73326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
74326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
75afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation::~Allocation() {
76fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    if (mUserBitmapCallback != NULL) {
77fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams        mUserBitmapCallback(mUserBitmapCallbackData);
78fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    } else {
79fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams        free(mPtr);
80fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams    }
81bf3c14ebf456c745c084605dddeda08afdfc7987Jason Sams    mPtr = NULL;
82e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams
83e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    if (mBufferID) {
84e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        // Causes a SW crash....
85e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //LOGV(" mBufferID %i", mBufferID);
86e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //glDeleteBuffers(1, &mBufferID);
87e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        //mBufferID = 0;
88e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    }
89e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    if (mTextureID) {
90e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        glDeleteTextures(1, &mTextureID);
91e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams        mTextureID = 0;
92e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams    }
93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
94326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
95afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setCpuWritable(bool) {
96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
97326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
98afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setGpuWritable(bool) {
99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
100326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
101afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setCpuReadable(bool) {
102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
103326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
104afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setGpuReadable(bool) {
105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
106326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
107afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool Allocation::fixAllocation() {
108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    return false;
109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
110326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
111afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::deferedUploadToTexture(const Context *rsc, bool genMipmap, uint32_t lodOffset) {
112326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(lodOffset < mType->getLODCount());
113ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
114cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mTextureLOD = lodOffset;
115cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
1167fabe1a3bf8de37d86021bb7f744c791db81aed3Jason Sams    mTextureGenMipmap = !mType->getDimLOD() && genMipmap;
117cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
118cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
11984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchoukuint32_t Allocation::getGLTarget() const {
120ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsTexture()) {
12184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        if (mType->getDimFaces()) {
12284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            return GL_TEXTURE_CUBE_MAP;
12384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        } else {
12484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            return GL_TEXTURE_2D;
12584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        }
12684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
127ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsBufferObject()) {
12884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        return GL_ARRAY_BUFFER;
12984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
13084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    return 0;
13184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
13284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
133366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::syncAll(Context *rsc, RsAllocationUsageType src) {
134366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    rsAssert(src == RS_ALLOCATION_USAGE_SCRIPT);
135366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
136ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsTexture()) {
137366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        uploadToTexture(rsc);
138366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    }
139ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (getIsBufferObject()) {
140366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        uploadToBufferObject(rsc);
141366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    }
142366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
143366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    mUploadDefered = false;
144366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams}
14584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
146afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::uploadToTexture(const Context *rsc) {
147cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
148ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE;
149d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    GLenum type = mType->getElement()->getComponent().getGLType();
150d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams    GLenum format = mType->getElement()->getComponent().getGLFormat();
151565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
152565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    if (!type || !format) {
153565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        return;
154565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
155565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
15639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk    bool isFirstUpload = false;
15739f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
158326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (!mTextureID) {
159326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glGenTextures(1, &mTextureID);
16013e2634a71a30d289ed8d821aef61c7d1687460eJason Sams
16113e2634a71a30d289ed8d821aef61c7d1687460eJason Sams        if (!mTextureID) {
16213e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // This should not happen, however, its likely the cause of the
16313e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // white sqare bug.
16413e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            // Force a crash to 1: restart the app, 2: make sure we get a bugreport.
16513e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            LOGE("Upload to texture failed to gen mTextureID");
16613e2634a71a30d289ed8d821aef61c7d1687460eJason Sams            rsc->dumpDebug();
167cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams            mUploadDefered = true;
168cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams            return;
16913e2634a71a30d289ed8d821aef61c7d1687460eJason Sams        }
17039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        isFirstUpload = true;
171326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
17284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
17384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum target = (GLenum)getGLTarget();
17484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    glBindTexture(target, mTextureID);
1755f0b4e19811e7e0ba59888939a3d0761297099fbJason Sams    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
176326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
17784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    if (target == GL_TEXTURE_2D) {
17884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        upload2DTexture(isFirstUpload);
17984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    } else if (target == GL_TEXTURE_CUBE_MAP) {
18084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        uploadCubeTexture(isFirstUpload);
18184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
18284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
18384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    if (mTextureGenMipmap) {
18484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
18584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        glGenerateMipmap(target);
18684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST
18784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
18884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
18984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    rsc->checkError("Allocation::uploadToTexture");
19084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
19184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
19284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchoukvoid Allocation::upload2DTexture(bool isFirstUpload) {
19384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum type = mType->getElement()->getComponent().getGLType();
19484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum format = mType->getElement()->getComponent().getGLFormat();
19584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
196e514b45de8561fbc6ef6770845102ca10b0a69d7Jason Sams    Adapter2D adapt(getContext(), this);
197afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    for (uint32_t lod = 0; (lod + mTextureLOD) < mType->getLODCount(); lod++) {
198cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        adapt.setLOD(lod+mTextureLOD);
199326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
200326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint16_t * ptr = static_cast<uint16_t *>(adapt.getElement(0,0));
201afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk        if (isFirstUpload) {
20239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk            glTexImage2D(GL_TEXTURE_2D, lod, format,
20339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk                         adapt.getDimX(), adapt.getDimY(),
20439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk                         0, format, type, ptr);
20539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        } else {
20639f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk            glTexSubImage2D(GL_TEXTURE_2D, lod, 0, 0,
20784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk                            adapt.getDimX(), adapt.getDimY(),
20884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk                            format, type, ptr);
20939f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        }
210326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
21184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
2127fabe1a3bf8de37d86021bb7f744c791db81aed3Jason Sams
21384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchoukvoid Allocation::uploadCubeTexture(bool isFirstUpload) {
21484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum type = mType->getElement()->getComponent().getGLType();
21584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum format = mType->getElement()->getComponent().getGLFormat();
21684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
21784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum faceOrder[] = {
21884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        GL_TEXTURE_CUBE_MAP_POSITIVE_X,
21984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
22084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
22184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
22284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
22384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
22484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    };
22584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
22684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    Adapter2D adapt(getContext(), this);
22784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    for (uint32_t face = 0; face < 6; face ++) {
22884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        adapt.setFace(face);
22984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
23084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        for (uint32_t lod = 0; (lod + mTextureLOD) < mType->getLODCount(); lod++) {
23184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            adapt.setLOD(lod+mTextureLOD);
23284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
23384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            uint16_t * ptr = static_cast<uint16_t *>(adapt.getElement(0,0));
23484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
23584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            if (isFirstUpload) {
23684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk                glTexImage2D(faceOrder[face], lod, format,
23784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk                             adapt.getDimX(), adapt.getDimY(),
23884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk                             0, format, type, ptr);
23984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            } else {
24084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk                glTexSubImage2D(faceOrder[face], lod, 0, 0,
24184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk                                adapt.getDimX(), adapt.getDimY(),
24284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk                                format, type, ptr);
24384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            }
24484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        }
24584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
246326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
247326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
248afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::deferedUploadToBufferObject(const Context *rsc) {
249ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX;
250cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
251cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
252cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
253afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::uploadToBufferObject(const Context *rsc) {
254326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(!mType->getDimY());
255326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    rsAssert(!mType->getDimZ());
256326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
257ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX;
258cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
259326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    if (!mBufferID) {
260326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        glGenBuffers(1, &mBufferID);
261326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
262cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    if (!mBufferID) {
263cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        LOGE("Upload to buffer object failed");
264cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        mUploadDefered = true;
265cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams        return;
266cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    }
26784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    GLenum target = (GLenum)getGLTarget();
26884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    glBindBuffer(target, mBufferID);
26984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    glBufferData(target, mType->getSizeBytes(), getPtr(), GL_DYNAMIC_DRAW);
27084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    glBindBuffer(target, 0);
271c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams    rsc->checkError("Allocation::uploadToBufferObject");
272326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
273326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
274366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::uploadCheck(Context *rsc) {
275cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    if (mUploadDefered) {
276366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        syncAll(rsc, RS_ALLOCATION_USAGE_SCRIPT);
277cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    }
278cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams}
279cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams
280e5ffb879ae535a899a486285a23bea05e912480fJason Sams
281afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::data(Context *rsc, const void *data, uint32_t sizeBytes) {
2829397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    uint32_t size = mType->getSizeBytes();
2839397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if (size != sizeBytes) {
2849397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        LOGE("Allocation::data called with mismatched size expected %i, got %i", size, sizeBytes);
2859397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
2869397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
287e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
288e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (mType->getElement()->getHasReferences()) {
289e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        incRefs(data, sizeBytes / mType->getElement()->getSizeBytes());
290e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        decRefs(mPtr, sizeBytes / mType->getElement()->getSizeBytes());
291e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
292e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
2939397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    memcpy(mPtr, data, size);
2945c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    sendDirty();
295cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
296326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
297326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
298afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::read(void *data) {
299e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams    memcpy(data, mPtr, mType->getSizeBytes());
300e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams}
301e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams
302afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::subData(Context *rsc, uint32_t xoff, uint32_t count, const void *data, uint32_t sizeBytes) {
303326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t eSize = mType->getElementSizeBytes();
304326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
305326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    ptr += eSize * xoff;
3069397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    uint32_t size = count * eSize;
3079397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
3089397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if (size != sizeBytes) {
3099397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        LOGE("Allocation::subData called with mismatched size expected %i, got %i", size, sizeBytes);
310e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams        mType->dumpLOGV("type info");
3119397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
3129397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
313e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
314e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    if (mType->getElement()->getHasReferences()) {
315e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        incRefs(data, count);
316e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        decRefs(ptr, count);
317e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
318e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
3199397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    memcpy(ptr, data, size);
3205c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    sendDirty();
321cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
322326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
323326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3245f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Samsvoid Allocation::subData(Context *rsc, uint32_t xoff, uint32_t yoff,
325afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk             uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes) {
326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t eSize = mType->getElementSizeBytes();
327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t lineSize = eSize * w;
328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t destW = mType->getDimX();
329326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
330326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    const uint8_t *src = static_cast<const uint8_t *>(data);
331326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint8_t *dst = static_cast<uint8_t *>(mPtr);
332326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    dst += eSize * (xoff + yoff * destW);
3339397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
3349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    if ((lineSize * eSize * h) != sizeBytes) {
3359397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        rsAssert(!"Allocation::subData called with mismatched size");
3369397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams        return;
3379397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams    }
3389397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams
339326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    for (uint32_t line=yoff; line < (yoff+h); line++) {
340e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        if (mType->getElement()->getHasReferences()) {
341e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            incRefs(src, w);
342e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams            decRefs(dst, w);
343e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        }
344326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        memcpy(dst, src, lineSize);
345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        src += lineSize;
346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        dst += destW * eSize;
347326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
3485c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    sendDirty();
349cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    mUploadDefered = true;
350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3525f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Samsvoid Allocation::subData(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff,
353afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk             uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes) {
354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
3565f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Samsvoid Allocation::subElementData(Context *rsc, uint32_t x, const void *data,
357afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                uint32_t cIdx, uint32_t sizeBytes) {
3585f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint32_t eSize = mType->getElementSizeBytes();
3595f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
3605f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += eSize * x;
3615f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3625f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (cIdx >= mType->getElement()->getFieldCount()) {
3635f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData component %i out of range.", cIdx);
3645f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
3655f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3665f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3675f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3685f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (x >= mType->getDimX()) {
3695f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
3705f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
3715f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3725f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3735f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3745f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    const Element * e = mType->getElement()->getField(cIdx);
3755f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += mType->getElement()->getFieldOffsetBytes(cIdx);
3765f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3775f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (sizeBytes != e->getSizeBytes()) {
3785f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData data size %i does not match field size %i.", sizeBytes, e->getSizeBytes());
3795f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
3805f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
3815f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3825f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3835f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (e->getHasReferences()) {
3845f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->incRefs(data);
3855f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->decRefs(ptr);
3865f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
3875f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3885f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    memcpy(ptr, data, sizeBytes);
3895f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    sendDirty();
3905f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    mUploadDefered = true;
3915f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
3925f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3935f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Samsvoid Allocation::subElementData(Context *rsc, uint32_t x, uint32_t y,
394afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk                                const void *data, uint32_t cIdx, uint32_t sizeBytes) {
3955f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint32_t eSize = mType->getElementSizeBytes();
3965f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    uint8_t * ptr = static_cast<uint8_t *>(mPtr);
3975f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += eSize * (x + y * mType->getDimX());
3985f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
3995f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (x >= mType->getDimX()) {
4005f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
4015f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
4025f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4035f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4045f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4055f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (y >= mType->getDimY()) {
4065f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData X offset %i out of range.", x);
4075f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range.");
4085f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4095f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4105f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4115f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (cIdx >= mType->getElement()->getFieldCount()) {
4125f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData component %i out of range.", cIdx);
4135f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range.");
4145f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4165f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4175f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    const Element * e = mType->getElement()->getField(cIdx);
4185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    ptr += mType->getElement()->getFieldOffsetBytes(cIdx);
4195f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (sizeBytes != e->getSizeBytes()) {
4215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        LOGE("Error Allocation::subElementData data size %i does not match field size %i.", sizeBytes, e->getSizeBytes());
4225f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size.");
4235f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        return;
4245f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4255f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4265f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    if (e->getHasReferences()) {
4275f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->incRefs(data);
4285f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams        e->decRefs(ptr);
4295f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    }
4305f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
4315f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    memcpy(ptr, data, sizeBytes);
4325f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    sendDirty();
4335f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    mUploadDefered = true;
4345f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
4355f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
436afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::addProgramToDirty(const Program *p) {
437fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mToDirtyList.push(p);
4385c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
4395c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams
440afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::removeProgramToDirty(const Program *p) {
4415c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
4425c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        if (mToDirtyList[ct] == p) {
4435c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams            mToDirtyList.removeAt(ct);
4445c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams            return;
4455c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        }
4465c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    }
4475c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    rsAssert(0);
4485c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
449326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
450afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::dumpLOGV(const char *prefix) const {
451c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    ObjectBase::dumpLOGV(prefix);
452c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
453c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    String8 s(prefix);
454c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    s.append(" type ");
455c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    if (mType.get()) {
456c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams        mType->dumpLOGV(s.string());
457c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    }
458c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
459c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams    LOGV("%s allocation ptr=%p mCpuWrite=%i, mCpuRead=%i, mGpuWrite=%i, mGpuRead=%i",
460c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams          prefix, mPtr, mCpuWrite, mCpuRead, mGpuWrite, mGpuRead);
461c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams
462ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    LOGV("%s allocation mUsageFlags=0x04%x, mMipmapControl=0x%04x, mTextureID=%i, mBufferID=%i",
463ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams          prefix, mUsageFlags, mMipmapControl, mTextureID, mBufferID);
464c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams}
465326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
466afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::serialize(OStream *stream) const {
467fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Need to identify ourselves
468fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32((uint32_t)getClassId());
469fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
470fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name(getName());
471fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addString(&name);
472fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
473fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First thing we need to serialize is the type object since it will be needed
474fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // to initialize the class
475fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    mType->serialize(stream);
476fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
477fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint32_t dataSize = mType->getSizeBytes();
478fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Write how much data we are storing
479fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addU32(dataSize);
480fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Now write the data
481fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->addByteArray(mPtr, dataSize);
482fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
483fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
484afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation *Allocation::createFromStream(Context *rsc, IStream *stream) {
485fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // First make sure we are reading the correct object
486b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk    RsA3DClassID classID = (RsA3DClassID)stream->loadU32();
487afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (classID != RS_A3D_CLASS_ID_ALLOCATION) {
488fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("allocation loading skipped due to invalid class id\n");
489fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
490fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
491fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
492fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    String8 name;
493fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    stream->loadString(&name);
494fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
495fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    Type *type = Type::createFromStream(rsc, stream);
496afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (!type) {
497fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
498fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
499fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    type->compute();
500fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
501fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Number of bytes we wrote out for this allocation
502fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    uint32_t dataSize = stream->loadU32();
503afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    if (dataSize != type->getSizeBytes()) {
504fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        LOGE("failed to read allocation because numbytes written is not the same loaded type wants\n");
505225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams        ObjectBase::checkDelete(type);
506fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk        return NULL;
507fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    }
508fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
509ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    Allocation *alloc = new Allocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT);
510fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    alloc->setName(name.string(), name.size());
511fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
512fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    // Read in all of our allocation data
5135f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    alloc->data(rsc, stream->getPtr() + stream->getPos(), dataSize);
514e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk    stream->reset(stream->getPos() + dataSize);
515fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
516fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk    return alloc;
517fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk}
518fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
519afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::sendDirty() const {
5205c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    for (size_t ct=0; ct < mToDirtyList.size(); ct++) {
5215c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams        mToDirtyList[ct]->forceDirty();
5225c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams    }
5235c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams}
524326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
525afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const {
526e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const uint8_t *p = static_cast<const uint8_t *>(ptr);
527e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    const Element *e = mType->getElement();
528e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    uint32_t stride = e->getSizeBytes();
529e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
53096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    p += stride * startOff;
531e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    while (ct > 0) {
532e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        e->incRefs(p);
533e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        ct --;
534e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        p += stride;
535e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
536e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
537e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
538afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::decRefs(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->decRefs(p);
546e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        ct --;
547e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams        p += stride;
548e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams    }
549e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams}
550e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams
551afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) {
55296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
55396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
554afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize1D(Context *rsc, uint32_t dimX) {
55596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    Type *t = mType->cloneAndResize1D(rsc, dimX);
55696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
55796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    uint32_t oldDimX = mType->getDimX();
55896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX == oldDimX) {
55996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        return;
56096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
56196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
56296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX < oldDimX) {
56396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        decRefs(mPtr, oldDimX - dimX, dimX);
56496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
56596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    mPtr = realloc(mPtr, t->getSizeBytes());
56696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
56796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    if (dimX > oldDimX) {
56896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        const Element *e = mType->getElement();
56996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        uint32_t stride = e->getSizeBytes();
57096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams        memset(((uint8_t *)mPtr) + stride * oldDimX, 0, stride * (dimX - oldDimX));
57196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    }
57296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    mType.set(t);
57396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
57496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
575afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) {
57696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams    LOGE("not implemented");
57796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams}
57896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams
579326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams/////////////////
580565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams//
581326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
582326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
583326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android {
584326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript {
585326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
586afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, bool genmip, uint32_t baseMipLevel) {
587326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *alloc = static_cast<Allocation *>(va);
5887fabe1a3bf8de37d86021bb7f744c791db81aed3Jason Sams    alloc->deferedUploadToTexture(rsc, genmip, baseMipLevel);
589326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
590326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
591afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va) {
592326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *alloc = static_cast<Allocation *>(va);
593cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams    alloc->deferedUploadToBufferObject(rsc);
594326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
595326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
596afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip565(const Adapter2D &out, const Adapter2D &in) {
597326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t w = out.getDimX();
598326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    uint32_t h = out.getDimY();
599326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
600e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    for (uint32_t y=0; y < h; y++) {
601326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        uint16_t *oPtr = static_cast<uint16_t *>(out.getElement(0, y));
602326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const uint16_t *i1 = static_cast<uint16_t *>(in.getElement(0, y*2));
603326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        const uint16_t *i2 = static_cast<uint16_t *>(in.getElement(0, y*2+1));
604326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
605e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        for (uint32_t x=0; x < w; x++) {
606565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]);
607565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            oPtr ++;
608565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            i1 += 2;
609565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            i2 += 2;
610565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        }
611565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    }
612565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams}
613565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
614afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8888(const Adapter2D &out, const Adapter2D &in) {
615565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t w = out.getDimX();
616565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams    uint32_t h = out.getDimY();
617565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
618e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    for (uint32_t y=0; y < h; y++) {
619565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        uint32_t *oPtr = static_cast<uint32_t *>(out.getElement(0, y));
620565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        const uint32_t *i1 = static_cast<uint32_t *>(in.getElement(0, y*2));
621565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams        const uint32_t *i2 = static_cast<uint32_t *>(in.getElement(0, y*2+1));
622565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams
623e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        for (uint32_t x=0; x < w; x++) {
624565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams            *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]);
625326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            oPtr ++;
626326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            i1 += 2;
627326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams            i2 += 2;
628326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams        }
629326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    }
630326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
631326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
632afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8(const Adapter2D &out, const Adapter2D &in) {
6332f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    uint32_t w = out.getDimX();
6342f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    uint32_t h = out.getDimY();
6352f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
6362f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    for (uint32_t y=0; y < h; y++) {
6372f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        uint8_t *oPtr = static_cast<uint8_t *>(out.getElement(0, y));
6382f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        const uint8_t *i1 = static_cast<uint8_t *>(in.getElement(0, y*2));
6392f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        const uint8_t *i2 = static_cast<uint8_t *>(in.getElement(0, y*2+1));
6402f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
6412f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        for (uint32_t x=0; x < w; x++) {
6422f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f);
6432f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            oPtr ++;
6442f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            i1 += 2;
6452f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams            i2 += 2;
6462f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        }
6472f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    }
6482f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams}
6492f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams
650afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip(const Adapter2D &out, const Adapter2D &in) {
651afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk    switch (out.getBaseType()->getElement()->getSizeBits()) {
652e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    case 32:
653e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        mip8888(out, in);
654e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        break;
655e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    case 16:
656e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        mip565(out, in);
657e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams        break;
6582f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams    case 8:
6592f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        mip8(out, in);
6602f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams        break;
661e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams    }
662e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams}
663326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
664fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST
665fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk
666366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) {
667366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Allocation *a = static_cast<Allocation *>(va);
668366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    a->syncAll(rsc, src);
669366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams}
670366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
671837e388700a48084489ba59d1d8cc5ece68b1535Jason Samsvoid rsi_AllocationCopyFromBitmap(Context *rsc, RsAllocation va, const void *data, size_t dataLen) {
67239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(va);
673837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    const Type * t = texAlloc->getType();
674837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
675837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    uint32_t w = t->getDimX();
676837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    uint32_t h = t->getDimY();
677837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    bool genMips = t->getDimLOD();
678837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    size_t s = w * h * t->getElementSizeBytes();
679837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    if (s != dataLen) {
680837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size");
681837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        return;
682837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    }
683837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
684837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    memcpy(texAlloc->getPtr(), data, s);
685837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    if (genMips) {
686837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        Adapter2D adapt(rsc, texAlloc);
687837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        Adapter2D adapt2(rsc, texAlloc);
688837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) {
689837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams            adapt.setLOD(lod);
690837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams            adapt2.setLOD(lod + 1);
691837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams            mip(adapt2, adapt);
69239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk        }
69339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk    }
69439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk}
69539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk
696837e388700a48084489ba59d1d8cc5ece68b1535Jason Samsvoid rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t dataLen) {
697837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    Allocation *texAlloc = static_cast<Allocation *>(va);
698837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    const Type * t = texAlloc->getType();
699837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
700837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    size_t s = t->getDimX() * t->getDimY() * t->getElementSizeBytes();
701837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    if (s != dataLen) {
702837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size");
703837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams        return;
704837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    }
705837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
706837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams    memcpy(data, texAlloc->getPtr(), s);
707837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams}
708837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams
709afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationData(Context *rsc, RsAllocation va, const void *data, uint32_t sizeBytes) {
710326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
7115f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    a->data(rsc, data, sizeBytes);
712326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
713326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
714afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Allocation1DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t count, const void *data, uint32_t sizeBytes) {
715326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
7165f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    a->subData(rsc, xoff, count, data, sizeBytes);
7175f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
7185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
719afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Allocation2DSubElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, const void *data, uint32_t eoff, uint32_t sizeBytes) {
7205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    Allocation *a = static_cast<Allocation *>(va);
7215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    a->subElementData(rsc, x, y, data, eoff, sizeBytes);
7225f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams}
7235f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams
724afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Allocation1DSubElementData(Context *rsc, RsAllocation va, uint32_t x, const void *data, uint32_t eoff, uint32_t sizeBytes) {
7255f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    Allocation *a = static_cast<Allocation *>(va);
7265f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    a->subElementData(rsc, x, data, eoff, sizeBytes);
727326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams}
728326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams
729afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Allocation2DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes) {
730326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams    Allocation *a = static_cast<Allocation *>(va);
7315f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams    a->subData(rsc, xoff, yoff, 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#endif //ANDROID_RS_BUILD_FOR_HOST
750dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
751dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
752dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk}
753dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk
754afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst void * rsaAllocationGetType(RsContext con, RsAllocation va) {
755d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    Allocation *a = static_cast<Allocation *>(va);
756d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    a->getType()->incUserRef();
757d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
758d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk    return a->getType();
759d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk}
760d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk
761366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCreateTyped(RsContext con, RsType vtype,
762ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                      RsAllocationMipmapControl mips,
763366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                      uint32_t usages) {
764f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    Context *rsc = static_cast<Context *>(con);
765366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Allocation * alloc = new Allocation(rsc, static_cast<Type *>(vtype), usages);
766f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    alloc->incUserRef();
767f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    return alloc;
768f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams}
769f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
770f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
771366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCreateFromBitmap(RsContext con, RsType vtype,
772ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                           RsAllocationMipmapControl mips,
773366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                           const void *data, uint32_t usages) {
774366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Context *rsc = static_cast<Context *>(con);
775366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Type *t = static_cast<Type *>(vtype);
776f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
777366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    RsAllocation vTexAlloc = rsaAllocationCreateTyped(rsc, vtype, mips, usages);
778f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
779f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    if (texAlloc == NULL) {
780f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        LOGE("Memory allocation failure");
781f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        return NULL;
782f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
783f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
784366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    memcpy(texAlloc->getPtr(), data, t->getDimX() * t->getDimY() * t->getElementSizeBytes());
785ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    if (mips == RS_ALLOCATION_MIPMAP_FULL) {
786366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        Adapter2D adapt(rsc, texAlloc);
787366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        Adapter2D adapt2(rsc, texAlloc);
788366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) {
789366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams            adapt.setLOD(lod);
790366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams            adapt2.setLOD(lod + 1);
791366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams            mip(adapt2, adapt);
792f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams        }
793f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    }
794f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams
795ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    texAlloc->deferedUploadToTexture(rsc, false, 0);
796f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams    return texAlloc;
797f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams}
79884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
799366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCubeCreateFromBitmap(RsContext con, RsType vtype,
800ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams                                               RsAllocationMipmapControl mips,
801366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                                               const void *data, uint32_t usages) {
80284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    Context *rsc = static_cast<Context *>(con);
803366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    Type *t = static_cast<Type *>(vtype);
80484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
80584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Cubemap allocation's faces should be Width by Width each.
80684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Source data should have 6 * Width by Width pixels
80784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    // Error checking is done in the java layer
808366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    RsAllocation vTexAlloc = rsaAllocationCreateTyped(rsc, t, mips, usages);
80984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc);
81084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    if (texAlloc == NULL) {
81184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        LOGE("Memory allocation failure");
81284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        return NULL;
81384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
81484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
81584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    uint8_t *sourcePtr = (uint8_t*)data;
816366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams    for (uint32_t face = 0; face < 6; face ++) {
817366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        Adapter2D faceAdapter(rsc, texAlloc);
818366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        faceAdapter.setFace(face);
819366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
820366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        size_t cpySize = t->getDimX() * t->getDimX() * t->getElementSizeBytes();
821366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        memcpy(faceAdapter.getElement(0, 0), sourcePtr, cpySize);
822366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
823366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        // Move the data pointer to the next cube face
824366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams        sourcePtr += cpySize;
825366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams
826ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams        if (mips == RS_ALLOCATION_MIPMAP_FULL) {
827366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams            Adapter2D adapt(rsc, texAlloc);
828366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams            Adapter2D adapt2(rsc, texAlloc);
829366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams            adapt.setFace(face);
830366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams            adapt2.setFace(face);
831366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams            for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) {
832366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                adapt.setLOD(lod);
833366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                adapt2.setLOD(lod + 1);
834366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams                mip(adapt2, adapt);
83584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk            }
83684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk        }
83784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    }
83884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk
839ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams    texAlloc->deferedUploadToTexture(rsc, false, 0);
84084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk    return texAlloc;
84184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk}
842