Switch SurfaceFlinger to HWC 2.0
Enables SurfaceFlinger to speak to version 2.0 of the Hardware Composer
HAL instead of version 1.x (also removing support for the framebuffer
HAL). By default, however, this functionality is disabled. In order to
enable it, USE_HWC2 must be set to true in Android.mk.
Change-Id: I4589e02ac2165236b10ff2f7cb772f87e0d3daab
diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.cpp b/services/surfaceflinger/SurfaceFlingerConsumer.cpp
index d3b66e6..4c80fa0 100644
--- a/services/surfaceflinger/SurfaceFlingerConsumer.cpp
+++ b/services/surfaceflinger/SurfaceFlingerConsumer.cpp
@@ -87,7 +87,11 @@
}
// Release the previous buffer.
+#ifdef USE_HWC2
+ err = updateAndReleaseLocked(item, &mPendingRelease);
+#else
err = updateAndReleaseLocked(item);
+#endif
if (err != NO_ERROR) {
return err;
}
@@ -183,6 +187,40 @@
return nextRefresh + extraPadding;
}
+#ifdef USE_HWC2
+void SurfaceFlingerConsumer::setReleaseFence(const sp<Fence>& fence)
+{
+ if (!mPendingRelease.isPending) {
+ GLConsumer::setReleaseFence(fence);
+ return;
+ }
+ auto currentTexture = mPendingRelease.currentTexture;
+ if (fence->isValid() &&
+ currentTexture != BufferQueue::INVALID_BUFFER_SLOT) {
+ status_t result = addReleaseFence(currentTexture,
+ mPendingRelease.graphicBuffer, fence);
+ ALOGE_IF(result != NO_ERROR, "setReleaseFence: failed to add the"
+ " fence: %s (%d)", strerror(-result), result);
+ }
+}
+
+void SurfaceFlingerConsumer::releasePendingBuffer()
+{
+ if (!mPendingRelease.isPending) {
+ ALOGV("Pending buffer already released");
+ return;
+ }
+ ALOGV("Releasing pending buffer");
+ Mutex::Autolock lock(mMutex);
+ status_t result = releaseBufferLocked(mPendingRelease.currentTexture,
+ mPendingRelease.graphicBuffer, mPendingRelease.display,
+ mPendingRelease.fence);
+ ALOGE_IF(result != NO_ERROR, "releasePendingBuffer failed: %s (%d)",
+ strerror(-result), result);
+ mPendingRelease = PendingRelease();
+}
+#endif
+
void SurfaceFlingerConsumer::setContentsChangedListener(
const wp<ContentsChangedListener>& listener) {
setFrameAvailableListener(listener);