diff options
-rw-r--r-- | libs/input/Android.bp | 3 | ||||
-rw-r--r-- | libs/renderengine/skia/Cache.cpp | 13 | ||||
-rw-r--r-- | libs/renderengine/skia/SkiaGLRenderEngine.cpp | 10 | ||||
-rw-r--r-- | libs/renderengine/tests/RenderEngineTest.cpp | 140 | ||||
-rw-r--r-- | libs/ui/Gralloc4.cpp | 5 | ||||
-rw-r--r-- | services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayer.h | 2 | ||||
-rw-r--r-- | services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp | 8 | ||||
-rw-r--r-- | services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp | 7 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.cpp | 12 | ||||
-rw-r--r-- | services/surfaceflinger/Layer.h | 4 | ||||
-rw-r--r-- | services/surfaceflinger/tests/LayerCallback_test.cpp | 121 | ||||
-rw-r--r-- | services/surfaceflinger/tests/unittests/SurfaceFlinger_PowerHintTest.cpp | 3 |
12 files changed, 281 insertions, 47 deletions
diff --git a/libs/input/Android.bp b/libs/input/Android.bp index 1d4fc1fc04..5d7874af77 100644 --- a/libs/input/Android.bp +++ b/libs/input/Android.bp @@ -103,9 +103,6 @@ cc_library { sanitize: { misc_undefined: ["integer"], - diag: { - misc_undefined: ["integer"], - }, }, }, host: { diff --git a/libs/renderengine/skia/Cache.cpp b/libs/renderengine/skia/Cache.cpp index a3a1969ee7..5c137a4b5f 100644 --- a/libs/renderengine/skia/Cache.cpp +++ b/libs/renderengine/skia/Cache.cpp @@ -96,7 +96,6 @@ static void drawShadowLayers(SkiaRenderEngine* renderengine, const DisplaySettin .alpha = 1, }; - auto layers = std::vector<LayerSettings>{layer, caster}; // Four combinations of settings are used (two transforms here, and drawShadowLayers is // called with two different destination data spaces) They're all rounded rect. // Three of these are cache misses that generate new shaders. @@ -115,6 +114,8 @@ static void drawShadowLayers(SkiaRenderEngine* renderengine, const DisplaySettin for (auto transform : {mat4(), kFlip}) { layer.geometry.positionTransform = transform; caster.geometry.positionTransform = transform; + + auto layers = std::vector<LayerSettings>{layer, caster}; renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, base::unique_fd()); } @@ -141,7 +142,6 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting }}, }; - auto layers = std::vector<LayerSettings>{layer}; for (auto dataspace : {kDestDataSpace, kOtherDataSpace}) { layer.sourceDataspace = dataspace; // Cache shaders for both rects and round rects. @@ -153,6 +153,7 @@ static void drawImageLayers(SkiaRenderEngine* renderengine, const DisplaySetting layer.source.buffer.isOpaque = isOpaque; for (auto alpha : {half(.2f), half(1.0f)}) { layer.alpha = alpha; + auto layers = std::vector<LayerSettings>{layer}; renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, base::unique_fd()); } @@ -177,11 +178,11 @@ static void drawSolidLayers(SkiaRenderEngine* renderengine, const DisplaySetting .alpha = 0.5, }; - auto layers = std::vector<LayerSettings>{layer}; for (auto transform : {mat4(), kScaleAndTranslate}) { layer.geometry.positionTransform = transform; for (float roundedCornersRadius : {0.0f, 50.f}) { layer.geometry.roundedCornersRadius = roundedCornersRadius; + auto layers = std::vector<LayerSettings>{layer}; renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, base::unique_fd()); } @@ -202,10 +203,10 @@ static void drawBlurLayers(SkiaRenderEngine* renderengine, const DisplaySettings .skipContentDraw = true, }; - auto layers = std::vector<LayerSettings>{layer}; // Different blur code is invoked for radii less and greater than 30 pixels for (int radius : {9, 60}) { layer.backgroundBlurRadius = radius; + auto layers = std::vector<LayerSettings>{layer}; renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, base::unique_fd()); } @@ -243,7 +244,6 @@ static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySetti }, }; - auto layers = std::vector<LayerSettings>{layer}; for (auto pixelSource : {bufferSource, bufferOpaque, colorSource}) { layer.source = pixelSource; for (auto dataspace : {kDestDataSpace, kOtherDataSpace}) { @@ -252,7 +252,8 @@ static void drawClippedLayers(SkiaRenderEngine* renderengine, const DisplaySetti for (auto transform : {kScaleAndTranslate, kScaleAsymmetric}) { layer.geometry.positionTransform = transform; for (float alpha : {0.5f, 1.f}) { - layer.alpha = alpha, + layer.alpha = alpha; + auto layers = std::vector<LayerSettings>{layer}; renderengine->drawLayers(display, layers, dstTexture, kUseFrameBufferCache, base::unique_fd()); } diff --git a/libs/renderengine/skia/SkiaGLRenderEngine.cpp b/libs/renderengine/skia/SkiaGLRenderEngine.cpp index 9bb68e3464..f440f4a058 100644 --- a/libs/renderengine/skia/SkiaGLRenderEngine.cpp +++ b/libs/renderengine/skia/SkiaGLRenderEngine.cpp @@ -1192,11 +1192,15 @@ void SkiaGLRenderEngine::drawLayersInternal( static constexpr float kInverseGamma22 = 1.f / 2.2f; const auto gammaCorrectedDimmingRatio = std::pow(layerDimmingRatio, kInverseGamma22); - const auto dimmingMatrix = + auto dimmingMatrix = mat4::scale(vec4(gammaCorrectedDimmingRatio, gammaCorrectedDimmingRatio, gammaCorrectedDimmingRatio, 1.f)); - paint.setColorFilter(SkColorFilters::Matrix( - toSkColorMatrix(display.colorTransform * dimmingMatrix))); + + const auto colorFilter = + SkColorFilters::Matrix(toSkColorMatrix(std::move(dimmingMatrix))); + paint.setColorFilter(displayColorTransform + ? displayColorTransform->makeComposed(colorFilter) + : colorFilter); } else { paint.setColorFilter(displayColorTransform); } diff --git a/libs/renderengine/tests/RenderEngineTest.cpp b/libs/renderengine/tests/RenderEngineTest.cpp index 24932423f4..31598e3cc3 100644 --- a/libs/renderengine/tests/RenderEngineTest.cpp +++ b/libs/renderengine/tests/RenderEngineTest.cpp @@ -91,6 +91,14 @@ vec3 OETF_sRGB(vec3 linear) { sign(linear.b) * OETF_sRGB(linear.b)); } +// clang-format off +// Converts red channels to green channels, and zeroes out an existing green channel. +static const auto kRemoveGreenAndMoveRedToGreenMat4 = mat4(0, 1, 0, 0, + 0, 0, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1); +// clang-format on + } // namespace class RenderEngineFactory { @@ -2557,6 +2565,133 @@ TEST_P(RenderEngineTest, testDimming_inGammaSpace) { expectBufferColor(Rect(2, 0, 3, 1), 122, 0, 0, 255, 1); } +TEST_P(RenderEngineTest, testDimming_inGammaSpace_withDisplayColorTransform) { + if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) { + GTEST_SKIP(); + } + initializeRenderEngine(); + + const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 | + ui::Dataspace::TRANSFER_GAMMA2_2 | + ui::Dataspace::RANGE_FULL); + + const auto displayRect = Rect(3, 1); + const renderengine::DisplaySettings display{ + .physicalDisplay = displayRect, + .clip = displayRect, + .outputDataspace = dataspace, + .colorTransform = kRemoveGreenAndMoveRedToGreenMat4, + .targetLuminanceNits = 1000.f, + .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF, + }; + + const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255)); + const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255)); + const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255)); + + const renderengine::LayerSettings greenLayer{ + .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f), + .source = + renderengine::PixelSource{ + .buffer = + renderengine::Buffer{ + .buffer = greenBuffer, + .usePremultipliedAlpha = true, + }, + }, + .alpha = 1.0f, + .sourceDataspace = dataspace, + .whitePointNits = 200.f, + }; + + const renderengine::LayerSettings redLayer{ + .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f), + .source = + renderengine::PixelSource{ + .buffer = + renderengine::Buffer{ + .buffer = redBuffer, + .usePremultipliedAlpha = true, + }, + }, + .alpha = 1.0f, + .sourceDataspace = dataspace, + // When the white point is not set for a layer, just ignore it and treat it as the same + // as the max layer + .whitePointNits = -1.f, + }; + + std::vector<renderengine::LayerSettings> layers{greenLayer, redLayer}; + invokeDraw(display, layers); + + expectBufferColor(Rect(1, 1), 0, 0, 0, 255, 1); + expectBufferColor(Rect(1, 0, 2, 1), 0, 122, 0, 255, 1); +} + +TEST_P(RenderEngineTest, testDimming_inGammaSpace_withDisplayColorTransform_deviceHandles) { + if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) { + GTEST_SKIP(); + } + initializeRenderEngine(); + + const ui::Dataspace dataspace = static_cast<ui::Dataspace>(ui::Dataspace::STANDARD_BT709 | + ui::Dataspace::TRANSFER_GAMMA2_2 | + ui::Dataspace::RANGE_FULL); + + const auto displayRect = Rect(3, 1); + const renderengine::DisplaySettings display{ + .physicalDisplay = displayRect, + .clip = displayRect, + .outputDataspace = dataspace, + .colorTransform = kRemoveGreenAndMoveRedToGreenMat4, + .deviceHandlesColorTransform = true, + .targetLuminanceNits = 1000.f, + .dimmingStage = aidl::android::hardware::graphics::composer3::DimmingStage::GAMMA_OETF, + }; + + const auto greenBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 255, 0, 255)); + const auto blueBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(0, 0, 255, 255)); + const auto redBuffer = allocateAndFillSourceBuffer(1, 1, ubyte4(255, 0, 0, 255)); + + const renderengine::LayerSettings greenLayer{ + .geometry.boundaries = FloatRect(0.f, 0.f, 1.f, 1.f), + .source = + renderengine::PixelSource{ + .buffer = + renderengine::Buffer{ + .buffer = greenBuffer, + .usePremultipliedAlpha = true, + }, + }, + .alpha = 1.0f, + .sourceDataspace = dataspace, + .whitePointNits = 200.f, + }; + + const renderengine::LayerSettings redLayer{ + .geometry.boundaries = FloatRect(1.f, 0.f, 2.f, 1.f), + .source = + renderengine::PixelSource{ + .buffer = + renderengine::Buffer{ + .buffer = redBuffer, + .usePremultipliedAlpha = true, + }, + }, + .alpha = 1.0f, + .sourceDataspace = dataspace, + // When the white point is not set for a layer, just ignore it and treat it as the same + // as the max layer + .whitePointNits = -1.f, + }; + + std::vector<renderengine::LayerSettings> layers{greenLayer, redLayer}; + invokeDraw(display, layers); + + expectBufferColor(Rect(1, 1), 0, 122, 0, 255, 1); + expectBufferColor(Rect(1, 0, 2, 1), 122, 0, 0, 255, 1); +} + TEST_P(RenderEngineTest, testDimming_withoutTargetLuminance) { initializeRenderEngine(); if (GetParam()->type() == renderengine::RenderEngine::RenderEngineType::GLES) { @@ -2796,10 +2931,7 @@ TEST_P(RenderEngineTest, r8_respects_color_transform) { // pure red to pure green. That will occur when the R8 buffer is // 255. When the R8 buffer is 0, it will still change to black, as // with r8_behaves_as_mask. - .colorTransform = mat4(0, 1, 0, 0, - 0, 0, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1), + .colorTransform = kRemoveGreenAndMoveRedToGreenMat4, .deviceHandlesColorTransform = false, }; diff --git a/libs/ui/Gralloc4.cpp b/libs/ui/Gralloc4.cpp index 4f950b8c4a..f6ab7b2a5e 100644 --- a/libs/ui/Gralloc4.cpp +++ b/libs/ui/Gralloc4.cpp @@ -1245,8 +1245,9 @@ status_t Gralloc4Allocator::allocate(std::string requestorName, uint32_t width, } else { if (importBuffers) { for (uint32_t i = 0; i < bufferCount; i++) { - error = mMapper.importBuffer(makeFromAidl(result.buffers[i]), - &outBufferHandles[i]); + auto handle = makeFromAidl(result.buffers[i]); + error = mMapper.importBuffer(handle, &outBufferHandles[i]); + native_handle_delete(handle); if (error != NO_ERROR) { for (uint32_t j = 0; j < i; j++) { mMapper.freeBuffer(outBufferHandles[j]); diff --git a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayer.h b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayer.h index d64d676a86..ecd432f629 100644 --- a/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayer.h +++ b/services/surfaceflinger/CompositionEngine/include/compositionengine/impl/OutputLayer.h @@ -60,7 +60,7 @@ public: std::vector<LayerFE::LayerSettings> getOverrideCompositionList() const override; void dump(std::string&) const override; - virtual FloatRect calculateOutputSourceCrop() const; + virtual FloatRect calculateOutputSourceCrop(uint32_t internalDisplayRotationFlags) const; virtual Rect calculateOutputDisplayFrame() const; virtual uint32_t calculateOutputRelativeBufferTransform( uint32_t internalDisplayRotationFlags) const; diff --git a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp index 3289d55870..744561c38d 100644 --- a/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp +++ b/services/surfaceflinger/CompositionEngine/src/OutputLayer.cpp @@ -106,9 +106,8 @@ Rect OutputLayer::calculateInitialCrop() const { return activeCrop; } -FloatRect OutputLayer::calculateOutputSourceCrop() const { +FloatRect OutputLayer::calculateOutputSourceCrop(uint32_t internalDisplayRotationFlags) const { const auto& layerState = *getLayerFE().getCompositionState(); - const auto& outputState = getOutput().getState(); if (!layerState.geomUsesSourceCrop) { return {}; @@ -140,8 +139,7 @@ FloatRect OutputLayer::calculateOutputSourceCrop() const { * the code below applies the primary display's inverse transform to the * buffer */ - uint32_t invTransformOrient = - ui::Transform::toRotationFlags(outputState.displaySpace.getOrientation()); + uint32_t invTransformOrient = internalDisplayRotationFlags; // calculate the inverse transform if (invTransformOrient & HAL_TRANSFORM_ROT_90) { invTransformOrient ^= HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_FLIP_H; @@ -304,7 +302,7 @@ void OutputLayer::updateCompositionState( state.forceClientComposition = false; state.displayFrame = calculateOutputDisplayFrame(); - state.sourceCrop = calculateOutputSourceCrop(); + state.sourceCrop = calculateOutputSourceCrop(internalDisplayRotationFlags); state.bufferTransform = static_cast<Hwc2::Transform>( calculateOutputRelativeBufferTransform(internalDisplayRotationFlags)); diff --git a/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp b/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp index ceee48c1ef..f96570a36e 100644 --- a/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp +++ b/services/surfaceflinger/CompositionEngine/tests/OutputLayerTest.cpp @@ -169,7 +169,7 @@ struct OutputLayerSourceCropTest : public OutputLayerTest { FloatRect calculateOutputSourceCrop() { mLayerFEState.geomInverseLayerTransform = mLayerFEState.geomLayerTransform.inverse(); - return mOutputLayer.calculateOutputSourceCrop(); + return mOutputLayer.calculateOutputSourceCrop(ui::Transform::RotationFlags::ROT_0); } }; @@ -533,7 +533,7 @@ struct OutputLayerPartialMockForUpdateCompositionState : public impl::OutputLaye sp<compositionengine::LayerFE> layerFE) : mOutput(output), mLayerFE(layerFE) {} // Mock everything called by updateCompositionState to simplify testing it. - MOCK_CONST_METHOD0(calculateOutputSourceCrop, FloatRect()); + MOCK_CONST_METHOD1(calculateOutputSourceCrop, FloatRect(uint32_t)); MOCK_CONST_METHOD0(calculateOutputDisplayFrame, Rect()); MOCK_CONST_METHOD1(calculateOutputRelativeBufferTransform, uint32_t(uint32_t)); @@ -563,7 +563,8 @@ public: ~OutputLayerUpdateCompositionStateTest() = default; void setupGeometryChildCallValues(ui::Transform::RotationFlags internalDisplayRotationFlags) { - EXPECT_CALL(mOutputLayer, calculateOutputSourceCrop()).WillOnce(Return(kSourceCrop)); + EXPECT_CALL(mOutputLayer, calculateOutputSourceCrop(internalDisplayRotationFlags)) + .WillOnce(Return(kSourceCrop)); EXPECT_CALL(mOutputLayer, calculateOutputDisplayFrame()).WillOnce(Return(kDisplayFrame)); EXPECT_CALL(mOutputLayer, calculateOutputRelativeBufferTransform(internalDisplayRotationFlags)) diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index d8a5601b8a..3a92ca49a2 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -2664,6 +2664,18 @@ void Layer::cloneDrawingState(const Layer* from) { mDrawingState.callbackHandles = {}; } +bool Layer::setTransactionCompletedListeners(const std::vector<sp<CallbackHandle>>& handles) { + if (handles.empty()) { + return false; + } + + for (const auto& handle : handles) { + mFlinger->getTransactionCallbackInvoker().registerUnpresentedCallbackHandle(handle); + } + + return true; +} + // --------------------------------------------------------------------------- std::ostream& operator<<(std::ostream& stream, const Layer::FrameRate& rate) { diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index 565a6ff726..ecea74413c 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -431,9 +431,7 @@ public: virtual bool setApi(int32_t /*api*/) { return false; }; virtual bool setSidebandStream(const sp<NativeHandle>& /*sidebandStream*/) { return false; }; virtual bool setTransactionCompletedListeners( - const std::vector<sp<CallbackHandle>>& /*handles*/) { - return false; - }; + const std::vector<sp<CallbackHandle>>& /*handles*/); virtual bool addFrameEvent(const sp<Fence>& /*acquireFence*/, nsecs_t /*postedTime*/, nsecs_t /*requestedPresentTime*/) { return false; diff --git a/services/surfaceflinger/tests/LayerCallback_test.cpp b/services/surfaceflinger/tests/LayerCallback_test.cpp index 8a2305b365..219db8c148 100644 --- a/services/surfaceflinger/tests/LayerCallback_test.cpp +++ b/services/surfaceflinger/tests/LayerCallback_test.cpp @@ -55,24 +55,34 @@ public: return createLayer(mClient, "test", 0, 0, ISurfaceComposerClient::eFXSurfaceBufferState); } + static int fillBuffer(Transaction& transaction, const sp<SurfaceControl>& layer, + bool setBuffer = true, bool setBackgroundColor = false) { + sp<GraphicBuffer> buffer; + sp<Fence> fence; + if (setBuffer) { + int err = getBuffer(&buffer, &fence); + if (err != NO_ERROR) { + return err; + } + + transaction.setBuffer(layer, buffer, fence); + } + + if (setBackgroundColor) { + transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f, + ui::Dataspace::UNKNOWN); + } + + return NO_ERROR; + } + static int fillTransaction(Transaction& transaction, CallbackHelper* callbackHelper, const sp<SurfaceControl>& layer = nullptr, bool setBuffer = true, bool setBackgroundColor = false) { if (layer) { - sp<GraphicBuffer> buffer; - sp<Fence> fence; - if (setBuffer) { - int err = getBuffer(&buffer, &fence); - if (err != NO_ERROR) { - return err; - } - - transaction.setBuffer(layer, buffer, fence); - } - - if (setBackgroundColor) { - transaction.setBackgroundColor(layer, /*color*/ half3(1.0f, 0, 0), /*alpha*/ 1.0f, - ui::Dataspace::UNKNOWN); + int err = fillBuffer(transaction, layer, setBuffer, setBackgroundColor); + if (err != NO_ERROR) { + return err; } } @@ -1115,7 +1125,7 @@ TEST_F(LayerCallbackTest, CommitCallbackOffscreenLayer) { Transaction transaction; CallbackHelper callback; int err = fillTransaction(transaction, &callback, layer, true); - err |= fillTransaction(transaction, &callback, offscreenLayer, true); + err |= fillBuffer(transaction, offscreenLayer); if (err) { GTEST_SUCCEED() << "test not supported"; return; @@ -1129,5 +1139,86 @@ TEST_F(LayerCallbackTest, CommitCallbackOffscreenLayer) { committedSc.insert(layer); committedSc.insert(offscreenLayer); EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + + ExpectedResult expected; + expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer); + expected.addSurface(ExpectedResult::Transaction::PRESENTED, offscreenLayer); + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); } + +TEST_F(LayerCallbackTest, TransactionCommittedCallback_BSL) { + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE(layer = createBufferStateLayer()); + + Transaction transaction; + CallbackHelper callback; + int err = fillTransaction(transaction, &callback, layer, true); + if (err) { + GTEST_SUCCEED() << "test not supported"; + return; + } + transaction.addTransactionCommittedCallback(callback.function, callback.getContext()).apply(); + std::unordered_set<sp<SurfaceControl>, SCHash> committedSc; + committedSc.insert(layer); + EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + ExpectedResult expected; + expected.addSurface(ExpectedResult::Transaction::PRESENTED, layer); + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); +} + +TEST_F(LayerCallbackTest, TransactionCommittedCallback_EffectLayer) { + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE(layer = createColorLayer("ColorLayer", Color::RED)); + + Transaction transaction; + CallbackHelper callback; + int err = fillTransaction(transaction, &callback); + if (err) { + GTEST_SUCCEED() << "test not supported"; + return; + } + transaction.addTransactionCommittedCallback(callback.function, callback.getContext()).apply(); + std::unordered_set<sp<SurfaceControl>, SCHash> committedSc; + EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + + ExpectedResult expected; + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); +} + +TEST_F(LayerCallbackTest, TransactionCommittedCallback_ContainerLayer) { + sp<SurfaceControl> layer; + ASSERT_NO_FATAL_FAILURE(layer = createLayer(mClient, "Container Layer", 0, 0, + ISurfaceComposerClient::eFXSurfaceContainer)); + + Transaction transaction; + CallbackHelper callback; + int err = fillTransaction(transaction, &callback); + if (err) { + GTEST_SUCCEED() << "test not supported"; + return; + } + transaction.addTransactionCommittedCallback(callback.function, callback.getContext()).apply(); + std::unordered_set<sp<SurfaceControl>, SCHash> committedSc; + EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + + ExpectedResult expected; + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); +} + +TEST_F(LayerCallbackTest, TransactionCommittedCallback_NoLayer) { + Transaction transaction; + CallbackHelper callback; + int err = fillTransaction(transaction, &callback); + if (err) { + GTEST_SUCCEED() << "test not supported"; + return; + } + transaction.addTransactionCommittedCallback(callback.function, callback.getContext()).apply(); + std::unordered_set<sp<SurfaceControl>, SCHash> committedSc; + EXPECT_NO_FATAL_FAILURE(waitForCommitCallback(callback, committedSc)); + + ExpectedResult expected; + EXPECT_NO_FATAL_FAILURE(waitForCallback(callback, expected, true)); +} + } // namespace android diff --git a/services/surfaceflinger/tests/unittests/SurfaceFlinger_PowerHintTest.cpp b/services/surfaceflinger/tests/unittests/SurfaceFlinger_PowerHintTest.cpp index 0a157c4bc1..8de9e4be29 100644 --- a/services/surfaceflinger/tests/unittests/SurfaceFlinger_PowerHintTest.cpp +++ b/services/surfaceflinger/tests/unittests/SurfaceFlinger_PowerHintTest.cpp @@ -130,8 +130,7 @@ TEST_F(SurfaceFlingerPowerHintTest, sendDurationsIncludingHwcWaitTime) { ON_CALL(*mPowerAdvisor, usePowerHintSession()).WillByDefault(Return(true)); const std::chrono::nanoseconds mockVsyncPeriod = 15ms; - const std::chrono::nanoseconds expectedTargetTime = 14ms; - EXPECT_CALL(*mPowerAdvisor, setTargetWorkDuration(Gt(expectedTargetTime.count()))).Times(1); + EXPECT_CALL(*mPowerAdvisor, setTargetWorkDuration(_)).Times(1); const nsecs_t now = systemTime(); const std::chrono::nanoseconds mockHwcRunTime = 20ms; |