diff --git a/libs/rs/rsAdapter.cpp b/libs/rs/rsAdapter.cpp index 9a3bbb1f9d930..0d31facba9020 100644 --- a/libs/rs/rsAdapter.cpp +++ b/libs/rs/rsAdapter.cpp @@ -23,11 +23,15 @@ using namespace android::renderscript; Adapter1D::Adapter1D(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; reset(); } Adapter1D::Adapter1D(Context *rsc, Allocation *a) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; reset(); setAllocation(a); } @@ -127,11 +131,15 @@ void rsi_Adapter1DData(Context *rsc, RsAdapter1D va, const void *data) Adapter2D::Adapter2D(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; reset(); } Adapter2D::Adapter2D(Context *rsc, Allocation *a) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; reset(); setAllocation(a); } diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp index 96e128b6e29a7..8ee6e5a453247 100644 --- a/libs/rs/rsAllocation.cpp +++ b/libs/rs/rsAllocation.cpp @@ -24,6 +24,8 @@ using namespace android::renderscript; Allocation::Allocation(Context *rsc, const Type *type) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mPtr = NULL; mCpuWrite = false; diff --git a/libs/rs/rsComponent.cpp b/libs/rs/rsComponent.cpp index 67184ffacc27c..42e2e4fbf2299 100644 --- a/libs/rs/rsComponent.cpp +++ b/libs/rs/rsComponent.cpp @@ -23,6 +23,8 @@ using namespace android::renderscript; Component::Component(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mType = FLOAT; mKind = USER; mIsNormalized = false; @@ -33,6 +35,8 @@ Component::Component(Context *rsc, DataKind dk, DataType dt, bool isNormalized, uint32_t bits, const char * name) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mType = dt; mKind = dk; mIsNormalized = isNormalized; diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp index 653d42734ca30..70add927d4485 100644 --- a/libs/rs/rsContext.cpp +++ b/libs/rs/rsContext.cpp @@ -269,11 +269,16 @@ void * Context::threadProc(void *vrsc) } LOGV("RS Thread exiting"); + rsc->mRaster.clear(); + rsc->mFragment.clear(); + rsc->mVertex.clear(); + rsc->mFragmentStore.clear(); + rsc->mRootScript.clear(); + rsc->mStateRaster.deinit(rsc); + rsc->mStateVertex.deinit(rsc); + rsc->mStateFragment.deinit(rsc); + rsc->mStateFragmentStore.deinit(rsc); ObjectBase::zeroAllUserRef(rsc); - rsc->mRaster.set(NULL); - rsc->mFragment.set(NULL); - rsc->mVertex.set(NULL); - rsc->mFragmentStore.set(NULL); glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT); diff --git a/libs/rs/rsElement.cpp b/libs/rs/rsElement.cpp index e7ae2474f64e7..a00fb52171285 100644 --- a/libs/rs/rsElement.cpp +++ b/libs/rs/rsElement.cpp @@ -24,12 +24,16 @@ using namespace android::renderscript; Element::Element(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mComponents = NULL; mComponentCount = 0; } Element::Element(Context *rsc, uint32_t count) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mComponents = new ObjectBaseRef [count]; mComponentCount = count; } diff --git a/libs/rs/rsLight.cpp b/libs/rs/rsLight.cpp index e9b8ef9bf356f..6f2cf3e7f7f60 100644 --- a/libs/rs/rsLight.cpp +++ b/libs/rs/rsLight.cpp @@ -24,6 +24,8 @@ using namespace android::renderscript; Light::Light(Context *rsc, bool isLocal, bool isMono) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mIsLocal = isLocal; mIsMono = isMono; diff --git a/libs/rs/rsMesh.cpp b/libs/rs/rsMesh.cpp index 73aef62110a08..d595b4e09e5e0 100644 --- a/libs/rs/rsMesh.cpp +++ b/libs/rs/rsMesh.cpp @@ -24,6 +24,8 @@ using namespace android::renderscript; Mesh::Mesh(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mVerticies = NULL; mVerticiesCount = 0; mPrimitives = NULL; diff --git a/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp index 83fa482a52f0f..720e8fccc4972 100644 --- a/libs/rs/rsObjectBase.cpp +++ b/libs/rs/rsObjectBase.cpp @@ -28,6 +28,8 @@ ObjectBase::ObjectBase(Context *rsc) mRSC = NULL; mNext = NULL; mPrev = NULL; + mAllocFile = __FILE__; + mAllocLine = __LINE__; setContext(rsc); } @@ -39,6 +41,17 @@ ObjectBase::~ObjectBase() remove(); } +void ObjectBase::dumpObj(const char *op) const +{ + if (mName) { + LOGV("%s RSobj %p, name %s, refs %i,%i from %s,%i links %p,%p,%p", + op, this, mName, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC); + } else { + LOGV("%s RSobj %p, no-name, refs %i,%i from %s,%i links %p,%p,%p", + op, this, mUserRefCount, mSysRefCount, mAllocFile, mAllocLine, mNext, mPrev, mRSC); + } +} + void ObjectBase::setContext(Context *rsc) { if (mRSC) { @@ -66,11 +79,7 @@ bool ObjectBase::checkDelete() const { if (!(mSysRefCount | mUserRefCount)) { if (mRSC && mRSC->props.mLogObjects) { - if (mName) { - LOGV("Deleting RS object %p, name %s", this, mName); - } else { - LOGV("Deleting RS object %p, no name", this); - } + dumpObj("checkDelete"); } delete this; return true; @@ -82,14 +91,14 @@ bool ObjectBase::decUserRef() const { rsAssert(mUserRefCount > 0); mUserRefCount --; - //LOGV("ObjectBase %p dec ref %i", this, mRefCount); + //dumpObj("decUserRef"); return checkDelete(); } bool ObjectBase::zeroUserRef() const { mUserRefCount = 0; - //LOGV("ObjectBase %p dec ref %i", this, mRefCount); + //dumpObj("zeroUserRef"); return checkDelete(); } @@ -97,7 +106,7 @@ bool ObjectBase::decSysRef() const { rsAssert(mSysRefCount > 0); mSysRefCount --; - //LOGV("ObjectBase %p dec ref %i", this, mRefCount); + //dumpObj("decSysRef"); return checkDelete(); } @@ -174,5 +183,14 @@ void ObjectBase::zeroAllUserRef(Context *rsc) //LOGE("o next %p", o); } } + + if (rsc->props.mLogObjects) { + LOGV("Objects remaining."); + o = rsc->mObjHead; + while (o) { + o->dumpObj(" "); + o = o->mNext; + } + } } diff --git a/libs/rs/rsObjectBase.h b/libs/rs/rsObjectBase.h index be400caac04ec..ea5e37cc0eaaa 100644 --- a/libs/rs/rsObjectBase.h +++ b/libs/rs/rsObjectBase.h @@ -50,6 +50,12 @@ public: static void zeroAllUserRef(Context *rsc); + void dumpObj(const char *op) const; + +protected: + const char *mAllocFile; + uint32_t mAllocLine; + private: void add() const; void remove() const; diff --git a/libs/rs/rsProgram.cpp b/libs/rs/rsProgram.cpp index 051483f408f9c..5f2a6097192ea 100644 --- a/libs/rs/rsProgram.cpp +++ b/libs/rs/rsProgram.cpp @@ -23,10 +23,11 @@ using namespace android::renderscript; Program::Program(Context *rsc, Element *in, Element *out) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; + mElementIn.set(in); mElementOut.set(out); - - } Program::~Program() diff --git a/libs/rs/rsProgramFragment.cpp b/libs/rs/rsProgramFragment.cpp index 5f685ff573551..708a0e0f5957a 100644 --- a/libs/rs/rsProgramFragment.cpp +++ b/libs/rs/rsProgramFragment.cpp @@ -27,6 +27,8 @@ using namespace android::renderscript; ProgramFragment::ProgramFragment(Context *rsc, Element *in, Element *out, bool pointSpriteEnable) : Program(rsc, in, out) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; for (uint32_t ct=0; ct < MAX_TEXTURE; ct++) { mEnvModes[ct] = RS_TEX_ENV_MODE_REPLACE; mTextureDimensions[ct] = 2; @@ -190,6 +192,12 @@ void ProgramFragmentState::init(Context *rsc, int32_t w, int32_t h) mDefault.set(pf); } +void ProgramFragmentState::deinit(Context *rsc) +{ + mDefault.clear(); + mLast.clear(); +} + namespace android { namespace renderscript { diff --git a/libs/rs/rsProgramFragment.h b/libs/rs/rsProgramFragment.h index d783c0df9749a..e26c6e8a35fda 100644 --- a/libs/rs/rsProgramFragment.h +++ b/libs/rs/rsProgramFragment.h @@ -75,6 +75,7 @@ public: ProgramFragment *mPF; void init(Context *rsc, int32_t w, int32_t h); + void deinit(Context *rsc); ObjectBaseRef mTextureTypes[ProgramFragment::MAX_TEXTURE]; ObjectBaseRef mDefault; diff --git a/libs/rs/rsProgramFragmentStore.cpp b/libs/rs/rsProgramFragmentStore.cpp index 39802c7b9d1af..de33d9c5ed043 100644 --- a/libs/rs/rsProgramFragmentStore.cpp +++ b/libs/rs/rsProgramFragmentStore.cpp @@ -27,6 +27,8 @@ using namespace android::renderscript; ProgramFragmentStore::ProgramFragmentStore(Context *rsc, Element *in, Element *out) : Program(rsc, in, out) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mDitherEnable = true; mBlendEnable = false; mColorRWriteEnable = true; @@ -217,6 +219,12 @@ void ProgramFragmentStoreState::init(Context *rsc, int32_t w, int32_t h) mDefault.set(pfs); } +void ProgramFragmentStoreState::deinit(Context *rsc) +{ + mDefault.clear(); + mLast.clear(); +} + namespace android { namespace renderscript { diff --git a/libs/rs/rsProgramFragmentStore.h b/libs/rs/rsProgramFragmentStore.h index b71e35f90b6c1..a3443873c91fc 100644 --- a/libs/rs/rsProgramFragmentStore.h +++ b/libs/rs/rsProgramFragmentStore.h @@ -65,6 +65,7 @@ public: ProgramFragmentStoreState(); ~ProgramFragmentStoreState(); void init(Context *rsc, int32_t w, int32_t h); + void deinit(Context *rsc); ObjectBaseRef mDefault; ObjectBaseRef mLast; diff --git a/libs/rs/rsProgramRaster.cpp b/libs/rs/rsProgramRaster.cpp index 2a9c4abd2cb61..fcf6824f691d1 100644 --- a/libs/rs/rsProgramRaster.cpp +++ b/libs/rs/rsProgramRaster.cpp @@ -32,6 +32,8 @@ ProgramRaster::ProgramRaster(Context *rsc, bool pointSprite) : Program(rsc, in, out) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mPointSmooth = pointSmooth; mLineSmooth = lineSmooth; mPointSprite = pointSprite; @@ -100,6 +102,12 @@ void ProgramRasterState::init(Context *rsc, int32_t w, int32_t h) mDefault.set(pr); } +void ProgramRasterState::deinit(Context *rsc) +{ + mDefault.clear(); + mLast.clear(); +} + namespace android { namespace renderscript { diff --git a/libs/rs/rsProgramRaster.h b/libs/rs/rsProgramRaster.h index da68f67de1c6e..a6d5ba8e58500 100644 --- a/libs/rs/rsProgramRaster.h +++ b/libs/rs/rsProgramRaster.h @@ -58,6 +58,7 @@ public: ProgramRasterState(); ~ProgramRasterState(); void init(Context *rsc, int32_t w, int32_t h); + void deinit(Context *rsc); ObjectBaseRef mDefault; ObjectBaseRef mLast; diff --git a/libs/rs/rsProgramVertex.cpp b/libs/rs/rsProgramVertex.cpp index 9eb32ff269df3..9bfa6022ae6e6 100644 --- a/libs/rs/rsProgramVertex.cpp +++ b/libs/rs/rsProgramVertex.cpp @@ -27,6 +27,8 @@ using namespace android::renderscript; ProgramVertex::ProgramVertex(Context *rsc, Element *in, Element *out) : Program(rsc, in, out) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mTextureMatrixEnable = false; mLightCount = 0; } @@ -139,10 +141,10 @@ void ProgramVertexState::init(Context *rsc, int32_t w, int32_t h) rsi_TypeBegin(rsc, e); rsi_TypeAdd(rsc, RS_DIMENSION_X, 48); - mAllocType = rsi_TypeCreate(rsc); + mAllocType.set((Type *)rsi_TypeCreate(rsc)); ProgramVertex *pv = new ProgramVertex(rsc, NULL, NULL); - Allocation *alloc = (Allocation *)rsi_AllocationCreateTyped(rsc, mAllocType); + Allocation *alloc = (Allocation *)rsi_AllocationCreateTyped(rsc, mAllocType.get()); mDefaultAlloc.set(alloc); mDefault.set(pv); @@ -156,6 +158,16 @@ void ProgramVertexState::init(Context *rsc, int32_t w, int32_t h) alloc->subData(RS_PROGRAM_VERTEX_MODELVIEW_OFFSET, 16, &m.m[0], 16*4); } +void ProgramVertexState::deinit(Context *rsc) +{ + mDefaultAlloc.clear(); + mDefault.clear(); + mAllocType.clear(); + mLast.clear(); + delete mPV; + mPV = NULL; +} + namespace android { namespace renderscript { diff --git a/libs/rs/rsProgramVertex.h b/libs/rs/rsProgramVertex.h index b3a8b8dacb8ca..e198f2380c6cf 100644 --- a/libs/rs/rsProgramVertex.h +++ b/libs/rs/rsProgramVertex.h @@ -59,12 +59,13 @@ public: ~ProgramVertexState(); void init(Context *rsc, int32_t w, int32_t h); + void deinit(Context *rsc); ObjectBaseRef mDefault; ObjectBaseRef mLast; ObjectBaseRef mDefaultAlloc; - RsType mAllocType; + ObjectBaseRef mAllocType; ProgramVertex *mPV; diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp index 99091a911816a..b7937507664d6 100644 --- a/libs/rs/rsSampler.cpp +++ b/libs/rs/rsSampler.cpp @@ -27,6 +27,8 @@ using namespace android::renderscript; Sampler::Sampler(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; // Should not get called. rsAssert(0); } @@ -38,6 +40,8 @@ Sampler::Sampler(Context *rsc, RsSamplerValue wrapT, RsSamplerValue wrapR) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mMagFilter = magFilter; mMinFilter = minFilter; mWrapS = wrapS; diff --git a/libs/rs/rsScript.cpp b/libs/rs/rsScript.cpp index f9526fe0bfdf0..cb1436b0bacde 100644 --- a/libs/rs/rsScript.cpp +++ b/libs/rs/rsScript.cpp @@ -21,6 +21,8 @@ using namespace android::renderscript; Script::Script(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; memset(&mEnviroment, 0, sizeof(mEnviroment)); mEnviroment.mClearColor[0] = 0; mEnviroment.mClearColor[1] = 0; diff --git a/libs/rs/rsScriptC.cpp b/libs/rs/rsScriptC.cpp index fb8180fc4de7e..e63ed2462dea9 100644 --- a/libs/rs/rsScriptC.cpp +++ b/libs/rs/rsScriptC.cpp @@ -35,6 +35,8 @@ using namespace android::renderscript; ScriptC::ScriptC(Context *rsc) : Script(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mAccScript = NULL; memset(&mProgram, 0, sizeof(mProgram)); } diff --git a/libs/rs/rsSimpleMesh.cpp b/libs/rs/rsSimpleMesh.cpp index fe06e0cca5962..b082fd7db26b9 100644 --- a/libs/rs/rsSimpleMesh.cpp +++ b/libs/rs/rsSimpleMesh.cpp @@ -24,10 +24,14 @@ using namespace android::renderscript; SimpleMesh::SimpleMesh(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; } SimpleMesh::~SimpleMesh() { + delete[] mVertexTypes; + delete[] mVertexBuffers; } void SimpleMesh::render() const diff --git a/libs/rs/rsType.cpp b/libs/rs/rsType.cpp index 010e49bcde475..4edd0d4982b70 100644 --- a/libs/rs/rsType.cpp +++ b/libs/rs/rsType.cpp @@ -22,6 +22,8 @@ using namespace android::renderscript; Type::Type(Context *rsc) : ObjectBase(rsc) { + mAllocFile = __FILE__; + mAllocLine = __LINE__; mLODs = 0; mLODCount = 0; memset(&mGL, 0, sizeof(mGL));