1a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 2a5597fcd411badad50c1345b3eca26453da45bbbJason Sams/* 3a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Copyright (C) 2009 The Android Open Source Project 4a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * 5a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 6a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * you may not use this file except in compliance with the License. 7a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * You may obtain a copy of the License at 8a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * 9a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * http://www.apache.org/licenses/LICENSE-2.0 10a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * 11a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * Unless required by applicable law or agreed to in writing, software 12a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 13a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * See the License for the specific language governing permissions and 15a5597fcd411badad50c1345b3eca26453da45bbbJason Sams * limitations under the License. 16a5597fcd411badad50c1345b3eca26453da45bbbJason Sams */ 17a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 18a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsContext.h" 19a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsFileA3D.h" 20a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 21a5597fcd411badad50c1345b3eca26453da45bbbJason Sams#include "rsMesh.h" 22fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk#include "rsAnimation.h" 23e23d239828a229eb7d4d33c9630070f0a87833e1Alex Sakhartchouk#include "rs.h" 24d3e0ad43dc758c409fc23d1893dab67b18520c24Alex Sakhartchouk 25f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers#include <inttypes.h> 26f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers 2711496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace android { 2811496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsiehnamespace renderscript { 29a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 30afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukFileA3D::FileA3D(Context *rsc) : ObjectBase(rsc) { 3144bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mAlloc = nullptr; 3244bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mData = nullptr; 3344bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mWriteStream = nullptr; 3444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes mReadStream = nullptr; 35fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 36fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMajorVersion = 0; 37fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mMinorVersion = 1; 38fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mDataSize = 0; 39a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 40a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 41afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex SakhartchoukFileA3D::~FileA3D() { 42afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (size_t i = 0; i < mIndex.size(); i ++) { 43fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mIndex[i]; 44fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 45afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (size_t i = 0; i < mWriteIndex.size(); i ++) { 46fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteIndex[i]; 47fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 48afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream) { 49fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk delete mWriteStream; 50fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 51afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mReadStream) { 525bb6dc1933e11cb57e5f4205d13686ad113b205eMiao Wang delete mReadStream; 53fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 54afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mAlloc) { 55fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk free(mAlloc); 56fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 57a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 58a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 59afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukvoid FileA3D::parseHeader(IStream *headerStream) { 60b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mMajorVersion = headerStream->loadU32(); 61b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mMinorVersion = headerStream->loadU32(); 62b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t flags = headerStream->loadU32(); 63b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mUse64BitOffsets = (flags & 1) != 0; 64b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 65b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint32_t numIndexEntries = headerStream->loadU32(); 66afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < numIndexEntries; i ++) { 67b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk A3DIndexEntry *entry = new A3DIndexEntry(); 6848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams entry->mObjectName = headerStream->loadString(); 6948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams 706598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block //ALOGV("Header data, entry name = %s", entry->mObjectName.string()); 71b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mType = (RsA3DClassID)headerStream->loadU32(); 72afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 73b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadOffset(); 74b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadOffset(); 75afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 76b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mOffset = headerStream->loadU32(); 77b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mLength = headerStream->loadU32(); 78b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 7944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes entry->mRsObj = nullptr; 8082e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang mIndex.push_back(entry); 81b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 82b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 83b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 845224a27798f89093b13722b41143551a057ce550Alex Sakhartchoukbool FileA3D::load(Asset *asset) { 85a6ab26a035017143a24efa11859c9d8815a27f41Jason Sams return false; 865224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk} 875224a27798f89093b13722b41143551a057ce550Alex Sakhartchouk 88afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(const void *data, size_t length) { 89b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk const uint8_t *localData = (const uint8_t *)data; 90b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 91b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t lengthRemaining = length; 92b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk size_t magicStrLen = 12; 93b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk if ((length < magicStrLen) || 94b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcmp(data, "Android3D_ff", magicStrLen)) { 95b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 96b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 97b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 98b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += magicStrLen; 99b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= magicStrLen; 100b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 101b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Next we get our header size 102b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk uint64_t headerSize = 0; 103afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(headerSize)) { 104b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 105b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 106b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 107b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&headerSize, localData, sizeof(headerSize)); 108b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(headerSize); 109b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(headerSize); 110b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 111afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < headerSize) { 112b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 113b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 114b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 115b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Now open the stream to parse the header 116dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk IStream headerStream(localData, false); 117b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 118b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 119b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += headerSize; 120b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= headerSize; 121b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 122afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < sizeof(mDataSize)) { 123b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 124b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 125b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 126b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // Read the size of the data 127b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk memcpy(&mDataSize, localData, sizeof(mDataSize)); 128b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk localData += sizeof(mDataSize); 129b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk lengthRemaining -= sizeof(mDataSize); 130b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 131afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (lengthRemaining < mDataSize) { 132b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return false; 133b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 134b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 135b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk // We should know enough to read the file in at this point. 136dc763f345db3e796efc28dc4b4d8edffda5a803eAlex Sakhartchouk mData = (uint8_t *)localData; 137b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 138b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 139b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return true; 140b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk} 141b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 142afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::load(FILE *f) { 143a5597fcd411badad50c1345b3eca26453da45bbbJason Sams char magicString[12]; 144a5597fcd411badad50c1345b3eca26453da45bbbJason Sams size_t len; 145a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 1466598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("file open 1"); 147a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(magicString, 1, 12, f); 148a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if ((len != 12) || 149a5597fcd411badad50c1345b3eca26453da45bbbJason Sams memcmp(magicString, "Android3D_ff", 12)) { 150a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 151a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 152a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 153fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 154fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = 0; 155fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&headerSize, 1, sizeof(headerSize), f); 156fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(headerSize) || headerSize == 0) { 157a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 158a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 159a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 160fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint8_t *headerData = (uint8_t *)malloc(headerSize); 161afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!headerData) { 162a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 163a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 164a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 165fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(headerData, 1, headerSize, f); 166fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != headerSize) { 167ef974052beef34be281db39a06fc0b7a18731986Greg Kaiser free(headerData); 168a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 169a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 170fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 171fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now open the stream to parse the header 172fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk IStream headerStream(headerData, false); 173b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk parseHeader(&headerStream); 174fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 175b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk free(headerData); 176fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 177fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Next thing is the size of the header 178fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk len = fread(&mDataSize, 1, sizeof(mDataSize), f); 179fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk if (len != sizeof(mDataSize) || mDataSize == 0) { 180fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 181a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 182a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 183f8852d0494a260c583795a96a2a06c49b86a9b10Ian Rogers ALOGV("file open size = %" PRIi64, mDataSize); 184a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 185a5597fcd411badad50c1345b3eca26453da45bbbJason Sams // We should know enough to read the file in at this point. 186fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mAlloc = malloc(mDataSize); 187a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (!mAlloc) { 188a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 189a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 190a5597fcd411badad50c1345b3eca26453da45bbbJason Sams mData = (uint8_t *)mAlloc; 191a5597fcd411badad50c1345b3eca26453da45bbbJason Sams len = fread(mAlloc, 1, mDataSize, f); 192a5597fcd411badad50c1345b3eca26453da45bbbJason Sams if (len != mDataSize) { 193a5597fcd411badad50c1345b3eca26453da45bbbJason Sams return false; 194a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 195a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 196fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream = new IStream(mData, mUse64BitOffsets); 197fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 1986598201f1c4f409defac9a5af789fb53a7cc00f8Steve Block ALOGV("Header is read an stream initialized"); 199fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 200a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 201a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 202b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouksize_t FileA3D::getNumIndexEntries() const { 203fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex.size(); 204a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 205a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 20648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason SamsFileA3D::A3DIndexEntry::~A3DIndexEntry() { 20748ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams delete[] mObjectName; 20848ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams} 20948ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams 210b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchoukconst FileA3D::A3DIndexEntry *FileA3D::getIndexEntry(size_t index) const { 211afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index < mIndex.size()) { 212fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return mIndex[index]; 213a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 21444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 215fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 216a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 217b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex SakhartchoukObjectBase *FileA3D::initializeFromEntry(size_t index) { 218afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (index >= mIndex.size()) { 21944bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 220b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 221b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 222b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk FileA3D::A3DIndexEntry *entry = mIndex[index]; 223afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!entry) { 22444bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 225a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 226a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 227afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 228b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 229b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 230b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 231b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk 232fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Seek to the beginning of object 233fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mReadStream->reset(entry->mOffset); 234fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk switch (entry->mType) { 235b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_UNKNOWN: 23644bef6fba6244292b751387f3d6c31cca96c28adChris Wailes return nullptr; 237b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_MESH: 238b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Mesh::createFromStream(mRSC, mReadStream); 239b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 240b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_TYPE: 241b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Type::createFromStream(mRSC, mReadStream); 242b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 243b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ELEMENT: 244b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Element::createFromStream(mRSC, mReadStream); 245b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 246b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ALLOCATION: 247b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj = Allocation::createFromStream(mRSC, mReadStream); 248b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 249b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_VERTEX: 250099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramVertex::createFromStream(mRSC, mReadStream); 251b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 252b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_RASTER: 253099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramRaster::createFromStream(mRSC, mReadStream); 254b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 255b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_FRAGMENT: 256099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramFragment::createFromStream(mRSC, mReadStream); 257b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 258b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_PROGRAM_STORE: 259099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = ProgramStore::createFromStream(mRSC, mReadStream); 260b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 261b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SAMPLER: 262099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Sampler::createFromStream(mRSC, mReadStream); 263b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 264b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ANIMATION: 265099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Animation::createFromStream(mRSC, mReadStream); 266b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 267b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_1D: 268099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Adapter1D::createFromStream(mRSC, mReadStream); 269b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 270b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_ADAPTER_2D: 271099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk //entry->mRsObj = Adapter2D::createFromStream(mRSC, mReadStream); 272b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk break; 273b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk case RS_A3D_CLASS_ID_SCRIPT_C: 274099d7d33e55afeb3399f6e8cf8d665223ca94939Alex Sakhartchouk break; 275dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_KERNEL_ID: 276dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 277eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni case RS_A3D_CLASS_ID_SCRIPT_INVOKE_ID: 278eb9aa675754c49f613c6ad71d41472b30f38b007Yang Ni break; 279dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_FIELD_ID: 280dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 281dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_METHOD_ID: 282dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 283dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams case RS_A3D_CLASS_ID_SCRIPT_GROUP: 284dbe66d6783c1e53cd1572de0ef6ef6fdf6f76f48Jason Sams break; 2851ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni case RS_A3D_CLASS_ID_CLOSURE: 2861ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni break; 2871ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni case RS_A3D_CLASS_ID_SCRIPT_GROUP2: 2881ffd86b448d78366190c540f98f8b6d641cdb6cfYang Ni break; 289a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 290afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (entry->mRsObj) { 291b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk entry->mRsObj->incUserRef(); 292b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk } 293b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk return entry->mRsObj; 294a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 295a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 296afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchoukbool FileA3D::writeFile(const char *filename) { 297afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 298af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("No objects to write\n"); 299fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 300a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 301afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mWriteStream->getPos() == 0) { 302af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("No objects to write\n"); 303fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 304a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 305a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 306fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk FILE *writeHandle = fopen(filename, "wb"); 307afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!writeHandle) { 308af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Couldn't open the file for writing\n"); 309fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 310b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 311b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 312fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Open a new stream to make writing the header easier 313fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk OStream headerStream(5*1024, false); 314fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMajorVersion); 315fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(mMinorVersion); 316fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t is64Bit = 0; 317fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(is64Bit); 318fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 319fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t writeIndexSize = mWriteIndex.size(); 320fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(writeIndexSize); 321afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk for (uint32_t i = 0; i < writeIndexSize; i ++) { 32248ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams headerStream.addString(mWriteIndex[i]->mObjectName); 323fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32((uint32_t)mWriteIndex[i]->mType); 324afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (mUse64BitOffsets){ 325fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mOffset); 326b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addOffset(mWriteIndex[i]->mLength); 327afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk } else { 328fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint32_t offset = (uint32_t)mWriteIndex[i]->mOffset; 329fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk headerStream.addU32(offset); 330b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk offset = (uint32_t)mWriteIndex[i]->mLength; 331b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk headerStream.addU32(offset); 332b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams } 333a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 334a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 335fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Write our magic string so we know we are reading the right file 33648ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams fwrite(A3D_MAGIC_KEY, sizeof(char), strlen(A3D_MAGIC_KEY), writeHandle); 337a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 338fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Store the size of the header to make it easier to parse when we read it 339fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t headerSize = headerStream.getPos(); 340fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&headerSize, sizeof(headerSize), 1, writeHandle); 341a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 342fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write our header 343fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(headerStream.getPtr(), sizeof(uint8_t), headerStream.getPos(), writeHandle); 344a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 345fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk // Now write the size of the data part of the file for easier parsing later 346fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk uint64_t fileDataSize = mWriteStream->getPos(); 347fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(&fileDataSize, sizeof(fileDataSize), 1, writeHandle); 348a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 349fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk fwrite(mWriteStream->getPtr(), sizeof(uint8_t), mWriteStream->getPos(), writeHandle); 350b80dfa72dfdd146a9ddee948ad76635dbea3c0cdJason Sams 351fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk int status = fclose(writeHandle); 352a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 353afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (status != 0) { 354af12ac6a08651464f8d823add667c706f993b587Steve Block ALOGE("Couldn't close file\n"); 355fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return false; 356fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 357a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 358fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return true; 359fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk} 360fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk 361e3150cfb3edb028407669e4a65e087eae77e718cJason Samsvoid FileA3D::appendToFile(Context *con, ObjectBase *obj) { 362afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!obj) { 363fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk return; 364fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk } 365afb743aca56c18beb7ab924e75cb6e070ef3e55aAlex Sakhartchouk if (!mWriteStream) { 366fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk const uint64_t initialStreamSize = 256*1024; 367fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk mWriteStream = new OStream(initialStreamSize, false); 368a5597fcd411badad50c1345b3eca26453da45bbbJason Sams } 369fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk A3DIndexEntry *indexEntry = new A3DIndexEntry(); 37048ecf6a5e85a9a832f41393ed2802385bb8b5db8Jason Sams indexEntry->mObjectName = rsuCopyString(obj->getName()); 371fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mType = obj->getClassId(); 372fb6b614bcea88a587a7ea4530be45ff0ffa0210eAlex Sakhartchouk indexEntry->mOffset = mWriteStream->getPos(); 373b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mRsObj = obj; 37482e135c4bbe18855d8ed02632bb074f8da0b96e0Miao Wang mWriteIndex.push_back(indexEntry); 375e3150cfb3edb028407669e4a65e087eae77e718cJason Sams obj->serialize(con, mWriteStream); 376b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk indexEntry->mLength = mWriteStream->getPos() - indexEntry->mOffset; 377b825f67adb5d1e1751fe108e6dbf9c6f2555c283Alex Sakhartchouk mWriteStream->align(4); 378a5597fcd411badad50c1345b3eca26453da45bbbJason Sams} 379a5597fcd411badad50c1345b3eca26453da45bbbJason Sams 38011496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace renderscript 38111496ac131bb691edf5bdcab3029dceef5c1e4e1Chih-Hung Hsieh} // namespace android 382