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