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
diff --git a/libs/hwui/surfacetexture/ImageConsumer.cpp b/libs/hwui/surfacetexture/ImageConsumer.cpp
index 4a2f57e..624c290 100644
--- a/libs/hwui/surfacetexture/ImageConsumer.cpp
+++ b/libs/hwui/surfacetexture/ImageConsumer.cpp
@@ -46,8 +46,8 @@
}
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 @@
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 @@
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;
}