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

Commit 26679ce6 authored by Stan Iliev's avatar Stan Iliev
Browse files

Cache SkImage in SurfaceTexture only if buffer content is same

SkImage is immutable and changing GraphicBuffer content after
the object is created is not allowed. We still can cache
the image when BufferQueue is empty and showing unchanged
buffer.

Test: Ran UiRendering CTS, camera app
Change-Id: I9edefbda534e5d15b41bd7ff804fb29b1f72cc75
parent 31f977a4
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -46,8 +46,8 @@ void ImageConsumer::onReleaseBufferLocked(int buf) {
}

void ImageConsumer::ImageSlot::createIfNeeded(sp<GraphicBuffer> graphicBuffer,
                                              android_dataspace dataspace) {
    if (!mImage.get() || dataspace != mDataspace) {
                                              android_dataspace dataspace, bool forceCreate) {
    if (!mImage.get() || dataspace != mDataspace || forceCreate) {
        mImage = graphicBuffer.get()
                         ? SkImage::MakeFromAHardwareBuffer(
                                   reinterpret_cast<AHardwareBuffer*>(graphicBuffer.get()),
@@ -71,7 +71,7 @@ sk_sp<SkImage> ImageConsumer::dequeueImage(bool* queueEmpty, SurfaceTexture& st,
            if (slot != BufferItem::INVALID_BUFFER_SLOT) {
                *queueEmpty = true;
                mImageSlots[slot].createIfNeeded(st.mSlots[slot].mGraphicBuffer,
                        st.mCurrentDataSpace);
                        st.mCurrentDataSpace, false);
                return mImageSlots[slot].mImage;
            }
        }
@@ -150,7 +150,7 @@ sk_sp<SkImage> ImageConsumer::dequeueImage(bool* queueEmpty, SurfaceTexture& st,
    st.computeCurrentTransformMatrixLocked();

    *queueEmpty = false;
    mImageSlots[slot].createIfNeeded(st.mSlots[slot].mGraphicBuffer, item.mDataSpace);
    mImageSlots[slot].createIfNeeded(st.mSlots[slot].mGraphicBuffer, item.mDataSpace, true);
    return mImageSlots[slot].mImage;
}

+2 −1
Original line number Diff line number Diff line
@@ -82,7 +82,8 @@ private:
         */
        EGLSyncKHR mEglFence;

        void createIfNeeded(sp<GraphicBuffer> graphicBuffer, android_dataspace dataspace);
        void createIfNeeded(sp<GraphicBuffer> graphicBuffer, android_dataspace dataspace,
                            bool forceCreate);
    };

    /**