Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 35e973f6 authored by Mathias Agopian's avatar Mathias Agopian Committed by Android (Google) Code Review
Browse files

Merge changes I2d41cb94,Ia1a17985

* changes:
  fix [2324665] texture leak in surfaceflinger when using camera
  fix a texture leak introduced recently.
parents a2fe2f39 edfd97c0
Loading
Loading
Loading
Loading
+27 −5
Original line number Diff line number Diff line
@@ -370,8 +370,23 @@ LayerBuffer::BufferSource::BufferSource(LayerBuffer& layer,

LayerBuffer::BufferSource::~BufferSource()
{    
    class MessageDestroyTexture : public MessageBase {
        SurfaceFlinger* flinger;
        GLuint name;
    public:
        MessageDestroyTexture(
                SurfaceFlinger* flinger, GLuint name)
            : flinger(flinger), name(name) { }
        virtual bool handler() {
            glDeleteTextures(1, &name);
            return true;
        }
    };

    if (mTexture.name != -1U) {
        glDeleteTextures(1, &mTexture.name);
        // GL textures can only be destroyed from the GL thread
        mLayer.mFlinger->mEventQueue.postMessage(
                new MessageDestroyTexture(mLayer.mFlinger.get(), mTexture.name) );
    }
    if (mTexture.image != EGL_NO_IMAGE_KHR) {
        EGLDisplay dpy(mLayer.mFlinger->graphicPlane(0).getEGLDisplay());
@@ -444,6 +459,10 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const
    NativeBuffer src(ourBuffer->getBuffer());
    const Rect transformedBounds(mLayer.getTransformedBounds());

    if (UNLIKELY(mTexture.name == -1LU)) {
        mTexture.name = mLayer.createTexture();
    }

#if defined(EGL_ANDROID_image_native_buffer)
    if (mLayer.mFlags & DisplayHardware::DIRECT_TEXTURE) {
        copybit_device_t* copybit = mLayer.mBlitEngine;
@@ -483,9 +502,6 @@ void LayerBuffer::BufferSource::onDraw(const Region& clip) const
        t.format = src.img.format;
        t.data = (GGLubyte*)src.img.base;
        const Region dirty(Rect(t.width, t.height));
        if (UNLIKELY(mTexture.name == -1LU)) {
            mTexture.name = mLayer.createTexture();
        }
        mLayer.loadTexture(&mTexture, dirty, t);
    }

@@ -566,11 +582,17 @@ status_t LayerBuffer::BufferSource::initTempBuffer() const

void LayerBuffer::BufferSource::clearTempBufferImage() const
{
    // delete the image
    EGLDisplay dpy(mLayer.mFlinger->graphicPlane(0).getEGLDisplay());
    glDeleteTextures(1, &mTexture.name);
    eglDestroyImageKHR(dpy, mTexture.image);

    // and the associated texture (recreate a name)
    glDeleteTextures(1, &mTexture.name);
    Texture defaultTexture;
    mTexture = defaultTexture;
    mTexture.name = mLayer.createTexture();

    // and the associated buffer
    mTempGraphicBuffer.clear();
}