Merge "Don't destroy the same texture twice Bug #7221449" into jb-mr1-dev

This commit is contained in:
Romain Guy
2012-09-25 12:22:55 -07:00
committed by Android (Google) Code Review
7 changed files with 38 additions and 8 deletions

View File

@@ -166,6 +166,7 @@ class GLES20Canvas extends HardwareCanvas {
static native void nSetLayerColorFilter(int layerId, int nativeColorFilter);
static native void nUpdateTextureLayer(int layerId, int width, int height, boolean opaque,
SurfaceTexture surface);
static native void nClearLayerTexture(int layerId);
static native void nSetTextureLayerTransform(int layerId, int matrix);
static native void nDestroyLayer(int layerId);
static native void nDestroyLayerDeferred(int layerId);

View File

@@ -66,6 +66,11 @@ abstract class GLES20Layer extends HardwareLayer {
mLayer = 0;
}
@Override
void clearStorage() {
if (mLayer != 0) GLES20Canvas.nClearLayerTexture(mLayer);
}
static class Finalizer {
private int mLayerId;

View File

@@ -39,7 +39,7 @@ class GLES20TextureLayer extends GLES20Layer {
mFinalizer = new Finalizer(mLayer);
} else {
mFinalizer = null;
}
}
}
@Override

View File

@@ -204,4 +204,9 @@ abstract class HardwareLayer {
* @param dirtyRect The dirty region of the layer that needs to be redrawn
*/
abstract void redrawLater(DisplayList displayList, Rect dirtyRect);
/**
* Indicates that this layer has lost its underlying storage.
*/
abstract void clearStorage();
}

View File

@@ -224,6 +224,7 @@ public class TextureView extends View {
private void destroySurface() {
if (mLayer != null) {
mSurface.detachFromGLContext();
mLayer.clearStorage();
boolean shouldRelease = true;
if (mListener != null) {

View File

@@ -822,6 +822,11 @@ static void android_view_GLES20Canvas_updateRenderLayer(JNIEnv* env, jobject cla
layer->updateDeferred(renderer, displayList, left, top, right, bottom);
}
static void android_view_GLES20Canvas_clearLayerTexture(JNIEnv* env, jobject clazz,
Layer* layer) {
layer->clearTexture();
}
static void android_view_GLES20Canvas_setTextureLayerTransform(JNIEnv* env, jobject clazz,
Layer* layer, SkMatrix* matrix) {
@@ -1016,6 +1021,7 @@ static JNINativeMethod gMethods[] = {
{ "nUpdateTextureLayer", "(IIIZLandroid/graphics/SurfaceTexture;)V",
(void*) android_view_GLES20Canvas_updateTextureLayer },
{ "nUpdateRenderLayer", "(IIIIIII)V", (void*) android_view_GLES20Canvas_updateRenderLayer },
{ "nClearLayerTexture", "(I)V", (void*) android_view_GLES20Canvas_clearLayerTexture },
{ "nDestroyLayer", "(I)V", (void*) android_view_GLES20Canvas_destroyLayer },
{ "nDestroyLayerDeferred", "(I)V", (void*) android_view_GLES20Canvas_destroyLayerDeferred },
{ "nDrawLayer", "(IIFFI)V", (void*) android_view_GLES20Canvas_drawLayer },

View File

@@ -134,10 +134,6 @@ struct Layer {
return fbo;
}
inline GLuint* getTexturePointer() {
return &texture.id;
}
inline GLuint getTexture() {
return texture.id;
}
@@ -181,15 +177,31 @@ struct Layer {
ANDROID_API void setColorFilter(SkiaColorFilter* filter);
inline void bindTexture() {
glBindTexture(renderTarget, texture.id);
if (texture.id) {
glBindTexture(renderTarget, texture.id);
}
}
inline void generateTexture() {
glGenTextures(1, &texture.id);
if (!texture.id) {
glGenTextures(1, &texture.id);
}
}
inline void deleteTexture() {
if (texture.id) glDeleteTextures(1, &texture.id);
if (texture.id) {
glDeleteTextures(1, &texture.id);
texture.id = 0;
}
}
/**
* When the caller frees the texture itself, the caller
* must call this method to tell this layer that it lost
* the texture.
*/
void clearTexture() {
texture.id = 0;
}
inline void deleteFbo() {