Allocation *Allocation::createFromStream(Context *rsc, IStream *stream) { // First make sure we are reading the correct object RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); if (classID != RS_A3D_CLASS_ID_ALLOCATION) { rsc->setError(RS_ERROR_FATAL_DRIVER, "allocation loading failed due to corrupt file. (invalid id)\n"); return nullptr; } const char *name = stream->loadString(); Type *type = Type::createFromStream(rsc, stream); if (!type) { return nullptr; } type->compute(); Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT); type->decUserRef(); // Number of bytes we wrote out for this allocation uint32_t dataSize = stream->loadU32(); // 3 element vectors are padded to 4 in memory, but padding isn't serialized uint32_t packedSize = alloc->getPackedSize(); if (dataSize != type->getPackedSizeBytes() && dataSize != packedSize) { rsc->setError(RS_ERROR_FATAL_DRIVER, "allocation loading failed due to corrupt file. (invalid size)\n"); ObjectBase::checkDelete(alloc); ObjectBase::checkDelete(type); return nullptr; } alloc->assignName(name); if (dataSize == type->getPackedSizeBytes()) { uint32_t count = dataSize / type->getElementSizeBytes(); // Read in all of our allocation data alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize); } else { alloc->unpackVec3Allocation(rsc, stream->getPtr() + stream->getPos(), dataSize); } stream->reset(stream->getPos() + dataSize); return alloc; }
RsAllocation rsi_AllocationCreateFromBitmap(Context *rsc, RsType vtype, RsAllocationMipmapControl mipmaps, const void *data, size_t sizeBytes, uint32_t usages) { Type *t = static_cast<Type *>(vtype); RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mipmaps, usages, 0); Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); if (texAlloc == nullptr) { ALOGE("Memory allocation failure"); return nullptr; } texAlloc->data(rsc, 0, 0, 0, RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, t->getDimX(), t->getDimY(), data, sizeBytes, 0); if (mipmaps == RS_ALLOCATION_MIPMAP_FULL) { rsc->mHal.funcs.allocation.generateMipmaps(rsc, texAlloc); } texAlloc->sendDirty(rsc); return texAlloc; }
RsAllocation rsi_AllocationCubeCreateFromBitmap(Context *rsc, RsType vtype, RsAllocationMipmapControl mipmaps, const void *data, size_t sizeBytes, uint32_t usages) { Type *t = static_cast<Type *>(vtype); // Cubemap allocation's faces should be Width by Width each. // Source data should have 6 * Width by Width pixels // Error checking is done in the java layer RsAllocation vTexAlloc = rsi_AllocationCreateTyped(rsc, vtype, mipmaps, usages, 0); Allocation *texAlloc = static_cast<Allocation *>(vTexAlloc); if (texAlloc == nullptr) { ALOGE("Memory allocation failure"); return nullptr; } uint32_t faceSize = t->getDimX(); uint32_t strideBytes = faceSize * 6 * t->getElementSizeBytes(); uint32_t copySize = faceSize * t->getElementSizeBytes(); uint8_t *sourcePtr = (uint8_t*)data; for (uint32_t face = 0; face < 6; face ++) { for (uint32_t dI = 0; dI < faceSize; dI ++) { texAlloc->data(rsc, 0, dI, 0, (RsAllocationCubemapFace)face, t->getDimX(), 1, sourcePtr + strideBytes * dI, copySize, 0); } // Move the data pointer to the next cube face sourcePtr += copySize; } if (mipmaps == RS_ALLOCATION_MIPMAP_FULL) { rsc->mHal.funcs.allocation.generateMipmaps(rsc, texAlloc); } texAlloc->sendDirty(rsc); return texAlloc; }
Allocation *Allocation::createFromStream(Context *rsc, IStream *stream) { // First make sure we are reading the correct object RsA3DClassID classID = (RsA3DClassID)stream->loadU32(); if (classID != RS_A3D_CLASS_ID_ALLOCATION) { ALOGE("allocation loading skipped due to invalid class id\n"); return NULL; } String8 name; stream->loadString(&name); Type *type = Type::createFromStream(rsc, stream); if (!type) { return NULL; } type->compute(); // Number of bytes we wrote out for this allocation uint32_t dataSize = stream->loadU32(); if (dataSize != type->getSizeBytes()) { ALOGE("failed to read allocation because numbytes written is not the same loaded type wants\n"); ObjectBase::checkDelete(type); return NULL; } Allocation *alloc = Allocation::createAllocation(rsc, type, RS_ALLOCATION_USAGE_SCRIPT); alloc->setName(name.string(), name.size()); type->decUserRef(); uint32_t count = dataSize / type->getElementSizeBytes(); // Read in all of our allocation data alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize); stream->reset(stream->getPos() + dataSize); return alloc; }
void rsi_Allocation3DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, uint32_t d, const void *data, size_t sizeBytes, size_t stride) { Allocation *a = static_cast<Allocation *>(va); a->data(rsc, xoff, yoff, zoff, lod, w, h, d, data, sizeBytes, stride); }
void rsi_Allocation2DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t yoff, uint32_t lod, RsAllocationCubemapFace face, uint32_t w, uint32_t h, const void *data, size_t sizeBytes, size_t stride) { Allocation *a = static_cast<Allocation *>(va); a->data(rsc, xoff, yoff, lod, face, w, h, data, sizeBytes, stride); }
void rsi_Allocation1DData(Context *rsc, RsAllocation va, uint32_t xoff, uint32_t lod, uint32_t count, const void *data, size_t sizeBytes) { Allocation *a = static_cast<Allocation *>(va); a->data(rsc, xoff, lod, count, data, sizeBytes); }