10f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines/* 20f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Copyright (C) 2009 The Android Open Source Project 30f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 40f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Licensed under the Apache License, Version 2.0 (the "License"); 50f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * you may not use this file except in compliance with the License. 60f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * You may obtain a copy of the License at 70f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 80f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * http://www.apache.org/licenses/LICENSE-2.0 90f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * 100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * Unless required by applicable law or agreed to in writing, software 110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * distributed under the License is distributed on an "AS IS" BASIS, 120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * See the License for the specific language governing permissions and 140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines * limitations under the License. 150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines */ 160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#ifndef ANDROID_RS_OBJECT_BASE_H 180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define ANDROID_RS_OBJECT_BASE_H 190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsUtils.h" 210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include "rsDefines.h" 220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#define RS_OBJECT_DEBUG 0 240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#include <utils/CallStack.h> 260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace android { 280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesnamespace renderscript { 290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass Context; 310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass OStream; 320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines// An element is a group of Components that occupies one cell in a structure. 340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ObjectBase { 350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic: 360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBase(Context *rsc); 370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void incSysRef() const; 390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines bool decSysRef() const; 400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void incUserRef() const; 420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines bool decUserRef() const; 430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines bool zeroUserRef() const; 440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines static bool checkDelete(const ObjectBase *); 460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines const char * getName() const { 480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return mName.string(); 490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void setName(const char *); 510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void setName(const char *, uint32_t len); 520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Context * getContext() const {return mRSC;} 540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines virtual bool freeChildren(); 550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines static void zeroAllUserRef(Context *rsc); 570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines static void freeAllChildren(Context *rsc); 580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines static void dumpAll(Context *rsc); 590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines virtual void dumpLOGV(const char *prefix) const; 610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines virtual void serialize(Context *rsc, OStream *stream) const = 0; 620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines virtual RsA3DClassID getClassId() const = 0; 630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines static bool isValid(const Context *rsc, const ObjectBase *obj); 650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // The async lock is taken during object creation in non-rs threads 670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // and object deletion in the rs thread. 680f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines static void asyncLock(); 690f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines static void asyncUnlock(); 700f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 710f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected: 720f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // Called inside the async lock for any object list management that is 730f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines // necessary in derived classes. 740f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines virtual void preDestroy() const; 750f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 760f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines Context *mRSC; 770f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines virtual ~ObjectBase(); 780f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 790f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprivate: 800f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines static pthread_mutex_t gObjectInitMutex; 810f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 820f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void add() const; 830f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void remove() const; 840f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 850f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines String8 mName; 860f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mutable int32_t mSysRefCount; 870f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mutable int32_t mUserRefCount; 880f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 890f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mutable const ObjectBase * mPrev; 900f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mutable const ObjectBase * mNext; 910f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 920f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#if RS_OBJECT_DEBUG 930f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines CallStack mStack; 940f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif 950f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 960f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}; 970f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 980f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinestemplate<class T> 990f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesclass ObjectBaseRef { 1000f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinespublic: 1010f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBaseRef() { 1020f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRef = NULL; 1030f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1040f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1050f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBaseRef(const ObjectBaseRef &ref) { 1060f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRef = ref.get(); 1070f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mRef) { 1080f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRef->incSysRef(); 1090f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1100f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1110f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1120f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBaseRef(T *ref) { 1130f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRef = ref; 1140f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mRef) { 1150f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ref->incSysRef(); 1160f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1170f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1180f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1190f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ObjectBaseRef & operator= (const ObjectBaseRef &ref) { 1200f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (&ref != this) { 1210f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines set(ref); 1220f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1230f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return *this; 1240f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1250f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1260f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ~ObjectBaseRef() { 1270f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines clear(); 1280f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1290f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1300f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void set(T *ref) { 1310f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mRef != ref) { 1320f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines clear(); 1330f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRef = ref; 1340f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mRef) { 1350f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines ref->incSysRef(); 1360f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1370f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1380f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1390f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1400f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void set(const ObjectBaseRef &ref) { 1410f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines set(ref.mRef); 1420f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1430f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1440f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines void clear() { 1450f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines if (mRef) { 1460f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRef->decSysRef(); 1470f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1480f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines mRef = NULL; 1490f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1500f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1510f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines inline T * get() const { 1520f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return mRef; 1530f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1540f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1550f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines inline T * operator-> () const { 1560f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines return mRef; 1570f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines } 1580f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1590f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hinesprotected: 1600f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines T * mRef; 1610f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines}; 1620f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1630f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1640f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines} 1650f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 1660f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines#endif //ANDROID_RS_OBJECT_BASE_H 1670f6f72e19db852cc253fd2fc05459abdf8d5c3afStephen Hines 168