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