198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/* 298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project 398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License. 698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at 798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software 1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and 1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License. 1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript; 1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log; 2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/** 2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * BaseObj is the base class for interfacing with native renderscript objects. 2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * It primarly contains code for tracking the native object ID and forcably 2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * disconecting the object from the native allocation for early cleanup. 2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/ 2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class BaseObj { 2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams BaseObj(int id, RenderScript rs) { 2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams rs.validate(); 3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mRS = rs; 3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mID = id; 3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mDestroyed = false; 3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams void setID(int id) { 3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (mID != 0) { 3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSRuntimeException("Internal Error, reset of object ID."); 3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mID = id; 4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Lookup the native object ID for this object. Primarily used by the 4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * generated reflected code. 4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rs Context to verify against internal context for 4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * match. 4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @return int 5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams int getID(RenderScript rs) { 5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mRS.validate(); 5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (mDestroyed) { 5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSInvalidStateException("using a destroyed object."); 5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (mID == 0) { 5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSRuntimeException("Internal error: Object id 0."); 5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if ((rs != null) && (rs != mRS)) { 6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSInvalidStateException("using object with mismatched context."); 6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return mID; 6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams void checkValid() { 6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (mID == 0) { 6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSIllegalArgumentException("Invalid object."); 6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams private int mID; 7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams private boolean mDestroyed; 7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams RenderScript mRS; 7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams protected void finalize() throws Throwable { 7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (!mDestroyed) { 7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if(mID != 0 && mRS.isAlive()) { 7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mRS.nObjDestroy(mID); 7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mRS = null; 8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mID = 0; 8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mDestroyed = true; 8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams //Log.v(RenderScript.LOG_TAG, getClass() + 8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams // " auto finalizing object without having released the RS reference."); 8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams super.finalize(); 8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * destroy disconnects the object from the native object effectively 9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * rendering this java object dead. The primary use is to force immediate 9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * cleanup of resources when it is believed the GC will not respond quickly 9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * enough. 9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams synchronized public void destroy() { 9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if(mDestroyed) { 9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSInvalidStateException("Object already destroyed."); 9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mDestroyed = true; 10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams mRS.nObjDestroy(mID); 10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 10398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 10498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Calculates the hash code value for a BaseObj. 10598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 10698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @return int 10798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 10898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams @Override 10998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public int hashCode() { 11098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return mID; 11198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 11298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 11398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 11498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Compare the current BaseObj with another BaseObj for equality. 11598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 11698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param obj The object to check equality with. 11798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 11898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @return boolean 11998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 12098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams @Override 12198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams public boolean equals(Object obj) { 12298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams // Early-out check to see if both BaseObjs are actually the same 12398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (this == obj) 12498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return true; 12598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 12698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (getClass() != obj.getClass()) { 12798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return false; 12898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 12998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 13098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams BaseObj b = (BaseObj) obj; 13198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return mID == b.mID; 13298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 13398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams} 13498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 135