Merge "Destroy Type created by Allocation.createSized()" am: 2a64e23

am: cc24885

* commit 'cc248853c361588eb5429aee5921acbcc1900c8a':
  Destroy Type created by Allocation.createSized()

Change-Id: Ic79bbf7fbf1a3f9d8f49fdb3a3950b0383bc4dcb
This commit is contained in:
Yang Ni
2016-04-12 22:18:26 +00:00
committed by android-build-merger

View File

@@ -58,6 +58,7 @@ public class Allocation extends BaseObj {
private static final int MAX_NUMBER_IO_INPUT_ALLOC = 16;
Type mType;
boolean mOwningType = false;
Bitmap mBitmap;
int mUsage;
Allocation mAdaptedAllocation;
@@ -383,13 +384,16 @@ public class Allocation extends BaseObj {
guard.open("destroy");
}
Allocation(long id, RenderScript rs, Type t, int usage, MipmapControl mips) {
Allocation(long id, RenderScript rs, Type t, boolean owningType, int usage, MipmapControl mips) {
this(id, rs, t, usage);
mOwningType = owningType;
mMipmapControl = mips;
}
protected void finalize() throws Throwable {
RenderScript.registerNativeFree.invoke(RenderScript.sRuntime, mSize);
// Set mType null to avoid double-destroying it in case its finalizer races ahead
mType = null;
super.finalize();
}
@@ -1578,6 +1582,9 @@ public class Allocation extends BaseObj {
mRS.finish(); // Necessary because resize is fifoed and update is async.
long typeID = mRS.nAllocationGetType(getID(mRS));
// Sets zero the mID so that the finalizer of the old mType value won't
// destroy the native object that is being reused.
mType.setID(0);
mType = new Type(typeID, mRS);
mType.updateFromNative();
updateCacheInfo(mType);
@@ -1921,7 +1928,7 @@ public class Allocation extends BaseObj {
if (id == 0) {
throw new RSRuntimeException("Allocation creation failed.");
}
return new Allocation(id, rs, type, usage, mips);
return new Allocation(id, rs, type, false, usage, mips);
} finally {
Trace.traceEnd(RenderScript.TRACE_TAG);
}
@@ -1979,7 +1986,7 @@ public class Allocation extends BaseObj {
if (id == 0) {
throw new RSRuntimeException("Allocation creation failed.");
}
return new Allocation(id, rs, t, usage, MipmapControl.MIPMAP_NONE);
return new Allocation(id, rs, t, true, usage, MipmapControl.MIPMAP_NONE);
} finally {
Trace.traceEnd(RenderScript.TRACE_TAG);
}
@@ -2068,7 +2075,7 @@ public class Allocation extends BaseObj {
}
// keep a reference to the Bitmap around to prevent GC
Allocation alloc = new Allocation(id, rs, t, usage, mips);
Allocation alloc = new Allocation(id, rs, t, true, usage, mips);
alloc.setBitmap(b);
return alloc;
}
@@ -2078,7 +2085,7 @@ public class Allocation extends BaseObj {
if (id == 0) {
throw new RSRuntimeException("Load failed.");
}
return new Allocation(id, rs, t, usage, mips);
return new Allocation(id, rs, t, true, usage, mips);
} finally {
Trace.traceEnd(RenderScript.TRACE_TAG);
}
@@ -2150,7 +2157,7 @@ public class Allocation extends BaseObj {
}
for (int i=1; i<numAlloc; i++) {
mAllocationArray[i] = createFromAllcation(rs, mAllocationArray[0]);
mAllocationArray[i] = createFromAllocation(rs, mAllocationArray[0]);
}
return mAllocationArray;
} finally {
@@ -2169,7 +2176,7 @@ public class Allocation extends BaseObj {
* @param alloc RenderScript Allocation describing data layout.
* @return Allocation sharing the same data structure.
*/
static Allocation createFromAllcation(RenderScript rs, Allocation alloc) {
static Allocation createFromAllocation(RenderScript rs, Allocation alloc) {
try {
Trace.traceBegin(RenderScript.TRACE_TAG, "createFromAllcation");
rs.validate();
@@ -2184,7 +2191,7 @@ public class Allocation extends BaseObj {
if (id == 0) {
throw new RSRuntimeException("Allocation creation failed.");
}
Allocation outAlloc = new Allocation(id, rs, type, usage, mips);
Allocation outAlloc = new Allocation(id, rs, type, false, usage, mips);
if ((usage & USAGE_IO_INPUT) != 0) {
outAlloc.shareBufferQueue(alloc);
}
@@ -2360,7 +2367,7 @@ public class Allocation extends BaseObj {
if(id == 0) {
throw new RSRuntimeException("Load failed for bitmap " + b + " element " + e);
}
return new Allocation(id, rs, t, usage, mips);
return new Allocation(id, rs, t, true, usage, mips);
}
/**
@@ -2605,6 +2612,13 @@ public class Allocation extends BaseObj {
if((mUsage & USAGE_IO_OUTPUT) != 0) {
setSurface(null);
}
if (mType != null && mOwningType) {
mType.destroy();
mType = null;
}
super.destroy();
}
}