diff options
| author | 2018-11-14 22:33:24 +0000 | |
|---|---|---|
| committer | 2018-11-15 00:01:36 +0000 | |
| commit | 8d4f90aaadf9f3be77d258d2acd67b6186352811 (patch) | |
| tree | c0f9039c6d57685f08a34152a3ea2f051dc68b4e | |
| parent | 0587464f761d06512181f44b47bd950033a907ae (diff) | |
Revert "Bind to FBO when using GPU composition"
This reverts commit 8147b0ead81c2d26e38fb4d93bc6d2f499ebd470.
Reason for revert: Breaks screenrecord (b/119534075).
Change-Id: Iea02806d896ac53c805c27ed745f325456d9a3a4
| -rw-r--r-- | libs/renderengine/gl/GLES20RenderEngine.cpp | 31 | ||||
| -rw-r--r-- | libs/renderengine/gl/GLES20RenderEngine.h | 6 | ||||
| -rw-r--r-- | services/surfaceflinger/Android.bp | 1 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayDevice.cpp | 83 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayDevice.h | 20 | ||||
| -rw-r--r-- | services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp | 2 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 79 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.h | 4 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/CompositionTest.cpp | 34 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp | 31 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/unittests/mock/system/window/MockNativeWindow.h | 1 |
11 files changed, 102 insertions, 190 deletions
diff --git a/libs/renderengine/gl/GLES20RenderEngine.cpp b/libs/renderengine/gl/GLES20RenderEngine.cpp index e244a83c09..70a4322c5f 100644 --- a/libs/renderengine/gl/GLES20RenderEngine.cpp +++ b/libs/renderengine/gl/GLES20RenderEngine.cpp @@ -275,8 +275,6 @@ std::unique_ptr<GLES20RenderEngine> GLES20RenderEngine::create(int hwcFormat, // now figure out what version of GL did we actually get // NOTE: a dummy surface is not needed if KHR_create_context is supported - // TODO(alecmouri): don't create this surface if EGL_KHR_surfaceless_context - // is supported. EGLConfig dummyConfig = config; if (dummyConfig == EGL_NO_CONFIG) { @@ -303,10 +301,10 @@ std::unique_ptr<GLES20RenderEngine> GLES20RenderEngine::create(int hwcFormat, break; case GLES_VERSION_2_0: case GLES_VERSION_3_0: - engine = std::make_unique<GLES20RenderEngine>(featureFlags, display, config, ctxt, - dummy); + engine = std::make_unique<GLES20RenderEngine>(featureFlags); break; } + engine->setEGLHandles(display, config, ctxt); ALOGI("OpenGL ES informations:"); ALOGI("vendor : %s", extensions.getVendor()); @@ -316,6 +314,9 @@ std::unique_ptr<GLES20RenderEngine> GLES20RenderEngine::create(int hwcFormat, ALOGI("GL_MAX_TEXTURE_SIZE = %zu", engine->getMaxTextureSize()); ALOGI("GL_MAX_VIEWPORT_DIMS = %zu", engine->getMaxViewportDims()); + eglMakeCurrent(display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + eglDestroySurface(display, dummy); + return engine; } @@ -358,13 +359,11 @@ EGLConfig GLES20RenderEngine::chooseEglConfig(EGLDisplay display, int format, bo return config; } -GLES20RenderEngine::GLES20RenderEngine(uint32_t featureFlags, EGLDisplay display, EGLConfig config, - EGLContext ctxt, EGLSurface dummy) +GLES20RenderEngine::GLES20RenderEngine(uint32_t featureFlags) : renderengine::impl::RenderEngine(featureFlags), - mEGLDisplay(display), - mEGLConfig(config), - mEGLContext(ctxt), - mDummySurface(dummy), + mEGLDisplay(EGL_NO_DISPLAY), + mEGLConfig(nullptr), + mEGLContext(EGL_NO_CONTEXT), mVpWidth(0), mVpHeight(0), mUseColorManagement(featureFlags & USE_COLOR_MANAGEMENT) { @@ -637,6 +636,12 @@ void GLES20RenderEngine::unbindFrameBuffer(Framebuffer* /* framebuffer */) { // back to main framebuffer glBindFramebuffer(GL_FRAMEBUFFER, 0); + + // Workaround for b/77935566 to force the EGL driver to release the + // screenshot buffer + setScissor(Rect::EMPTY_RECT); + clearWithColor(0.0, 0.0, 0.0, 0.0); + disableScissor(); } void GLES20RenderEngine::checkErrors() const { @@ -969,6 +974,12 @@ bool GLES20RenderEngine::needsXYZTransformMatrix() const { return (isInputHdrDataSpace || isOutputHdrDataSpace) && inputTransfer != outputTransfer; } +void GLES20RenderEngine::setEGLHandles(EGLDisplay display, EGLConfig config, EGLContext ctxt) { + mEGLDisplay = display; + mEGLConfig = config; + mEGLContext = ctxt; +} + } // namespace gl } // namespace renderengine } // namespace android diff --git a/libs/renderengine/gl/GLES20RenderEngine.h b/libs/renderengine/gl/GLES20RenderEngine.h index aebb319a99..148df2fbb4 100644 --- a/libs/renderengine/gl/GLES20RenderEngine.h +++ b/libs/renderengine/gl/GLES20RenderEngine.h @@ -47,8 +47,7 @@ public: static std::unique_ptr<GLES20RenderEngine> create(int hwcFormat, uint32_t featureFlags); static EGLConfig chooseEglConfig(EGLDisplay display, int format, bool logConfig); - GLES20RenderEngine(uint32_t featureFlags, // See RenderEngine::FeatureFlag - EGLDisplay display, EGLConfig config, EGLContext ctxt, EGLSurface dummy); + GLES20RenderEngine(uint32_t featureFlags); // See RenderEngine::FeatureFlag ~GLES20RenderEngine() override; std::unique_ptr<Framebuffer> createFramebuffer() override; @@ -121,12 +120,11 @@ private: // with PQ or HLG transfer function. bool isHdrDataSpace(const ui::Dataspace dataSpace) const; bool needsXYZTransformMatrix() const; - void setEGLHandles(EGLDisplay display, EGLConfig config, EGLContext ctxt, EGLSurface dummy); + void setEGLHandles(EGLDisplay display, EGLConfig config, EGLContext ctxt); EGLDisplay mEGLDisplay; EGLConfig mEGLConfig; EGLContext mEGLContext; - EGLSurface mDummySurface; GLuint mProtectedTexName; GLint mMaxViewportDims[2]; GLint mMaxTextureSize; diff --git a/services/surfaceflinger/Android.bp b/services/surfaceflinger/Android.bp index 9bd07d2010..e8092a9e4a 100644 --- a/services/surfaceflinger/Android.bp +++ b/services/surfaceflinger/Android.bp @@ -183,7 +183,6 @@ cc_defaults { "libhidltransport", "liblayers_proto", "liblog", - "libsync", "libtimestats_proto", "libutils", ], diff --git a/services/surfaceflinger/DisplayDevice.cpp b/services/surfaceflinger/DisplayDevice.cpp index ac51d53ba8..be19b9fb44 100644 --- a/services/surfaceflinger/DisplayDevice.cpp +++ b/services/surfaceflinger/DisplayDevice.cpp @@ -35,8 +35,6 @@ #include <gui/Surface.h> #include <hardware/gralloc.h> #include <renderengine/RenderEngine.h> -#include <sync/sync.h> -#include <system/window.h> #include <ui/DebugUtils.h> #include <ui/DisplayInfo.h> #include <ui/PixelFormat.h> @@ -223,7 +221,6 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs&& args) mDisplayToken(args.displayToken), mId(args.displayId), mNativeWindow(args.nativeWindow), - mGraphicBuffer(nullptr), mDisplaySurface(args.displaySurface), mSurface{std::move(args.renderSurface)}, mDisplayInstallOrientation(args.displayInstallOrientation), @@ -287,10 +284,6 @@ DisplayDevice::DisplayDevice(DisplayDeviceCreationArgs&& args) mHdrCapabilities = HdrCapabilities(types, maxLuminance, maxAverageLuminance, minLuminance); ANativeWindow* const window = mNativeWindow.get(); - - int status = native_window_api_connect(mNativeWindow.get(), NATIVE_WINDOW_API_EGL); - ALOGE_IF(status != NO_ERROR, "Unable to connect BQ producer: %d", status); - mDisplayWidth = ANativeWindow_getWidth(window); mDisplayHeight = ANativeWindow_getHeight(window); @@ -328,6 +321,7 @@ uint32_t DisplayDevice::getPageFlipCount() const { void DisplayDevice::flip() const { + mFlinger->getRenderEngine().checkErrors(); mPageFlipCount++; } @@ -362,71 +356,9 @@ status_t DisplayDevice::prepareFrame(HWComposer& hwc, return mDisplaySurface->prepareFrame(compositionType); } -sp<GraphicBuffer> DisplayDevice::dequeueBuffer() { - int fd; - ANativeWindowBuffer* buffer; - - status_t res = mNativeWindow->dequeueBuffer(mNativeWindow.get(), &buffer, &fd); - - if (res != NO_ERROR) { - ALOGE("ANativeWindow::dequeueBuffer failed for display [%s] with error: %d", - getDisplayName().c_str(), res); - // Return fast here as we can't do much more - any rendering we do - // now will just be wrong. - return mGraphicBuffer; - } - - ALOGW_IF(mGraphicBuffer != nullptr, "Clobbering a non-null pointer to a buffer [%p].", - mGraphicBuffer->getNativeBuffer()->handle); - mGraphicBuffer = GraphicBuffer::from(buffer); - - // Block until the buffer is ready - // TODO(alecmouri): it's perhaps more appropriate to block renderengine so - // that the gl driver can block instead. - if (fd >= 0) { - sync_wait(fd, -1); - close(fd); - } - - return mGraphicBuffer; -} - -void DisplayDevice::queueBuffer(HWComposer& hwc) { +void DisplayDevice::swapBuffers(HWComposer& hwc) const { if (hwc.hasClientComposition(mId) || hwc.hasFlipClientTargetRequest(mId)) { - // hasFlipClientTargetRequest could return true even if we haven't - // dequeued a buffer before. Try dequeueing one if we don't have a - // buffer ready. - if (mGraphicBuffer == nullptr) { - ALOGI("Attempting to queue a client composited buffer without one " - "previously dequeued for display [%s]. Attempting to dequeue " - "a scratch buffer now", - mDisplayName.c_str()); - // We shouldn't deadlock here, since mGraphicBuffer == nullptr only - // after a successful call to queueBuffer, or if dequeueBuffer has - // never been called. - dequeueBuffer(); - } - - if (mGraphicBuffer == nullptr) { - ALOGE("No buffer is ready for display [%s]", mDisplayName.c_str()); - } else { - int fd = mBufferReady.release(); - - status_t res = mNativeWindow->queueBuffer(mNativeWindow.get(), - mGraphicBuffer->getNativeBuffer(), fd); - if (res != NO_ERROR) { - ALOGE("Error when queueing buffer for display [%s]: %d", mDisplayName.c_str(), res); - // We risk blocking on dequeueBuffer if the primary display failed - // to queue up its buffer, so crash here. - if (isPrimary()) { - LOG_ALWAYS_FATAL("ANativeWindow::queueBuffer failed with error: %d", res); - } else { - mNativeWindow->cancelBuffer(mNativeWindow.get(), - mGraphicBuffer->getNativeBuffer(), fd); - } - } - mGraphicBuffer = nullptr; - } + mSurface->swapBuffers(); } status_t result = mDisplaySurface->advanceFrame(); @@ -435,7 +367,7 @@ void DisplayDevice::queueBuffer(HWComposer& hwc) { } } -void DisplayDevice::onPresentDisplayCompleted() { +void DisplayDevice::onSwapBuffersCompleted() const { mDisplaySurface->onFrameCommitted(); } @@ -452,13 +384,6 @@ void DisplayDevice::setViewportAndProjection() const { mFlinger->getRenderEngine().setViewportAndProjection(w, h, sourceCrop, ui::Transform::ROT_0); } -void DisplayDevice::finishBuffer() { - mBufferReady = mFlinger->getRenderEngine().flush(); - if (mBufferReady.get() < 0) { - mFlinger->getRenderEngine().finish(); - } -} - const sp<Fence>& DisplayDevice::getClientTargetAcquireFence() const { return mDisplaySurface->getClientTargetAcquireFence(); } diff --git a/services/surfaceflinger/DisplayDevice.h b/services/surfaceflinger/DisplayDevice.h index 560a9588b5..bcd3330cf2 100644 --- a/services/surfaceflinger/DisplayDevice.h +++ b/services/surfaceflinger/DisplayDevice.h @@ -28,14 +28,13 @@ #include <gui/LayerState.h> #include <hardware/hwcomposer_defs.h> #include <math/mat4.h> -#include <renderengine/RenderEngine.h> #include <renderengine/Surface.h> #include <ui/GraphicTypes.h> #include <ui/HdrCapabilities.h> #include <ui/Region.h> #include <ui/Transform.h> -#include <utils/Mutex.h> #include <utils/RefBase.h> +#include <utils/Mutex.h> #include <utils/String8.h> #include <utils/Timers.h> @@ -147,13 +146,10 @@ public: ui::Dataspace* outDataspace, ui::ColorMode* outMode, ui::RenderIntent* outIntent) const; - // Queues the drawn buffer for consumption by HWC. - void queueBuffer(HWComposer& hwc); - // Allocates a buffer as scratch space for GPU composition - sp<GraphicBuffer> dequeueBuffer(); + void swapBuffers(HWComposer& hwc) const; // called after h/w composer has completed its set() call - void onPresentDisplayCompleted(); + void onSwapBuffersCompleted() const; Rect getBounds() const { return Rect(mDisplayWidth, mDisplayHeight); @@ -164,11 +160,6 @@ public: const std::string& getDisplayName() const { return mDisplayName; } bool makeCurrent() const; - // Acquires a new buffer for GPU composition. - void readyNewBuffer(); - // Marks the current buffer has finished, so that it can be presented and - // swapped out. - void finishBuffer(); void setViewportAndProjection() const; const sp<Fence>& getClientTargetAcquireFence() const; @@ -213,12 +204,7 @@ private: // ANativeWindow this display is rendering into sp<ANativeWindow> mNativeWindow; - // Current buffer that this display can render to. - sp<GraphicBuffer> mGraphicBuffer; sp<DisplaySurface> mDisplaySurface; - // File descriptor indicating that mGraphicBuffer is ready for display, i.e. - // that drawing to the buffer is now complete. - base::unique_fd mBufferReady; std::unique_ptr<renderengine::Surface> mSurface; int mDisplayWidth; diff --git a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp index 5f3fcd6e88..27d3dc5609 100644 --- a/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp +++ b/services/surfaceflinger/DisplayHardware/VirtualDisplaySurface.cpp @@ -107,6 +107,8 @@ VirtualDisplaySurface::VirtualDisplaySurface(HWComposer& hwc, mConsumer->setConsumerUsageBits(GRALLOC_USAGE_HW_COMPOSER); mConsumer->setDefaultBufferSize(sinkWidth, sinkHeight); sink->setAsyncMode(true); + IGraphicBufferProducer::QueueBufferOutput output; + mSource[SOURCE_SCRATCH]->connect(nullptr, NATIVE_WINDOW_API_EGL, false, &output); } VirtualDisplaySurface::~VirtualDisplaySurface() { diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 2858b7b8b7..9d1695814d 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -45,7 +45,6 @@ #include <gui/BufferQueue.h> #include <gui/GuiConfig.h> #include <gui/IDisplayEventConnection.h> -#include <gui/IProducerListener.h> #include <gui/LayerDebugInfo.h> #include <gui/Surface.h> #include <renderengine/RenderEngine.h> @@ -677,6 +676,10 @@ void SurfaceFlinger::init() { LOG_ALWAYS_FATAL_IF(!getHwComposer().isConnected(*display->getId()), "Internal display is disconnected."); + // make the default display GLContext current so that we can create textures + // when creating Layers (which may happens before we render something) + display->makeCurrent(); + if (useVrFlinger) { auto vrFlingerRequestDisplayCallback = [this](bool requestDisplay) { // This callback is called from the vr flinger dispatch thread. We @@ -1402,6 +1405,7 @@ void SurfaceFlinger::resetDisplayState() { // mCurrentState and mDrawingState and re-apply all changes when we make the // transition. mDrawingState.displays.clear(); + getRenderEngine().resetCurrentSurface(); mDisplays.clear(); } @@ -1711,7 +1715,7 @@ void SurfaceFlinger::doDebugFlashRegions(const sp<DisplayDevice>& display, bool auto& engine(getRenderEngine()); engine.fillRegionWithColor(dirtyRegion, 1, 0, 1, 1); - display->queueBuffer(getHwComposer()); + display->swapBuffers(getHwComposer()); } } @@ -2183,7 +2187,8 @@ void SurfaceFlinger::postFramebuffer(const sp<DisplayDevice>& display) if (displayId) { getHwComposer().presentAndGetReleaseFences(*displayId); } - display->onPresentDisplayCompleted(); + display->onSwapBuffersCompleted(); + display->makeCurrent(); for (auto& layer : display->getVisibleLayersSortedByZ()) { sp<Fence> releaseFence = Fence::NO_FENCE; @@ -2336,11 +2341,16 @@ sp<DisplayDevice> SurfaceFlinger::setupNewDisplayDeviceInternal( std::unique_ptr<renderengine::Surface> renderSurface = getRenderEngine().createSurface(); renderSurface->setCritical(isInternalDisplay); renderSurface->setAsync(state.isVirtual()); + renderSurface->setNativeWindow(nativeWindow.get()); creationArgs.renderSurface = std::move(renderSurface); // Make sure that composition can never be stalled by a virtual display // consumer that isn't processing buffers fast enough. We have to do this - // here, in case the display is composed entirely by HWC. + // in two places: + // * Here, in case the display is composed entirely by HWC. + // * In makeCurrent(), using eglSwapInterval. Some EGL drivers set the + // window's swap interval in eglMakeCurrent, so they'll override the + // interval we set here. if (state.isVirtual()) { nativeWindow->setSwapInterval(nativeWindow.get(), 0); } @@ -2400,6 +2410,12 @@ void SurfaceFlinger::processDisplayChangesLocked() { const auto externalDisplayId = getExternalDisplayId(); // in drawing state but not in current state + // Call makeCurrent() on the primary display so we can + // be sure that nothing associated with this display + // is current. + if (const auto defaultDisplay = getDefaultDisplayDeviceLocked()) { + defaultDisplay->makeCurrent(); + } if (const auto display = getDisplayDeviceLocked(draw.keyAt(i))) { display->disconnect(getHwComposer()); } @@ -2946,7 +2962,7 @@ void SurfaceFlinger::invalidateHwcGeometry() mGeometryInvalid = true; } -void SurfaceFlinger::doDisplayComposition(const sp<DisplayDevice>& display, +void SurfaceFlinger::doDisplayComposition(const sp<const DisplayDevice>& display, const Region& inDirtyRegion) { // We only need to actually compose the display if: // 1) It is being handled by hardware composer, which may need this to @@ -2962,10 +2978,10 @@ void SurfaceFlinger::doDisplayComposition(const sp<DisplayDevice>& display, if (!doComposeSurfaces(display)) return; // swap buffers (presentation) - display->queueBuffer(getHwComposer()); + display->swapBuffers(getHwComposer()); } -bool SurfaceFlinger::doComposeSurfaces(const sp<DisplayDevice>& display) { +bool SurfaceFlinger::doComposeSurfaces(const sp<const DisplayDevice>& display) { ALOGV("doComposeSurfaces"); const Region bounds(display->bounds()); @@ -2978,31 +2994,9 @@ bool SurfaceFlinger::doComposeSurfaces(const sp<DisplayDevice>& display) { bool applyColorMatrix = false; bool needsEnhancedColorMatrix = false; - // Framebuffer will live in this scope for GPU composition. - std::unique_ptr<renderengine::BindNativeBufferAsFramebuffer> fbo; - if (hasClientComposition) { ALOGV("hasClientComposition"); - sp<GraphicBuffer> buf = display->dequeueBuffer(); - - if (buf == nullptr) { - ALOGW("Dequeuing buffer for display [%s] failed, bailing out of " - "client composition for this frame", - display->getDisplayName().c_str()); - return false; - } - - // Bind the framebuffer in this scope. - fbo = std::make_unique<renderengine::BindNativeBufferAsFramebuffer>(getRenderEngine(), - buf->getNativeBuffer()); - - if (fbo->getStatus() != NO_ERROR) { - ALOGW("Binding buffer for display [%s] failed with status: %d", - display->getDisplayName().c_str(), fbo->getStatus()); - return false; - } - Dataspace outputDataspace = Dataspace::UNKNOWN; if (display->hasWideColorGamut()) { outputDataspace = display->getCompositionDataSpace(); @@ -3031,7 +3025,18 @@ bool SurfaceFlinger::doComposeSurfaces(const sp<DisplayDevice>& display) { colorMatrix *= mEnhancedSaturationMatrix; } - display->setViewportAndProjection(); + if (!display->makeCurrent()) { + ALOGW("DisplayDevice::makeCurrent failed. Aborting surface composition for display %s", + display->getDisplayName().c_str()); + getRenderEngine().resetCurrentSurface(); + + // |mStateLock| not needed as we are on the main thread + const auto defaultDisplay = getDefaultDisplayDeviceLocked(); + if (!defaultDisplay || !defaultDisplay->makeCurrent()) { + ALOGE("DisplayDevice::makeCurrent on default display failed. Aborting."); + } + return false; + } // Never touch the framebuffer if we don't have any framebuffer layers if (hasDeviceComposition) { @@ -3124,15 +3129,11 @@ bool SurfaceFlinger::doComposeSurfaces(const sp<DisplayDevice>& display) { firstLayer = false; } - // Perform some cleanup steps if we used client composition. - if (hasClientComposition) { - getRenderEngine().setColorTransform(mat4()); - getBE().mRenderEngine->disableScissor(); - display->finishBuffer(); - // Clear out error flags here so that we don't wait until next - // composition to log. - getRenderEngine().checkErrors(); - } + // Clear color transform matrix at the end of the frame. + getRenderEngine().setColorTransform(mat4()); + + // disable scissor at the end of the frame + getBE().mRenderEngine->disableScissor(); return true; } diff --git a/services/surfaceflinger/SurfaceFlinger.h b/services/surfaceflinger/SurfaceFlinger.h index ca409130fe..e449e2044a 100644 --- a/services/surfaceflinger/SurfaceFlinger.h +++ b/services/surfaceflinger/SurfaceFlinger.h @@ -716,10 +716,10 @@ private: void doDebugFlashRegions(const sp<DisplayDevice>& display, bool repaintEverything); void doTracing(const char* where); void logLayerStats(); - void doDisplayComposition(const sp<DisplayDevice>& display, const Region& dirtyRegion); + void doDisplayComposition(const sp<const DisplayDevice>& display, const Region& dirtyRegion); // This fails if using GL and the surface has been destroyed. - bool doComposeSurfaces(const sp<DisplayDevice>& display); + bool doComposeSurfaces(const sp<const DisplayDevice>& display); void postFramebuffer(const sp<DisplayDevice>& display); void postFrame(); diff --git a/services/surfaceflinger/tests/unittests/CompositionTest.cpp b/services/surfaceflinger/tests/unittests/CompositionTest.cpp index 2ea2654d45..ebb58dc3d6 100644 --- a/services/surfaceflinger/tests/unittests/CompositionTest.cpp +++ b/services/surfaceflinger/tests/unittests/CompositionTest.cpp @@ -46,7 +46,6 @@ using testing::_; using testing::AtLeast; using testing::ByMove; using testing::DoAll; -using testing::Invoke; using testing::IsNull; using testing::Mock; using testing::NotNull; @@ -143,9 +142,6 @@ public: renderengine::mock::Surface* mRenderSurface = new renderengine::mock::Surface(); mock::NativeWindow* mNativeWindow = new mock::NativeWindow(); - sp<GraphicBuffer> mBuffer = new GraphicBuffer(); - ANativeWindowBuffer* mNativeWindowBuffer = mBuffer->getNativeBuffer(); - mock::EventThread* mEventThread = new mock::EventThread(); mock::EventControlThread* mEventControlThread = new mock::EventControlThread(); @@ -270,9 +266,13 @@ struct BaseDisplayVariant { EXPECT_CALL(*test->mRenderEngine, checkErrors()).WillRepeatedly(Return()); EXPECT_CALL(*test->mRenderEngine, isCurrent()).WillRepeatedly(Return(true)); - EXPECT_CALL(*test->mRenderEngine, flush()).WillRepeatedly(Invoke([]() { - return base::unique_fd(0); - })); + EXPECT_CALL(*test->mRenderEngine, setCurrentSurface(Ref(*test->mRenderSurface))) + .WillOnce(Return(true)); + EXPECT_CALL(*test->mRenderEngine, + setViewportAndProjection(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT, + Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), + ui::Transform::ROT_0)) + .Times(1); EXPECT_CALL(*test->mDisplaySurface, onFrameCommitted()).Times(1); EXPECT_CALL(*test->mDisplaySurface, advanceFrame()).Times(1); @@ -323,6 +323,8 @@ struct BaseDisplayVariant { static void setupHwcCompositionCallExpectations(CompositionTest* test) { EXPECT_CALL(*test->mDisplaySurface, prepareFrame(DisplaySurface::COMPOSITION_HWC)).Times(1); + + EXPECT_CALL(*test->mRenderEngine, disableScissor()).Times(1); } static void setupRECompositionCallExpectations(CompositionTest* test) { @@ -342,18 +344,12 @@ struct BaseDisplayVariant { setViewportAndProjection(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT, Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT), ui::Transform::ROT_0)) - .Times(1); - EXPECT_CALL(*test->mReFrameBuffer, setNativeWindowBuffer(NotNull())).WillOnce(Return(true)); - EXPECT_CALL(*test->mReFrameBuffer, setNativeWindowBuffer(IsNull())).WillOnce(Return(true)); - EXPECT_CALL(*test->mRenderEngine, createFramebuffer()) - .WillOnce(Return( - ByMove(std::unique_ptr<renderengine::Framebuffer>(test->mReFrameBuffer)))); - EXPECT_CALL(*test->mRenderEngine, bindFrameBuffer(test->mReFrameBuffer)).Times(1); - EXPECT_CALL(*test->mRenderEngine, unbindFrameBuffer(test->mReFrameBuffer)).Times(1); - EXPECT_CALL(*test->mNativeWindow, queueBuffer(_, _)).WillOnce(Return(0)); - EXPECT_CALL(*test->mNativeWindow, dequeueBuffer(_, _)) - .WillOnce(DoAll(SetArgPointee<0>(test->mNativeWindowBuffer), SetArgPointee<1>(-1), - Return(0))); + .Times(1) + .RetiresOnSaturation(); + EXPECT_CALL(*test->mRenderEngine, setCurrentSurface(Ref(*test->mRenderSurface))) + .WillOnce(Return(true)) + .RetiresOnSaturation(); + EXPECT_CALL(*test->mRenderSurface, swapBuffers()).Times(1); } template <typename Case> diff --git a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp index e4eb1d5a93..a8cd8672b6 100644 --- a/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp +++ b/services/surfaceflinger/tests/unittests/DisplayTransactionTest.cpp @@ -120,7 +120,6 @@ public: mock::EventThread* mEventThread = new mock::EventThread(); mock::EventControlThread* mEventControlThread = new mock::EventControlThread(); sp<mock::NativeWindow> mNativeWindow = new mock::NativeWindow(); - sp<GraphicBuffer> mBuffer = new GraphicBuffer(); // These mocks are created by the test, but are destroyed by SurfaceFlinger // by virtue of being stored into a std::unique_ptr. However we still need @@ -341,6 +340,7 @@ struct DisplayVariant { static void setupNativeWindowSurfaceCreationCallExpectations(DisplayTransactionTest* test) { EXPECT_CALL(*test->mNativeWindowSurface, getNativeWindow()) .WillOnce(Return(test->mNativeWindow)); + EXPECT_CALL(*test->mNativeWindow, perform(19)).WillRepeatedly(Return(NO_ERROR)); // For simplicity, we only expect to create a single render surface for // each test. @@ -349,15 +349,17 @@ struct DisplayVariant { EXPECT_CALL(*test->mRenderEngine, createSurface()) .WillOnce(Return(ByMove( std::unique_ptr<renderengine::Surface>(test->mRenderSurface)))); + + // Creating a DisplayDevice requires getting default dimensions from the + // native window. EXPECT_CALL(*test->mNativeWindow, query(NATIVE_WINDOW_WIDTH, _)) .WillRepeatedly(DoAll(SetArgPointee<1>(WIDTH), Return(0))); EXPECT_CALL(*test->mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _)) .WillRepeatedly(DoAll(SetArgPointee<1>(HEIGHT), Return(0))); - // Creating a DisplayDevice requires getting default dimensions from the - // native window. EXPECT_CALL(*test->mRenderSurface, setAsync(static_cast<bool>(ASYNC))).Times(1); EXPECT_CALL(*test->mRenderSurface, setCritical(static_cast<bool>(CRITICAL))).Times(1); + EXPECT_CALL(*test->mRenderSurface, setNativeWindow(test->mNativeWindow.get())).Times(1); } static void setupFramebufferConsumerBufferQueueCallExpectations(DisplayTransactionTest* test) { @@ -1068,6 +1070,9 @@ TEST_F(DisplayTransactionTest, resetDisplayStateClearsState) { // The call disable vsyncs EXPECT_CALL(*mEventControlThread, setVsyncEnabled(false)).Times(1); + // The call clears the current render engine surface + EXPECT_CALL(*mRenderEngine, resetCurrentSurface()); + // The call ends any display resyncs EXPECT_CALL(*mPrimaryDispSync, endResync()).Times(1); @@ -1127,7 +1132,6 @@ public: .WillRepeatedly(DoAll(SetArgPointee<1>(1080 /* arbitrary */), Return(0))); EXPECT_CALL(*mNativeWindow, query(NATIVE_WINDOW_HEIGHT, _)) .WillRepeatedly(DoAll(SetArgPointee<1>(1920 /* arbitrary */), Return(0))); - EXPECT_CALL(*mNativeWindow, perform(13)).Times(1); auto displayDevice = mInjector.inject(); displayDevice->getBestColorMode(mInputDataspace, mInputRenderIntent, &mOutDataspace, @@ -1721,6 +1725,7 @@ TEST_F(HandleTransactionLockedTest, processesVirtualDisplayAdded) { EXPECT_CALL(*surface, setAsyncMode(true)).Times(1); + EXPECT_CALL(*mProducer, connect(_, _, _, _)).Times(1); EXPECT_CALL(*mProducer, disconnect(_, _)).Times(1); Case::Display::setupHwcVirtualDisplayCreationCallExpectations(this); @@ -1945,17 +1950,10 @@ TEST_F(HandleTransactionLockedTest, processesDisplayWidthChanges) { auto nativeWindow = new mock::NativeWindow(); auto displaySurface = new mock::DisplaySurface(); auto renderSurface = new renderengine::mock::Surface(); - sp<GraphicBuffer> buf = new GraphicBuffer(); auto display = Case::Display::makeFakeExistingDisplayInjector(this); display.setNativeWindow(nativeWindow); display.setDisplaySurface(displaySurface); display.setRenderSurface(std::unique_ptr<renderengine::Surface>(renderSurface)); - // Setup injection expections - EXPECT_CALL(*nativeWindow, query(NATIVE_WINDOW_WIDTH, _)) - .WillOnce(DoAll(SetArgPointee<1>(oldWidth), Return(0))); - EXPECT_CALL(*nativeWindow, query(NATIVE_WINDOW_HEIGHT, _)) - .WillOnce(DoAll(SetArgPointee<1>(oldHeight), Return(0))); - EXPECT_CALL(*nativeWindow, perform(13)).Times(1); display.inject(); // There is a change to the viewport state @@ -1967,7 +1965,9 @@ TEST_F(HandleTransactionLockedTest, processesDisplayWidthChanges) { // -------------------------------------------------------------------- // Call Expectations + EXPECT_CALL(*renderSurface, setNativeWindow(nullptr)).Times(1); EXPECT_CALL(*displaySurface, resizeBuffers(newWidth, oldHeight)).Times(1); + EXPECT_CALL(*renderSurface, setNativeWindow(nativeWindow)).Times(1); // -------------------------------------------------------------------- // Invocation @@ -1989,17 +1989,10 @@ TEST_F(HandleTransactionLockedTest, processesDisplayHeightChanges) { auto nativeWindow = new mock::NativeWindow(); auto displaySurface = new mock::DisplaySurface(); auto renderSurface = new renderengine::mock::Surface(); - sp<GraphicBuffer> buf = new GraphicBuffer(); auto display = Case::Display::makeFakeExistingDisplayInjector(this); display.setNativeWindow(nativeWindow); display.setDisplaySurface(displaySurface); display.setRenderSurface(std::unique_ptr<renderengine::Surface>(renderSurface)); - // Setup injection expections - EXPECT_CALL(*nativeWindow, query(NATIVE_WINDOW_WIDTH, _)) - .WillOnce(DoAll(SetArgPointee<1>(oldWidth), Return(0))); - EXPECT_CALL(*nativeWindow, query(NATIVE_WINDOW_HEIGHT, _)) - .WillOnce(DoAll(SetArgPointee<1>(oldHeight), Return(0))); - EXPECT_CALL(*nativeWindow, perform(13)).Times(1); display.inject(); // There is a change to the viewport state @@ -2011,7 +2004,9 @@ TEST_F(HandleTransactionLockedTest, processesDisplayHeightChanges) { // -------------------------------------------------------------------- // Call Expectations + EXPECT_CALL(*renderSurface, setNativeWindow(nullptr)).Times(1); EXPECT_CALL(*displaySurface, resizeBuffers(oldWidth, newHeight)).Times(1); + EXPECT_CALL(*renderSurface, setNativeWindow(nativeWindow)).Times(1); // -------------------------------------------------------------------- // Invocation diff --git a/services/surfaceflinger/tests/unittests/mock/system/window/MockNativeWindow.h b/services/surfaceflinger/tests/unittests/mock/system/window/MockNativeWindow.h index 4950a4b9e2..561fd5869e 100644 --- a/services/surfaceflinger/tests/unittests/mock/system/window/MockNativeWindow.h +++ b/services/surfaceflinger/tests/unittests/mock/system/window/MockNativeWindow.h @@ -36,7 +36,6 @@ public: MOCK_METHOD1(queueBuffer_DEPRECATED, int(struct ANativeWindowBuffer*)); MOCK_CONST_METHOD2(query, int(int, int*)); MOCK_METHOD1(perform, int(int)); - MOCK_METHOD2(perform, int(int, int)); MOCK_METHOD1(cancelBuffer_DEPRECATED, int(struct ANativeWindowBuffer*)); MOCK_METHOD2(dequeueBuffer, int(struct ANativeWindowBuffer**, int*)); MOCK_METHOD2(queueBuffer, int(struct ANativeWindowBuffer*, int)); |