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

Commit 9870c9b6 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

make GLConsumer's debug texture static

this is so that we don't burn a gralloc handle and a bit
of memory per GLConsumer.

Change-Id: I30c3e7ec45d7f1b5426aca8e06c7716870877706
parent 6c913be9
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -297,6 +297,9 @@ private:
    // binding the buffer without touching the EglSlots.
    status_t bindUnslottedBufferLocked(EGLDisplay dpy);

    // returns a graphic buffer used when the texture image has been released
    static sp<GraphicBuffer> getDebugTexImageBuffer();

    // The default consumer usage flags that GLConsumer always sets on its
    // BufferQueue instance; these will be OR:d with any additional flags passed
    // from the GLConsumer user. In particular, GLConsumer will always
@@ -414,9 +417,12 @@ private:
    // attachToContext.
    bool mAttached;

    // protects static initialization
    static Mutex sStaticInitLock;

    // mReleasedTexImageBuffer is a dummy buffer used when in single buffer
    // mode and releaseTexImage() has been called
    sp<GraphicBuffer> mReleasedTexImageBuffer;
    static sp<GraphicBuffer> sReleasedTexImageBuffer;
};

// ----------------------------------------------------------------------------
+28 −22
Original line number Diff line number Diff line
@@ -86,6 +86,8 @@ static float mtxRot90[16] = {

static void mtxMul(float out[16], const float a[16], const float b[16]);

Mutex GLConsumer::sStaticInitLock;
sp<GraphicBuffer> GLConsumer::sReleasedTexImageBuffer;

GLConsumer::GLConsumer(const sp<IGraphicBufferConsumer>& bq, GLuint tex,
        GLenum texTarget, bool useFenceSync, bool isControlledByApp) :
@@ -212,7 +214,25 @@ status_t GLConsumer::releaseTexImage() {
            return err;
        }

        if (CC_UNLIKELY(mReleasedTexImageBuffer == NULL)) {
        mCurrentTexture = BufferQueue::INVALID_BUFFER_SLOT;
        mCurrentTextureBuf = getDebugTexImageBuffer();
        mCurrentCrop.makeInvalid();
        mCurrentTransform = 0;
        mCurrentScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
        mCurrentTimestamp = 0;
        mCurrentFence = Fence::NO_FENCE;

        // bind a dummy texture
        glBindTexture(mTexTarget, mTexName);
        bindUnslottedBufferLocked(mEglDisplay);
    }

    return NO_ERROR;
}

sp<GraphicBuffer> GLConsumer::getDebugTexImageBuffer() {
    Mutex::Autolock _l(sStaticInitLock);
    if (CC_UNLIKELY(sReleasedTexImageBuffer == NULL)) {
        // The first time, create the debug texture in case the application
        // continues to use it.
        sp<GraphicBuffer> buffer = new GraphicBuffer(
@@ -230,23 +250,9 @@ status_t GLConsumer::releaseTexImage() {
            bits += w;
        }
        buffer->unlock();
            mReleasedTexImageBuffer = buffer;
        sReleasedTexImageBuffer = buffer;
    }

        mCurrentTexture = BufferQueue::INVALID_BUFFER_SLOT;
        mCurrentTextureBuf = mReleasedTexImageBuffer;
        mCurrentCrop.makeInvalid();
        mCurrentTransform = 0;
        mCurrentScalingMode = NATIVE_WINDOW_SCALING_MODE_FREEZE;
        mCurrentTimestamp = 0;
        mCurrentFence = Fence::NO_FENCE;

        // bind a dummy texture
        glBindTexture(mTexTarget, mTexName);
        bindUnslottedBufferLocked(mEglDisplay);
    }

    return NO_ERROR;
    return sReleasedTexImageBuffer;
}

status_t GLConsumer::acquireBufferLocked(BufferQueue::BufferItem *item,