From 94e35b93537c7f9da018688ac8a8ba87f4689915 Mon Sep 17 00:00:00 2001 From: Steven Thomas Date: Wed, 26 Jul 2017 18:48:28 -0700 Subject: Use a separate hwcomposer hidl instance for vr flinger Improve robustness of vr flinger <--> surface flinger switching by having vr flinger use a separate hardware composer hidl instance instead of sharing the instance with surface flinger. Sharing the hardware composer instance has proven to be error prone, with situations where both the vr flinger thread and surface flinger main thread would write to the composer at the same time, causing hard to diagnose crashes (b/62925812). Instead of sharing the hardware composer instance, when switching to vr flinger we now delete the existing instance, create a new instance directed to the vr hardware composer shim, and vr flinger creates its own composer instance connected to the real hardware composer. By creating a separate composer instance for vr flinger, crashes like the ones found in b/62925812 are no longer impossible. Most of the changes in this commit are related to enabling surface flinger to delete HWComposer instances cleanly. In particular: - Previously the hardware composer callbacks (which come in on a hwbinder thread) would land in HWC2::Device and bubble up to the SurfaceFlinger object. But with the new behavior the HWC2::Device might be dead or in the process of being destroyed, so instead we have SurfaceFlinger receive the composer callbacks directly, and forward them to HWComposer and HWC2::Device. We include a composer id field in the callbacks so surface flinger can ignore stale callbacks from dead composer instances. - Object ownership for HWC2::Display and HWC2::Layer was shared by passing around shared_ptrs to these objects. This was problematic because they referenced and used the HWC2::Device, which can now be destroyed when switching to vr flinger. Simplify the ownership model by having HWC2::Device own (via unique_ptr<>) instances of HWC2::Display, which owns (again via unique_ptr<>) instances of HWC2::Layer. In cases where we previously passed std::shared_ptr<> to HWC2::Display or HWC2::Layer, instead pass non-owning HWC2::Display* and HWC2::Layer* pointers. This ensures clean composer instance teardown with no stale references to the deleted HWC2::Device. - When the hardware composer instance is destroyed and the HWC2::Layers are removed, notify the android::Layer via a callback, so it can remove the HWC2::Layer from its internal table of hardware composer layers. This removes the burden to explicitly clear out all hardware composer layers when switching to vr flinger, which has been a source of bugs. - We were missing an mStateLock lock in SurfaceFlinger::setVsyncEnabled(), which was necessary to ensure we were setting vsync on the correct hardware composer instance. Once that lock was added, surface flinger would sometimes deadlock when transitioning to vr flinger, because the surface flinger main thread would acquire mStateLock and then EventControlThread::mMutex, whereas the event control thread would acquire the locks in the opposite order. The changes in EventControlThread.cpp are to ensure it doesn't hold a lock on EventControlThread::mMutex while calling setVsyncEnabled(), to avoid the deadlock. I found that without a composer callback registered in vr flinger the vsync_event file wasn't getting vsync timestamps written, so vr flinger would get stuck in an infinite loop trying to parse a vsync timestamp. Since we need to have a callback anyway I changed the code in hardware_composer.cpp to get the vsync timestamp from the callback, as surface flinger does. I confirmed the timestamps are the same with either method, and this lets us remove some extra code for extracting the vsync timestamp that (probably) wasn't compatible with all devices we want to run on anyway. I also added a timeout to the vysnc wait so we'll see an error message in the log if we fail to wait for vsync, instead of looping forever. Bug: 62925812 Test: - Confirmed surface flinger <--> vr flinger switching is robust by switching devices on and off hundreds of times and observing no hardware composer related issues, surface flinger crashes, or hardware composer service crashes. - Confirmed 2d in vr works as before by going through the OOBE flow on a standalone. This also exercises virtual display creation and usage through surface flinger. - Added logs to confirm perfect layer/display cleanup when destroying hardware composer instances. - Tested normal 2d phone usage to confirm basic layer create/destroy functionality works as before. - Monitored surface flinger file descriptor usage across dozens of surface flinger <--> vr flinger transitions and observed no file descriptor leaks. - Confirmed the HWC1 code path still compiles. - Ran the surface flinger tests and confirmed there are no new test failures. - Ran the hardware composer hidl in passthrough mode on a Marlin and confirmed it works. - Ran CTS tests for virtual displays and confirmed they all pass. - Tested Android Auto and confirmed basic graphics functionality still works. Change-Id: I17dc0e060bfb5cb447ffbaa573b279fc6d2d8bd1 --- services/surfaceflinger/EventControlThread.cpp | 43 +++++++++++++------------- 1 file changed, 22 insertions(+), 21 deletions(-) (limited to 'services/surfaceflinger/EventControlThread.cpp') diff --git a/services/surfaceflinger/EventControlThread.cpp b/services/surfaceflinger/EventControlThread.cpp index ee6e886d12..052a959724 100644 --- a/services/surfaceflinger/EventControlThread.cpp +++ b/services/surfaceflinger/EventControlThread.cpp @@ -31,34 +31,35 @@ void EventControlThread::setVsyncEnabled(bool enabled) { } bool EventControlThread::threadLoop() { - Mutex::Autolock lock(mMutex); - - bool vsyncEnabled = mVsyncEnabled; - -#ifdef USE_HWC2 - mFlinger->setVsyncEnabled(HWC_DISPLAY_PRIMARY, mVsyncEnabled); -#else - mFlinger->eventControl(HWC_DISPLAY_PRIMARY, SurfaceFlinger::EVENT_VSYNC, - mVsyncEnabled); -#endif + enum class VsyncState {Unset, On, Off}; + auto currentVsyncState = VsyncState::Unset; while (true) { - status_t err = mCond.wait(mMutex); - if (err != NO_ERROR) { - ALOGE("error waiting for new events: %s (%d)", - strerror(-err), err); - return false; + auto requestedVsyncState = VsyncState::On; + { + Mutex::Autolock lock(mMutex); + requestedVsyncState = + mVsyncEnabled ? VsyncState::On : VsyncState::Off; + while (currentVsyncState == requestedVsyncState) { + status_t err = mCond.wait(mMutex); + if (err != NO_ERROR) { + ALOGE("error waiting for new events: %s (%d)", + strerror(-err), err); + return false; + } + requestedVsyncState = + mVsyncEnabled ? VsyncState::On : VsyncState::Off; + } } - if (vsyncEnabled != mVsyncEnabled) { + bool enable = requestedVsyncState == VsyncState::On; #ifdef USE_HWC2 - mFlinger->setVsyncEnabled(HWC_DISPLAY_PRIMARY, mVsyncEnabled); + mFlinger->setVsyncEnabled(HWC_DISPLAY_PRIMARY, enable); #else - mFlinger->eventControl(HWC_DISPLAY_PRIMARY, - SurfaceFlinger::EVENT_VSYNC, mVsyncEnabled); + mFlinger->eventControl(HWC_DISPLAY_PRIMARY, + SurfaceFlinger::EVENT_VSYNC, enable); #endif - vsyncEnabled = mVsyncEnabled; - } + currentVsyncState = requestedVsyncState; } return false; -- cgit v1.2.3-59-g8ed1b From 83ce7c162855742a2d9eeebc0cd70fe48d2cd125 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 19 Oct 2017 15:18:55 -0700 Subject: surfaceflinger: remove USE_HWC2 Remove USE_HWC2 and assume it to be true. Remove all !USE_HWC2 code. This also fixes a compile error in tests/fakehwc, which never defines USE_HWC2. Test: boots taimen and hikey960 Change-Id: Ie6d2fcf884aa6fc715ab0ce19a1e0f7c8acf734c --- services/surfaceflinger/Android.mk | 3 - services/surfaceflinger/BufferLayer.cpp | 55 ---------- services/surfaceflinger/BufferLayer.h | 12 --- services/surfaceflinger/ColorLayer.cpp | 2 - services/surfaceflinger/ColorLayer.h | 7 -- services/surfaceflinger/DisplayDevice.cpp | 79 -------------- services/surfaceflinger/DisplayDevice.h | 33 ------ .../DisplayHardware/DisplaySurface.h | 8 -- .../DisplayHardware/FramebufferSurface.cpp | 79 -------------- .../DisplayHardware/FramebufferSurface.h | 12 --- .../surfaceflinger/DisplayHardware/HWComposer.h | 6 -- .../DisplayHardware/VirtualDisplaySurface.cpp | 29 ------ .../DisplayHardware/VirtualDisplaySurface.h | 6 -- services/surfaceflinger/EventControlThread.cpp | 5 - services/surfaceflinger/Layer.cpp | 114 +-------------------- services/surfaceflinger/Layer.h | 23 ----- services/surfaceflinger/RenderArea.h | 4 +- .../RenderEngine/GLES20RenderEngine.cpp | 14 --- .../RenderEngine/GLES20RenderEngine.h | 2 - .../surfaceflinger/RenderEngine/RenderEngine.h | 2 - services/surfaceflinger/SurfaceFlinger.cpp | 2 - services/surfaceflinger/SurfaceFlinger.h | 50 --------- services/surfaceflinger/SurfaceFlingerConsumer.cpp | 6 -- services/surfaceflinger/SurfaceFlingerConsumer.h | 4 - .../tests/fakehwc/FakeComposerClient.h | 4 + 25 files changed, 6 insertions(+), 555 deletions(-) (limited to 'services/surfaceflinger/EventControlThread.cpp') diff --git a/services/surfaceflinger/Android.mk b/services/surfaceflinger/Android.mk index 469e5989ba..2a78aa597f 100644 --- a/services/surfaceflinger/Android.mk +++ b/services/surfaceflinger/Android.mk @@ -54,7 +54,6 @@ LOCAL_C_INCLUDES := \ LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\" LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES -LOCAL_CFLAGS += -DUSE_HWC2 LOCAL_CFLAGS += -fvisibility=hidden -Werror=format @@ -120,8 +119,6 @@ LOCAL_CFLAGS := -DLOG_TAG=\"SurfaceFlinger\" LOCAL_INIT_RC := surfaceflinger.rc -LOCAL_CFLAGS += -DUSE_HWC2 - LOCAL_SRC_FILES := \ main_surfaceflinger.cpp diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index fc0949dd90..0c1693b53b 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -61,9 +61,7 @@ BufferLayer::BufferLayer(SurfaceFlinger* flinger, const sp& client, cons mPreviousFrameNumber(0), mUpdateTexImageFailed(false), mRefreshPending(false) { -#ifdef USE_HWC2 ALOGV("Creating Layer %s", name.string()); -#endif mFlinger->getRenderEngine().genTextures(1, &mTextureName); mTexture.init(Texture::TEXTURE_EXTERNAL, mTextureName); @@ -90,14 +88,12 @@ BufferLayer::~BufferLayer() { } mFlinger->deleteTextureAsync(mTextureName); -#ifdef USE_HWC2 if (!mHwcLayers.empty()) { ALOGE("Found stale hardware composer layers when destroying " "surface flinger layer %s", mName.string()); destroyAllHwcLayers(); } -#endif } void BufferLayer::useSurfaceDamage() { @@ -265,22 +261,12 @@ void BufferLayer::onDraw(const RenderArea& renderArea, const Region& clip, engine.disableTexturing(); } -#ifdef USE_HWC2 void BufferLayer::onLayerDisplayed(const sp& releaseFence) { if (mHwcLayers.empty()) { return; } mSurfaceFlingerConsumer->setReleaseFence(releaseFence); } -#else -void BufferLayer::onLayerDisplayed(const sp& /*hw*/, - HWComposer::HWCLayerInterface* layer) { - if (layer) { - layer->onDisplayed(); - mSurfaceFlingerConsumer->setReleaseFence(layer->getAndResetReleaseFence()); - } -} -#endif void BufferLayer::abandon() { mSurfaceFlingerConsumer->abandon(); @@ -376,7 +362,6 @@ bool BufferLayer::getTransformToDisplayInverse() const { return mSurfaceFlingerConsumer->getTransformToDisplayInverse(); } -#ifdef USE_HWC2 void BufferLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) { if (!mSurfaceFlingerConsumer->releasePendingBuffer()) { return; @@ -393,7 +378,6 @@ void BufferLayer::releasePendingBuffer(nsecs_t dequeueReadyTime) { std::move(releaseFenceTime)); } } -#endif Region BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime) { ATRACE_CALL(); @@ -523,16 +507,6 @@ Region BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime { Mutex::Autolock lock(mFrameEventHistoryMutex); mFrameEventHistory.addLatch(mCurrentFrameNumber, latchTime); -#ifndef USE_HWC2 - auto releaseFenceTime = - std::make_shared(mSurfaceFlingerConsumer->getPrevFinalReleaseFence()); - mReleaseTimeline.updateSignalTimes(); - mReleaseTimeline.push(releaseFenceTime); - if (mPreviousFrameNumber != 0) { - mFrameEventHistory.addRelease(mPreviousFrameNumber, latchTime, - std::move(releaseFenceTime)); - } -#endif } mRefreshPending = true; @@ -604,7 +578,6 @@ void BufferLayer::setDefaultBufferSize(uint32_t w, uint32_t h) { mSurfaceFlingerConsumer->setDefaultBufferSize(w, h); } -#ifdef USE_HWC2 void BufferLayer::setPerFrameData(const sp& displayDevice) { // Apply this display's projection's viewport to the visible region // before giving it to the HWC HAL. @@ -676,28 +649,6 @@ void BufferLayer::setPerFrameData(const sp& displayDevice) } } -#else -void BufferLayer::setAcquireFence(const sp& /* hw */, - HWComposer::HWCLayerInterface& layer) { - int fenceFd = -1; - - // TODO: there is a possible optimization here: we only need to set the - // acquire fence the first time a new buffer is acquired on EACH display. - - if (layer.getCompositionType() == HWC_OVERLAY || - layer.getCompositionType() == HWC_CURSOR_OVERLAY) { - sp fence = mSurfaceFlingerConsumer->getCurrentFence(); - if (fence->isValid()) { - fenceFd = fence->dup(); - if (fenceFd == -1) { - ALOGW("failed to dup layer fence, skipping sync: %d", errno); - } - } - } - layer.setAcquireFenceFd(fenceFd); -} -#endif - bool BufferLayer::isOpaque(const Layer::State& s) const { // if we don't have a buffer or sidebandStream yet, we're translucent regardless of the // layer's opaque flag. @@ -871,9 +822,7 @@ void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityT RenderEngine& engine(mFlinger->getRenderEngine()); engine.setupLayerBlending(mPremultipliedAlpha, isOpaque(s), false /* disableTexture */, getColor()); -#ifdef USE_HWC2 engine.setSourceDataSpace(mCurrentState.dataSpace); -#endif engine.drawMesh(mMesh); engine.disableBlending(); } @@ -913,7 +862,6 @@ uint64_t BufferLayer::getHeadFrameNumber() const { } bool BufferLayer::headFenceHasSignaled() const { -#ifdef USE_HWC2 if (latchUnsignaledBuffers()) { return true; } @@ -930,9 +878,6 @@ bool BufferLayer::headFenceHasSignaled() const { return true; } return mQueueItems[0].mFenceTime->getSignalTime() != Fence::SIGNAL_TIME_PENDING; -#else - return true; -#endif } uint32_t BufferLayer::getEffectiveScalingMode() const { diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index 418f032198..078302bc75 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -105,12 +105,7 @@ public: void onDraw(const RenderArea& renderArea, const Region& clip, bool useIdentityTransform) const override; -#ifdef USE_HWC2 void onLayerDisplayed(const sp& releaseFence) override; -#else - void onLayerDisplayed(const sp& hw, - HWComposer::HWCLayerInterface* layer) override; -#endif void abandon() override; bool shouldPresentNow(const DispSync& dispSync) const override; @@ -124,10 +119,8 @@ public: public: bool onPreComposition(nsecs_t refreshStartTime) override; -#ifdef USE_HWC2 // If a buffer was replaced this frame, release the former buffer void releasePendingBuffer(nsecs_t dequeueReadyTime); -#endif /* * latchBuffer - called each time the screen is redrawn and returns whether @@ -139,12 +132,7 @@ public: bool isBufferLatched() const override { return mRefreshPending; } void setDefaultBufferSize(uint32_t w, uint32_t h) override; -#ifdef USE_HWC2 void setPerFrameData(const sp& displayDevice) override; -#else - void setAcquireFence(const sp& hw, - HWComposer::HWCLayerInterface& layer) override; -#endif bool isOpaque(const Layer::State& s) const override; diff --git a/services/surfaceflinger/ColorLayer.cpp b/services/surfaceflinger/ColorLayer.cpp index 8a17f882d0..292e1a7350 100644 --- a/services/surfaceflinger/ColorLayer.cpp +++ b/services/surfaceflinger/ColorLayer.cpp @@ -61,7 +61,6 @@ bool ColorLayer::isVisible() const { return !isHiddenByPolicy() && s.color.a; } -#ifdef USE_HWC2 void ColorLayer::setPerFrameData(const sp& displayDevice) { const Transform& tr = displayDevice->getTransform(); const auto& viewport = displayDevice->getViewport(); @@ -89,7 +88,6 @@ void ColorLayer::setPerFrameData(const sp& displayDevice) { static_cast(error)); } } -#endif // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/ColorLayer.h b/services/surfaceflinger/ColorLayer.h index debd3c3869..4022b319fa 100644 --- a/services/surfaceflinger/ColorLayer.h +++ b/services/surfaceflinger/ColorLayer.h @@ -42,21 +42,14 @@ public: void notifyAvailableFrames() override {} PixelFormat getPixelFormat() const override { return PIXEL_FORMAT_NONE; } uint32_t getEffectiveScalingMode() const override { return 0; } -#ifdef USE_HWC2 void releasePendingBuffer(nsecs_t) override {} -#endif Region latchBuffer(bool&, nsecs_t) override { return Region(); } void useSurfaceDamage() override {} void useEmptyDamage() override {} bool isBufferLatched() const override { return false; } bool onPreComposition(nsecs_t) override { return true; } void abandon() override {} -#ifdef USE_HWC2 void setPerFrameData(const sp& displayDevice) override; -#else - void setAcquireFence(const sp& /*hw*/, - HWComposer::HWCLayerInterface& /*layer*/) override {} -#endif void setDefaultBufferSize(uint32_t /*w*/, uint32_t /*h*/) override {} bool shouldPresentNow(const DispSync& /*dispSync*/) const override { return false; } bool onPostComposition(const std::shared_ptr& /*glDoneFence*/, diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index 0244c1b862..ef7d482f28 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -38,9 +38,7 @@ #include "DisplayHardware/DisplaySurface.h" #include "DisplayHardware/HWComposer.h" -#ifdef USE_HWC2 #include "DisplayHardware/HWC2.h" -#endif #include "RenderEngine/RenderEngine.h" #include "clz.h" @@ -86,9 +84,6 @@ DisplayDevice::DisplayDevice( const sp& flinger, DisplayType type, int32_t hwcId, -#ifndef USE_HWC2 - int format, -#endif bool isSecure, const wp& displayToken, const sp& displaySurface, @@ -105,9 +100,6 @@ DisplayDevice::DisplayDevice( mSurface(EGL_NO_SURFACE), mDisplayWidth(), mDisplayHeight(), -#ifndef USE_HWC2 - mFormat(), -#endif mFlags(), mPageFlipCount(), mIsSecure(isSecure), @@ -121,12 +113,8 @@ DisplayDevice::DisplayDevice( mNativeWindow = surface = new Surface(producer, false); ANativeWindow* const window = mNativeWindow.get(); -#ifdef USE_HWC2 mActiveColorMode = HAL_COLOR_MODE_NATIVE; mDisplayHasWideColor = supportWideColor; -#else - (void) supportWideColor; -#endif /* * Create our display's surface */ @@ -134,13 +122,8 @@ 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, /*logConfig*/ false); -#else - config = RenderEngine::chooseEglConfig(display, format, - /*logConfig*/ false); -#endif } eglSurface = eglCreateWindowSurface(display, config, window, NULL); eglQuerySurface(display, eglSurface, EGL_WIDTH, &mDisplayWidth); @@ -159,9 +142,6 @@ DisplayDevice::DisplayDevice( mConfig = config; mDisplay = display; mSurface = eglSurface; -#ifndef USE_HWC2 - mFormat = format; -#endif mPageFlipCount = 0; mViewport.makeInvalid(); mFrame.makeInvalid(); @@ -202,10 +182,6 @@ 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; } } @@ -222,12 +198,6 @@ int DisplayDevice::getHeight() const { return mDisplayHeight; } -#ifndef USE_HWC2 -PixelFormat DisplayDevice::getFormat() const { - return mFormat; -} -#endif - EGLSurface DisplayDevice::getEGLSurface() const { return mSurface; } @@ -243,12 +213,6 @@ 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(); @@ -269,7 +233,6 @@ 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) { @@ -293,41 +256,9 @@ 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(); @@ -349,17 +280,9 @@ 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 { @@ -437,7 +360,6 @@ int DisplayDevice::getActiveConfig() const { } // ---------------------------------------------------------------------------- -#ifdef USE_HWC2 void DisplayDevice::setActiveColorMode(android_color_mode_t mode) { mActiveColorMode = mode; } @@ -450,7 +372,6 @@ void DisplayDevice::setCompositionDataSpace(android_dataspace dataspace) { ANativeWindow* const window = mNativeWindow.get(); native_window_set_buffers_data_space(window, dataspace); } -#endif // ---------------------------------------------------------------------------- diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index 49fef5805f..50e30b2571 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -21,18 +21,13 @@ #include -#ifndef USE_HWC2 -#include -#endif #include #include #include -#ifdef USE_HWC2 #include #include -#endif #include #include #include @@ -41,9 +36,7 @@ #include #include "RenderArea.h" -#ifdef USE_HWC2 #include -#endif struct ANativeWindow; @@ -90,9 +83,6 @@ public: const sp& flinger, DisplayType type, int32_t hwcId, -#ifndef USE_HWC2 - int format, -#endif bool isSecure, const wp& displayToken, const sp& displaySurface, @@ -117,9 +107,6 @@ public: int getWidth() const; int getHeight() const; -#ifndef USE_HWC2 - PixelFormat getFormat() const; -#endif uint32_t getFlags() const; EGLSurface getEGLSurface() const; @@ -150,24 +137,13 @@ 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); bool getWideColorSupport() const { return mDisplayHasWideColor; } -#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); @@ -189,11 +165,9 @@ public: void setPowerMode(int mode); bool isDisplayOn() const; -#ifdef USE_HWC2 android_color_mode_t getActiveColorMode() const; void setActiveColorMode(android_color_mode_t mode); void setCompositionDataSpace(android_dataspace dataspace); -#endif /* ------------------------------------------------------------------------ * Display active config management. @@ -228,9 +202,6 @@ private: EGLSurface mSurface; int mDisplayWidth; int mDisplayHeight; -#ifndef USE_HWC2 - PixelFormat mFormat; -#endif uint32_t mFlags; mutable uint32_t mPageFlipCount; String8 mDisplayName; @@ -269,7 +240,6 @@ private: int mPowerMode; // Current active config int mActiveConfig; -#ifdef USE_HWC2 // current active color mode android_color_mode_t mActiveColorMode; @@ -277,7 +247,6 @@ private: // Initialized by SurfaceFlinger when the DisplayDevice is created. // Fed to RenderEngine during composition. bool mDisplayHasWideColor; -#endif }; struct DisplayDeviceState { @@ -319,12 +288,10 @@ public: bool isSecure() const override { return mDevice->isSecure(); } bool needsFiltering() const override { return mDevice->needsFiltering(); } Rect getSourceCrop() const override { return mSourceCrop; } -#ifdef USE_HWC2 bool getWideColorSupport() const override { return mDevice->getWideColorSupport(); } android_color_mode_t getActiveColorMode() const override { return mDevice->getActiveColorMode(); } -#endif private: const sp mDevice; diff --git a/services/surfaceflinger/DisplayHardware/DisplaySurface.h b/services/surfaceflinger/DisplayHardware/DisplaySurface.h index cb08f084fe..f744f5cf21 100644 --- a/services/surfaceflinger/DisplayHardware/DisplaySurface.h +++ b/services/surfaceflinger/DisplayHardware/DisplaySurface.h @@ -50,14 +50,6 @@ 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 diff --git a/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp b/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp index 93c6d5486f..182629c97e 100644 --- a/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp +++ b/services/surfaceflinger/DisplayHardware/FramebufferSurface.cpp @@ -59,32 +59,21 @@ 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( SurfaceFlinger::maxFrameBufferAcquiredBuffers - 1); } @@ -98,7 +87,6 @@ status_t FramebufferSurface::prepareFrame(CompositionType /*compositionType*/) { } status_t FramebufferSurface::advanceFrame() { -#ifdef USE_HWC2 uint32_t slot = 0; sp buf; sp acquireFence(Fence::NO_FENCE); @@ -110,32 +98,18 @@ status_t FramebufferSurface::advanceFrame() { strerror(-result), 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(uint32_t& outSlot, sp& outBuffer, sp& outFence, android_dataspace_t& outDataspace) { -#else -status_t FramebufferSurface::nextBuffer(sp& outBuffer, sp& outFence) { -#endif Mutex::Autolock lock(mMutex); BufferItem item; status_t err = acquireBufferLocked(&item, 0); if (err == BufferQueue::NO_BUFFER_AVAILABLE) { -#ifdef USE_HWC2 mHwcBufferCache.getHwcBuffer(mCurrentBufferSlot, mCurrentBuffer, &outSlot, &outBuffer); -#else - outBuffer = mCurrentBuffer; -#endif return NO_ERROR; } else if (err != NO_ERROR) { ALOGE("error acquiring buffer: %s (%d)", strerror(-err), err); @@ -152,26 +126,15 @@ status_t FramebufferSurface::nextBuffer(sp& outBuffer, sp& // 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; mCurrentFence = item.mFence; outFence = item.mFence; -#ifdef USE_HWC2 mHwcBufferCache.getHwcBuffer(mCurrentBufferSlot, mCurrentBuffer, &outSlot, &outBuffer); outDataspace = item.mDataSpace; @@ -181,31 +144,10 @@ status_t FramebufferSurface::nextBuffer(sp& outBuffer, sp& ALOGE("error posting framebuffer: %d", result); return result; } -#else - outBuffer = mCurrentBuffer; -#endif return NO_ERROR; } -#ifndef USE_HWC2 -// Overrides ConsumerBase::onFrameAvailable(), does not call base class impl. -void FramebufferSurface::onFrameAvailable(const BufferItem& /* item */) { - sp buf; - sp 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) { @@ -214,7 +156,6 @@ void FramebufferSurface::freeBufferLocked(int slotIndex) { } void FramebufferSurface::onFrameCommitted() { -#ifdef USE_HWC2 if (mHasPendingRelease) { sp fence = mHwc.getPresentFence(mDisplayType); if (fence->isValid()) { @@ -231,24 +172,7 @@ void FramebufferSurface::onFrameCommitted() { mPreviousBuffer.clear(); mHasPendingRelease = false; } -#else - sp 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 { Mutex::Autolock lock(mMutex); @@ -259,9 +183,6 @@ 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); } diff --git a/services/surfaceflinger/DisplayHardware/FramebufferSurface.h b/services/surfaceflinger/DisplayHardware/FramebufferSurface.h index a1756ca3c2..4186b7aac4 100644 --- a/services/surfaceflinger/DisplayHardware/FramebufferSurface.h +++ b/services/surfaceflinger/DisplayHardware/FramebufferSurface.h @@ -42,9 +42,6 @@ public: virtual status_t beginFrame(bool mustRecompose); virtual status_t prepareFrame(CompositionType compositionType); -#ifndef USE_HWC2 - virtual status_t compositionComplete(); -#endif virtual status_t advanceFrame(); virtual void onFrameCommitted(); virtual void dumpAsString(String8& result) const; @@ -58,9 +55,6 @@ public: private: virtual ~FramebufferSurface() { }; // this class cannot be overloaded -#ifndef USE_HWC2 - virtual void onFrameAvailable(const BufferItem& item); -#endif virtual void freeBufferLocked(int slotIndex); virtual void dumpLocked(String8& result, const char* prefix) const; @@ -68,12 +62,8 @@ private: // nextBuffer waits for and then latches the next buffer from the // BufferQueue and releases the previously latched buffer to the // BufferQueue. The new buffer is returned in the 'buffer' argument. -#ifdef USE_HWC2 status_t nextBuffer(uint32_t& outSlot, sp& outBuffer, sp& outFence, android_dataspace_t& outDataspace); -#else - status_t nextBuffer(sp& outBuffer, sp& outFence); -#endif // mDisplayType must match one of the HWC display types int mDisplayType; @@ -100,14 +90,12 @@ private: // Hardware composer, owned by SurfaceFlinger. HWComposer& mHwc; -#ifdef USE_HWC2 HWComposerBufferCache mHwcBufferCache; // Previous buffer to release after getting an updated retire fence bool mHasPendingRelease; int mPreviousBufferSlot; sp mPreviousBuffer; -#endif }; // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/DisplayHardware/HWComposer.h b/services/surfaceflinger/DisplayHardware/HWComposer.h index 3640bb5a98..3b6d931b5c 100644 --- a/services/surfaceflinger/DisplayHardware/HWComposer.h +++ b/services/surfaceflinger/DisplayHardware/HWComposer.h @@ -14,10 +14,6 @@ * limitations under the License. */ -#ifndef USE_HWC2 -#include "HWComposer_hwc1.h" -#else - #ifndef ANDROID_SF_HWCOMPOSER_H #define ANDROID_SF_HWCOMPOSER_H @@ -219,5 +215,3 @@ private: }; // namespace android #endif // ANDROID_SF_HWCOMPOSER_H - -#endif // #ifdef USE_HWC2 diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp index 1de5e48cb9..dba6f7cf9a 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp @@ -176,12 +176,6 @@ status_t VirtualDisplaySurface::prepareFrame(CompositionType compositionType) { return NO_ERROR; } -#ifndef USE_HWC2 -status_t VirtualDisplaySurface::compositionComplete() { - return NO_ERROR; -} -#endif - status_t VirtualDisplaySurface::advanceFrame() { if (mDisplayId < 0) return NO_ERROR; @@ -221,7 +215,6 @@ status_t VirtualDisplaySurface::advanceFrame() { status_t result = NO_ERROR; if (fbBuffer != NULL) { -#ifdef USE_HWC2 uint32_t hwcSlot = 0; sp hwcBuffer; mHwcBufferCache.getHwcBuffer(mFbProducerSlot, fbBuffer, @@ -230,9 +223,6 @@ status_t VirtualDisplaySurface::advanceFrame() { // TODO: Correctly propagate the dataspace from GL composition result = mHwc.setClientTarget(mDisplayId, hwcSlot, mFbFence, hwcBuffer, HAL_DATASPACE_UNKNOWN); -#else - result = mHwc.fbPost(mDisplayId, mFbFence, fbBuffer); -#endif } return result; @@ -246,22 +236,14 @@ void VirtualDisplaySurface::onFrameCommitted() { "Unexpected onFrameCommitted() in %s state", dbgStateStr()); mDbgState = DBG_STATE_IDLE; -#ifdef USE_HWC2 sp retireFence = mHwc.getPresentFence(mDisplayId); -#else - sp fbFence = mHwc.getAndResetReleaseFence(mDisplayId); -#endif if (mCompositionType == COMPOSITION_MIXED && mFbProducerSlot >= 0) { // release the scratch buffer back to the pool Mutex::Autolock lock(mMutex); int sslot = mapProducer2SourceSlot(SOURCE_SCRATCH, mFbProducerSlot); VDS_LOGV("onFrameCommitted: release scratch sslot=%d", sslot); -#ifdef USE_HWC2 addReleaseFenceLocked(sslot, mProducerBuffers[mFbProducerSlot], retireFence); -#else - addReleaseFenceLocked(sslot, mProducerBuffers[mFbProducerSlot], fbFence); -#endif releaseBufferLocked(sslot, mProducerBuffers[mFbProducerSlot], EGL_NO_DISPLAY, EGL_NO_SYNC_KHR); } @@ -269,9 +251,6 @@ void VirtualDisplaySurface::onFrameCommitted() { if (mOutputProducerSlot >= 0) { int sslot = mapProducer2SourceSlot(SOURCE_SINK, mOutputProducerSlot); QueueBufferOutput qbo; -#ifndef USE_HWC2 - sp outFence = mHwc.getLastRetireFence(mDisplayId); -#endif VDS_LOGV("onFrameCommitted: queue sink sslot=%d", sslot); if (mMustRecompose) { status_t result = mSource[SOURCE_SINK]->queueBuffer(sslot, @@ -280,11 +259,7 @@ void VirtualDisplaySurface::onFrameCommitted() { HAL_DATASPACE_UNKNOWN, Rect(mSinkBufferWidth, mSinkBufferHeight), NATIVE_WINDOW_SCALING_MODE_FREEZE, 0 /* transform */, -#ifdef USE_HWC2 retireFence), -#else - outFence), -#endif &qbo); if (result == NO_ERROR) { updateQueueBufferOutput(std::move(qbo)); @@ -294,11 +269,7 @@ void VirtualDisplaySurface::onFrameCommitted() { // through the motions of updating the display to keep our state // machine happy. We cancel the buffer to avoid triggering another // re-composition and causing an infinite loop. -#ifdef USE_HWC2 mSource[SOURCE_SINK]->cancelBuffer(sslot, retireFence); -#else - mSource[SOURCE_SINK]->cancelBuffer(sslot, outFence); -#endif } } diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h index 1671aba1d8..5c8aceae92 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.h @@ -84,9 +84,6 @@ public: // virtual status_t beginFrame(bool mustRecompose); virtual status_t prepareFrame(CompositionType compositionType); -#ifndef USE_HWC2 - virtual status_t compositionComplete(); -#endif virtual status_t advanceFrame(); virtual void onFrameCommitted(); virtual void dumpAsString(String8& result) const; @@ -253,10 +250,7 @@ private: bool mMustRecompose; -#ifdef USE_HWC2 HWComposerBufferCache mHwcBufferCache; -#endif - bool mForceHwcCopy; }; diff --git a/services/surfaceflinger/EventControlThread.cpp b/services/surfaceflinger/EventControlThread.cpp index 052a959724..02eea4769b 100644 --- a/services/surfaceflinger/EventControlThread.cpp +++ b/services/surfaceflinger/EventControlThread.cpp @@ -53,12 +53,7 @@ bool EventControlThread::threadLoop() { } bool enable = requestedVsyncState == VsyncState::On; -#ifdef USE_HWC2 mFlinger->setVsyncEnabled(HWC_DISPLAY_PRIMARY, enable); -#else - mFlinger->eventControl(HWC_DISPLAY_PRIMARY, - SurfaceFlinger::EVENT_VSYNC, enable); -#endif currentVsyncState = requestedVsyncState; } diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 80987a4f91..aa3100eb1d 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -85,9 +85,6 @@ Layer::Layer(SurfaceFlinger* flinger, const sp& client, const String8& n mFiltering(false), mNeedsFiltering(false), mMesh(Mesh::TRIANGLE_FAN, 4, 2, 2), -#ifndef USE_HWC2 - mIsGlesComposition(false), -#endif mProtectedByApp(false), mClientRef(client), mPotentialCursor(false), @@ -128,13 +125,9 @@ Layer::Layer(SurfaceFlinger* flinger, const sp& client, const String8& n // drawing state & current state are identical mDrawingState = mCurrentState; -#ifdef USE_HWC2 const auto& hwc = flinger->getHwComposer(); const auto& activeConfig = hwc.getActiveConfig(HWC_DISPLAY_PRIMARY); nsecs_t displayPeriod = activeConfig->getVsyncPeriod(); -#else - nsecs_t displayPeriod = flinger->getHwComposer().getRefreshPeriod(HWC_DISPLAY_PRIMARY); -#endif mFrameTracker.setDisplayRefreshPeriod(displayPeriod); CompositorTiming compositorTiming; @@ -157,12 +150,7 @@ Layer::~Layer() { * Layer. So, the implementation is done in BufferLayer. When called on a * ColorLayer object, it's essentially a NOP. */ -#ifdef USE_HWC2 void Layer::onLayerDisplayed(const sp& /*releaseFence*/) {} -#else -void Layer::onLayerDisplayed(const sp& /* hw */, - HWComposer::HWCLayerInterface* /*layer*/) {} -#endif void Layer::onRemovedFromCurrentState() { // the layer is removed from SF mCurrentState to mLayersPendingRemoval @@ -187,9 +175,7 @@ void Layer::onRemoved() { // the layer is removed from SF mLayersPendingRemoval abandon(); -#ifdef USE_HWC2 destroyAllHwcLayers(); -#endif for (const auto& child : mCurrentChildren) { child->onRemoved(); @@ -217,7 +203,6 @@ sp Layer::getHandle() { // h/w composer set-up // --------------------------------------------------------------------------- -#ifdef USE_HWC2 bool Layer::createHwcLayer(HWComposer* hwc, int32_t hwcId) { LOG_ALWAYS_FATAL_IF(mHwcLayers.count(hwcId) != 0, "Already have a layer for hwcId %d", hwcId); HWC2::Layer* layer = hwc->createLayer(hwcId); @@ -254,7 +239,6 @@ void Layer::destroyAllHwcLayers() { LOG_ALWAYS_FATAL_IF(!mHwcLayers.empty(), "All hardware composer layers should have been destroyed"); } -#endif Rect Layer::getContentCrop() const { // this is the crop rectangle that applies to the buffer @@ -470,21 +454,12 @@ FloatRect Layer::computeCrop(const sp& hw) const { return crop; } -#ifdef USE_HWC2 void Layer::setGeometry(const sp& displayDevice, uint32_t z) -#else -void Layer::setGeometry(const sp& hw, HWComposer::HWCLayerInterface& layer) -#endif { -#ifdef USE_HWC2 const auto hwcId = displayDevice->getHwcDisplayId(); auto& hwcInfo = mHwcLayers[hwcId]; -#else - layer.setDefaultState(); -#endif // enable this layer -#ifdef USE_HWC2 hwcInfo.forceClientComposition = false; if (isSecure() && !displayDevice->isSecure()) { @@ -492,17 +467,9 @@ void Layer::setGeometry(const sp& hw, HWComposer::HWCLayerI } auto& hwcLayer = hwcInfo.layer; -#else - layer.setSkip(false); - - if (isSecure() && !hw->isSecure()) { - layer.setSkip(true); - } -#endif // this gives us only the "orientation" component of the transform const State& s(getDrawingState()); -#ifdef USE_HWC2 auto blendMode = HWC2::BlendMode::None; if (!isOpaque(s) || getAlpha() != 1.0f) { blendMode = @@ -514,11 +481,6 @@ void Layer::setGeometry(const sp& hw, HWComposer::HWCLayerI " %s (%d)", mName.string(), to_string(blendMode).c_str(), to_string(error).c_str(), static_cast(error)); -#else - if (!isOpaque(s) || getAlpha() != 1.0f) { - layer.setBlending(mPremultipliedAlpha ? HWC_BLENDING_PREMULT : HWC_BLENDING_COVERAGE); - } -#endif // apply the layer's transform, followed by the display's global transform // here we're guaranteed that the layer's transform preserves rects @@ -527,11 +489,7 @@ void Layer::setGeometry(const sp& hw, HWComposer::HWCLayerI if (!s.crop.isEmpty()) { Rect activeCrop(s.crop); activeCrop = t.transform(activeCrop); -#ifdef USE_HWC2 if (!activeCrop.intersect(displayDevice->getViewport(), &activeCrop)) { -#else - if (!activeCrop.intersect(hw->getViewport(), &activeCrop)) { -#endif activeCrop.clear(); } activeCrop = t.inverse().transform(activeCrop, true); @@ -558,7 +516,6 @@ void Layer::setGeometry(const sp& hw, HWComposer::HWCLayerI frame.clear(); } } -#ifdef USE_HWC2 if (!frame.intersect(displayDevice->getViewport(), &frame)) { frame.clear(); } @@ -607,15 +564,6 @@ void Layer::setGeometry(const sp& hw, HWComposer::HWCLayerI error = hwcLayer->setInfo(type, appId); ALOGE_IF(error != HWC2::Error::None, "[%s] Failed to set info (%d)", mName.string(), static_cast(error)); -#else - if (!frame.intersect(hw->getViewport(), &frame)) { - frame.clear(); - } - const Transform& tr(hw->getTransform()); - layer.setFrame(tr.transform(frame)); - layer.setCrop(computeCrop(hw)); - layer.setPlaneAlpha(static_cast(std::round(255.0f * getAlpha()))); -#endif /* * Transformations are applied in this order: @@ -650,7 +598,6 @@ void Layer::setGeometry(const sp& hw, HWComposer::HWCLayerI // this gives us only the "orientation" component of the transform const uint32_t orientation = transform.getOrientation(); -#ifdef USE_HWC2 if (orientation & Transform::ROT_INVALID) { // we can only handle simple transformation hwcInfo.forceClientComposition = true; @@ -663,17 +610,8 @@ void Layer::setGeometry(const sp& hw, HWComposer::HWCLayerI mName.string(), to_string(transform).c_str(), to_string(error).c_str(), static_cast(error)); } -#else - if (orientation & Transform::ROT_INVALID) { - // we can only handle simple transformation - layer.setSkip(true); - } else { - layer.setTransform(orientation); - } -#endif } -#ifdef USE_HWC2 void Layer::forceClientComposition(int32_t hwcId) { if (mHwcLayers.count(hwcId) == 0) { ALOGE("forceClientComposition: no HWC layer found (%d)", hwcId); @@ -682,32 +620,7 @@ void Layer::forceClientComposition(int32_t hwcId) { mHwcLayers[hwcId].forceClientComposition = true; } -#else -void Layer::setPerFrameData(const sp& hw, - HWComposer::HWCLayerInterface& layer) { - // we have to set the visible region on every frame because - // we currently free it during onLayerDisplayed(), which is called - // after HWComposer::commit() -- every frame. - // Apply this display's projection's viewport to the visible region - // before giving it to the HWC HAL. - const Transform& tr = hw->getTransform(); - Region visible = tr.transform(visibleRegion.intersect(hw->getViewport())); - layer.setVisibleRegionScreen(visible); - layer.setSurfaceDamage(surfaceDamageRegion); - mIsGlesComposition = (layer.getCompositionType() == HWC_FRAMEBUFFER); - - if (mSidebandStream.get()) { - layer.setSidebandStream(mSidebandStream); - } else { - // NOTE: buffer can be NULL if the client never drew into this - // layer yet, or if we ran out of memory - layer.setBuffer(mActiveBuffer); - } -} -#endif - -#ifdef USE_HWC2 void Layer::updateCursorPosition(const sp& displayDevice) { auto hwcId = displayDevice->getHwcDisplayId(); if (mHwcLayers.count(hwcId) == 0 || getCompositionType(hwcId) != HWC2::Composition::Cursor) { @@ -740,28 +653,6 @@ void Layer::updateCursorPosition(const sp& displayDevice) { mName.string(), position.left, position.top, to_string(error).c_str(), static_cast(error)); } -#else -Rect Layer::getPosition(const sp& hw) { - // this gives us only the "orientation" component of the transform - const State& s(getCurrentState()); - - // apply the layer's transform, followed by the display's global transform - // here we're guaranteed that the layer's transform preserves rects - Rect win(s.active.w, s.active.h); - if (!s.crop.isEmpty()) { - win.intersect(s.crop, &win); - } - // subtract the transparent region and snap to the bounds - Rect bounds = reduce(win, s.activeTransparentRegion); - Rect frame(getTransform().transform(bounds)); - frame.intersect(hw->getViewport(), &frame); - if (!s.finalCrop.isEmpty()) { - frame.intersect(s.finalCrop, &frame); - } - const Transform& tr(hw->getTransform()); - return Rect(tr.transform(frame)); -} -#endif // --------------------------------------------------------------------------- // drawing... @@ -791,7 +682,6 @@ void Layer::clearWithOpenGL(const RenderArea& renderArea) const { clearWithOpenGL(renderArea, 0, 0, 0, 0); } -#ifdef USE_HWC2 void Layer::setCompositionType(int32_t hwcId, HWC2::Composition type, bool callIntoHwc) { if (mHwcLayers.count(hwcId) == 0) { ALOGE("setCompositionType called without a valid HWC layer"); @@ -843,7 +733,6 @@ bool Layer::getClearClientTarget(int32_t hwcId) const { } return mHwcLayers.at(hwcId).clearClientTarget; } -#endif bool Layer::addSyncPoint(const std::shared_ptr& point) { if (point->getFrameNumber() <= mCurrentFrameNumber) { @@ -1496,7 +1385,7 @@ LayerDebugInfo Layer::getLayerDebugInfo() const { info.mContentDirty = contentDirty; return info; } -#ifdef USE_HWC2 + void Layer::miniDumpHeader(String8& result) { result.append("----------------------------------------"); result.append("---------------------------------------\n"); @@ -1539,7 +1428,6 @@ void Layer::miniDump(String8& result, int32_t hwcId) const { result.append("- - - - - - - - - - - - - - - - - - - - "); result.append("- - - - - - - - - - - - - - - - - - - -\n"); } -#endif void Layer::dumpFrameStats(String8& result) const { mFrameTracker.dumpStats(result); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 0580b9f40f..c125a3c3e1 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -297,7 +297,6 @@ protected: public: virtual void setDefaultBufferSize(uint32_t w, uint32_t h) = 0; -#ifdef USE_HWC2 void setGeometry(const sp& displayDevice, uint32_t z); void forceClientComposition(int32_t hwcId); virtual void setPerFrameData(const sp& displayDevice) = 0; @@ -309,23 +308,11 @@ public: void setClearClientTarget(int32_t hwcId, bool clear); bool getClearClientTarget(int32_t hwcId) const; void updateCursorPosition(const sp& hw); -#else - void setGeometry(const sp& hw, HWComposer::HWCLayerInterface& layer); - void setPerFrameData(const sp& hw, HWComposer::HWCLayerInterface& layer); - virtual void setAcquireFence(const sp& hw, - HWComposer::HWCLayerInterface& layer) = 0; - Rect getPosition(const sp& hw); -#endif /* * called after page-flip */ -#ifdef USE_HWC2 virtual void onLayerDisplayed(const sp& releaseFence); -#else - virtual void onLayerDisplayed(const sp& hw, - HWComposer::HWCLayerInterface* layer); -#endif virtual void abandon() = 0; @@ -346,10 +333,8 @@ public: const std::shared_ptr& presentFence, const CompositorTiming& compositorTiming) = 0; -#ifdef USE_HWC2 // If a buffer was replaced this frame, release the former buffer virtual void releasePendingBuffer(nsecs_t dequeueReadyTime) = 0; -#endif /* * draw - performs some global clipping optimizations @@ -425,7 +410,6 @@ public: int32_t getQueuedFrameCount() const { return mQueuedFrames; } -#ifdef USE_HWC2 // ----------------------------------------------------------------------- bool createHwcLayer(HWComposer* hwc, int32_t hwcId); @@ -441,7 +425,6 @@ public: return mHwcLayers[hwcId].layer; } -#endif // ----------------------------------------------------------------------- void clearWithOpenGL(const RenderArea& renderArea) const; @@ -458,10 +441,8 @@ public: LayerDebugInfo getLayerDebugInfo() const; /* always call base class first */ -#ifdef USE_HWC2 static void miniDumpHeader(String8& result); void miniDump(String8& result, int32_t hwcId) const; -#endif void dumpFrameStats(String8& result) const; void dumpFrameEvents(String8& result); void clearFrameStats(); @@ -673,7 +654,6 @@ protected: bool mPendingRemoval = false; -#ifdef USE_HWC2 // HWC items, accessed from the main thread struct HWCInfo { HWCInfo() @@ -698,9 +678,6 @@ protected: // case we need to keep track. In non-mirror mode, a layer will have only one // HWCInfo. This map key is a display layerStack. std::unordered_map mHwcLayers; -#else - bool mIsGlesComposition; -#endif // page-flip thread (currently main thread) bool mProtectedByApp; // application requires protected path to external sink diff --git a/services/surfaceflinger/RenderArea.h b/services/surfaceflinger/RenderArea.h index faf1ec64f8..44b9dc9254 100644 --- a/services/surfaceflinger/RenderArea.h +++ b/services/surfaceflinger/RenderArea.h @@ -24,10 +24,8 @@ public: int getReqHeight() const { return mReqHeight; }; int getReqWidth() const { return mReqWidth; }; Transform::orientation_flags getRotationFlags() const { return mRotationFlags; }; -#ifdef USE_HWC2 virtual bool getWideColorSupport() const = 0; virtual android_color_mode_t getActiveColorMode() const = 0; -#endif status_t updateDimensions(); @@ -37,4 +35,4 @@ private: Transform::orientation_flags mRotationFlags; }; -} // namespace android \ No newline at end of file +} // namespace android diff --git a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp index daaa11e1d3..3ae7042230 100644 --- a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp +++ b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.cpp @@ -44,7 +44,6 @@ #include // --------------------------------------------------------------------------- -#ifdef USE_HWC2 bool checkGlError(const char* op, int lineNumber) { bool errorFound = false; GLint error = glGetError(); @@ -103,7 +102,6 @@ void writePPM(const char* basename, GLuint width, GLuint height) { } file.write(reinterpret_cast(outBuffer.data()), outBuffer.size()); } -#endif // --------------------------------------------------------------------------- namespace android { @@ -132,7 +130,6 @@ GLES20RenderEngine::GLES20RenderEngine(uint32_t featureFlags) : //mColorBlindnessCorrection = M; -#ifdef USE_HWC2 if (mPlatformHasWideColor) { // Compute sRGB to DisplayP3 color transform // NOTE: For now, we are limiting wide-color support to @@ -145,7 +142,6 @@ GLES20RenderEngine::GLES20RenderEngine(uint32_t featureFlags) : mat4 gamutTransform(srgbToP3); mSrgbToDisplayP3 = gamutTransform; } -#endif } GLES20RenderEngine::~GLES20RenderEngine() { @@ -222,7 +218,6 @@ void GLES20RenderEngine::setupLayerBlending(bool premultipliedAlpha, } } -#ifdef USE_HWC2 void GLES20RenderEngine::setColorMode(android_color_mode mode) { ALOGV("setColorMode: %s (0x%x)", decodeColorMode(mode).c_str(), mode); @@ -256,7 +251,6 @@ void GLES20RenderEngine::setWideColor(bool hasWideColor) { bool GLES20RenderEngine::usesWideColor() { return mUseWideColor; } -#endif void GLES20RenderEngine::setupLayerTexturing(const Texture& texture) { GLuint target = texture.getTextureTarget(); @@ -344,7 +338,6 @@ void GLES20RenderEngine::drawMesh(const Mesh& mesh) { mesh.getByteStride(), mesh.getPositions()); -#ifdef USE_HWC2 if (usesWideColor()) { Description wideColorState = mState; if (mDataSpace != HAL_DATASPACE_DISPLAY_P3) { @@ -366,11 +359,6 @@ void GLES20RenderEngine::drawMesh(const Mesh& mesh) { glDrawArrays(mesh.getPrimitive(), 0, mesh.getVertexCount()); } -#else - ProgramCache::getInstance().useProgram(mState); - - glDrawArrays(mesh.getPrimitive(), 0, mesh.getVertexCount()); -#endif if (mesh.getTexCoordsSize()) { glDisableVertexAttribArray(Program::texCoords); @@ -379,13 +367,11 @@ void GLES20RenderEngine::drawMesh(const Mesh& mesh) { void GLES20RenderEngine::dump(String8& result) { RenderEngine::dump(result); -#ifdef USE_HWC2 if (usesWideColor()) { result.append("Wide-color: On\n"); } else { result.append("Wide-color: Off\n"); } -#endif } // --------------------------------------------------------------------------- diff --git a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.h b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.h index 5ac12fc3d6..b96bfe0f99 100644 --- a/services/surfaceflinger/RenderEngine/GLES20RenderEngine.h +++ b/services/surfaceflinger/RenderEngine/GLES20RenderEngine.h @@ -70,7 +70,6 @@ protected: Transform::orientation_flags rotation); virtual void setupLayerBlending(bool premultipliedAlpha, bool opaque, bool disableTexture, const half4& color) override; -#ifdef USE_HWC2 // Color management related functions and state void setColorMode(android_color_mode mode); @@ -91,7 +90,6 @@ protected: // Currently only supporting sRGB and DisplayP3 color spaces mat4 mSrgbToDisplayP3; -#endif bool mPlatformHasWideColor = false; virtual void setupLayerTexturing(const Texture& texture); diff --git a/services/surfaceflinger/RenderEngine/RenderEngine.h b/services/surfaceflinger/RenderEngine/RenderEngine.h index fa65979edd..7e05cec7d6 100644 --- a/services/surfaceflinger/RenderEngine/RenderEngine.h +++ b/services/surfaceflinger/RenderEngine/RenderEngine.h @@ -101,12 +101,10 @@ public: Rect sourceCrop, size_t hwh, bool yswap, Transform::orientation_flags rotation) = 0; virtual void setupLayerBlending(bool premultipliedAlpha, bool opaque, bool disableTexture, const half4& color) = 0; -#ifdef USE_HWC2 virtual void setColorMode(android_color_mode mode) = 0; virtual void setSourceDataSpace(android_dataspace source) = 0; virtual void setWideColor(bool hasWideColor) = 0; virtual bool usesWideColor() = 0; -#endif virtual void setupLayerTexturing(const Texture& texture) = 0; virtual void setupLayerBlackedOut() = 0; virtual void setupFillWithColor(float r, float g, float b, float a) = 0; diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index d13b188ab8..96ba5fb766 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -2675,12 +2675,10 @@ bool SurfaceFlinger::doComposeSurfaces( if (hasClientComposition) { ALOGV("hasClientComposition"); -#ifdef USE_HWC2 mRenderEngine->setWideColor( displayDevice->getWideColorSupport() && !mForceNativeColorMode); mRenderEngine->setColorMode(mForceNativeColorMode ? HAL_COLOR_MODE_NATIVE : displayDevice->getActiveColorMode()); -#endif if (!displayDevice->makeCurrent(mEGLDisplay, mEGLContext)) { ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s", displayDevice->getDisplayName().string()); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index d10b41bd34..67e4607012 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -63,12 +63,8 @@ #include "SurfaceTracing.h" #include "StartPropertySetThread.h" -#ifdef USE_HWC2 #include "DisplayHardware/HWC2.h" #include "DisplayHardware/HWComposer.h" -#else -#include "DisplayHardware/HWComposer_hwc1.h" -#endif #include "Effects/Daltonizer.h" @@ -117,11 +113,7 @@ enum { class SurfaceFlinger : public BnSurfaceComposer, public PriorityDumper, private IBinder::DeathRecipient, -#ifdef USE_HWC2 private HWC2::ComposerCallback -#else - private HWComposer::EventHandler -#endif { public: @@ -217,11 +209,7 @@ public: // enable/disable h/w composer event // TODO: this should be made accessible only to EventThread -#ifdef USE_HWC2 void setVsyncEnabled(int disp, int enabled); -#else - void eventControl(int disp, int event, int enabled); -#endif // called on the main thread by MessageQueue when an internal message // is received @@ -344,18 +332,12 @@ private: /* ------------------------------------------------------------------------ * HWC2::ComposerCallback / HWComposer::EventHandler interface */ -#ifdef USE_HWC2 void onVsyncReceived(int32_t sequenceId, hwc2_display_t display, int64_t timestamp) override; void onHotplugReceived(int32_t sequenceId, hwc2_display_t display, HWC2::Connection connection, bool primaryDisplay) override; void onRefreshReceived(int32_t sequenceId, hwc2_display_t display) override; -#else - void onVSyncReceived(HWComposer* composer, int type, nsecs_t timestamp) override; - void onHotplugReceived(HWComposer* composer, int disp, bool connected) override; - void onInvalidateReceived(HWComposer* composer) override; -#endif /* ------------------------------------------------------------------------ * Message handling @@ -372,12 +354,8 @@ private: // called on the main thread in response to setActiveConfig() void setActiveConfigInternal(const sp& hw, int mode); // called on the main thread in response to setPowerMode() -#ifdef USE_HWC2 void setPowerModeInternal(const sp& hw, int mode, bool stateLockHeld); -#else - void setPowerModeInternal(const sp& hw, int mode); -#endif // Called on the main thread in response to setActiveColorMode() void setActiveColorModeInternal(const sp& hw, android_color_mode_t colorMode); @@ -463,17 +441,10 @@ private: const sp& producer, bool useIdentityTransform); -#ifdef USE_HWC2 status_t captureScreenImplLocked(const RenderArea& renderArea, TraverseLayersFunction traverseLayers, ANativeWindowBuffer* buffer, bool useIdentityTransform, bool isLocalScreenshot, int* outSyncFd); -#else - status_t captureScreenImplLocked(const RenderArea& renderArea, - TraverseLayersFunction traverseLayers, - const sp& producer, - bool useIdentityTransform, bool isLocalScreenshot); -#endif void traverseLayersInDisplay(const sp& display, int32_t minLayerZ, int32_t maxLayerZ, const LayerVector::Visitor& visitor); @@ -540,10 +511,6 @@ private: // region of all screens presenting this layer stack. void invalidateLayerStack(const sp& layer, const Region& dirty); -#ifndef USE_HWC2 - int32_t allocateHwcDisplayId(DisplayDevice::DisplayType type); -#endif - /* ------------------------------------------------------------------------ * H/W composer */ @@ -642,7 +609,6 @@ private: } status_t doDump(int fd, const Vector& args, bool asProto); -#ifdef USE_HWC2 /* ------------------------------------------------------------------------ * VrFlinger */ @@ -650,7 +616,6 @@ private: // Check to see if we should handoff to vr flinger. void updateVrFlinger(); -#endif /* ------------------------------------------------------------------------ * Attributes @@ -695,9 +660,7 @@ private: // acquiring mStateLock. std::unique_ptr mHwc; -#ifdef USE_HWC2 const std::string mHwcServiceName; // "default" for real use, something else for testing. -#endif // constant members (no synchronization needed for access) RenderEngine* mRenderEngine; @@ -716,17 +679,11 @@ private: // don't need synchronization State mDrawingState{LayerVector::StateSet::Drawing}; bool mVisibleRegionsDirty; -#ifndef USE_HWC2 - bool mHwWorkListDirty; -#else bool mGeometryInvalid; -#endif bool mAnimCompositionPending; -#ifdef USE_HWC2 std::vector> mLayersWithQueuedFrames; sp mPreviousPresentFence = Fence::NO_FENCE; bool mHadClientComposition = false; -#endif FenceTimeline mGlCompositionDoneTimeline; FenceTimeline mDisplayTimeline; @@ -745,9 +702,7 @@ private: nsecs_t mLastTransactionTime; bool mBootFinished; bool mForceFullDamage; -#ifdef USE_HWC2 bool mPropagateBackpressure = true; -#endif SurfaceInterceptor mInterceptor; SurfaceTracing mTracing; bool mUseHwcVirtualDisplays = false; @@ -789,9 +744,6 @@ private: bool mInjectVSyncs; Daltonizer mDaltonizer; -#ifndef USE_HWC2 - bool mDaltonize; -#endif mat4 mPreviousColorMatrix; mat4 mColorMatrix; @@ -833,7 +785,6 @@ private: // either AID_GRAPHICS or AID_SYSTEM. status_t CheckTransactCodeCredentials(uint32_t code); -#ifdef USE_HWC2 std::unique_ptr mVrFlinger; std::atomic mVrFlingerRequestsDisplay; static bool useVrFlinger; @@ -842,7 +793,6 @@ private: // use to differentiate callbacks from different hardware composer // instances. Each hardware composer instance gets a different sequence id. int32_t mComposerSequenceId; -#endif float mSaturation = 1.0f; bool mForceNativeColorMode = false; diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.cpp b/services/surfaceflinger/SurfaceFlingerConsumer.cpp index abc8fde26b..e17bb58b31 100644 --- a/services/surfaceflinger/SurfaceFlingerConsumer.cpp +++ b/services/surfaceflinger/SurfaceFlingerConsumer.cpp @@ -89,11 +89,7 @@ status_t SurfaceFlingerConsumer::updateTexImage(BufferRejecter* rejecter, } // Release the previous buffer. -#ifdef USE_HWC2 err = updateAndReleaseLocked(item, &mPendingRelease); -#else - err = updateAndReleaseLocked(item); -#endif if (err != NO_ERROR) { return err; } @@ -197,7 +193,6 @@ sp SurfaceFlingerConsumer::getPrevFinalReleaseFence() const { return ConsumerBase::mPrevFinalReleaseFence; } -#ifdef USE_HWC2 void SurfaceFlingerConsumer::setReleaseFence(const sp& fence) { if (!mPendingRelease.isPending) { @@ -230,7 +225,6 @@ bool SurfaceFlingerConsumer::releasePendingBuffer() mPendingRelease = PendingRelease(); return true; } -#endif void SurfaceFlingerConsumer::setContentsChangedListener( const wp& listener) { diff --git a/services/surfaceflinger/SurfaceFlingerConsumer.h b/services/surfaceflinger/SurfaceFlingerConsumer.h index 1126233d60..53b4915426 100644 --- a/services/surfaceflinger/SurfaceFlingerConsumer.h +++ b/services/surfaceflinger/SurfaceFlingerConsumer.h @@ -81,10 +81,8 @@ public: nsecs_t computeExpectedPresent(const DispSync& dispSync); sp getPrevFinalReleaseFence() const; -#ifdef USE_HWC2 virtual void setReleaseFence(const sp& fence) override; bool releasePendingBuffer(); -#endif void onDisconnect() override; void addAndGetFrameTimestamps( @@ -104,11 +102,9 @@ private: // The portion of this surface that has changed since the previous frame Region mSurfaceDamage; -#ifdef USE_HWC2 // A release that is pending on the receipt of a new release fence from // presentDisplay PendingRelease mPendingRelease; -#endif // The layer for this SurfaceFlingerConsumer const wp mLayer; diff --git a/services/surfaceflinger/tests/fakehwc/FakeComposerClient.h b/services/surfaceflinger/tests/fakehwc/FakeComposerClient.h index 2a5a8ad03f..b94418281e 100644 --- a/services/surfaceflinger/tests/fakehwc/FakeComposerClient.h +++ b/services/surfaceflinger/tests/fakehwc/FakeComposerClient.h @@ -16,7 +16,11 @@ #pragma once +#define HWC2_USE_CPP11 +#define HWC2_INCLUDE_STRINGIFICATION #include "ComposerClient.h" +#undef HWC2_USE_CPP11 +#undef HWC2_INCLUDE_STRINGIFICATION #include "RenderState.h" // Needed for display type/ID enums -- cgit v1.2.3-59-g8ed1b From 78ce418ea76033a19663dcc0905e0390d21e5baf Mon Sep 17 00:00:00 2001 From: Lloyd Pique Date: Wed, 31 Jan 2018 16:39:51 -0800 Subject: SF: Clang format selected sources Bug: None Test: None Change-Id: Icef36ab31252e0e785d1088cbde2aaa0cf356fdf --- services/surfaceflinger/DispSync.cpp | 118 ++++++++++--------------- services/surfaceflinger/DispSync.h | 17 ++-- services/surfaceflinger/EventControlThread.cpp | 17 ++-- services/surfaceflinger/EventThread.cpp | 79 +++++++---------- services/surfaceflinger/EventThread.h | 21 ++--- services/surfaceflinger/MessageQueue.cpp | 41 ++++----- services/surfaceflinger/MessageQueue.h | 29 +++--- 7 files changed, 127 insertions(+), 195 deletions(-) (limited to 'services/surfaceflinger/EventControlThread.cpp') diff --git a/services/surfaceflinger/DispSync.cpp b/services/surfaceflinger/DispSync.cpp index bef12ea50f..b5fc365470 100644 --- a/services/surfaceflinger/DispSync.cpp +++ b/services/surfaceflinger/DispSync.cpp @@ -33,8 +33,8 @@ #include #include "DispSync.h" -#include "SurfaceFlinger.h" #include "EventLog/EventLog.h" +#include "SurfaceFlinger.h" using std::max; using std::min; @@ -53,15 +53,14 @@ static const bool kEnableZeroPhaseTracer = false; // needed to re-synchronize the software vsync model with the hardware. The // error metric used is the mean of the squared difference between each // present time and the nearest software-predicted vsync. -static const nsecs_t kErrorThreshold = 160000000000; // 400 usec squared +static const nsecs_t kErrorThreshold = 160000000000; // 400 usec squared #undef LOG_TAG #define LOG_TAG "DispSyncThread" -class DispSyncThread: public Thread { +class DispSyncThread : public Thread { public: - - explicit DispSyncThread(const char* name): - mName(name), + explicit DispSyncThread(const char* name) + : mName(name), mStop(false), mPeriod(0), mPhase(0), @@ -78,8 +77,8 @@ public: mPhase = phase; mReferenceTime = referenceTime; ALOGV("[%s] updateModel: mPeriod = %" PRId64 ", mPhase = %" PRId64 - " mReferenceTime = %" PRId64, mName, ns2us(mPeriod), - ns2us(mPhase), ns2us(mReferenceTime)); + " mReferenceTime = %" PRId64, + mName, ns2us(mPeriod), ns2us(mPhase), ns2us(mReferenceTime)); mCond.signal(); } @@ -115,8 +114,7 @@ public: if (mPeriod == 0) { err = mCond.wait(mMutex); if (err != NO_ERROR) { - ALOGE("error waiting for new events: %s (%d)", - strerror(-err), err); + ALOGE("error waiting for new events: %s (%d)", strerror(-err), err); return false; } continue; @@ -133,16 +131,14 @@ public: ALOGV("[%s] Waiting forever", mName); err = mCond.wait(mMutex); } else { - ALOGV("[%s] Waiting until %" PRId64, mName, - ns2us(targetTime)); + ALOGV("[%s] Waiting until %" PRId64, mName, ns2us(targetTime)); err = mCond.waitRelative(mMutex, targetTime - now); } if (err == TIMED_OUT) { isWakeup = true; } else if (err != NO_ERROR) { - ALOGE("error waiting for next event: %s (%d)", - strerror(-err), err); + ALOGE("error waiting for next event: %s (%d)", strerror(-err), err); return false; } } @@ -153,8 +149,7 @@ public: static const nsecs_t kMaxWakeupLatency = us2ns(1500); if (isWakeup) { - mWakeupLatency = ((mWakeupLatency * 63) + - (now - targetTime)) / 64; + mWakeupLatency = ((mWakeupLatency * 63) + (now - targetTime)) / 64; mWakeupLatency = min(mWakeupLatency, kMaxWakeupLatency); if (kTraceDetailedInfo) { ATRACE_INT64("DispSync:WakeupLat", now - targetTime); @@ -174,7 +169,7 @@ public: } status_t addEventListener(const char* name, nsecs_t phase, - const sp& callback) { + const sp& callback) { if (kTraceDetailedInfo) ATRACE_CALL(); Mutex::Autolock lock(mMutex); @@ -191,8 +186,7 @@ public: // We want to allow the firstmost future event to fire without // allowing any past events to fire - listener.mLastEventTime = systemTime() - mPeriod / 2 + mPhase - - mWakeupLatency; + listener.mLastEventTime = systemTime() - mPeriod / 2 + mPhase - mWakeupLatency; mEventListeners.push(listener); @@ -225,7 +219,6 @@ public: } private: - struct EventListener { const char* mName; nsecs_t mPhase; @@ -243,8 +236,7 @@ private: ALOGV("[%s] computeNextEventTimeLocked", mName); nsecs_t nextEventTime = INT64_MAX; for (size_t i = 0; i < mEventListeners.size(); i++) { - nsecs_t t = computeListenerNextEventTimeLocked(mEventListeners[i], - now); + nsecs_t t = computeListenerNextEventTimeLocked(mEventListeners[i], now); if (t < nextEventTime) { nextEventTime = t; @@ -257,22 +249,19 @@ private: Vector gatherCallbackInvocationsLocked(nsecs_t now) { if (kTraceDetailedInfo) ATRACE_CALL(); - ALOGV("[%s] gatherCallbackInvocationsLocked @ %" PRId64, mName, - ns2us(now)); + ALOGV("[%s] gatherCallbackInvocationsLocked @ %" PRId64, mName, ns2us(now)); Vector callbackInvocations; nsecs_t onePeriodAgo = now - mPeriod; for (size_t i = 0; i < mEventListeners.size(); i++) { - nsecs_t t = computeListenerNextEventTimeLocked(mEventListeners[i], - onePeriodAgo); + nsecs_t t = computeListenerNextEventTimeLocked(mEventListeners[i], onePeriodAgo); if (t < now) { CallbackInvocation ci; ci.mCallback = mEventListeners[i].mCallback; ci.mEventTime = t; - ALOGV("[%s] [%s] Preparing to fire", mName, - mEventListeners[i].mName); + ALOGV("[%s] [%s] Preparing to fire", mName, mEventListeners[i].mName); callbackInvocations.push(ci); mEventListeners.editItemAt(i).mLastEventTime = t; } @@ -281,18 +270,16 @@ private: return callbackInvocations; } - nsecs_t computeListenerNextEventTimeLocked(const EventListener& listener, - nsecs_t baseTime) { + nsecs_t computeListenerNextEventTimeLocked(const EventListener& listener, nsecs_t baseTime) { if (kTraceDetailedInfo) ATRACE_CALL(); - ALOGV("[%s] [%s] computeListenerNextEventTimeLocked(%" PRId64 ")", - mName, listener.mName, ns2us(baseTime)); + ALOGV("[%s] [%s] computeListenerNextEventTimeLocked(%" PRId64 ")", mName, listener.mName, + ns2us(baseTime)); nsecs_t lastEventTime = listener.mLastEventTime + mWakeupLatency; ALOGV("[%s] lastEventTime: %" PRId64, mName, ns2us(lastEventTime)); if (baseTime < lastEventTime) { baseTime = lastEventTime; - ALOGV("[%s] Clamping baseTime to lastEventTime -> %" PRId64, mName, - ns2us(baseTime)); + ALOGV("[%s] Clamping baseTime to lastEventTime -> %" PRId64, mName, ns2us(baseTime)); } baseTime -= mReferenceTime; @@ -374,11 +361,8 @@ private: bool mParity; }; -DispSync::DispSync(const char* name) : - mName(name), - mRefreshSkipCount(0), - mThread(new DispSyncThread(name)) { -} +DispSync::DispSync(const char* name) + : mName(name), mRefreshSkipCount(0), mThread(new DispSyncThread(name)) {} DispSync::~DispSync() {} @@ -451,8 +435,8 @@ bool DispSync::addResyncSample(nsecs_t timestamp) { mPhase = 0; mReferenceTime = timestamp; ALOGV("[%s] First resync sample: mPeriod = %" PRId64 ", mPhase = 0, " - "mReferenceTime = %" PRId64, mName, ns2us(mPeriod), - ns2us(mReferenceTime)); + "mReferenceTime = %" PRId64, + mName, ns2us(mPeriod), ns2us(mReferenceTime)); mThread->updateModel(mPeriod, mPhase, mReferenceTime); } @@ -480,16 +464,13 @@ bool DispSync::addResyncSample(nsecs_t timestamp) { // Check against kErrorThreshold / 2 to add some hysteresis before having to // resync again bool modelLocked = mModelUpdated && mError < (kErrorThreshold / 2); - ALOGV("[%s] addResyncSample returning %s", mName, - modelLocked ? "locked" : "unlocked"); + ALOGV("[%s] addResyncSample returning %s", mName, modelLocked ? "locked" : "unlocked"); return !modelLocked; } -void DispSync::endResync() { -} +void DispSync::endResync() {} -status_t DispSync::addEventListener(const char* name, nsecs_t phase, - const sp& callback) { +status_t DispSync::addEventListener(const char* name, nsecs_t phase, const sp& callback) { Mutex::Autolock lock(mMutex); return mThread->addEventListener(name, phase, callback); } @@ -597,8 +578,7 @@ void DispSync::updateErrorLocked() { // call getSignalTime() periodically so the cache is updated when the // fence signals. nsecs_t time = mPresentFences[i]->getCachedSignalTime(); - if (time == Fence::SIGNAL_TIME_PENDING || - time == Fence::SIGNAL_TIME_INVALID) { + if (time == Fence::SIGNAL_TIME_PENDING || time == Fence::SIGNAL_TIME_INVALID) { continue; } @@ -622,9 +602,8 @@ void DispSync::updateErrorLocked() { mError = 0; // Use mod ACCEPTABLE_ZERO_ERR_SAMPLES_COUNT to avoid log spam. mZeroErrSamplesCount++; - ALOGE_IF( - (mZeroErrSamplesCount % ACCEPTABLE_ZERO_ERR_SAMPLES_COUNT) == 0, - "No present times for model error."); + ALOGE_IF((mZeroErrSamplesCount % ACCEPTABLE_ZERO_ERR_SAMPLES_COUNT) == 0, + "No present times for model error."); } if (kTraceDetailedInfo) { @@ -650,17 +629,14 @@ nsecs_t DispSync::computeNextRefresh(int periodOffset) const { void DispSync::dump(String8& result) const { Mutex::Autolock lock(mMutex); - result.appendFormat("present fences are %s\n", - mIgnorePresentFences ? "ignored" : "used"); - result.appendFormat("mPeriod: %" PRId64 " ns (%.3f fps; skipCount=%d)\n", - mPeriod, 1000000000.0 / mPeriod, mRefreshSkipCount); + result.appendFormat("present fences are %s\n", mIgnorePresentFences ? "ignored" : "used"); + result.appendFormat("mPeriod: %" PRId64 " ns (%.3f fps; skipCount=%d)\n", mPeriod, + 1000000000.0 / mPeriod, mRefreshSkipCount); result.appendFormat("mPhase: %" PRId64 " ns\n", mPhase); - result.appendFormat("mError: %" PRId64 " ns (sqrt=%.1f)\n", - mError, sqrt(mError)); + result.appendFormat("mError: %" PRId64 " ns (sqrt=%.1f)\n", mError, sqrt(mError)); result.appendFormat("mNumResyncSamplesSincePresent: %d (limit %d)\n", - mNumResyncSamplesSincePresent, MAX_RESYNC_SAMPLES_WITHOUT_PRESENT); - result.appendFormat("mNumResyncSamples: %zd (max %d)\n", - mNumResyncSamples, MAX_RESYNC_SAMPLES); + mNumResyncSamplesSincePresent, MAX_RESYNC_SAMPLES_WITHOUT_PRESENT); + result.appendFormat("mNumResyncSamples: %zd (max %d)\n", mNumResyncSamples, MAX_RESYNC_SAMPLES); result.appendFormat("mResyncSamples:\n"); nsecs_t previous = -1; @@ -670,14 +646,13 @@ void DispSync::dump(String8& result) const { if (i == 0) { result.appendFormat(" %" PRId64 "\n", sampleTime); } else { - result.appendFormat(" %" PRId64 " (+%" PRId64 ")\n", - sampleTime, sampleTime - previous); + result.appendFormat(" %" PRId64 " (+%" PRId64 ")\n", sampleTime, + sampleTime - previous); } previous = sampleTime; } - result.appendFormat("mPresentFences [%d]:\n", - NUM_PRESENT_SAMPLES); + result.appendFormat("mPresentFences [%d]:\n", NUM_PRESENT_SAMPLES); nsecs_t now = systemTime(SYSTEM_TIME_MONOTONIC); previous = Fence::SIGNAL_TIME_INVALID; for (size_t i = 0; i < NUM_PRESENT_SAMPLES; i++) { @@ -685,17 +660,16 @@ void DispSync::dump(String8& result) const { nsecs_t presentTime = mPresentFences[idx]->getSignalTime(); if (presentTime == Fence::SIGNAL_TIME_PENDING) { result.appendFormat(" [unsignaled fence]\n"); - } else if(presentTime == Fence::SIGNAL_TIME_INVALID) { + } else if (presentTime == Fence::SIGNAL_TIME_INVALID) { result.appendFormat(" [invalid fence]\n"); } else if (previous == Fence::SIGNAL_TIME_PENDING || - previous == Fence::SIGNAL_TIME_INVALID) { + previous == Fence::SIGNAL_TIME_INVALID) { result.appendFormat(" %" PRId64 " (%.3f ms ago)\n", presentTime, - (now - presentTime) / 1000000.0); + (now - presentTime) / 1000000.0); } else { - result.appendFormat(" %" PRId64 " (+%" PRId64 " / %.3f) (%.3f ms ago)\n", - presentTime, presentTime - previous, - (presentTime - previous) / (double) mPeriod, - (now - presentTime) / 1000000.0); + result.appendFormat(" %" PRId64 " (+%" PRId64 " / %.3f) (%.3f ms ago)\n", presentTime, + presentTime - previous, (presentTime - previous) / (double)mPeriod, + (now - presentTime) / 1000000.0); } previous = presentTime; } diff --git a/services/surfaceflinger/DispSync.h b/services/surfaceflinger/DispSync.h index 880a24d6ad..d066d55107 100644 --- a/services/surfaceflinger/DispSync.h +++ b/services/surfaceflinger/DispSync.h @@ -20,8 +20,8 @@ #include #include -#include #include +#include #include @@ -47,12 +47,10 @@ class DispSyncThread; // false to indicate that a resynchronization (via addResyncSample) is not // needed. class DispSync { - public: - - class Callback: public virtual RefBase { + class Callback : public virtual RefBase { public: - virtual ~Callback() {}; + virtual ~Callback(){}; virtual void onDispSyncEvent(nsecs_t when) = 0; }; @@ -108,8 +106,7 @@ public: // given phase offset from the hardware vsync events. The callback is // called from a separate thread and it should return reasonably quickly // (i.e. within a few hundred microseconds). - status_t addEventListener(const char* name, nsecs_t phase, - const sp& callback); + status_t addEventListener(const char* name, nsecs_t phase, const sp& callback); // removeEventListener removes an already-registered event callback. Once // this method returns that callback will no longer be called by the @@ -126,7 +123,6 @@ public: void dump(String8& result) const; private: - void updateModelLocked(); void updateErrorLocked(); void resetErrorLocked(); @@ -174,8 +170,7 @@ private: // These member variables store information about the present fences used // to validate the currently computed model. - std::shared_ptr - mPresentFences[NUM_PRESENT_SAMPLES] {FenceTime::NO_FENCE}; + std::shared_ptr mPresentFences[NUM_PRESENT_SAMPLES]{FenceTime::NO_FENCE}; size_t mPresentSampleOffset; int mRefreshSkipCount; @@ -195,6 +190,6 @@ private: bool mIgnorePresentFences; }; -} +} // namespace android #endif // ANDROID_DISPSYNC_H diff --git a/services/surfaceflinger/EventControlThread.cpp b/services/surfaceflinger/EventControlThread.cpp index 02eea4769b..6fd4cdf28e 100644 --- a/services/surfaceflinger/EventControlThread.cpp +++ b/services/surfaceflinger/EventControlThread.cpp @@ -19,10 +19,8 @@ namespace android { -EventControlThread::EventControlThread(const sp& flinger): - mFlinger(flinger), - mVsyncEnabled(false) { -} +EventControlThread::EventControlThread(const sp& flinger) + : mFlinger(flinger), mVsyncEnabled(false) {} void EventControlThread::setVsyncEnabled(bool enabled) { Mutex::Autolock lock(mMutex); @@ -31,24 +29,21 @@ void EventControlThread::setVsyncEnabled(bool enabled) { } bool EventControlThread::threadLoop() { - enum class VsyncState {Unset, On, Off}; + enum class VsyncState { Unset, On, Off }; auto currentVsyncState = VsyncState::Unset; while (true) { auto requestedVsyncState = VsyncState::On; { Mutex::Autolock lock(mMutex); - requestedVsyncState = - mVsyncEnabled ? VsyncState::On : VsyncState::Off; + requestedVsyncState = mVsyncEnabled ? VsyncState::On : VsyncState::Off; while (currentVsyncState == requestedVsyncState) { status_t err = mCond.wait(mMutex); if (err != NO_ERROR) { - ALOGE("error waiting for new events: %s (%d)", - strerror(-err), err); + ALOGE("error waiting for new events: %s (%d)", strerror(-err), err); return false; } - requestedVsyncState = - mVsyncEnabled ? VsyncState::On : VsyncState::Off; + requestedVsyncState = mVsyncEnabled ? VsyncState::On : VsyncState::Off; } } diff --git a/services/surfaceflinger/EventThread.cpp b/services/surfaceflinger/EventThread.cpp index 5c0e3b37f3..6b92cc8a0e 100644 --- a/services/surfaceflinger/EventThread.cpp +++ b/services/surfaceflinger/EventThread.cpp @@ -21,8 +21,8 @@ #include -#include #include +#include #include #include @@ -36,18 +36,17 @@ namespace android { // --------------------------------------------------------------------------- EventThread::EventThread(const sp& src, SurfaceFlinger& flinger, bool interceptVSyncs) - : mVSyncSource(src), - mFlinger(flinger), - mUseSoftwareVSync(false), - mVsyncEnabled(false), - mDebugVsyncEnabled(false), - mInterceptVSyncs(interceptVSyncs) { - - for (int32_t i=0 ; i& connection) { +void EventThread::removeDisplayEventConnection(const wp& connection) { Mutex::Autolock _l(mLock); mDisplayEventConnections.remove(connection); } -void EventThread::setVsyncRate(uint32_t count, - const sp& connection) { +void EventThread::setVsyncRate(uint32_t count, const sp& connection) { if (int32_t(count) >= 0) { // server must protect against bad params Mutex::Autolock _l(mLock); const int32_t new_count = (count == 0) ? -1 : count; @@ -90,8 +87,7 @@ void EventThread::setVsyncRate(uint32_t count, } } -void EventThread::requestNextVsync( - const sp& connection) { +void EventThread::requestNextVsync(const sp& connection) { Mutex::Autolock _l(mLock); mFlinger.resyncWithRateLimit(); @@ -131,7 +127,7 @@ void EventThread::onVSyncEvent(nsecs_t timestamp) { void EventThread::onHotplugReceived(int type, bool connected) { ALOGE_IF(type >= DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES, - "received hotplug event for an invalid display (id=%d)", type); + "received hotplug event for an invalid display (id=%d)", type); Mutex::Autolock _l(mLock); if (type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) { @@ -147,12 +143,12 @@ void EventThread::onHotplugReceived(int type, bool connected) { bool EventThread::threadLoop() { DisplayEventReceiver::Event event; - Vector< sp > signalConnections; + Vector > signalConnections; signalConnections = waitForEvent(&event); // dispatch events to listeners... const size_t count = signalConnections.size(); - for (size_t i=0 ; i& conn(signalConnections[i]); // now see if we still need to report this event status_t err = conn->postEvent(event); @@ -162,8 +158,8 @@ bool EventThread::threadLoop() { // FIXME: Note that some events cannot be dropped and would have // to be re-sent later. // Right-now we don't have the ability to do this. - ALOGW("EventThread: dropping event (%08x) for connection %p", - event.header.type, conn.get()); + ALOGW("EventThread: dropping event (%08x) for connection %p", event.header.type, + conn.get()); } else if (err < 0) { // handle any other error on the pipe as fatal. the only // reasonable thing to do is to clean-up this connection. @@ -176,11 +172,9 @@ bool EventThread::threadLoop() { // This will return when (1) a vsync event has been received, and (2) there was // at least one connection interested in receiving it when we started waiting. -Vector< sp > EventThread::waitForEvent( - DisplayEventReceiver::Event* event) -{ +Vector > EventThread::waitForEvent(DisplayEventReceiver::Event* event) { Mutex::Autolock _l(mLock); - Vector< sp > signalConnections; + Vector > signalConnections; do { bool eventPending = false; @@ -188,7 +182,7 @@ Vector< sp > EventThread::waitForEvent( size_t vsyncCount = 0; nsecs_t timestamp = 0; - for (int32_t i=0 ; i > EventThread::waitForEvent( // find out connections waiting for events size_t count = mDisplayEventConnections.size(); - for (size_t i=0 ; i connection(mDisplayEventConnections[i].promote()); if (connection != nullptr) { bool added = false; @@ -231,7 +225,7 @@ Vector< sp > EventThread::waitForEvent( signalConnections.add(connection); added = true; } else if (connection->count == 1 || - (vsyncCount % connection->count) == 0) { + (vsyncCount % connection->count) == 0) { // continuous event, and time to report it signalConnections.add(connection); added = true; @@ -335,28 +329,22 @@ void EventThread::disableVSyncLocked() { void EventThread::dump(String8& result) const { Mutex::Autolock _l(mLock); - result.appendFormat("VSYNC state: %s\n", - mDebugVsyncEnabled?"enabled":"disabled"); - result.appendFormat(" soft-vsync: %s\n", - mUseSoftwareVSync?"enabled":"disabled"); + result.appendFormat("VSYNC state: %s\n", mDebugVsyncEnabled ? "enabled" : "disabled"); + result.appendFormat(" soft-vsync: %s\n", mUseSoftwareVSync ? "enabled" : "disabled"); result.appendFormat(" numListeners=%zu,\n events-delivered: %u\n", - mDisplayEventConnections.size(), - mVSyncEvent[DisplayDevice::DISPLAY_PRIMARY].vsync.count); - for (size_t i=0 ; i connection = - mDisplayEventConnections.itemAt(i).promote(); - result.appendFormat(" %p: count=%d\n", - connection.get(), connection != nullptr ? connection->count : 0); + mDisplayEventConnections.size(), + mVSyncEvent[DisplayDevice::DISPLAY_PRIMARY].vsync.count); + for (size_t i = 0; i < mDisplayEventConnections.size(); i++) { + sp connection = mDisplayEventConnections.itemAt(i).promote(); + result.appendFormat(" %p: count=%d\n", connection.get(), + connection != nullptr ? connection->count : 0); } } // --------------------------------------------------------------------------- -EventThread::Connection::Connection( - const sp& eventThread) - : count(-1), mEventThread(eventThread), mChannel(gui::BitTube::DefaultSize) -{ -} +EventThread::Connection::Connection(const sp& eventThread) + : count(-1), mEventThread(eventThread), mChannel(gui::BitTube::DefaultSize) {} EventThread::Connection::~Connection() { // do nothing here -- clean-up will happen automatically @@ -382,8 +370,7 @@ void EventThread::Connection::requestNextVsync() { mEventThread->requestNextVsync(this); } -status_t EventThread::Connection::postEvent( - const DisplayEventReceiver::Event& event) { +status_t EventThread::Connection::postEvent(const DisplayEventReceiver::Event& event) { ssize_t size = DisplayEventReceiver::sendEvents(&mChannel, &event, 1); return size < 0 ? status_t(size) : status_t(NO_ERROR); } diff --git a/services/surfaceflinger/EventThread.h b/services/surfaceflinger/EventThread.h index 0823839ee7..b4d718cd17 100644 --- a/services/surfaceflinger/EventThread.h +++ b/services/surfaceflinger/EventThread.h @@ -20,13 +20,13 @@ #include #include -#include #include #include +#include #include -#include #include +#include #include "DisplayDevice.h" @@ -39,10 +39,9 @@ class String8; // --------------------------------------------------------------------------- - class VSyncSource : public virtual RefBase { public: - class Callback: public virtual RefBase { + class Callback : public virtual RefBase { public: virtual ~Callback() {} virtual void onVSyncEvent(nsecs_t when) = 0; @@ -70,13 +69,12 @@ class EventThread : public Thread, private VSyncSource::Callback { virtual void onFirstRef(); status_t stealReceiveChannel(gui::BitTube* outChannel) override; status_t setVsyncRate(uint32_t count) override; - void requestNextVsync() override; // asynchronous + void requestNextVsync() override; // asynchronous sp const mEventThread; gui::BitTube mChannel; }; public: - EventThread(const sp& src, SurfaceFlinger& flinger, bool interceptVSyncs); sp createEventConnection() const; @@ -94,16 +92,15 @@ public: // called when receiving a hotplug event void onHotplugReceived(int type, bool connected); - Vector< sp > waitForEvent( - DisplayEventReceiver::Event* event); + Vector > waitForEvent(DisplayEventReceiver::Event* event); void dump(String8& result) const; void setPhaseOffset(nsecs_t phaseOffset); private: - virtual bool threadLoop(); - virtual void onFirstRef(); + virtual bool threadLoop(); + virtual void onFirstRef(); virtual void onVSyncEvent(nsecs_t timestamp); @@ -119,8 +116,8 @@ private: mutable Condition mCondition; // protected by mLock - SortedVector< wp > mDisplayEventConnections; - Vector< DisplayEventReceiver::Event > mPendingEvents; + SortedVector > mDisplayEventConnections; + Vector mPendingEvents; DisplayEventReceiver::Event mVSyncEvent[DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES]; bool mUseSoftwareVSync; bool mVsyncEnabled; diff --git a/services/surfaceflinger/MessageQueue.cpp b/services/surfaceflinger/MessageQueue.cpp index 0b1199c2d0..c9c398969c 100644 --- a/services/surfaceflinger/MessageQueue.cpp +++ b/services/surfaceflinger/MessageQueue.cpp @@ -14,32 +14,29 @@ * limitations under the License. */ -#include #include +#include #include #include -#include -#include #include +#include +#include #include -#include "MessageQueue.h" #include "EventThread.h" +#include "MessageQueue.h" #include "SurfaceFlinger.h" namespace android { // --------------------------------------------------------------------------- -MessageBase::MessageBase() - : MessageHandler() { -} +MessageBase::MessageBase() : MessageHandler() {} -MessageBase::~MessageBase() { -} +MessageBase::~MessageBase() {} void MessageBase::handleMessage(const Message&) { this->handler(); @@ -75,22 +72,17 @@ void MessageQueue::Handler::handleMessage(const Message& message) { // --------------------------------------------------------------------------- -MessageQueue::MessageQueue() -{ -} +MessageQueue::MessageQueue() {} -MessageQueue::~MessageQueue() { -} +MessageQueue::~MessageQueue() {} -void MessageQueue::init(const sp& flinger) -{ +void MessageQueue::init(const sp& flinger) { mFlinger = flinger; mLooper = new Looper(true); mHandler = new Handler(*this); } -void MessageQueue::setEventThread(const sp& eventThread) -{ +void MessageQueue::setEventThread(const sp& eventThread) { if (mEventThread == eventThread) { return; } @@ -102,8 +94,8 @@ void MessageQueue::setEventThread(const sp& eventThread) mEventThread = eventThread; mEvents = eventThread->createEventConnection(); mEvents->stealReceiveChannel(&mEventTube); - mLooper->addFd(mEventTube.getFd(), 0, Looper::EVENT_INPUT, - MessageQueue::cb_eventReceiver, this); + mLooper->addFd(mEventTube.getFd(), 0, Looper::EVENT_INPUT, MessageQueue::cb_eventReceiver, + this); } void MessageQueue::waitMessage() { @@ -128,9 +120,7 @@ void MessageQueue::waitMessage() { } while (true); } -status_t MessageQueue::postMessage( - const sp& messageHandler, nsecs_t relTime) -{ +status_t MessageQueue::postMessage(const sp& messageHandler, nsecs_t relTime) { const Message dummyMessage; if (relTime > 0) { mLooper->sendMessageDelayed(relTime, messageHandler, dummyMessage); @@ -140,7 +130,6 @@ status_t MessageQueue::postMessage( return NO_ERROR; } - void MessageQueue::invalidate() { mEvents->requestNextVsync(); } @@ -150,7 +139,7 @@ void MessageQueue::refresh() { } int MessageQueue::cb_eventReceiver(int fd, int events, void* data) { - MessageQueue* queue = reinterpret_cast(data); + MessageQueue* queue = reinterpret_cast(data); return queue->eventReceiver(fd, events); } @@ -158,7 +147,7 @@ int MessageQueue::eventReceiver(int /*fd*/, int /*events*/) { ssize_t n; DisplayEventReceiver::Event buffer[8]; while ((n = DisplayEventReceiver::getEvents(&mEventTube, buffer, 8)) > 0) { - for (int i=0 ; idispatchInvalidate(); break; diff --git a/services/surfaceflinger/MessageQueue.h b/services/surfaceflinger/MessageQueue.h index 14f50bbdce..fe1bf081b8 100644 --- a/services/surfaceflinger/MessageQueue.h +++ b/services/surfaceflinger/MessageQueue.h @@ -17,16 +17,16 @@ #ifndef ANDROID_MESSAGE_QUEUE_H #define ANDROID_MESSAGE_QUEUE_H -#include #include +#include #include -#include -#include #include +#include +#include -#include #include +#include #include "Barrier.h" @@ -40,11 +40,10 @@ class SurfaceFlinger; // --------------------------------------------------------------------------- -class MessageBase : public MessageHandler -{ +class MessageBase : public MessageHandler { public: MessageBase(); - + // return true if message has a handler virtual bool handler() = 0; @@ -79,15 +78,12 @@ private: class MessageQueue { class Handler : public MessageHandler { - enum { - eventMaskInvalidate = 0x1, - eventMaskRefresh = 0x2, - eventMaskTransaction = 0x4 - }; + enum { eventMaskInvalidate = 0x1, eventMaskRefresh = 0x2, eventMaskTransaction = 0x4 }; MessageQueue& mQueue; int32_t mEventMask; + public: - explicit Handler(MessageQueue& queue) : mQueue(queue), mEventMask(0) { } + explicit Handler(MessageQueue& queue) : mQueue(queue), mEventMask(0) {} virtual void handleMessage(const Message& message); void dispatchRefresh(); void dispatchInvalidate(); @@ -102,14 +98,13 @@ class MessageQueue { gui::BitTube mEventTube; sp mHandler; - static int cb_eventReceiver(int fd, int events, void* data); int eventReceiver(int fd, int events); public: enum { - INVALIDATE = 0, - REFRESH = 1, + INVALIDATE = 0, + REFRESH = 1, }; MessageQueue(); @@ -118,7 +113,7 @@ public: void setEventThread(const sp& events); void waitMessage(); - status_t postMessage(const sp& message, nsecs_t reltime=0); + status_t postMessage(const sp& message, nsecs_t reltime = 0); // sends INVALIDATE message at next VSYNC void invalidate(); -- cgit v1.2.3-59-g8ed1b From 755e319d6a656dc92bd4f2b486d8f5a44b0e7350 Mon Sep 17 00:00:00 2001 From: Lloyd Pique Date: Wed, 31 Jan 2018 16:46:15 -0800 Subject: SF: Cleanup EventControlThread Primarily the goal was to eliminate the use of RefBase in various forms from EventControlThread. 1) SurfaceFlinger only needs a std::unique_ptr<> and not an android::sp<> to own the created instance. 2) Convert from android::Thread to std::thread, along with using std::mutex and std::condition_variable to keep consistency. 3) The code only needs a reference to a function to call, rather than a reference to all of SurfaceFlinger. This removes an unnecessary full dependency. 4) Switch the header to #pragma once. 5) Added Clang thread annotations and enabled the corresponding warning. 6) Simplified the thread function to eliminate unnecessary locals and indentation. 7) Added proper thread shutdown handling (invoked by dtor). Bug: None Test: Verified event control thread still works on Pixel XL Change-Id: I2d5621b0cbbfb9e0f8c5831ccfc94704c95a4a55 --- services/surfaceflinger/Android.bp | 1 + services/surfaceflinger/EventControlThread.cpp | 70 +++++++++++++++----------- services/surfaceflinger/EventControlThread.h | 38 ++++++++------ services/surfaceflinger/SurfaceFlinger.cpp | 11 ++-- services/surfaceflinger/SurfaceFlinger.h | 2 +- 5 files changed, 72 insertions(+), 50 deletions(-) (limited to 'services/surfaceflinger/EventControlThread.cpp') diff --git a/services/surfaceflinger/Android.bp b/services/surfaceflinger/Android.bp index 9f3189a39c..4ed4392028 100644 --- a/services/surfaceflinger/Android.bp +++ b/services/surfaceflinger/Android.bp @@ -4,6 +4,7 @@ cc_defaults { "-DLOG_TAG=\"SurfaceFlinger\"", "-Wall", "-Werror", + "-Wthread-safety", "-Wunused", "-Wunreachable-code", ], diff --git a/services/surfaceflinger/EventControlThread.cpp b/services/surfaceflinger/EventControlThread.cpp index 6fd4cdf28e..ac54059360 100644 --- a/services/surfaceflinger/EventControlThread.cpp +++ b/services/surfaceflinger/EventControlThread.cpp @@ -14,45 +14,57 @@ * limitations under the License. */ +#include +#include +#include + +#include +#include +#include + #include "EventControlThread.h" -#include "SurfaceFlinger.h" namespace android { -EventControlThread::EventControlThread(const sp& flinger) - : mFlinger(flinger), mVsyncEnabled(false) {} +EventControlThread::EventControlThread(EventControlThread::SetVSyncEnabledFunction function) + : mSetVSyncEnabled(function) { + pthread_setname_np(mThread.native_handle(), "EventControlThread"); + + pid_t tid = pthread_gettid_np(mThread.native_handle()); + setpriority(PRIO_PROCESS, tid, ANDROID_PRIORITY_URGENT_DISPLAY); + set_sched_policy(tid, SP_FOREGROUND); +} + +EventControlThread::~EventControlThread() { + { + std::lock_guard lock(mMutex); + mKeepRunning = false; + mCondition.notify_all(); + } + mThread.join(); +} void EventControlThread::setVsyncEnabled(bool enabled) { - Mutex::Autolock lock(mMutex); + std::lock_guard lock(mMutex); mVsyncEnabled = enabled; - mCond.signal(); + mCondition.notify_all(); } -bool EventControlThread::threadLoop() { - enum class VsyncState { Unset, On, Off }; - auto currentVsyncState = VsyncState::Unset; - - while (true) { - auto requestedVsyncState = VsyncState::On; - { - Mutex::Autolock lock(mMutex); - requestedVsyncState = mVsyncEnabled ? VsyncState::On : VsyncState::Off; - while (currentVsyncState == requestedVsyncState) { - status_t err = mCond.wait(mMutex); - if (err != NO_ERROR) { - ALOGE("error waiting for new events: %s (%d)", strerror(-err), err); - return false; - } - requestedVsyncState = mVsyncEnabled ? VsyncState::On : VsyncState::Off; - } - } - - bool enable = requestedVsyncState == VsyncState::On; - mFlinger->setVsyncEnabled(HWC_DISPLAY_PRIMARY, enable); - currentVsyncState = requestedVsyncState; - } +// Unfortunately std::unique_lock gives warnings with -Wthread-safety +void EventControlThread::threadMain() NO_THREAD_SAFETY_ANALYSIS { + auto keepRunning = true; + auto currentVsyncEnabled = false; - return false; + while (keepRunning) { + mSetVSyncEnabled(currentVsyncEnabled); + + std::unique_lock lock(mMutex); + mCondition.wait(lock, [this, currentVsyncEnabled, keepRunning]() NO_THREAD_SAFETY_ANALYSIS { + return currentVsyncEnabled != mVsyncEnabled || keepRunning != mKeepRunning; + }); + currentVsyncEnabled = mVsyncEnabled; + keepRunning = mKeepRunning; + } } } // namespace android diff --git a/services/surfaceflinger/EventControlThread.h b/services/surfaceflinger/EventControlThread.h index 1b1ef75b9d..321fb79831 100644 --- a/services/surfaceflinger/EventControlThread.h +++ b/services/surfaceflinger/EventControlThread.h @@ -14,35 +14,41 @@ * limitations under the License. */ -#ifndef ANDROID_EVENTCONTROLTHREAD_H -#define ANDROID_EVENTCONTROLTHREAD_H +#pragma once -#include +#include +#include +#include +#include +#include -#include -#include +#include namespace android { class SurfaceFlinger; -class EventControlThread: public Thread { +class EventControlThread { public: + using SetVSyncEnabledFunction = std::function; - explicit EventControlThread(const sp& flinger); - virtual ~EventControlThread() {} + explicit EventControlThread(SetVSyncEnabledFunction function); + ~EventControlThread(); void setVsyncEnabled(bool enabled); - virtual bool threadLoop(); private: - sp mFlinger; - bool mVsyncEnabled; + void threadMain(); - Mutex mMutex; - Condition mCond; -}; + std::mutex mMutex; + std::condition_variable mCondition; + + const SetVSyncEnabledFunction mSetVSyncEnabled; + bool mVsyncEnabled GUARDED_BY(mMutex) = false; + bool mKeepRunning GUARDED_BY(mMutex) = true; -} + // Must be last so that everything is initialized before the thread starts. + std::thread mThread{&EventControlThread::threadMain, this}; +}; -#endif // ANDROID_EVENTCONTROLTHREAD_H +} // namespace android diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index d8740d973e..70a282db17 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -636,8 +636,9 @@ void SurfaceFlinger::init() { } } - mEventControlThread = new EventControlThread(this); - mEventControlThread->run("EventControl", PRIORITY_URGENT_DISPLAY); + mEventControlThread = std::make_unique([this](bool enabled) { + setVsyncEnabled(HWC_DISPLAY_PRIMARY, enabled); + }); // initialize our drawing state mDrawingState = mCurrentState; @@ -1101,7 +1102,8 @@ status_t SurfaceFlinger::injectVSync(nsecs_t when) { return NO_ERROR; } -status_t SurfaceFlinger::getLayerDebugInfo(std::vector* outLayers) const { +status_t SurfaceFlinger::getLayerDebugInfo(std::vector* outLayers) const + NO_THREAD_SAFETY_ANALYSIS { IPCThreadState* ipc = IPCThreadState::self(); const int pid = ipc->getCallingPid(); const int uid = ipc->getCallingUid(); @@ -3567,7 +3569,8 @@ void SurfaceFlinger::setPowerMode(const sp& display, int mode) { // --------------------------------------------------------------------------- -status_t SurfaceFlinger::doDump(int fd, const Vector& args, bool asProto) { +status_t SurfaceFlinger::doDump(int fd, const Vector& args, bool asProto) + NO_THREAD_SAFETY_ANALYSIS { String8 result; IPCThreadState* ipc = IPCThreadState::self(); diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index bde1a8e2be..89f3930a04 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -723,7 +723,7 @@ private: sp mSFEventThread; sp mInjectorEventThread; sp mVSyncInjector; - sp mEventControlThread; + std::unique_ptr mEventControlThread; sp mBuiltinDisplays[DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES]; // Can only accessed from the main thread, these members -- cgit v1.2.3-59-g8ed1b From 0c3a88319136a8ce0e7050ef5695610a986ce900 Mon Sep 17 00:00:00 2001 From: Lloyd Pique Date: Mon, 22 Jan 2018 17:31:47 -0800 Subject: SF: Separate EventControlThread into interface and impl Test: Builds Bug: 74827900 Change-Id: Ib79503860bf9409cc71d98e2e845ffaff114fbb1 (cherry picked from commit 379adc10ebe94eec8c7754d262c6184fbfb3f0a3) --- services/surfaceflinger/EventControlThread.cpp | 5 +++++ services/surfaceflinger/EventControlThread.h | 15 +++++++++++++-- services/surfaceflinger/SurfaceFlinger.cpp | 5 ++--- 3 files changed, 20 insertions(+), 5 deletions(-) (limited to 'services/surfaceflinger/EventControlThread.cpp') diff --git a/services/surfaceflinger/EventControlThread.cpp b/services/surfaceflinger/EventControlThread.cpp index ac54059360..fb6cff5705 100644 --- a/services/surfaceflinger/EventControlThread.cpp +++ b/services/surfaceflinger/EventControlThread.cpp @@ -26,6 +26,10 @@ namespace android { +EventControlThread::~EventControlThread() = default; + +namespace impl { + EventControlThread::EventControlThread(EventControlThread::SetVSyncEnabledFunction function) : mSetVSyncEnabled(function) { pthread_setname_np(mThread.native_handle(), "EventControlThread"); @@ -67,4 +71,5 @@ void EventControlThread::threadMain() NO_THREAD_SAFETY_ANALYSIS { } } +} // namespace impl } // namespace android diff --git a/services/surfaceflinger/EventControlThread.h b/services/surfaceflinger/EventControlThread.h index 321fb79831..9be4e7cd8e 100644 --- a/services/surfaceflinger/EventControlThread.h +++ b/services/surfaceflinger/EventControlThread.h @@ -16,8 +16,8 @@ #pragma once -#include #include +#include #include #include #include @@ -29,13 +29,23 @@ namespace android { class SurfaceFlinger; class EventControlThread { +public: + virtual ~EventControlThread(); + + virtual void setVsyncEnabled(bool enabled) = 0; +}; + +namespace impl { + +class EventControlThread final : public android::EventControlThread { public: using SetVSyncEnabledFunction = std::function; explicit EventControlThread(SetVSyncEnabledFunction function); ~EventControlThread(); - void setVsyncEnabled(bool enabled); + // EventControlThread implementation + void setVsyncEnabled(bool enabled) override; private: void threadMain(); @@ -51,4 +61,5 @@ private: std::thread mThread{&EventControlThread::threadMain, this}; }; +} // namespace impl } // namespace android diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 932b92e653..cdf126e9e2 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -639,9 +639,8 @@ void SurfaceFlinger::init() { } } - mEventControlThread = std::make_unique([this](bool enabled) { - setVsyncEnabled(HWC_DISPLAY_PRIMARY, enabled); - }); + mEventControlThread = std::make_unique( + [this](bool enabled) { setVsyncEnabled(HWC_DISPLAY_PRIMARY, enabled); }); // initialize our drawing state mDrawingState = mCurrentState; -- cgit v1.2.3-59-g8ed1b