Plumb context through for serialization.

Change-Id: I2a49f57aa7576604deeac898a7cceb36ae68d66f
diff --git a/rsAdapter.cpp b/rsAdapter.cpp
index 41811ae..807da08 100644
--- a/rsAdapter.cpp
+++ b/rsAdapter.cpp
@@ -60,7 +60,7 @@
            mAllocation.get()->getType()->getSizeBytes());
 }
 
-void Adapter1D::serialize(OStream *stream) const {
+void Adapter1D::serialize(Context *rsc, OStream *stream) const {
 }
 
 Adapter1D *Adapter1D::createFromStream(Context *rsc, IStream *stream) {
@@ -177,7 +177,7 @@
            mAllocation.get()->getType()->getSizeBytes());
 }
 
-void Adapter2D::serialize(OStream *stream) const {
+void Adapter2D::serialize(Context *rsc, OStream *stream) const {
 }
 
 Adapter2D *Adapter2D::createFromStream(Context *rsc, IStream *stream) {
diff --git a/rsAdapter.h b/rsAdapter.h
index d150789..4134a98 100644
--- a/rsAdapter.h
+++ b/rsAdapter.h
@@ -49,7 +49,7 @@
     void subData(uint32_t xoff, uint32_t count, const void *data);
     void data(const void *data);
 
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ADAPTER_1D; }
     static Adapter1D *createFromStream(Context *rsc, IStream *stream);
 
@@ -84,7 +84,7 @@
     void data(const void *data);
     void subData(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, const void *data);
 
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ADAPTER_2D; }
     static Adapter2D *createFromStream(Context *rsc, IStream *stream);
 
diff --git a/rsAllocation.cpp b/rsAllocation.cpp
index 5d09936..95cc33e 100644
--- a/rsAllocation.cpp
+++ b/rsAllocation.cpp
@@ -207,7 +207,7 @@
     return numItems * mHal.state.type->getElement()->getSizeBytesUnpadded();
 }
 
-void Allocation::writePackedData(const Type *type,
+void Allocation::writePackedData(Context *rsc, const Type *type,
                                  uint8_t *dst, const uint8_t *src, bool dstPadded) {
     const Element *elem = type->getElement();
     uint32_t unpaddedBytes = elem->getSizeBytesUnpadded();
@@ -256,14 +256,14 @@
     delete[] sizeUnpadded;
 }
 
-void Allocation::unpackVec3Allocation(const void *data, size_t dataSize) {
+void Allocation::unpackVec3Allocation(Context *rsc, const void *data, size_t dataSize) {
     const uint8_t *src = (const uint8_t*)data;
     uint8_t *dst = (uint8_t*)getPtr();
 
-    writePackedData(getType(), dst, src, true);
+    writePackedData(rsc, getType(), dst, src, true);
 }
 
-void Allocation::packVec3Allocation(OStream *stream) const {
+void Allocation::packVec3Allocation(Context *rsc, OStream *stream) const {
     uint32_t paddedBytes = getType()->getElement()->getSizeBytes();
     uint32_t unpaddedBytes = getType()->getElement()->getSizeBytesUnpadded();
     uint32_t numItems = mHal.state.type->getSizeBytes() / paddedBytes;
@@ -271,13 +271,13 @@
     const uint8_t *src = (const uint8_t*)getPtr();
     uint8_t *dst = new uint8_t[numItems * unpaddedBytes];
 
-    writePackedData(getType(), dst, src, false);
+    writePackedData(rsc, getType(), dst, src, false);
     stream->addByteArray(dst, getPackedSize());
 
     delete[] dst;
 }
 
-void Allocation::serialize(OStream *stream) const {
+void Allocation::serialize(Context *rsc, OStream *stream) const {
     // Need to identify ourselves
     stream->addU32((uint32_t)getClassId());
 
@@ -286,7 +286,7 @@
 
     // First thing we need to serialize is the type object since it will be needed
     // to initialize the class
-    mHal.state.type->serialize(stream);
+    mHal.state.type->serialize(rsc, stream);
 
     uint32_t dataSize = mHal.state.type->getSizeBytes();
     // 3 element vectors are padded to 4 in memory, but padding isn't serialized
@@ -298,7 +298,7 @@
         stream->addByteArray(getPtr(), dataSize);
     } else {
         // Now write the data
-        packVec3Allocation(stream);
+        packVec3Allocation(rsc, stream);
     }
 }
 
@@ -341,7 +341,7 @@
         // Read in all of our allocation data
         alloc->data(rsc, 0, 0, count, stream->getPtr() + stream->getPos(), dataSize);
     } else {
-        alloc->unpackVec3Allocation(stream->getPtr() + stream->getPos(), dataSize);
+        alloc->unpackVec3Allocation(rsc, stream->getPtr() + stream->getPos(), dataSize);
     }
     stream->reset(stream->getPos() + dataSize);
 
diff --git a/rsAllocation.h b/rsAllocation.h
index dce09ed..2da2dbf 100644
--- a/rsAllocation.h
+++ b/rsAllocation.h
@@ -107,7 +107,7 @@
     void removeProgramToDirty(const Program *);
 
     virtual void dumpLOGV(const char *prefix) const;
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ALLOCATION; }
     static Allocation *createFromStream(Context *rsc, IStream *stream);
 
@@ -152,9 +152,9 @@
     Allocation(Context *rsc, const Type *, uint32_t usages, RsAllocationMipmapControl mc, void *ptr);
 
     uint32_t getPackedSize() const;
-    static void writePackedData(const Type *type, uint8_t *dst, const uint8_t *src, bool dstPadded);
-    void unpackVec3Allocation(const void *data, size_t dataSize);
-    void packVec3Allocation(OStream *stream) const;
+    static void writePackedData(Context *rsc, const Type *type, uint8_t *dst, const uint8_t *src, bool dstPadded);
+    void unpackVec3Allocation(Context *rsc, const void *data, size_t dataSize);
+    void packVec3Allocation(Context *rsc, OStream *stream) const;
 };
 
 }
diff --git a/rsAnimation.cpp b/rsAnimation.cpp
index a4093d9..f6da138 100644
--- a/rsAnimation.cpp
+++ b/rsAnimation.cpp
@@ -21,7 +21,7 @@
 using namespace android;
 using namespace android::renderscript;
 
-void Animation::serialize(OStream *stream) const {
+void Animation::serialize(Context *rsc, OStream *stream) const {
 }
 
 Animation *Animation::createFromStream(Context *rsc, IStream *stream) {
diff --git a/rsAnimation.h b/rsAnimation.h
index 526a081..4e0cc89 100644
--- a/rsAnimation.h
+++ b/rsAnimation.h
@@ -36,7 +36,7 @@
 
     float eval(float) const;
 
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ANIMATION; }
     static Animation *createFromStream(Context *rsc, IStream *stream);
 
diff --git a/rsElement.cpp b/rsElement.cpp
index fb2892c..4424938 100644
--- a/rsElement.cpp
+++ b/rsElement.cpp
@@ -92,7 +92,7 @@
     }
 }
 
-void Element::serialize(OStream *stream) const {
+void Element::serialize(Context *rsc, OStream *stream) const {
     // Need to identify ourselves
     stream->addU32((uint32_t)getClassId());
 
@@ -106,7 +106,7 @@
     for (uint32_t ct = 0; ct < mFieldCount; ct++) {
         stream->addString(&mFields[ct].name);
         stream->addU32(mFields[ct].arraySize);
-        mFields[ct].e->serialize(stream);
+        mFields[ct].e->serialize(rsc, stream);
     }
 }
 
diff --git a/rsElement.h b/rsElement.h
index b86d3bc..57698f4 100644
--- a/rsElement.h
+++ b/rsElement.h
@@ -105,7 +105,7 @@
     uint32_t getBitsUnpadded() const {return mBitsUnpadded;}
 
     void dumpLOGV(const char *prefix) const;
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_ELEMENT; }
     static Element *createFromStream(Context *rsc, IStream *stream);
 
diff --git a/rsFileA3D.cpp b/rsFileA3D.cpp
index a52bf7e..07c413f 100644
--- a/rsFileA3D.cpp
+++ b/rsFileA3D.cpp
@@ -352,7 +352,7 @@
     return true;
 }
 
-void FileA3D::appendToFile(ObjectBase *obj) {
+void FileA3D::appendToFile(Context *con, ObjectBase *obj) {
     if (!obj) {
         return;
     }
@@ -366,7 +366,7 @@
     indexEntry->mOffset = mWriteStream->getPos();
     indexEntry->mRsObj = obj;
     mWriteIndex.push(indexEntry);
-    obj->serialize(mWriteStream);
+    obj->serialize(con, mWriteStream);
     indexEntry->mLength = mWriteStream->getPos() - indexEntry->mOffset;
     mWriteStream->align(4);
 }
diff --git a/rsFileA3D.h b/rsFileA3D.h
index cc38c8a..06b90d7 100644
--- a/rsFileA3D.h
+++ b/rsFileA3D.h
@@ -66,12 +66,12 @@
     const A3DIndexEntry* getIndexEntry(size_t index) const;
     ObjectBase *initializeFromEntry(size_t index);
 
-    void appendToFile(ObjectBase *obj);
+    void appendToFile(Context *rsc, ObjectBase *obj);
     bool writeFile(const char *filename);
 
     // Currently files do not get serialized,
     // but we need to inherit from ObjectBase for ref tracking
-    virtual void serialize(OStream *stream) const {
+    virtual void serialize(Context *rsc, OStream *stream) const {
     }
     virtual RsA3DClassID getClassId() const {
         return RS_A3D_CLASS_ID_UNKNOWN;
diff --git a/rsFont.h b/rsFont.h
index 2bd30b7..460dfde 100644
--- a/rsFont.h
+++ b/rsFont.h
@@ -67,7 +67,7 @@
 
     // Currently files do not get serialized,
     // but we need to inherit from ObjectBase for ref tracking
-    virtual void serialize(OStream *stream) const {
+    virtual void serialize(Context *rsc, OStream *stream) const {
     }
     virtual RsA3DClassID getClassId() const {
         return RS_A3D_CLASS_ID_UNKNOWN;
diff --git a/rsMesh.cpp b/rsMesh.cpp
index 399a52b..89361e5 100644
--- a/rsMesh.cpp
+++ b/rsMesh.cpp
@@ -78,7 +78,7 @@
 #endif
 }
 
-void Mesh::serialize(OStream *stream) const {
+void Mesh::serialize(Context *rsc, OStream *stream) const {
     // Need to identify ourselves
     stream->addU32((uint32_t)getClassId());
 
@@ -88,7 +88,7 @@
     // Store number of vertex streams
     stream->addU32(mHal.state.vertexBuffersCount);
     for (uint32_t vCount = 0; vCount < mHal.state.vertexBuffersCount; vCount ++) {
-        mHal.state.vertexBuffers[vCount]->serialize(stream);
+        mHal.state.vertexBuffers[vCount]->serialize(rsc, stream);
     }
 
     stream->addU32(mHal.state.primitivesCount);
@@ -98,7 +98,7 @@
 
         if (mHal.state.indexBuffers[pCount]) {
             stream->addU32(1);
-            mHal.state.indexBuffers[pCount]->serialize(stream);
+            mHal.state.indexBuffers[pCount]->serialize(rsc, stream);
         } else {
             stream->addU32(0);
         }
@@ -215,7 +215,7 @@
     }
 }
 
-void Mesh::computeBBox() {
+void Mesh::computeBBox(Context *rsc) {
     float *posPtr = NULL;
     uint32_t vectorSize = 0;
     uint32_t stride = 0;
diff --git a/rsMesh.h b/rsMesh.h
index 7ca63cf..9b61ebe 100644
--- a/rsMesh.h
+++ b/rsMesh.h
@@ -59,7 +59,7 @@
     Mesh(Context *, uint32_t vertexBuffersCount, uint32_t primitivesCount);
     ~Mesh();
 
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_MESH; }
     static Mesh *createFromStream(Context *rsc, IStream *stream);
     void init();
@@ -83,7 +83,7 @@
     // Bounding volumes
     float mBBoxMin[3];
     float mBBoxMax[3];
-    void computeBBox();
+    void computeBBox(Context *rsc);
 protected:
     ObjectBaseRef<Allocation> *mVertexBuffers;
     ObjectBaseRef<Allocation> *mIndexBuffers;
diff --git a/rsObjectBase.h b/rsObjectBase.h
index 586da19..f16acd9 100644
--- a/rsObjectBase.h
+++ b/rsObjectBase.h
@@ -58,7 +58,7 @@
     static void dumpAll(Context *rsc);
 
     virtual void dumpLOGV(const char *prefix) const;
-    virtual void serialize(OStream *stream) const = 0;
+    virtual void serialize(Context *rsc, OStream *stream) const = 0;
     virtual RsA3DClassID getClassId() const = 0;
 
     static bool isValid(const Context *rsc, const ObjectBase *obj);
diff --git a/rsPath.cpp b/rsPath.cpp
index 055bb86..bcf4b8e 100644
--- a/rsPath.cpp
+++ b/rsPath.cpp
@@ -59,7 +59,7 @@
 void Path::render(Context *rsc) {
 }
 
-void Path::serialize(OStream *stream) const {
+void Path::serialize(Context *rsc, OStream *stream) const {
 
 }
 
diff --git a/rsPath.h b/rsPath.h
index 1abfc9a..ea14335 100644
--- a/rsPath.h
+++ b/rsPath.h
@@ -43,7 +43,7 @@
     ~Path();
 
     void render(Context *);
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const;
 
 private:
diff --git a/rsProgramFragment.cpp b/rsProgramFragment.cpp
index bebde1e..af2d396 100644
--- a/rsProgramFragment.cpp
+++ b/rsProgramFragment.cpp
@@ -74,7 +74,7 @@
     rsc->mHal.funcs.fragment.setActive(rsc, this);
 }
 
-void ProgramFragment::serialize(OStream *stream) const {
+void ProgramFragment::serialize(Context *rsc, OStream *stream) const {
 }
 
 ProgramFragment *ProgramFragment::createFromStream(Context *rsc, IStream *stream) {
diff --git a/rsProgramFragment.h b/rsProgramFragment.h
index 4eb28e7..d580252 100644
--- a/rsProgramFragment.h
+++ b/rsProgramFragment.h
@@ -34,7 +34,7 @@
 
     virtual void setup(Context *, ProgramFragmentState *);
 
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_FRAGMENT; }
     static ProgramFragment *createFromStream(Context *rsc, IStream *stream);
 
diff --git a/rsProgramRaster.cpp b/rsProgramRaster.cpp
index 94bfe42..4f27f2e 100644
--- a/rsProgramRaster.cpp
+++ b/rsProgramRaster.cpp
@@ -53,7 +53,7 @@
     rsc->mHal.funcs.raster.setActive(rsc, this);
 }
 
-void ProgramRaster::serialize(OStream *stream) const {
+void ProgramRaster::serialize(Context *rsc, OStream *stream) const {
 }
 
 ProgramRaster *ProgramRaster::createFromStream(Context *rsc, IStream *stream) {
diff --git a/rsProgramRaster.h b/rsProgramRaster.h
index c552ea3..e9a524b 100644
--- a/rsProgramRaster.h
+++ b/rsProgramRaster.h
@@ -46,7 +46,7 @@
     Hal mHal;
 
     virtual void setup(const Context *, ProgramRasterState *);
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_RASTER; }
     static ProgramRaster *createFromStream(Context *rsc, IStream *stream);
 
diff --git a/rsProgramStore.cpp b/rsProgramStore.cpp
index 7e25a22..83c1f2c 100644
--- a/rsProgramStore.cpp
+++ b/rsProgramStore.cpp
@@ -63,7 +63,7 @@
     rsc->mHal.funcs.store.setActive(rsc, this);
 }
 
-void ProgramStore::serialize(OStream *stream) const {
+void ProgramStore::serialize(Context *rsc, OStream *stream) const {
 }
 
 ProgramStore *ProgramStore::createFromStream(Context *rsc, IStream *stream) {
diff --git a/rsProgramStore.h b/rsProgramStore.h
index 9bb2795..9a7f7f1 100644
--- a/rsProgramStore.h
+++ b/rsProgramStore.h
@@ -59,7 +59,7 @@
 
     virtual void setup(const Context *, ProgramStoreState *);
 
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_STORE; }
     static ProgramStore *createFromStream(Context *rsc, IStream *stream);
     static ObjectBaseRef<ProgramStore> getProgramStore(Context *,
diff --git a/rsProgramVertex.cpp b/rsProgramVertex.cpp
index 23fcbe7..4374e51 100644
--- a/rsProgramVertex.cpp
+++ b/rsProgramVertex.cpp
@@ -136,7 +136,7 @@
     mvp.vectorMultiply(v4out, v3in);
 }
 
-void ProgramVertex::serialize(OStream *stream) const {
+void ProgramVertex::serialize(Context *rsc, OStream *stream) const {
 }
 
 ProgramVertex *ProgramVertex::createFromStream(Context *rsc, IStream *stream) {
diff --git a/rsProgramVertex.h b/rsProgramVertex.h
index 67c2a88..105d065 100644
--- a/rsProgramVertex.h
+++ b/rsProgramVertex.h
@@ -41,7 +41,7 @@
 
     void transformToScreen(Context *, float *v4out, const float *v3in) const;
 
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_PROGRAM_VERTEX; }
     static ProgramVertex *createFromStream(Context *rsc, IStream *stream);
 };
diff --git a/rsSampler.cpp b/rsSampler.cpp
index c7180bd..fededb1 100644
--- a/rsSampler.cpp
+++ b/rsSampler.cpp
@@ -68,7 +68,7 @@
     ss->mSamplers[slot].clear();
 }
 
-void Sampler::serialize(OStream *stream) const {
+void Sampler::serialize(Context *rsc, OStream *stream) const {
 }
 
 Sampler *Sampler::createFromStream(Context *rsc, IStream *stream) {
diff --git a/rsSampler.h b/rsSampler.h
index dea4cb6..81220a8 100644
--- a/rsSampler.h
+++ b/rsSampler.h
@@ -61,7 +61,7 @@
     void bindToContext(SamplerState *, uint32_t slot);
     void unbindFromContext(SamplerState *);
 
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SAMPLER; }
     static Sampler *createFromStream(Context *rsc, IStream *stream);
 
diff --git a/rsScriptC.h b/rsScriptC.h
index 92e1f4f..53a59f8 100644
--- a/rsScriptC.h
+++ b/rsScriptC.h
@@ -54,7 +54,7 @@
                             size_t usrBytes,
                             const RsScriptCall *sc = NULL);
 
-    virtual void serialize(OStream *stream) const {    }
+    virtual void serialize(Context *rsc, OStream *stream) const {    }
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_SCRIPT_C; }
     static Type *createFromStream(Context *rsc, IStream *stream) { return NULL; }
 
diff --git a/rsScriptC_LibGL.cpp b/rsScriptC_LibGL.cpp
index 21b1c42..995cef2 100644
--- a/rsScriptC_LibGL.cpp
+++ b/rsScriptC_LibGL.cpp
@@ -251,7 +251,7 @@
                                float *minX, float *minY, float *minZ,
                                float *maxX, float *maxY, float *maxZ) {
     CHECK_OBJ(sm);
-    sm->computeBBox();
+    sm->computeBBox(rsc);
     *minX = sm->mBBoxMin[0];
     *minY = sm->mBBoxMin[1];
     *minZ = sm->mBBoxMin[2];
diff --git a/rsType.cpp b/rsType.cpp
index e11b9c1..7ed8d97 100644
--- a/rsType.cpp
+++ b/rsType.cpp
@@ -155,14 +155,14 @@
     mElement->dumpLOGV(buf);
 }
 
-void Type::serialize(OStream *stream) const {
+void Type::serialize(Context *rsc, OStream *stream) const {
     // Need to identify ourselves
     stream->addU32((uint32_t)getClassId());
 
     String8 name(getName());
     stream->addString(&name);
 
-    mElement->serialize(stream);
+    mElement->serialize(rsc, stream);
 
     stream->addU32(mHal.state.dimX);
     stream->addU32(mHal.state.dimY);
diff --git a/rsType.h b/rsType.h
index ed4aa79..1d136b4 100644
--- a/rsType.h
+++ b/rsType.h
@@ -99,7 +99,7 @@
     void compute();
 
     void dumpLOGV(const char *prefix) const;
-    virtual void serialize(OStream *stream) const;
+    virtual void serialize(Context *rsc, OStream *stream) const;
     virtual RsA3DClassID getClassId() const { return RS_A3D_CLASS_ID_TYPE; }
     static Type *createFromStream(Context *rsc, IStream *stream);