Loading services/surfaceflinger/Android.mk +15 −2 Original line number Diff line number Diff line Loading @@ -17,14 +17,12 @@ LOCAL_SRC_FILES := \ LayerDim.cpp \ MessageQueue.cpp \ MonitoredProducer.cpp \ SurfaceFlinger.cpp \ SurfaceFlingerConsumer.cpp \ SurfaceInterceptor.cpp \ Transform.cpp \ DisplayHardware/FramebufferSurface.cpp \ DisplayHardware/HWC2.cpp \ DisplayHardware/HWC2On1Adapter.cpp \ DisplayHardware/HWComposer.cpp \ DisplayHardware/PowerHAL.cpp \ DisplayHardware/VirtualDisplaySurface.cpp \ Effects/Daltonizer.cpp \ Loading @@ -49,6 +47,17 @@ LOCAL_C_INCLUDES := \ LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\" LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES ifeq ($(TARGET_USES_HWC2),true) LOCAL_CFLAGS += -DUSE_HWC2 LOCAL_SRC_FILES += \ SurfaceFlinger.cpp \ DisplayHardware/HWComposer.cpp else LOCAL_SRC_FILES += \ SurfaceFlinger_hwc1.cpp \ DisplayHardware/HWComposer_hwc1.cpp endif ifeq ($(TARGET_BOARD_PLATFORM),omap4) LOCAL_CFLAGS += -DHAS_CONTEXT_PRIORITY endif Loading Loading @@ -155,6 +164,10 @@ ifneq ($(ENABLE_CPUSETS),) LOCAL_CFLAGS += -DENABLE_CPUSETS endif ifeq ($(TARGET_USES_HWC2),true) LOCAL_CFLAGS += -DUSE_HWC2 endif LOCAL_SRC_FILES := \ main_surfaceflinger.cpp Loading services/surfaceflinger/DisplayDevice.cpp +74 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -72,6 +74,9 @@ DisplayDevice::DisplayDevice( 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, Loading @@ -87,6 +92,9 @@ DisplayDevice::DisplayDevice( mSurface(EGL_NO_SURFACE), mDisplayWidth(), mDisplayHeight(), #ifndef USE_HWC2 mFormat(), #endif mFlags(), mPageFlipCount(), mIsSecure(isSecure), Loading @@ -106,7 +114,11 @@ DisplayDevice::DisplayDevice( 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); Loading @@ -125,6 +137,9 @@ DisplayDevice::DisplayDevice( mConfig = config; mDisplay = display; mSurface = eglSurface; #ifndef USE_HWC2 mFormat = format; #endif mPageFlipCount = 0; mViewport.makeInvalid(); mFrame.makeInvalid(); Loading Loading @@ -165,6 +180,10 @@ DisplayDevice::~DisplayDevice() { void DisplayDevice::disconnect(HWComposer& hwc) { if (mHwcDisplayId >= 0) { hwc.disconnectDisplay(mHwcDisplayId); #ifndef USE_HWC2 if (mHwcDisplayId >= DISPLAY_VIRTUAL) hwc.freeDisplayId(mHwcDisplayId); #endif mHwcDisplayId = -1; } } Loading @@ -181,6 +200,12 @@ int DisplayDevice::getHeight() const { return mDisplayHeight; } #ifndef USE_HWC2 PixelFormat DisplayDevice::getFormat() const { return mFormat; } #endif EGLSurface DisplayDevice::getEGLSurface() const { return mSurface; } Loading @@ -196,6 +221,12 @@ uint32_t DisplayDevice::getPageFlipCount() const { return mPageFlipCount; } #ifndef USE_HWC2 status_t DisplayDevice::compositionComplete() const { return mDisplaySurface->compositionComplete(); } #endif void DisplayDevice::flip(const Region& dirty) const { mFlinger->getRenderEngine().checkErrors(); Loading @@ -216,6 +247,7 @@ status_t DisplayDevice::beginFrame(bool mustRecompose) const { return mDisplaySurface->beginFrame(mustRecompose); } #ifdef USE_HWC2 status_t DisplayDevice::prepareFrame(HWComposer& hwc) { status_t error = hwc.prepare(*this); if (error != NO_ERROR) { Loading @@ -239,9 +271,41 @@ status_t DisplayDevice::prepareFrame(HWComposer& hwc) { } 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(); Loading @@ -263,9 +327,17 @@ void DisplayDevice::swapBuffers(HWComposer& hwc) const { } } #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 { Loading Loading @@ -343,6 +415,7 @@ int DisplayDevice::getActiveConfig() const { } // ---------------------------------------------------------------------------- #ifdef USE_HWC2 void DisplayDevice::setActiveColorMode(android_color_mode_t mode) { mActiveColorMode = mode; } Loading @@ -350,6 +423,7 @@ void DisplayDevice::setActiveColorMode(android_color_mode_t mode) { android_color_mode_t DisplayDevice::getActiveColorMode() const { return mActiveColorMode; } #endif // ---------------------------------------------------------------------------- Loading services/surfaceflinger/DisplayDevice.h +31 −0 Original line number Diff line number Diff line Loading @@ -21,20 +21,27 @@ #include <stdlib.h> #ifndef USE_HWC2 #include <ui/PixelFormat.h> #endif #include <ui/Region.h> #include <EGL/egl.h> #include <EGL/eglext.h> #ifdef USE_HWC2 #include <binder/IBinder.h> #include <utils/RefBase.h> #endif #include <utils/Mutex.h> #include <utils/String8.h> #include <utils/Timers.h> #include <hardware/hwcomposer_defs.h> #ifdef USE_HWC2 #include <memory> #endif struct ANativeWindow; Loading Loading @@ -80,6 +87,9 @@ public: 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, Loading @@ -102,6 +112,9 @@ public: int getWidth() const; int getHeight() const; #ifndef USE_HWC2 PixelFormat getFormat() const; #endif uint32_t getFlags() const; EGLSurface getEGLSurface() const; Loading Loading @@ -131,12 +144,23 @@ public: // We pass in mustRecompose so we can keep VirtualDisplaySurface's state // machine happy without actually queueing a buffer if nothing has changed status_t beginFrame(bool mustRecompose) const; #ifdef USE_HWC2 status_t prepareFrame(HWComposer& hwc); #else status_t prepareFrame(const HWComposer& hwc) const; #endif void swapBuffers(HWComposer& hwc) const; #ifndef USE_HWC2 status_t compositionComplete() const; #endif // called after h/w composer has completed its set() call #ifdef USE_HWC2 void onSwapBuffersCompleted() const; #else void onSwapBuffersCompleted(HWComposer& hwc) const; #endif Rect getBounds() const { return Rect(mDisplayWidth, mDisplayHeight); Loading @@ -158,8 +182,10 @@ public: void setPowerMode(int mode); bool isDisplayOn() const; #ifdef USE_HWC2 android_color_mode_t getActiveColorMode() const; void setActiveColorMode(android_color_mode_t mode); #endif /* ------------------------------------------------------------------------ * Display active config management. Loading Loading @@ -194,6 +220,9 @@ private: EGLSurface mSurface; int mDisplayWidth; int mDisplayHeight; #ifndef USE_HWC2 PixelFormat mFormat; #endif uint32_t mFlags; mutable uint32_t mPageFlipCount; String8 mDisplayName; Loading Loading @@ -228,8 +257,10 @@ private: int mPowerMode; // Current active config int mActiveConfig; #ifdef USE_HWC2 // current active color mode android_color_mode_t mActiveColorMode; #endif }; struct DisplayDeviceState { Loading services/surfaceflinger/DisplayHardware/DisplaySurface.h +8 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,14 @@ public: }; virtual status_t prepareFrame(CompositionType compositionType) = 0; #ifndef USE_HWC2 // Should be called when composition rendering is complete for a frame (but // eglSwapBuffers hasn't necessarily been called). Required by certain // older drivers for synchronization. // TODO: Remove this when we drop support for HWC 1.0. virtual status_t compositionComplete() = 0; #endif // Inform the surface that GLES composition is complete for this frame, and // the surface should make sure that HWComposer has the correct buffer for // this frame. Some implementations may only push a new buffer to Loading services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp +74 −0 Original line number Diff line number Diff line Loading @@ -62,20 +62,32 @@ FramebufferSurface::FramebufferSurface(HWComposer& hwc, int disp, mCurrentBufferSlot(-1), mCurrentBuffer(), mCurrentFence(Fence::NO_FENCE), #ifdef USE_HWC2 mHwc(hwc), mHasPendingRelease(false), mPreviousBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), mPreviousBuffer() #else mHwc(hwc) #endif { #ifdef USE_HWC2 ALOGV("Creating for display %d", disp); #endif mName = "FramebufferSurface"; mConsumer->setConsumerName(mName); mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_COMPOSER); #ifdef USE_HWC2 const auto& activeConfig = mHwc.getActiveConfig(disp); mConsumer->setDefaultBufferSize(activeConfig->getWidth(), activeConfig->getHeight()); #else mConsumer->setDefaultBufferFormat(mHwc.getFormat(disp)); mConsumer->setDefaultBufferSize(mHwc.getWidth(disp), mHwc.getHeight(disp)); #endif mConsumer->setMaxAcquiredBufferCount(NUM_FRAMEBUFFER_SURFACE_BUFFERS - 1); } Loading @@ -88,6 +100,7 @@ status_t FramebufferSurface::prepareFrame(CompositionType /*compositionType*/) { } status_t FramebufferSurface::advanceFrame() { #ifdef USE_HWC2 sp<GraphicBuffer> buf; sp<Fence> acquireFence(Fence::NO_FENCE); android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN; Loading @@ -102,10 +115,20 @@ status_t FramebufferSurface::advanceFrame() { ALOGE("error posting framebuffer: %d", result); } return result; #else // Once we remove FB HAL support, we can call nextBuffer() from here // instead of using onFrameAvailable(). No real benefit, except it'll be // more like VirtualDisplaySurface. return NO_ERROR; #endif } #ifdef USE_HWC2 status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence, android_dataspace_t& outDataspace) { #else status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence) { #endif Mutex::Autolock lock(mMutex); BufferItem item; Loading @@ -128,9 +151,19 @@ status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, // had released the old buffer first. if (mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT && item.mSlot != mCurrentBufferSlot) { #ifdef USE_HWC2 mHasPendingRelease = true; mPreviousBufferSlot = mCurrentBufferSlot; mPreviousBuffer = mCurrentBuffer; #else // Release the previous buffer. err = releaseBufferLocked(mCurrentBufferSlot, mCurrentBuffer, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); if (err < NO_ERROR) { ALOGE("error releasing buffer: %s (%d)", strerror(-err), err); return err; } #endif } mCurrentBufferSlot = item.mSlot; mCurrentBuffer = mSlots[mCurrentBufferSlot].mGraphicBuffer; Loading @@ -138,10 +171,30 @@ status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, outFence = item.mFence; outBuffer = mCurrentBuffer; #ifdef USE_HWC2 outDataspace = item.mDataSpace; #endif return NO_ERROR; } #ifndef USE_HWC2 // Overrides ConsumerBase::onFrameAvailable(), does not call base class impl. void FramebufferSurface::onFrameAvailable(const BufferItem& /* item */) { sp<GraphicBuffer> buf; sp<Fence> acquireFence; status_t err = nextBuffer(buf, acquireFence); if (err != NO_ERROR) { ALOGE("error latching nnext FramebufferSurface buffer: %s (%d)", strerror(-err), err); return; } err = mHwc.fbPost(mDisplayType, acquireFence, buf); if (err != NO_ERROR) { ALOGE("error posting framebuffer: %d", err); } } #endif void FramebufferSurface::freeBufferLocked(int slotIndex) { ConsumerBase::freeBufferLocked(slotIndex); if (slotIndex == mCurrentBufferSlot) { Loading @@ -150,6 +203,7 @@ void FramebufferSurface::freeBufferLocked(int slotIndex) { } void FramebufferSurface::onFrameCommitted() { #ifdef USE_HWC2 if (mHasPendingRelease) { sp<Fence> fence = mHwc.getRetireFence(mDisplayType); if (fence->isValid()) { Loading @@ -166,7 +220,24 @@ void FramebufferSurface::onFrameCommitted() { mPreviousBuffer.clear(); mHasPendingRelease = false; } #else sp<Fence> fence = mHwc.getAndResetReleaseFence(mDisplayType); if (fence->isValid() && mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT) { status_t err = addReleaseFence(mCurrentBufferSlot, mCurrentBuffer, fence); ALOGE_IF(err, "setReleaseFenceFd: failed to add the fence: %s (%d)", strerror(-err), err); } #endif } #ifndef USE_HWC2 status_t FramebufferSurface::compositionComplete() { return mHwc.fbCompositionComplete(); } #endif void FramebufferSurface::dumpAsString(String8& result) const { ConsumerBase::dumpState(result); Loading @@ -174,6 +245,9 @@ void FramebufferSurface::dumpAsString(String8& result) const { void FramebufferSurface::dumpLocked(String8& result, const char* prefix) const { #ifndef USE_HWC2 mHwc.fbDump(result); #endif ConsumerBase::dumpLocked(result, prefix); } Loading Loading
services/surfaceflinger/Android.mk +15 −2 Original line number Diff line number Diff line Loading @@ -17,14 +17,12 @@ LOCAL_SRC_FILES := \ LayerDim.cpp \ MessageQueue.cpp \ MonitoredProducer.cpp \ SurfaceFlinger.cpp \ SurfaceFlingerConsumer.cpp \ SurfaceInterceptor.cpp \ Transform.cpp \ DisplayHardware/FramebufferSurface.cpp \ DisplayHardware/HWC2.cpp \ DisplayHardware/HWC2On1Adapter.cpp \ DisplayHardware/HWComposer.cpp \ DisplayHardware/PowerHAL.cpp \ DisplayHardware/VirtualDisplaySurface.cpp \ Effects/Daltonizer.cpp \ Loading @@ -49,6 +47,17 @@ LOCAL_C_INCLUDES := \ LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\" LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES ifeq ($(TARGET_USES_HWC2),true) LOCAL_CFLAGS += -DUSE_HWC2 LOCAL_SRC_FILES += \ SurfaceFlinger.cpp \ DisplayHardware/HWComposer.cpp else LOCAL_SRC_FILES += \ SurfaceFlinger_hwc1.cpp \ DisplayHardware/HWComposer_hwc1.cpp endif ifeq ($(TARGET_BOARD_PLATFORM),omap4) LOCAL_CFLAGS += -DHAS_CONTEXT_PRIORITY endif Loading Loading @@ -155,6 +164,10 @@ ifneq ($(ENABLE_CPUSETS),) LOCAL_CFLAGS += -DENABLE_CPUSETS endif ifeq ($(TARGET_USES_HWC2),true) LOCAL_CFLAGS += -DUSE_HWC2 endif LOCAL_SRC_FILES := \ main_surfaceflinger.cpp Loading
services/surfaceflinger/DisplayDevice.cpp +74 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -72,6 +74,9 @@ DisplayDevice::DisplayDevice( 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, Loading @@ -87,6 +92,9 @@ DisplayDevice::DisplayDevice( mSurface(EGL_NO_SURFACE), mDisplayWidth(), mDisplayHeight(), #ifndef USE_HWC2 mFormat(), #endif mFlags(), mPageFlipCount(), mIsSecure(isSecure), Loading @@ -106,7 +114,11 @@ DisplayDevice::DisplayDevice( 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); Loading @@ -125,6 +137,9 @@ DisplayDevice::DisplayDevice( mConfig = config; mDisplay = display; mSurface = eglSurface; #ifndef USE_HWC2 mFormat = format; #endif mPageFlipCount = 0; mViewport.makeInvalid(); mFrame.makeInvalid(); Loading Loading @@ -165,6 +180,10 @@ DisplayDevice::~DisplayDevice() { void DisplayDevice::disconnect(HWComposer& hwc) { if (mHwcDisplayId >= 0) { hwc.disconnectDisplay(mHwcDisplayId); #ifndef USE_HWC2 if (mHwcDisplayId >= DISPLAY_VIRTUAL) hwc.freeDisplayId(mHwcDisplayId); #endif mHwcDisplayId = -1; } } Loading @@ -181,6 +200,12 @@ int DisplayDevice::getHeight() const { return mDisplayHeight; } #ifndef USE_HWC2 PixelFormat DisplayDevice::getFormat() const { return mFormat; } #endif EGLSurface DisplayDevice::getEGLSurface() const { return mSurface; } Loading @@ -196,6 +221,12 @@ uint32_t DisplayDevice::getPageFlipCount() const { return mPageFlipCount; } #ifndef USE_HWC2 status_t DisplayDevice::compositionComplete() const { return mDisplaySurface->compositionComplete(); } #endif void DisplayDevice::flip(const Region& dirty) const { mFlinger->getRenderEngine().checkErrors(); Loading @@ -216,6 +247,7 @@ status_t DisplayDevice::beginFrame(bool mustRecompose) const { return mDisplaySurface->beginFrame(mustRecompose); } #ifdef USE_HWC2 status_t DisplayDevice::prepareFrame(HWComposer& hwc) { status_t error = hwc.prepare(*this); if (error != NO_ERROR) { Loading @@ -239,9 +271,41 @@ status_t DisplayDevice::prepareFrame(HWComposer& hwc) { } 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(); Loading @@ -263,9 +327,17 @@ void DisplayDevice::swapBuffers(HWComposer& hwc) const { } } #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 { Loading Loading @@ -343,6 +415,7 @@ int DisplayDevice::getActiveConfig() const { } // ---------------------------------------------------------------------------- #ifdef USE_HWC2 void DisplayDevice::setActiveColorMode(android_color_mode_t mode) { mActiveColorMode = mode; } Loading @@ -350,6 +423,7 @@ void DisplayDevice::setActiveColorMode(android_color_mode_t mode) { android_color_mode_t DisplayDevice::getActiveColorMode() const { return mActiveColorMode; } #endif // ---------------------------------------------------------------------------- Loading
services/surfaceflinger/DisplayDevice.h +31 −0 Original line number Diff line number Diff line Loading @@ -21,20 +21,27 @@ #include <stdlib.h> #ifndef USE_HWC2 #include <ui/PixelFormat.h> #endif #include <ui/Region.h> #include <EGL/egl.h> #include <EGL/eglext.h> #ifdef USE_HWC2 #include <binder/IBinder.h> #include <utils/RefBase.h> #endif #include <utils/Mutex.h> #include <utils/String8.h> #include <utils/Timers.h> #include <hardware/hwcomposer_defs.h> #ifdef USE_HWC2 #include <memory> #endif struct ANativeWindow; Loading Loading @@ -80,6 +87,9 @@ public: 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, Loading @@ -102,6 +112,9 @@ public: int getWidth() const; int getHeight() const; #ifndef USE_HWC2 PixelFormat getFormat() const; #endif uint32_t getFlags() const; EGLSurface getEGLSurface() const; Loading Loading @@ -131,12 +144,23 @@ public: // We pass in mustRecompose so we can keep VirtualDisplaySurface's state // machine happy without actually queueing a buffer if nothing has changed status_t beginFrame(bool mustRecompose) const; #ifdef USE_HWC2 status_t prepareFrame(HWComposer& hwc); #else status_t prepareFrame(const HWComposer& hwc) const; #endif void swapBuffers(HWComposer& hwc) const; #ifndef USE_HWC2 status_t compositionComplete() const; #endif // called after h/w composer has completed its set() call #ifdef USE_HWC2 void onSwapBuffersCompleted() const; #else void onSwapBuffersCompleted(HWComposer& hwc) const; #endif Rect getBounds() const { return Rect(mDisplayWidth, mDisplayHeight); Loading @@ -158,8 +182,10 @@ public: void setPowerMode(int mode); bool isDisplayOn() const; #ifdef USE_HWC2 android_color_mode_t getActiveColorMode() const; void setActiveColorMode(android_color_mode_t mode); #endif /* ------------------------------------------------------------------------ * Display active config management. Loading Loading @@ -194,6 +220,9 @@ private: EGLSurface mSurface; int mDisplayWidth; int mDisplayHeight; #ifndef USE_HWC2 PixelFormat mFormat; #endif uint32_t mFlags; mutable uint32_t mPageFlipCount; String8 mDisplayName; Loading Loading @@ -228,8 +257,10 @@ private: int mPowerMode; // Current active config int mActiveConfig; #ifdef USE_HWC2 // current active color mode android_color_mode_t mActiveColorMode; #endif }; struct DisplayDeviceState { Loading
services/surfaceflinger/DisplayHardware/DisplaySurface.h +8 −0 Original line number Diff line number Diff line Loading @@ -49,6 +49,14 @@ public: }; virtual status_t prepareFrame(CompositionType compositionType) = 0; #ifndef USE_HWC2 // Should be called when composition rendering is complete for a frame (but // eglSwapBuffers hasn't necessarily been called). Required by certain // older drivers for synchronization. // TODO: Remove this when we drop support for HWC 1.0. virtual status_t compositionComplete() = 0; #endif // Inform the surface that GLES composition is complete for this frame, and // the surface should make sure that HWComposer has the correct buffer for // this frame. Some implementations may only push a new buffer to Loading
services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp +74 −0 Original line number Diff line number Diff line Loading @@ -62,20 +62,32 @@ FramebufferSurface::FramebufferSurface(HWComposer& hwc, int disp, mCurrentBufferSlot(-1), mCurrentBuffer(), mCurrentFence(Fence::NO_FENCE), #ifdef USE_HWC2 mHwc(hwc), mHasPendingRelease(false), mPreviousBufferSlot(BufferQueue::INVALID_BUFFER_SLOT), mPreviousBuffer() #else mHwc(hwc) #endif { #ifdef USE_HWC2 ALOGV("Creating for display %d", disp); #endif mName = "FramebufferSurface"; mConsumer->setConsumerName(mName); mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_FB | GRALLOC_USAGE_HW_RENDER | GRALLOC_USAGE_HW_COMPOSER); #ifdef USE_HWC2 const auto& activeConfig = mHwc.getActiveConfig(disp); mConsumer->setDefaultBufferSize(activeConfig->getWidth(), activeConfig->getHeight()); #else mConsumer->setDefaultBufferFormat(mHwc.getFormat(disp)); mConsumer->setDefaultBufferSize(mHwc.getWidth(disp), mHwc.getHeight(disp)); #endif mConsumer->setMaxAcquiredBufferCount(NUM_FRAMEBUFFER_SURFACE_BUFFERS - 1); } Loading @@ -88,6 +100,7 @@ status_t FramebufferSurface::prepareFrame(CompositionType /*compositionType*/) { } status_t FramebufferSurface::advanceFrame() { #ifdef USE_HWC2 sp<GraphicBuffer> buf; sp<Fence> acquireFence(Fence::NO_FENCE); android_dataspace_t dataspace = HAL_DATASPACE_UNKNOWN; Loading @@ -102,10 +115,20 @@ status_t FramebufferSurface::advanceFrame() { ALOGE("error posting framebuffer: %d", result); } return result; #else // Once we remove FB HAL support, we can call nextBuffer() from here // instead of using onFrameAvailable(). No real benefit, except it'll be // more like VirtualDisplaySurface. return NO_ERROR; #endif } #ifdef USE_HWC2 status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence, android_dataspace_t& outDataspace) { #else status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, sp<Fence>& outFence) { #endif Mutex::Autolock lock(mMutex); BufferItem item; Loading @@ -128,9 +151,19 @@ status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, // had released the old buffer first. if (mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT && item.mSlot != mCurrentBufferSlot) { #ifdef USE_HWC2 mHasPendingRelease = true; mPreviousBufferSlot = mCurrentBufferSlot; mPreviousBuffer = mCurrentBuffer; #else // Release the previous buffer. err = releaseBufferLocked(mCurrentBufferSlot, mCurrentBuffer, EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); if (err < NO_ERROR) { ALOGE("error releasing buffer: %s (%d)", strerror(-err), err); return err; } #endif } mCurrentBufferSlot = item.mSlot; mCurrentBuffer = mSlots[mCurrentBufferSlot].mGraphicBuffer; Loading @@ -138,10 +171,30 @@ status_t FramebufferSurface::nextBuffer(sp<GraphicBuffer>& outBuffer, outFence = item.mFence; outBuffer = mCurrentBuffer; #ifdef USE_HWC2 outDataspace = item.mDataSpace; #endif return NO_ERROR; } #ifndef USE_HWC2 // Overrides ConsumerBase::onFrameAvailable(), does not call base class impl. void FramebufferSurface::onFrameAvailable(const BufferItem& /* item */) { sp<GraphicBuffer> buf; sp<Fence> acquireFence; status_t err = nextBuffer(buf, acquireFence); if (err != NO_ERROR) { ALOGE("error latching nnext FramebufferSurface buffer: %s (%d)", strerror(-err), err); return; } err = mHwc.fbPost(mDisplayType, acquireFence, buf); if (err != NO_ERROR) { ALOGE("error posting framebuffer: %d", err); } } #endif void FramebufferSurface::freeBufferLocked(int slotIndex) { ConsumerBase::freeBufferLocked(slotIndex); if (slotIndex == mCurrentBufferSlot) { Loading @@ -150,6 +203,7 @@ void FramebufferSurface::freeBufferLocked(int slotIndex) { } void FramebufferSurface::onFrameCommitted() { #ifdef USE_HWC2 if (mHasPendingRelease) { sp<Fence> fence = mHwc.getRetireFence(mDisplayType); if (fence->isValid()) { Loading @@ -166,7 +220,24 @@ void FramebufferSurface::onFrameCommitted() { mPreviousBuffer.clear(); mHasPendingRelease = false; } #else sp<Fence> fence = mHwc.getAndResetReleaseFence(mDisplayType); if (fence->isValid() && mCurrentBufferSlot != BufferQueue::INVALID_BUFFER_SLOT) { status_t err = addReleaseFence(mCurrentBufferSlot, mCurrentBuffer, fence); ALOGE_IF(err, "setReleaseFenceFd: failed to add the fence: %s (%d)", strerror(-err), err); } #endif } #ifndef USE_HWC2 status_t FramebufferSurface::compositionComplete() { return mHwc.fbCompositionComplete(); } #endif void FramebufferSurface::dumpAsString(String8& result) const { ConsumerBase::dumpState(result); Loading @@ -174,6 +245,9 @@ void FramebufferSurface::dumpAsString(String8& result) const { void FramebufferSurface::dumpLocked(String8& result, const char* prefix) const { #ifndef USE_HWC2 mHwc.fbDump(result); #endif ConsumerBase::dumpLocked(result, prefix); } Loading