Revert "Delete HWC1"
This reverts commit 90f923493fa053655a203c34ea491086aeb07602.
Change-Id: If9da49e3bc85f8ff21ac1bd22a6bab97e9aa3103
diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp
index 43fb19d..6c18ef7 100644
--- a/services/surfaceflinger/DisplayDevice.cpp
+++ b/services/surfaceflinger/DisplayDevice.cpp
@@ -37,7 +37,9 @@
#include "DisplayHardware/DisplaySurface.h"
#include "DisplayHardware/HWComposer.h"
+#ifdef USE_HWC2
#include "DisplayHardware/HWC2.h"
+#endif
#include "RenderEngine/RenderEngine.h"
#include "clz.h"
@@ -72,6 +74,9 @@
const sp<SurfaceFlinger>& flinger,
DisplayType type,
int32_t hwcId,
+#ifndef USE_HWC2
+ int format,
+#endif
bool isSecure,
const wp<IBinder>& displayToken,
const sp<DisplaySurface>& displaySurface,
@@ -87,6 +92,9 @@
mSurface(EGL_NO_SURFACE),
mDisplayWidth(),
mDisplayHeight(),
+#ifndef USE_HWC2
+ mFormat(),
+#endif
mFlags(),
mPageFlipCount(),
mIsSecure(isSecure),
@@ -106,7 +114,11 @@
EGLSurface eglSurface;
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if (config == EGL_NO_CONFIG) {
+#ifdef USE_HWC2
config = RenderEngine::chooseEglConfig(display, PIXEL_FORMAT_RGBA_8888);
+#else
+ config = RenderEngine::chooseEglConfig(display, format);
+#endif
}
eglSurface = eglCreateWindowSurface(display, config, window, NULL);
eglQuerySurface(display, eglSurface, EGL_WIDTH, &mDisplayWidth);
@@ -125,6 +137,9 @@
mConfig = config;
mDisplay = display;
mSurface = eglSurface;
+#ifndef USE_HWC2
+ mFormat = format;
+#endif
mPageFlipCount = 0;
mViewport.makeInvalid();
mFrame.makeInvalid();
@@ -165,6 +180,10 @@
void DisplayDevice::disconnect(HWComposer& hwc) {
if (mHwcDisplayId >= 0) {
hwc.disconnectDisplay(mHwcDisplayId);
+#ifndef USE_HWC2
+ if (mHwcDisplayId >= DISPLAY_VIRTUAL)
+ hwc.freeDisplayId(mHwcDisplayId);
+#endif
mHwcDisplayId = -1;
}
}
@@ -181,6 +200,12 @@
return mDisplayHeight;
}
+#ifndef USE_HWC2
+PixelFormat DisplayDevice::getFormat() const {
+ return mFormat;
+}
+#endif
+
EGLSurface DisplayDevice::getEGLSurface() const {
return mSurface;
}
@@ -196,6 +221,12 @@
return mPageFlipCount;
}
+#ifndef USE_HWC2
+status_t DisplayDevice::compositionComplete() const {
+ return mDisplaySurface->compositionComplete();
+}
+#endif
+
void DisplayDevice::flip(const Region& dirty) const
{
mFlinger->getRenderEngine().checkErrors();
@@ -216,6 +247,7 @@
return mDisplaySurface->beginFrame(mustRecompose);
}
+#ifdef USE_HWC2
status_t DisplayDevice::prepareFrame(HWComposer& hwc) {
status_t error = hwc.prepare(*this);
if (error != NO_ERROR) {
@@ -239,9 +271,41 @@
}
return mDisplaySurface->prepareFrame(compositionType);
}
+#else
+status_t DisplayDevice::prepareFrame(const HWComposer& hwc) const {
+ DisplaySurface::CompositionType compositionType;
+ bool haveGles = hwc.hasGlesComposition(mHwcDisplayId);
+ bool haveHwc = hwc.hasHwcComposition(mHwcDisplayId);
+ if (haveGles && haveHwc) {
+ compositionType = DisplaySurface::COMPOSITION_MIXED;
+ } else if (haveGles) {
+ compositionType = DisplaySurface::COMPOSITION_GLES;
+ } else if (haveHwc) {
+ compositionType = DisplaySurface::COMPOSITION_HWC;
+ } else {
+ // Nothing to do -- when turning the screen off we get a frame like
+ // this. Call it a HWC frame since we won't be doing any GLES work but
+ // will do a prepare/set cycle.
+ compositionType = DisplaySurface::COMPOSITION_HWC;
+ }
+ return mDisplaySurface->prepareFrame(compositionType);
+}
+#endif
void DisplayDevice::swapBuffers(HWComposer& hwc) const {
+#ifdef USE_HWC2
if (hwc.hasClientComposition(mHwcDisplayId)) {
+#else
+ // We need to call eglSwapBuffers() if:
+ // (1) we don't have a hardware composer, or
+ // (2) we did GLES composition this frame, and either
+ // (a) we have framebuffer target support (not present on legacy
+ // devices, where HWComposer::commit() handles things); or
+ // (b) this is a virtual display
+ if (hwc.initCheck() != NO_ERROR ||
+ (hwc.hasGlesComposition(mHwcDisplayId) &&
+ (hwc.supportsFramebufferTarget() || mType >= DISPLAY_VIRTUAL))) {
+#endif
EGLBoolean success = eglSwapBuffers(mDisplay, mSurface);
if (!success) {
EGLint error = eglGetError();
@@ -263,9 +327,17 @@
}
}
+#ifdef USE_HWC2
void DisplayDevice::onSwapBuffersCompleted() const {
mDisplaySurface->onFrameCommitted();
}
+#else
+void DisplayDevice::onSwapBuffersCompleted(HWComposer& hwc) const {
+ if (hwc.initCheck() == NO_ERROR) {
+ mDisplaySurface->onFrameCommitted();
+ }
+}
+#endif
uint32_t DisplayDevice::getFlags() const
{
@@ -343,6 +415,7 @@
}
// ----------------------------------------------------------------------------
+#ifdef USE_HWC2
void DisplayDevice::setActiveColorMode(android_color_mode_t mode) {
mActiveColorMode = mode;
}
@@ -350,6 +423,7 @@
android_color_mode_t DisplayDevice::getActiveColorMode() const {
return mActiveColorMode;
}
+#endif
// ----------------------------------------------------------------------------