rsAllocation.cpp revision b89b0b7dd8199967502c92fe5c8f57c3bc255e1c
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 39b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams allocScriptMemory(); 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); 78b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams mPtr = NULL; 79fa84da2cbc271f855b3b1ec75bb688abdf1d1d01Jason Sams } 80b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams freeScriptMemory(); 81e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams 82e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams if (mBufferID) { 83e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams // Causes a SW crash.... 84e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams //LOGV(" mBufferID %i", mBufferID); 85e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams //glDeleteBuffers(1, &mBufferID); 86e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams //mBufferID = 0; 87e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams } 88e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams if (mTextureID) { 89e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams glDeleteTextures(1, &mTextureID); 90e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams mTextureID = 0; 91e402ed33486730f1d06f080cdfc48132bf612b3aJason Sams } 92326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 93326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 94afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setCpuWritable(bool) { 95326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 96326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 97afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setGpuWritable(bool) { 98326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 99326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 100afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setCpuReadable(bool) { 101326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 102326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 103afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::setGpuReadable(bool) { 104326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 105326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 106afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool Allocation::fixAllocation() { 107326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams return false; 108326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 109326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 110b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::deferedUploadToTexture(const Context *rsc) { 111ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE; 112cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mUploadDefered = true; 113cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams} 114cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams 11584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchoukuint32_t Allocation::getGLTarget() const { 116ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (getIsTexture()) { 11784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (mType->getDimFaces()) { 11884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return GL_TEXTURE_CUBE_MAP; 11984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } else { 12084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return GL_TEXTURE_2D; 12184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 12284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 123ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (getIsBufferObject()) { 12484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return GL_ARRAY_BUFFER; 12584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 12684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return 0; 12784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk} 12884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 129b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::allocScriptMemory() { 130b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams rsAssert(!mPtr); 131b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams mPtr = malloc(mType->getSizeBytes()); 132b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams} 133b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 134b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::freeScriptMemory() { 135b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams rsAssert(!(mUsageFlags & RS_ALLOCATION_USAGE_SCRIPT)); 136b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams if (mPtr) { 137b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams free(mPtr); 138b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams mPtr = NULL; 139b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams } 140b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams} 141b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 142b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 143366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::syncAll(Context *rsc, RsAllocationUsageType src) { 144366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams rsAssert(src == RS_ALLOCATION_USAGE_SCRIPT); 145366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 146ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (getIsTexture()) { 147366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams uploadToTexture(rsc); 148366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams } 149ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (getIsBufferObject()) { 150366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams uploadToBufferObject(rsc); 151366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams } 152366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 153366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams mUploadDefered = false; 154366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams} 15584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 156afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::uploadToTexture(const Context *rsc) { 157cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams 158ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE; 159d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams GLenum type = mType->getElement()->getComponent().getGLType(); 160d01d970cf5973aa5186cc02c80fb2c143a69b0b1Jason Sams GLenum format = mType->getElement()->getComponent().getGLFormat(); 161565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 162565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams if (!type || !format) { 163565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams return; 164565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 165565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 166b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams if (!mPtr) { 167b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams return; 168b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams } 169b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 17039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk bool isFirstUpload = false; 17139f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 172326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (!mTextureID) { 173326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glGenTextures(1, &mTextureID); 17413e2634a71a30d289ed8d821aef61c7d1687460eJason Sams 17513e2634a71a30d289ed8d821aef61c7d1687460eJason Sams if (!mTextureID) { 17613e2634a71a30d289ed8d821aef61c7d1687460eJason Sams // This should not happen, however, its likely the cause of the 17713e2634a71a30d289ed8d821aef61c7d1687460eJason Sams // white sqare bug. 17813e2634a71a30d289ed8d821aef61c7d1687460eJason Sams // Force a crash to 1: restart the app, 2: make sure we get a bugreport. 17913e2634a71a30d289ed8d821aef61c7d1687460eJason Sams LOGE("Upload to texture failed to gen mTextureID"); 18013e2634a71a30d289ed8d821aef61c7d1687460eJason Sams rsc->dumpDebug(); 181cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mUploadDefered = true; 182cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams return; 18313e2634a71a30d289ed8d821aef61c7d1687460eJason Sams } 18439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk isFirstUpload = true; 185326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 18684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 18784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GLenum target = (GLenum)getGLTarget(); 18884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (target == GL_TEXTURE_2D) { 189b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams upload2DTexture(isFirstUpload, mPtr); 19084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } else if (target == GL_TEXTURE_CUBE_MAP) { 19184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uploadCubeTexture(isFirstUpload); 19284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 19384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 194b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams if (mMipmapControl == RS_ALLOCATION_MIPMAP_ON_SYNC_TO_TEXTURE) { 19584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 19684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk glGenerateMipmap(target); 19784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST 19884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 19984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 200b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 201b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams if (!(mUsageFlags & RS_ALLOCATION_USAGE_SCRIPT)) { 202b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams freeScriptMemory(); 203b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams } 204b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 20584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk rsc->checkError("Allocation::uploadToTexture"); 20684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk} 20784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 208b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Samsvoid Allocation::upload2DTexture(bool isFirstUpload, const void *ptr) { 20984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GLenum type = mType->getElement()->getComponent().getGLType(); 21084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GLenum format = mType->getElement()->getComponent().getGLFormat(); 21184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 212b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams GLenum target = (GLenum)getGLTarget(); 213b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams glBindTexture(target, mTextureID); 214b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 215b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 216b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams for (uint32_t lod = 0; lod < mType->getLODCount(); lod++) { 217b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams const uint8_t *p = (const uint8_t *)ptr; 218b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams p += mType->getLODOffset(lod); 219326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 220afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (isFirstUpload) { 22139f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk glTexImage2D(GL_TEXTURE_2D, lod, format, 222b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams mType->getLODDimX(lod), mType->getLODDimY(lod), 223b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 0, format, type, p); 22439f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk } else { 22539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk glTexSubImage2D(GL_TEXTURE_2D, lod, 0, 0, 226b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams mType->getLODDimX(lod), mType->getLODDimY(lod), 227b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams format, type, p); 22839f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk } 229326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 23084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk} 2317fabe1a3bf8de37d86021bb7f744c791db81aed3Jason Sams 23284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchoukvoid Allocation::uploadCubeTexture(bool isFirstUpload) { 23384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GLenum type = mType->getElement()->getComponent().getGLType(); 23484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GLenum format = mType->getElement()->getComponent().getGLFormat(); 23584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 236b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams GLenum target = (GLenum)getGLTarget(); 237b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams glBindTexture(target, mTextureID); 238b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 239b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 24084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GLenum faceOrder[] = { 24184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GL_TEXTURE_CUBE_MAP_POSITIVE_X, 24284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 24384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 24484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 24584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 24684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GL_TEXTURE_CUBE_MAP_NEGATIVE_Z 24784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk }; 24884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 24984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk Adapter2D adapt(getContext(), this); 25084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk for (uint32_t face = 0; face < 6; face ++) { 25184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk adapt.setFace(face); 25284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 253b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams for (uint32_t lod = 0; lod < mType->getLODCount(); lod++) { 254b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams adapt.setLOD(lod); 25584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 25684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint16_t * ptr = static_cast<uint16_t *>(adapt.getElement(0,0)); 25784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 25884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (isFirstUpload) { 25984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk glTexImage2D(faceOrder[face], lod, format, 26084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk adapt.getDimX(), adapt.getDimY(), 26184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 0, format, type, ptr); 26284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } else { 26384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk glTexSubImage2D(faceOrder[face], lod, 0, 0, 26484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk adapt.getDimX(), adapt.getDimY(), 26584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk format, type, ptr); 26684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 26784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 26884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 269326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 270326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 271afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::deferedUploadToBufferObject(const Context *rsc) { 272ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX; 273cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mUploadDefered = true; 274cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams} 275cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams 276afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::uploadToBufferObject(const Context *rsc) { 277326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!mType->getDimY()); 278326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams rsAssert(!mType->getDimZ()); 279326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 280ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams mUsageFlags |= RS_ALLOCATION_USAGE_GRAPHICS_VERTEX; 281cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams 282326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams if (!mBufferID) { 283326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams glGenBuffers(1, &mBufferID); 284326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 285cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams if (!mBufferID) { 286cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams LOGE("Upload to buffer object failed"); 287cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mUploadDefered = true; 288cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams return; 289cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams } 29084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk GLenum target = (GLenum)getGLTarget(); 29184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk glBindBuffer(target, mBufferID); 29284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk glBufferData(target, mType->getSizeBytes(), getPtr(), GL_DYNAMIC_DRAW); 29384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk glBindBuffer(target, 0); 294c1ed589021e280cda59a0521cb96b3e9eb629e1bJason Sams rsc->checkError("Allocation::uploadToBufferObject"); 295326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 296326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 297366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid Allocation::uploadCheck(Context *rsc) { 298cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams if (mUploadDefered) { 299366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams syncAll(rsc, RS_ALLOCATION_USAGE_SCRIPT); 300cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams } 301cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams} 302cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams 303e5ffb879ae535a899a486285a23bea05e912480fJason Sams 304afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::data(Context *rsc, const void *data, uint32_t sizeBytes) { 3059397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams uint32_t size = mType->getSizeBytes(); 3069397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams if (size != sizeBytes) { 3079397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams LOGE("Allocation::data called with mismatched size expected %i, got %i", size, sizeBytes); 3089397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams return; 3099397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 310e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 311e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mType->getElement()->getHasReferences()) { 312e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams incRefs(data, sizeBytes / mType->getElement()->getSizeBytes()); 313e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams decRefs(mPtr, sizeBytes / mType->getElement()->getSizeBytes()); 314e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 315e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 3169397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams memcpy(mPtr, data, size); 3175c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams sendDirty(); 318cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mUploadDefered = true; 319326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 320326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 321afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::read(void *data) { 322e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams memcpy(data, mPtr, mType->getSizeBytes()); 323e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams} 324e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams 325afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::subData(Context *rsc, uint32_t xoff, uint32_t count, const void *data, uint32_t sizeBytes) { 326326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t eSize = mType->getElementSizeBytes(); 327326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint8_t * ptr = static_cast<uint8_t *>(mPtr); 328326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams ptr += eSize * xoff; 3299397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams uint32_t size = count * eSize; 3309397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 3319397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams if (size != sizeBytes) { 3329397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams LOGE("Allocation::subData called with mismatched size expected %i, got %i", size, sizeBytes); 333e12c1c591b4219e80f29c6c0e0c62c9578b75450Jason Sams mType->dumpLOGV("type info"); 3349397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams return; 3359397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 336e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 337e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mType->getElement()->getHasReferences()) { 338e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams incRefs(data, count); 339e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams decRefs(ptr, count); 340e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 341e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 3429397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams memcpy(ptr, data, size); 3435c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams sendDirty(); 344cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mUploadDefered = true; 345326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 346326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3475f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Samsvoid Allocation::subData(Context *rsc, uint32_t xoff, uint32_t yoff, 348afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t w, uint32_t h, const void *data, uint32_t sizeBytes) { 349326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t eSize = mType->getElementSizeBytes(); 350326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t lineSize = eSize * w; 351326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t destW = mType->getDimX(); 352326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 353326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint8_t *src = static_cast<const uint8_t *>(data); 354326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint8_t *dst = static_cast<uint8_t *>(mPtr); 355326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams dst += eSize * (xoff + yoff * destW); 3569397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 3579397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams if ((lineSize * eSize * h) != sizeBytes) { 3589397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams rsAssert(!"Allocation::subData called with mismatched size"); 3599397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams return; 3609397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams } 3619397e30ce5fe3f6af9212a93b490836b04fdfffaJason Sams 362326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams for (uint32_t line=yoff; line < (yoff+h); line++) { 363e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams if (mType->getElement()->getHasReferences()) { 364e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams incRefs(src, w); 365e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams decRefs(dst, w); 366e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 367326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams memcpy(dst, src, lineSize); 368326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams src += lineSize; 369326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams dst += destW * eSize; 370326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 3715c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams sendDirty(); 372cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams mUploadDefered = true; 373326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 374326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3755f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Samsvoid Allocation::subData(Context *rsc, uint32_t xoff, uint32_t yoff, uint32_t zoff, 376afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t w, uint32_t h, uint32_t d, const void *data, uint32_t sizeBytes) { 377326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 378326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 3795f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Samsvoid Allocation::subElementData(Context *rsc, uint32_t x, const void *data, 380afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk uint32_t cIdx, uint32_t sizeBytes) { 3815f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams uint32_t eSize = mType->getElementSizeBytes(); 3825f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams uint8_t * ptr = static_cast<uint8_t *>(mPtr); 3835f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams ptr += eSize * x; 3845f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 3855f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (cIdx >= mType->getElement()->getFieldCount()) { 3865f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData component %i out of range.", cIdx); 3875f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); 3885f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 3895f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 3905f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 3915f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (x >= mType->getDimX()) { 3925f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData X offset %i out of range.", x); 3935f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 3945f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 3955f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 3965f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 3975f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams const Element * e = mType->getElement()->getField(cIdx); 3985f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams ptr += mType->getElement()->getFieldOffsetBytes(cIdx); 3995f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4005f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (sizeBytes != e->getSizeBytes()) { 4015f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData data size %i does not match field size %i.", sizeBytes, e->getSizeBytes()); 4025f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); 4035f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 4045f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 4055f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4065f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (e->getHasReferences()) { 4075f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams e->incRefs(data); 4085f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams e->decRefs(ptr); 4095f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 4105f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4115f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams memcpy(ptr, data, sizeBytes); 4125f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams sendDirty(); 4135f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams mUploadDefered = true; 4145f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 4155f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4165f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Samsvoid Allocation::subElementData(Context *rsc, uint32_t x, uint32_t y, 417afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk const void *data, uint32_t cIdx, uint32_t sizeBytes) { 4185f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams uint32_t eSize = mType->getElementSizeBytes(); 4195f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams uint8_t * ptr = static_cast<uint8_t *>(mPtr); 4205f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams ptr += eSize * (x + y * mType->getDimX()); 4215f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4225f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (x >= mType->getDimX()) { 4235f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData X offset %i out of range.", x); 4245f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 4255f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 4265f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 4275f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4285f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (y >= mType->getDimY()) { 4295f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData X offset %i out of range.", x); 4305f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData X offset out of range."); 4315f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 4325f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 4335f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4345f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (cIdx >= mType->getElement()->getFieldCount()) { 4355f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData component %i out of range.", cIdx); 4365f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData component out of range."); 4375f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 4385f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 4395f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4405f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams const Element * e = mType->getElement()->getField(cIdx); 4415f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams ptr += mType->getElement()->getFieldOffsetBytes(cIdx); 4425f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4435f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (sizeBytes != e->getSizeBytes()) { 4445f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams LOGE("Error Allocation::subElementData data size %i does not match field size %i.", sizeBytes, e->getSizeBytes()); 4455f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams rsc->setError(RS_ERROR_BAD_VALUE, "subElementData bad size."); 4465f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams return; 4475f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 4485f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4495f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams if (e->getHasReferences()) { 4505f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams e->incRefs(data); 4515f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams e->decRefs(ptr); 4525f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams } 4535f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 4545f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams memcpy(ptr, data, sizeBytes); 4555f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams sendDirty(); 4565f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams mUploadDefered = true; 4575f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 4585f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 459afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::addProgramToDirty(const Program *p) { 460fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mToDirtyList.push(p); 4615c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 4625c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams 463afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::removeProgramToDirty(const Program *p) { 4645c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams for (size_t ct=0; ct < mToDirtyList.size(); ct++) { 4655c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams if (mToDirtyList[ct] == p) { 4665c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams mToDirtyList.removeAt(ct); 4675c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams return; 4685c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 4695c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 4705c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams rsAssert(0); 4715c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 472326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 473afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::dumpLOGV(const char *prefix) const { 474c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams ObjectBase::dumpLOGV(prefix); 475c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 476c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams String8 s(prefix); 477c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams s.append(" type "); 478c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams if (mType.get()) { 479c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams mType->dumpLOGV(s.string()); 480c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams } 481c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 482c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams LOGV("%s allocation ptr=%p mCpuWrite=%i, mCpuRead=%i, mGpuWrite=%i, mGpuRead=%i", 483c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams prefix, mPtr, mCpuWrite, mCpuRead, mGpuWrite, mGpuRead); 484c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams 485ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams LOGV("%s allocation mUsageFlags=0x04%x, mMipmapControl=0x%04x, mTextureID=%i, mBufferID=%i", 486ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams prefix, mUsageFlags, mMipmapControl, mTextureID, mBufferID); 487c21cf40f6ae69091bf24f87b5eeabc95e73dd271Jason Sams} 488326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 489afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::serialize(OStream *stream) const { 490fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Need to identify ourselves 491fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32((uint32_t)getClassId()); 492fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 493fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name(getName()); 494fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addString(&name); 495fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 496fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First thing we need to serialize is the type object since it will be needed 497fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // to initialize the class 498fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mType->serialize(stream); 499fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 500fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t dataSize = mType->getSizeBytes(); 501fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write how much data we are storing 502fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addU32(dataSize); 503fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write the data 504fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->addByteArray(mPtr, dataSize); 505fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 506fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 507afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukAllocation *Allocation::createFromStream(Context *rsc, IStream *stream) { 508fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // First make sure we are reading the correct object 509b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); 510afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (classID != RS_A3D_CLASS_ID_ALLOCATION) { 511fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("allocation loading skipped due to invalid class id\n"); 512fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 513fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 514fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 515fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk String8 name; 516fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk stream->loadString(&name); 517fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 518fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk Type *type = Type::createFromStream(rsc, stream); 519afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!type) { 520fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 521fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 522fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk type->compute(); 523fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 524fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Number of bytes we wrote out for this allocation 525fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t dataSize = stream->loadU32(); 526afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (dataSize != type->getSizeBytes()) { 527fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk LOGE("failed to read allocation because numbytes written is not the same loaded type wants\n"); 528225afd317e101a7be5fe02c0a86361146ea89f05Jason Sams ObjectBase::checkDelete(type); 529fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return NULL; 530fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 531fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 532ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams Allocation *alloc = new Allocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT); 533fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk alloc->setName(name.string(), name.size()); 534fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 535fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Read in all of our allocation data 5365f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams alloc->data(rsc, stream->getPtr() + stream->getPos(), dataSize); 537e6d9fbc31bef01219cc812e819c505ff01673c6fAlex Sakhartchouk stream->reset(stream->getPos() + dataSize); 538fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 539fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return alloc; 540fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 541fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 542afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::sendDirty() const { 5435c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams for (size_t ct=0; ct < mToDirtyList.size(); ct++) { 5445c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams mToDirtyList[ct]->forceDirty(); 5455c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams } 5465c3e3bc8af6de6be5e6bd68e1d5168496f99e6cfJason Sams} 547326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 548afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::incRefs(const void *ptr, size_t ct, size_t startOff) const { 549e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 550e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const Element *e = mType->getElement(); 551e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t stride = e->getSizeBytes(); 552e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 55396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams p += stride * startOff; 554e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams while (ct > 0) { 555e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->incRefs(p); 556e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ct --; 557e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams p += stride; 558e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 559e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 560e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 561afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::decRefs(const void *ptr, size_t ct, size_t startOff) const { 562e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const uint8_t *p = static_cast<const uint8_t *>(ptr); 563e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams const Element *e = mType->getElement(); 564e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams uint32_t stride = e->getSizeBytes(); 565e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 56696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams p += stride * startOff; 567e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams while (ct > 0) { 568e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams e->decRefs(p); 569e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams ct --; 570e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams p += stride; 571e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams } 572e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams} 573e3929c9bc6f3897e132304faf1b40c3cf1f47474Jason Sams 574afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::copyRange1D(Context *rsc, const Allocation *src, int32_t srcOff, int32_t destOff, int32_t len) { 57596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 57696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 577afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize1D(Context *rsc, uint32_t dimX) { 57896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Type *t = mType->cloneAndResize1D(rsc, dimX); 57996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 58096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams uint32_t oldDimX = mType->getDimX(); 58196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX == oldDimX) { 58296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams return; 58396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 58496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 58596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX < oldDimX) { 58696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams decRefs(mPtr, oldDimX - dimX, dimX); 58796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 58896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams mPtr = realloc(mPtr, t->getSizeBytes()); 58996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 59096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams if (dimX > oldDimX) { 59196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams const Element *e = mType->getElement(); 59296abf819e50b59ba8cf886c13f894633eb0a24baJason Sams uint32_t stride = e->getSizeBytes(); 59396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams memset(((uint8_t *)mPtr) + stride * oldDimX, 0, stride * (dimX - oldDimX)); 59496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams } 59596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams mType.set(t); 59696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 59796abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 598afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid Allocation::resize2D(Context *rsc, uint32_t dimX, uint32_t dimY) { 59996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams LOGE("not implemented"); 60096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 60196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 602326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams///////////////// 603565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams// 604326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 605326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 606326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace android { 607326e0ddf89e8df2837752fbfd7a014814b32082cJason Samsnamespace renderscript { 608326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 609afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationUploadToTexture(Context *rsc, RsAllocation va, bool genmip, uint32_t baseMipLevel) { 610326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *alloc = static_cast<Allocation *>(va); 611b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams alloc->deferedUploadToTexture(rsc); 612326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 613326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 614afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationUploadToBufferObject(Context *rsc, RsAllocation va) { 615326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *alloc = static_cast<Allocation *>(va); 616cf4c7c9b2f513be77a5b9853319ca82ac2b128edJason Sams alloc->deferedUploadToBufferObject(rsc); 617326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 618326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 619afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip565(const Adapter2D &out, const Adapter2D &in) { 620326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t w = out.getDimX(); 621326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint32_t h = out.getDimY(); 622326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 623e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t y=0; y < h; y++) { 624326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams uint16_t *oPtr = static_cast<uint16_t *>(out.getElement(0, y)); 625326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint16_t *i1 = static_cast<uint16_t *>(in.getElement(0, y*2)); 626326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams const uint16_t *i2 = static_cast<uint16_t *>(in.getElement(0, y*2+1)); 627326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 628e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t x=0; x < w; x++) { 629565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams *oPtr = rsBoxFilter565(i1[0], i1[1], i2[0], i2[1]); 630565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams oPtr ++; 631565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams i1 += 2; 632565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams i2 += 2; 633565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 634565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams } 635565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams} 636565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 637afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8888(const Adapter2D &out, const Adapter2D &in) { 638565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t w = out.getDimX(); 639565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t h = out.getDimY(); 640565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 641e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t y=0; y < h; y++) { 642565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams uint32_t *oPtr = static_cast<uint32_t *>(out.getElement(0, y)); 643565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams const uint32_t *i1 = static_cast<uint32_t *>(in.getElement(0, y*2)); 644565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams const uint32_t *i2 = static_cast<uint32_t *>(in.getElement(0, y*2+1)); 645565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams 646e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams for (uint32_t x=0; x < w; x++) { 647565ac36ee479f9d7b83e2030ac9646a09cb886a1Jason Sams *oPtr = rsBoxFilter8888(i1[0], i1[1], i2[0], i2[1]); 648326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams oPtr ++; 649326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams i1 += 2; 650326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams i2 += 2; 651326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 652326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams } 653326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 654326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 655afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip8(const Adapter2D &out, const Adapter2D &in) { 6562f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint32_t w = out.getDimX(); 6572f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint32_t h = out.getDimY(); 6582f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 6592f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams for (uint32_t y=0; y < h; y++) { 6602f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams uint8_t *oPtr = static_cast<uint8_t *>(out.getElement(0, y)); 6612f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams const uint8_t *i1 = static_cast<uint8_t *>(in.getElement(0, y*2)); 6622f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams const uint8_t *i2 = static_cast<uint8_t *>(in.getElement(0, y*2+1)); 6632f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 6642f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams for (uint32_t x=0; x < w; x++) { 6652f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams *oPtr = (uint8_t)(((uint32_t)i1[0] + i1[1] + i2[0] + i2[1]) * 0.25f); 6662f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams oPtr ++; 6672f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams i1 += 2; 6682f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams i2 += 2; 6692f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams } 6702f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams } 6712f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams} 6722f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams 673afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukstatic void mip(const Adapter2D &out, const Adapter2D &in) { 674afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk switch (out.getBaseType()->getElement()->getSizeBits()) { 675e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams case 32: 676e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams mip8888(out, in); 677e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams break; 678e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams case 16: 679e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams mip565(out, in); 680e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams break; 6812f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams case 8: 6822f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams mip8(out, in); 6832f6d8617769b5fd6287404a31d4e10140ebdcf7eJason Sams break; 684e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams } 685e9f5c53929c6c46872c4e9ba7cc3d0e528f5ad01Jason Sams} 686326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 687fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#ifndef ANDROID_RS_BUILD_FOR_HOST 688fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 689366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Samsvoid rsi_AllocationSyncAll(Context *rsc, RsAllocation va, RsAllocationUsageType src) { 690366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Allocation *a = static_cast<Allocation *>(va); 691366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams a->syncAll(rsc, src); 692366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams} 693366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 694837e388700a48084489ba59d1d8cc5ece68b1535Jason Samsvoid rsi_AllocationCopyFromBitmap(Context *rsc, RsAllocation va, const void *data, size_t dataLen) { 69539f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(va); 696837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams const Type * t = texAlloc->getType(); 697837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 698837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams uint32_t w = t->getDimX(); 699837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams uint32_t h = t->getDimY(); 700837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams bool genMips = t->getDimLOD(); 701837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams size_t s = w * h * 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 707b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams if (texAlloc->getIsScript()) { 708b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams memcpy(texAlloc->getPtr(), data, s); 709b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams if (genMips) { 710b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams Adapter2D adapt(rsc, texAlloc); 711b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams Adapter2D adapt2(rsc, texAlloc); 712b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) { 713b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams adapt.setLOD(lod); 714b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams adapt2.setLOD(lod + 1); 715b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams mip(adapt2, adapt); 716b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams } 71739f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk } 718b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams } else { 719b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams texAlloc->upload2DTexture(false, data); 72039f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk } 721b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams 72239f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk} 72339f2ef6fed00a99c5c389e12c4597884027d4858Alex Sakhartchouk 724837e388700a48084489ba59d1d8cc5ece68b1535Jason Samsvoid rsi_AllocationCopyToBitmap(Context *rsc, RsAllocation va, void *data, size_t dataLen) { 725837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams Allocation *texAlloc = static_cast<Allocation *>(va); 726837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams const Type * t = texAlloc->getType(); 727837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 728837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams size_t s = t->getDimX() * t->getDimY() * t->getElementSizeBytes(); 729837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams if (s != dataLen) { 730837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams rsc->setError(RS_ERROR_BAD_VALUE, "Bitmap size didn't match allocation size"); 731837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams return; 732837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams } 733837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 734837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams memcpy(data, texAlloc->getPtr(), s); 735837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams} 736837e388700a48084489ba59d1d8cc5ece68b1535Jason Sams 737afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationData(Context *rsc, RsAllocation va, const void *data, uint32_t sizeBytes) { 738326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 7395f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams a->data(rsc, data, sizeBytes); 740326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 741326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 742afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Allocation1DSubData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t count, const void *data, uint32_t sizeBytes) { 743326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 7445f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams a->subData(rsc, xoff, count, data, sizeBytes); 7455f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 7465f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 747afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Allocation2DSubElementData(Context *rsc, RsAllocation va, uint32_t x, uint32_t y, const void *data, uint32_t eoff, uint32_t sizeBytes) { 7485f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams Allocation *a = static_cast<Allocation *>(va); 7495f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams a->subElementData(rsc, x, y, data, eoff, sizeBytes); 7505f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams} 7515f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams 752afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_Allocation1DSubElementData(Context *rsc, RsAllocation va, uint32_t x, const void *data, uint32_t eoff, uint32_t sizeBytes) { 7535f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams Allocation *a = static_cast<Allocation *>(va); 7545f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams a->subElementData(rsc, x, data, eoff, sizeBytes); 755326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 756326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 757afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex 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) { 758326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams Allocation *a = static_cast<Allocation *>(va); 7595f0c84cf464dda719cef65fdc9b4d0980e86b98fJason Sams a->subData(rsc, xoff, yoff, w, h, data, sizeBytes); 760326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams} 761326e0ddf89e8df2837752fbfd7a014814b32082cJason Sams 762afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationRead(Context *rsc, RsAllocation va, void *data) { 763e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams Allocation *a = static_cast<Allocation *>(va); 764e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams a->read(data); 765e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams} 766e579df42e85d9e00f53c42ef1b78dbd209dba989Jason Sams 767afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize1D(Context *rsc, RsAllocation va, uint32_t dimX) { 76896abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Allocation *a = static_cast<Allocation *>(va); 76996abf819e50b59ba8cf886c13f894633eb0a24baJason Sams a->resize1D(rsc, dimX); 77096abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 77196abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 772afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid rsi_AllocationResize2D(Context *rsc, RsAllocation va, uint32_t dimX, uint32_t dimY) { 77396abf819e50b59ba8cf886c13f894633eb0a24baJason Sams Allocation *a = static_cast<Allocation *>(va); 77496abf819e50b59ba8cf886c13f894633eb0a24baJason Sams a->resize2D(rsc, dimX, dimY); 77596abf819e50b59ba8cf886c13f894633eb0a24baJason Sams} 77696abf819e50b59ba8cf886c13f894633eb0a24baJason Sams 777dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk#endif //ANDROID_RS_BUILD_FOR_HOST 778dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 779dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 780dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk} 781dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk 782afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukconst void * rsaAllocationGetType(RsContext con, RsAllocation va) { 783d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk Allocation *a = static_cast<Allocation *>(va); 784d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk a->getType()->incUserRef(); 785d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 786d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk return a->getType(); 787d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk} 788d18c744a37441311c9b65254a35db456835adad3Alex Sakhartchouk 789366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCreateTyped(RsContext con, RsType vtype, 790ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams RsAllocationMipmapControl mips, 791366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams uint32_t usages) { 792f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams Context *rsc = static_cast<Context *>(con); 793366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Allocation * alloc = new Allocation(rsc, static_cast<Type *>(vtype), usages); 794f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams alloc->incUserRef(); 795f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return alloc; 796f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 797f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 798f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 799366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCreateFromBitmap(RsContext con, RsType vtype, 800ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams RsAllocationMipmapControl mips, 801366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams const void *data, uint32_t usages) { 802366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Context *rsc = static_cast<Context *>(con); 803366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Type *t = static_cast<Type *>(vtype); 804f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 805366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams RsAllocation vTexAlloc = rsaAllocationCreateTyped(rsc, vtype, mips, usages); 806f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); 807f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams if (texAlloc == NULL) { 808f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams LOGE("Memory allocation failure"); 809f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return NULL; 810f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 811f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 812366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams memcpy(texAlloc->getPtr(), data, t->getDimX() * t->getDimY() * t->getElementSizeBytes()); 813ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (mips == RS_ALLOCATION_MIPMAP_FULL) { 814366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Adapter2D adapt(rsc, texAlloc); 815366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Adapter2D adapt2(rsc, texAlloc); 816366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) { 817366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams adapt.setLOD(lod); 818366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams adapt2.setLOD(lod + 1); 819366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams mip(adapt2, adapt); 820f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 821f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams } 822f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams 823b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams texAlloc->deferedUploadToTexture(rsc); 824f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams return texAlloc; 825f0c1df480304a72ce41e7d4b088319cbd7f0938aJason Sams} 82684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 827366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason SamsRsAllocation rsaAllocationCubeCreateFromBitmap(RsContext con, RsType vtype, 828ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams RsAllocationMipmapControl mips, 829366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams const void *data, uint32_t usages) { 83084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk Context *rsc = static_cast<Context *>(con); 831366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Type *t = static_cast<Type *>(vtype); 83284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 83384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Cubemap allocation's faces should be Width by Width each. 83484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Source data should have 6 * Width by Width pixels 83584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk // Error checking is done in the java layer 836366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams RsAllocation vTexAlloc = rsaAllocationCreateTyped(rsc, t, mips, usages); 83784e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); 83884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk if (texAlloc == NULL) { 83984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk LOGE("Memory allocation failure"); 84084e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return NULL; 84184e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 84284e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 84384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk uint8_t *sourcePtr = (uint8_t*)data; 844366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams for (uint32_t face = 0; face < 6; face ++) { 845366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Adapter2D faceAdapter(rsc, texAlloc); 846366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams faceAdapter.setFace(face); 847366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 848366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams size_t cpySize = t->getDimX() * t->getDimX() * t->getElementSizeBytes(); 849366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams memcpy(faceAdapter.getElement(0, 0), sourcePtr, cpySize); 850366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 851366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams // Move the data pointer to the next cube face 852366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams sourcePtr += cpySize; 853366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams 854ebc5019400a129b1f1e57bd1fe8200a21f8da00bJason Sams if (mips == RS_ALLOCATION_MIPMAP_FULL) { 855366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Adapter2D adapt(rsc, texAlloc); 856366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams Adapter2D adapt2(rsc, texAlloc); 857366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams adapt.setFace(face); 858366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams adapt2.setFace(face); 859366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams for (uint32_t lod=0; lod < (texAlloc->getType()->getLODCount() -1); lod++) { 860366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams adapt.setLOD(lod); 861366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams adapt2.setLOD(lod + 1); 862366c9c85196675437a8dd74c1cf6b63ddbde3d6aJason Sams mip(adapt2, adapt); 86384e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 86484e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 86584e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk } 86684e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk 867b89b0b7dd8199967502c92fe5c8f57c3bc255e1cJason Sams texAlloc->deferedUploadToTexture(rsc); 86884e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk return texAlloc; 86984e4027f83b20af59f5b1fc52be6e45f159d3970Alex Sakhartchouk} 870