diff options
| -rw-r--r-- | libs/gui/tests/EndToEndNativeInputTest.cpp | 5 | ||||
| -rw-r--r-- | services/surfaceflinger/BufferLayer.cpp | 12 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.cpp | 76 | ||||
| -rw-r--r-- | services/surfaceflinger/Layer.h | 12 | ||||
| -rw-r--r-- | services/surfaceflinger/SurfaceFlinger.cpp | 25 | ||||
| -rw-r--r-- | services/surfaceflinger/tests/Transaction_test.cpp | 233 |
6 files changed, 172 insertions, 191 deletions
diff --git a/libs/gui/tests/EndToEndNativeInputTest.cpp b/libs/gui/tests/EndToEndNativeInputTest.cpp index 2871302927..86e9c23a7e 100644 --- a/libs/gui/tests/EndToEndNativeInputTest.cpp +++ b/libs/gui/tests/EndToEndNativeInputTest.cpp @@ -59,9 +59,8 @@ static const int LAYER_BASE = INT32_MAX - 10; class InputSurface { public: InputSurface(const sp<SurfaceComposerClient>& scc, int width, int height) { - mSurfaceControl = scc->createSurface(String8("Test Surface"), - width, height, PIXEL_FORMAT_RGBA_8888, - ISurfaceComposerClient::eFXSurfaceColor); + mSurfaceControl = scc->createSurface(String8("Test Surface"), 0, 0, PIXEL_FORMAT_RGBA_8888, + ISurfaceComposerClient::eFXSurfaceColor); InputChannel::openInputChannelPair("testchannels", mServerChannel, mClientChannel); mServerChannel->setToken(new BBinder()); diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index ade62bf68f..7caae989cd 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -501,7 +501,7 @@ Region BufferLayer::latchBuffer(bool& recomputeVisibleRegions, nsecs_t latchTime // FIXME: postedRegion should be dirty & bounds // transform the dirty region to window-manager space - return getTransform().transform(Region(Rect(getActiveWidth(s), getActiveHeight(s)))); + return getTransform().transform(Region(getBufferSize(s))); } // transaction @@ -624,11 +624,13 @@ void BufferLayer::drawWithOpenGL(const RenderArea& renderArea, bool useIdentityT ui::Transform t = getTransform(); Rect win = bounds; + const int bufferWidth = getBufferSize(s).getWidth(); + const int bufferHeight = getBufferSize(s).getHeight(); - float left = float(win.left) / float(getActiveWidth(s)); - float top = float(win.top) / float(getActiveHeight(s)); - float right = float(win.right) / float(getActiveWidth(s)); - float bottom = float(win.bottom) / float(getActiveHeight(s)); + const float left = float(win.left) / float(bufferWidth); + const float top = float(win.top) / float(bufferHeight); + const float right = float(win.right) / float(bufferWidth); + const float bottom = float(win.bottom) / float(bufferHeight); // TODO: we probably want to generate the texture coords with the mesh // here we assume that we only have 4 vertices diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index 6ac09016bb..3b444f7aa4 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -367,27 +367,24 @@ Rect Layer::computeInitialCrop(const sp<const DisplayDevice>& display) const { // layerstack space, and convert-back to layer space. // if there are no window scaling involved, this operation will map to full // pixels in the buffer. - // FIXME: the 3 lines below can produce slightly incorrect clipping when we have - // a viewport clipping and a window transform. we should use floating point to fix this. - - Rect activeCrop(getActiveWidth(s), getActiveHeight(s)); - Rect crop = getCrop(s); - if (!crop.isEmpty()) { - activeCrop.intersect(crop, &activeCrop); - } + FloatRect activeCropFloat = computeBounds(); ui::Transform t = getTransform(); - activeCrop = t.transform(activeCrop); - if (!activeCrop.intersect(display->getViewport(), &activeCrop)) { + // Transform to screen space. + activeCropFloat = t.transform(activeCropFloat); + activeCropFloat = activeCropFloat.intersect(display->getViewport().toFloatRect()); + // Back to layer space to work with the content crop. + activeCropFloat = t.inverse().transform(activeCropFloat); + // This needs to be here as transform.transform(Rect) computes the + // transformed rect and then takes the bounding box of the result before + // returning. This means + // transform.inverse().transform(transform.transform(Rect)) != Rect + // in which case we need to make sure the final rect is clipped to the + // display bounds. + Rect activeCrop{activeCropFloat}; + if (!activeCrop.intersect(getBufferSize(s), &activeCrop)) { activeCrop.clear(); } - - const auto& p = mDrawingParent.promote(); - if (p != nullptr) { - auto parentCrop = p->computeInitialCrop(display); - activeCrop.intersect(parentCrop, &activeCrop); - } - return activeCrop; } @@ -399,24 +396,8 @@ FloatRect Layer::computeCrop(const sp<const DisplayDevice>& display) const { // In addition there is a WM-specified crop we pull from our drawing state. const State& s(getDrawingState()); - // Screen space to make reduction to parent crop clearer. Rect activeCrop = computeInitialCrop(display); - ui::Transform t = getTransform(); - // Back to layer space to work with the content crop. - activeCrop = t.inverse().transform(activeCrop); - - // This needs to be here as transform.transform(Rect) computes the - // transformed rect and then takes the bounding box of the result before - // returning. This means - // transform.inverse().transform(transform.transform(Rect)) != Rect - // in which case we need to make sure the final rect is clipped to the - // display bounds. - if (!activeCrop.intersect(Rect(getActiveWidth(s), getActiveHeight(s)), &activeCrop)) { - activeCrop.clear(); - } - - // subtract the transparent region and snap to the bounds - activeCrop = reduce(activeCrop, getActiveTransparentRegion(s)); + Rect bufferSize = getBufferSize(s); // Transform the window crop to match the buffer coordinate system, // which means using the inverse of the current transform set on the @@ -437,8 +418,8 @@ FloatRect Layer::computeCrop(const sp<const DisplayDevice>& display) const { ui::Transform(invTransform)).getOrientation(); } - int winWidth = getActiveWidth(s); - int winHeight = getActiveHeight(s); + int winWidth = bufferSize.getWidth(); + int winHeight = bufferSize.getHeight(); if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) { // If the activeCrop has been rotate the ends are rotated but not // the space itself so when transforming ends back we can't rely on @@ -450,10 +431,10 @@ FloatRect Layer::computeCrop(const sp<const DisplayDevice>& display) const { if (is_h_flipped == is_v_flipped) { invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V | NATIVE_WINDOW_TRANSFORM_FLIP_H; } - winWidth = getActiveHeight(s); - winHeight = getActiveWidth(s); + std::swap(winWidth, winHeight); } - const Rect winCrop = activeCrop.transform(invTransform, getActiveWidth(s), getActiveHeight(s)); + const Rect winCrop = + activeCrop.transform(invTransform, bufferSize.getWidth(), bufferSize.getHeight()); // below, crop is intersected with winCrop expressed in crop's coordinate space float xScale = crop.getWidth() / float(winWidth); @@ -489,6 +470,8 @@ void Layer::setGeometry(const sp<const DisplayDevice>& display, uint32_t z) { // this gives us only the "orientation" component of the transform const State& s(getDrawingState()); + const int bufferWidth = getBufferSize(s).getWidth(); + const int bufferHeight = getBufferSize(s).getHeight(); auto blendMode = HWC2::BlendMode::None; if (!isOpaque(s) || getAlpha() != 1.0f) { blendMode = @@ -519,16 +502,15 @@ void Layer::setGeometry(const sp<const DisplayDevice>& display, uint32_t z) { // transform.inverse().transform(transform.transform(Rect)) != Rect // in which case we need to make sure the final rect is clipped to the // display bounds. - if (!activeCrop.intersect(Rect(getActiveWidth(s), getActiveHeight(s)), &activeCrop)) { + if (!activeCrop.intersect(Rect(bufferWidth, bufferHeight), &activeCrop)) { activeCrop.clear(); } // mark regions outside the crop as transparent - activeTransparentRegion.orSelf(Rect(0, 0, getActiveWidth(s), activeCrop.top)); - activeTransparentRegion.orSelf( - Rect(0, activeCrop.bottom, getActiveWidth(s), getActiveHeight(s))); + activeTransparentRegion.orSelf(Rect(0, 0, bufferWidth, activeCrop.top)); + activeTransparentRegion.orSelf(Rect(0, activeCrop.bottom, bufferWidth, bufferHeight)); activeTransparentRegion.orSelf(Rect(0, activeCrop.top, activeCrop.left, activeCrop.bottom)); activeTransparentRegion.orSelf( - Rect(activeCrop.right, activeCrop.top, getActiveWidth(s), activeCrop.bottom)); + Rect(activeCrop.right, activeCrop.top, bufferWidth, activeCrop.bottom)); } // computeBounds returns a FloatRect to provide more accuracy during the @@ -664,11 +646,7 @@ void Layer::updateCursorPosition(const sp<const DisplayDevice>& display) { // 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(getActiveWidth(s), getActiveHeight(s)); - Rect crop = getCrop(s); - if (!crop.isEmpty()) { - win.intersect(crop, &win); - } + Rect win = getCroppedBufferSize(s); // Subtract the transparent region and snap to the bounds Rect bounds = reduce(win, getActiveTransparentRegion(s)); Rect frame(getTransform().transform(bounds)); diff --git a/services/surfaceflinger/Layer.h b/services/surfaceflinger/Layer.h index fe8d5a95c9..00a6bbede6 100644 --- a/services/surfaceflinger/Layer.h +++ b/services/surfaceflinger/Layer.h @@ -596,6 +596,12 @@ public: int32_t getZ() const; virtual void pushPendingState(); + /** + * Returns active buffer size in the correct orientation. Buffer size is determined by undoing + * any buffer transformations. If the layer has no buffer then return INVALID_RECT. + */ + virtual Rect getBufferSize(const Layer::State&) const { return Rect::INVALID_RECT; } + protected: // constant sp<SurfaceFlinger> mFlinger; @@ -819,12 +825,6 @@ private: * bounds are constrained by its parent bounds. */ Rect getCroppedBufferSize(const Layer::State& s) const; - - /** - * Returns active buffer size in the correct orientation. Buffer size is determined by undoing - * any buffer transformations. If the layer has no buffer then return INVALID_RECT. - */ - virtual Rect getBufferSize(const Layer::State&) const { return Rect::INVALID_RECT; } }; } // namespace android diff --git a/services/surfaceflinger/SurfaceFlinger.cpp b/services/surfaceflinger/SurfaceFlinger.cpp index 1db87915bc..06c50944d1 100644 --- a/services/surfaceflinger/SurfaceFlinger.cpp +++ b/services/surfaceflinger/SurfaceFlinger.cpp @@ -3707,11 +3707,24 @@ status_t SurfaceFlinger::createLayer( result = createBufferStateLayer(client, uniqueName, w, h, flags, handle, &layer); break; case ISurfaceComposerClient::eFXSurfaceColor: + // check if buffer size is set for color layer. + if (w > 0 || h > 0) { + ALOGE("createLayer() failed, w or h cannot be set for color layer (w=%d, h=%d)", + int(w), int(h)); + return BAD_VALUE; + } + result = createColorLayer(client, uniqueName, w, h, flags, handle, &layer); break; case ISurfaceComposerClient::eFXSurfaceContainer: + // check if buffer size is set for container layer. + if (w > 0 || h > 0) { + ALOGE("createLayer() failed, w or h cannot be set for container layer (w=%d, h=%d)", + int(w), int(h)); + return BAD_VALUE; + } result = createContainerLayer(client, uniqueName, w, h, flags, handle, &layer); @@ -5161,12 +5174,14 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, const ui::Transform& getTransform() const override { return mTransform; } Rect getBounds() const override { const Layer::State& layerState(mLayer->getDrawingState()); - return Rect(mLayer->getActiveWidth(layerState), mLayer->getActiveHeight(layerState)); + return mLayer->getBufferSize(layerState); } int getHeight() const override { - return mLayer->getActiveHeight(mLayer->getDrawingState()); + return mLayer->getBufferSize(mLayer->getDrawingState()).getHeight(); + } + int getWidth() const override { + return mLayer->getBufferSize(mLayer->getDrawingState()).getWidth(); } - int getWidth() const override { return mLayer->getActiveWidth(mLayer->getDrawingState()); } bool isSecure() const override { return false; } bool needsFiltering() const override { return mNeedsFiltering; } Rect getSourceCrop() const override { @@ -5240,12 +5255,12 @@ status_t SurfaceFlinger::captureLayers(const sp<IBinder>& layerHandleBinder, Rect crop(sourceCrop); if (sourceCrop.width() <= 0) { crop.left = 0; - crop.right = parent->getActiveWidth(parent->getCurrentState()); + crop.right = parent->getBufferSize(parent->getCurrentState()).getWidth(); } if (sourceCrop.height() <= 0) { crop.top = 0; - crop.bottom = parent->getActiveHeight(parent->getCurrentState()); + crop.bottom = parent->getBufferSize(parent->getCurrentState()).getHeight(); } int32_t reqWidth = crop.width() * frameScale; diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp index a600a0a5af..7e95d99512 100644 --- a/services/surfaceflinger/tests/Transaction_test.cpp +++ b/services/surfaceflinger/tests/Transaction_test.cpp @@ -334,16 +334,10 @@ protected: virtual sp<SurfaceControl> createLayer(const sp<SurfaceComposerClient>& client, const char* name, uint32_t width, uint32_t height, uint32_t flags = 0) { - auto layer = - client->createSurface(String8(name), width, height, PIXEL_FORMAT_RGBA_8888, flags); - EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl"; + auto layer = createSurface(client, name, width, height, PIXEL_FORMAT_RGBA_8888, flags); Transaction t; t.setLayerStack(layer, mDisplayLayerStack).setLayer(layer, mLayerZBase); - // If we are creating a color layer, set its crop since its size will be ignored. - if (flags == ISurfaceComposerClient::eFXSurfaceColor) { - t.setCrop_legacy(layer, Rect(0, 0, width, height)); - } status_t error = t.apply(); if (error != NO_ERROR) { @@ -354,6 +348,15 @@ protected: return layer; } + virtual sp<SurfaceControl> createSurface(const sp<SurfaceComposerClient>& client, + const char* name, uint32_t width, uint32_t height, + PixelFormat format, uint32_t flags, + SurfaceControl* parent = nullptr) { + auto layer = client->createSurface(String8(name), width, height, format, flags, parent); + EXPECT_NE(nullptr, layer.get()) << "failed to create SurfaceControl"; + return layer; + } + virtual sp<SurfaceControl> createLayer(const char* name, uint32_t width, uint32_t height, uint32_t flags = 0) { return createLayer(mClient, name, width, height, flags); @@ -509,9 +512,9 @@ private: mDisplayLayerStack = 0; - mBlackBgSurface = mClient->createSurface(String8("BaseSurface"), mDisplayWidth, - mDisplayHeight, PIXEL_FORMAT_RGBA_8888, - ISurfaceComposerClient::eFXSurfaceColor); + mBlackBgSurface = + createSurface(mClient, "BaseSurface", 0 /* buffer width */, 0 /* buffer height */, + PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eFXSurfaceColor); // set layer stack (b/68888219) Transaction t; @@ -834,8 +837,9 @@ TEST_P(LayerTypeTransactionTest, SetZBasic) { TEST_P(LayerTypeTransactionTest, SetZNegative) { sp<SurfaceControl> parent = - LayerTransactionTest::createLayer("Parent", mDisplayWidth, mDisplayHeight, + LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */, ISurfaceComposerClient::eFXSurfaceContainer); + Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply(); sp<SurfaceControl> layerR; sp<SurfaceControl> layerG; ASSERT_NO_FATAL_FAILURE(layerR = createLayer("test R", 32, 32)); @@ -892,8 +896,9 @@ TEST_P(LayerTypeTransactionTest, SetRelativeZBasic) { TEST_P(LayerTypeTransactionTest, SetRelativeZNegative) { sp<SurfaceControl> parent = - LayerTransactionTest::createLayer("Parent", mDisplayWidth, mDisplayHeight, + LayerTransactionTest::createLayer("Parent", 0 /* buffer width */, 0 /* buffer height */, ISurfaceComposerClient::eFXSurfaceContainer); + Transaction().setCrop_legacy(parent, Rect(0, 0, mDisplayWidth, mDisplayHeight)).apply(); sp<SurfaceControl> layerR; sp<SurfaceControl> layerG; sp<SurfaceControl> layerB; @@ -1225,10 +1230,15 @@ TEST_F(LayerTransactionTest, SetColorBasic) { sp<SurfaceControl> colorLayer; ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32)); ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32)); - ASSERT_NO_FATAL_FAILURE( - colorLayer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceColor)); + ASSERT_NO_FATAL_FAILURE(colorLayer = + createLayer("test", 0 /* buffer width */, 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor)); + + Transaction() + .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)) + .setLayer(colorLayer, mLayerZBase + 1) + .apply(); - Transaction().setLayer(colorLayer, mLayerZBase + 1).apply(); { SCOPED_TRACE("default color"); screenshot()->expectColor(Rect(0, 0, 32, 32), Color::BLACK); @@ -1248,10 +1258,14 @@ TEST_F(LayerTransactionTest, SetColorBasic) { TEST_F(LayerTransactionTest, SetColorClamped) { sp<SurfaceControl> colorLayer; - ASSERT_NO_FATAL_FAILURE( - colorLayer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceColor)); + ASSERT_NO_FATAL_FAILURE(colorLayer = + createLayer("test", 0 /* buffer width */, 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor)); + Transaction() + .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)) + .setColor(colorLayer, half3(2.0f, -1.0f, 0.0f)) + .apply(); - Transaction().setColor(colorLayer, half3(2.0f, -1.0f, 0.0f)).apply(); screenshot()->expectColor(Rect(0, 0, 32, 32), Color::RED); } @@ -1260,8 +1274,10 @@ TEST_F(LayerTransactionTest, SetColorWithAlpha) { sp<SurfaceControl> colorLayer; ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32)); ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32)); - ASSERT_NO_FATAL_FAILURE( - colorLayer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceColor)); + ASSERT_NO_FATAL_FAILURE(colorLayer = + createLayer("test", 0 /* buffer width */, 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor)); + Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply(); const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f); const float alpha = 0.25f; @@ -1285,9 +1301,10 @@ TEST_F(LayerTransactionTest, SetColorWithParentAlpha_Bug74220420) { ASSERT_NO_FATAL_FAILURE(bufferLayer = createLayer("test bg", 32, 32)); ASSERT_NO_FATAL_FAILURE(parentLayer = createLayer("parentWithAlpha", 32, 32)); ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::RED, 32, 32)); - ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer( - "childWithColor", 32, 32, ISurfaceComposerClient::eFXSurfaceColor)); - + ASSERT_NO_FATAL_FAILURE(colorLayer = createLayer("childWithColor", 0 /* buffer width */, + 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor)); + Transaction().setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)).apply(); const half3 color(15.0f / 255.0f, 51.0f / 255.0f, 85.0f / 255.0f); const float alpha = 0.25f; const ubyte3 expected((vec3(color) * alpha + vec3(1.0f, 0.0f, 0.0f) * (1.0f - alpha)) * 255.0f); @@ -2129,10 +2146,13 @@ public: TEST_F(LayerTransactionTest, SetColorTransformBasic) { sp<SurfaceControl> colorLayer; - ASSERT_NO_FATAL_FAILURE( - colorLayer = createLayer("test", 32, 32, ISurfaceComposerClient::eFXSurfaceColor)); - - Transaction().setLayer(colorLayer, mLayerZBase + 1).apply(); + ASSERT_NO_FATAL_FAILURE(colorLayer = + createLayer("test", 0 /* buffer width */, 0 /* buffer height */, + ISurfaceComposerClient::eFXSurfaceColor)); + Transaction() + .setCrop_legacy(colorLayer, Rect(0, 0, 32, 32)) + .setLayer(colorLayer, mLayerZBase + 1) + .apply(); { SCOPED_TRACE("default color"); screenshot()->expectColor(Rect(0, 0, 32, 32), Color::BLACK); @@ -3024,11 +3044,10 @@ TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) { std::unique_ptr<ScreenCapture> sc; sp<SurfaceControl> childNoBuffer = - mClient->createSurface(String8("Bufferless child"), 10, 10, - PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); - sp<SurfaceControl> childBuffer = - mClient->createSurface(String8("Buffered child"), 20, 20, - PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get()); + createSurface(mClient, "Bufferless child", 0 /* buffer width */, 0 /* buffer height */, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); + sp<SurfaceControl> childBuffer = createSurface(mClient, "Buffered child", 20, 20, + PIXEL_FORMAT_RGBA_8888, 0, childNoBuffer.get()); fillSurfaceRGBA8(childBuffer, 200, 200, 200); SurfaceComposerClient::Transaction{} .setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10)) @@ -3078,8 +3097,8 @@ class ChildLayerTest : public LayerUpdateTest { protected: void SetUp() override { LayerUpdateTest::SetUp(); - mChild = mClient->createSurface(String8("Child surface"), 10, 10, - PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); + mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, + mFGSurfaceControl.get()); fillSurfaceRGBA8(mChild, 200, 200, 200); { @@ -3254,8 +3273,7 @@ TEST_F(ChildLayerTest, ReparentChildren) { TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) { sp<SurfaceControl> mGrandChild = - mClient->createSurface(String8("Grand Child"), 10, 10, - PIXEL_FORMAT_RGBA_8888, 0, mChild.get()); + createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get()); fillSurfaceRGBA8(mGrandChild, 111, 111, 111); { @@ -3318,10 +3336,9 @@ TEST_F(ChildLayerTest, DetachChildrenSameClient) { TEST_F(ChildLayerTest, DetachChildrenDifferentClient) { sp<SurfaceComposerClient> mNewComposerClient = new SurfaceComposerClient; sp<SurfaceControl> mChildNewClient = - mNewComposerClient->createSurface(String8("New Child Test Surface"), 10, 10, - PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); + createSurface(mNewComposerClient, "New Child Test Surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); - ASSERT_TRUE(mChildNewClient != nullptr); ASSERT_TRUE(mChildNewClient->isValid()); fillSurfaceRGBA8(mChildNewClient, 200, 200, 200); @@ -3482,9 +3499,8 @@ TEST_F(ChildLayerTest, Bug36858924) { mChild.clear(); // Now recreate it as hidden - mChild = mClient->createSurface(String8("Child surface"), 10, 10, - PIXEL_FORMAT_RGBA_8888, ISurfaceComposerClient::eHidden, - mFGSurfaceControl.get()); + mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, + ISurfaceComposerClient::eHidden, mFGSurfaceControl.get()); // Show the child layer in a deferred transaction asTransaction([&](Transaction& t) { @@ -3600,9 +3616,8 @@ TEST_F(ChildLayerTest, ReparentFromNoParent) { } TEST_F(ChildLayerTest, NestedChildren) { - sp<SurfaceControl> grandchild = - mClient->createSurface(String8("Grandchild surface"), 10, 10, - PIXEL_FORMAT_RGBA_8888, 0, mChild.get()); + sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mChild.get()); fillSurfaceRGBA8(grandchild, 50, 50, 50); { @@ -3640,9 +3655,8 @@ protected: // Verify setting a size on a buffer layer has no effect. TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) { sp<SurfaceControl> bufferLayer = - mClient->createSurface(String8("BufferLayer"), 45, 45, PIXEL_FORMAT_RGBA_8888, 0, - mFGSurfaceControl.get()); - ASSERT_TRUE(bufferLayer != nullptr); + createSurface(mClient, "BufferLayer", 45, 45, PIXEL_FORMAT_RGBA_8888, 0, + mFGSurfaceControl.get()); ASSERT_TRUE(bufferLayer->isValid()); ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(bufferLayer, Color::BLACK, 30, 30)); asTransaction([&](Transaction& t) { t.show(bufferLayer); }); @@ -3661,10 +3675,8 @@ TEST_F(BoundlessLayerTest, BufferLayerIgnoresSize) { // which will crop the color layer. TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) { sp<SurfaceControl> colorLayer = - mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888, - ISurfaceComposerClient::eFXSurfaceColor, - mFGSurfaceControl.get()); - ASSERT_TRUE(colorLayer != nullptr); + createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888, + ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get()); ASSERT_TRUE(colorLayer->isValid()); asTransaction([&](Transaction& t) { t.setColor(colorLayer, half3{0, 0, 0}); @@ -3684,15 +3696,12 @@ TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentBufferBounds) { // Verify a boundless color layer will fill its parent bounds. The parent has no buffer but has // a crop which will be used to crop the color layer. TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) { - sp<SurfaceControl> cropLayer = - mClient->createSurface(String8("CropLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888, - 0 /* flags */, mFGSurfaceControl.get()); - ASSERT_TRUE(cropLayer != nullptr); + sp<SurfaceControl> cropLayer = createSurface(mClient, "CropLayer", 0, 0, PIXEL_FORMAT_RGBA_8888, + 0 /* flags */, mFGSurfaceControl.get()); ASSERT_TRUE(cropLayer->isValid()); sp<SurfaceControl> colorLayer = - mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888, - ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get()); - ASSERT_TRUE(colorLayer != nullptr); + createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888, + ISurfaceComposerClient::eFXSurfaceColor, cropLayer.get()); ASSERT_TRUE(colorLayer->isValid()); asTransaction([&](Transaction& t) { t.setCrop_legacy(cropLayer, Rect(5, 5, 10, 10)); @@ -3716,10 +3725,8 @@ TEST_F(BoundlessLayerTest, BoundlessColorLayerFillsParentCropBounds) { // Verify for boundless layer with no children, their transforms have no effect. TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) { sp<SurfaceControl> colorLayer = - mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888, - ISurfaceComposerClient::eFXSurfaceColor, - mFGSurfaceControl.get()); - ASSERT_TRUE(colorLayer != nullptr); + createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888, + ISurfaceComposerClient::eFXSurfaceColor, mFGSurfaceControl.get()); ASSERT_TRUE(colorLayer->isValid()); asTransaction([&](Transaction& t) { t.setPosition(colorLayer, 320, 320); @@ -3741,20 +3748,16 @@ TEST_F(BoundlessLayerTest, BoundlessColorLayerTransformHasNoEffect) { // Verify for boundless layer with children, their transforms have an effect. TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerCanSetTransform) { sp<SurfaceControl> boundlessLayerRightShift = - mClient->createSurface(String8("BoundlessLayerRightShift"), 0, 0, - PIXEL_FORMAT_RGBA_8888, 0 /* flags */, mFGSurfaceControl.get()); - ASSERT_TRUE(boundlessLayerRightShift != nullptr); + createSurface(mClient, "BoundlessLayerRightShift", 0, 0, PIXEL_FORMAT_RGBA_8888, + 0 /* flags */, mFGSurfaceControl.get()); ASSERT_TRUE(boundlessLayerRightShift->isValid()); sp<SurfaceControl> boundlessLayerDownShift = - mClient->createSurface(String8("BoundlessLayerLeftShift"), 0, 0, PIXEL_FORMAT_RGBA_8888, - 0 /* flags */, boundlessLayerRightShift.get()); - ASSERT_TRUE(boundlessLayerDownShift != nullptr); + createSurface(mClient, "BoundlessLayerLeftShift", 0, 0, PIXEL_FORMAT_RGBA_8888, + 0 /* flags */, boundlessLayerRightShift.get()); ASSERT_TRUE(boundlessLayerDownShift->isValid()); sp<SurfaceControl> colorLayer = - mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888, - ISurfaceComposerClient::eFXSurfaceColor, - boundlessLayerDownShift.get()); - ASSERT_TRUE(colorLayer != nullptr); + createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888, + ISurfaceComposerClient::eFXSurfaceColor, boundlessLayerDownShift.get()); ASSERT_TRUE(colorLayer->isValid()); asTransaction([&](Transaction& t) { t.setPosition(boundlessLayerRightShift, 32, 0); @@ -3815,16 +3818,13 @@ TEST_F(BoundlessLayerTest, IntermediateBoundlessLayerDoNotCrop) { // Verify for boundless root layers with children, their transforms have an effect. TEST_F(BoundlessLayerTest, RootBoundlessLayerCanSetTransform) { - sp<SurfaceControl> rootBoundlessLayer = - mClient->createSurface(String8("RootBoundlessLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888, - 0 /* flags */); - ASSERT_TRUE(rootBoundlessLayer != nullptr); + sp<SurfaceControl> rootBoundlessLayer = createSurface(mClient, "RootBoundlessLayer", 0, 0, + PIXEL_FORMAT_RGBA_8888, 0 /* flags */); ASSERT_TRUE(rootBoundlessLayer->isValid()); sp<SurfaceControl> colorLayer = - mClient->createSurface(String8("ColorLayer"), 0, 0, PIXEL_FORMAT_RGBA_8888, - ISurfaceComposerClient::eFXSurfaceColor, - rootBoundlessLayer.get()); - ASSERT_TRUE(colorLayer != nullptr); + createSurface(mClient, "ColorLayer", 0, 0, PIXEL_FORMAT_RGBA_8888, + ISurfaceComposerClient::eFXSurfaceColor, rootBoundlessLayer.get()); + ASSERT_TRUE(colorLayer->isValid()); asTransaction([&](Transaction& t) { t.setLayer(rootBoundlessLayer, INT32_MAX - 1); @@ -3864,9 +3864,8 @@ TEST_F(ScreenCaptureTest, CaptureSingleLayer) { TEST_F(ScreenCaptureTest, CaptureLayerWithChild) { auto fgHandle = mFGSurfaceControl->getHandle(); - sp<SurfaceControl> child = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); + sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); fillSurfaceRGBA8(child, 200, 200, 200); SurfaceComposerClient::Transaction().show(child).apply(true); @@ -3880,9 +3879,8 @@ TEST_F(ScreenCaptureTest, CaptureLayerWithChild) { TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) { auto fgHandle = mFGSurfaceControl->getHandle(); - sp<SurfaceControl> child = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); + sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); fillSurfaceRGBA8(child, 200, 200, 200); SurfaceComposerClient::Transaction().show(child).apply(true); @@ -3894,9 +3892,8 @@ TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) { } TEST_F(ScreenCaptureTest, CaptureTransparent) { - sp<SurfaceControl> child = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); + sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); fillSurfaceRGBA8(child, 200, 200, 200); @@ -3914,9 +3911,9 @@ TEST_F(ScreenCaptureTest, CaptureTransparent) { TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) { auto fgHandle = mFGSurfaceControl->getHandle(); - sp<SurfaceControl> child = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); + sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); + ASSERT_NE(nullptr, child.get()) << "failed to create surface"; sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 10, 10, 0); fillSurfaceRGBA8(child, 200, 200, 200); fillSurfaceRGBA8(relative, 100, 100, 100); @@ -3937,12 +3934,10 @@ TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) { TEST_F(ScreenCaptureTest, CaptureRelativeInTree) { auto fgHandle = mFGSurfaceControl->getHandle(); - sp<SurfaceControl> child = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); - sp<SurfaceControl> relative = - mClient->createSurface(String8("Relative surface"), 10, 10, - PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); + sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); + sp<SurfaceControl> relative = createSurface(mClient, "Relative surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); fillSurfaceRGBA8(child, 200, 200, 200); fillSurfaceRGBA8(relative, 100, 100, 100); @@ -3971,9 +3966,8 @@ public: void SetUp() override { LayerUpdateTest::SetUp(); - mChild = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); + mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, + mFGSurfaceControl.get()); fillSurfaceRGBA8(mChild, 200, 200, 200); SurfaceComposerClient::Transaction().show(mChild).apply(true); @@ -4029,14 +4023,12 @@ TEST_F(ScreenCaptureChildOnlyTest, RegressionTest76099859) { TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) { auto fgHandle = mFGSurfaceControl->getHandle(); - sp<SurfaceControl> child = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); + sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); fillSurfaceRGBA8(child, 200, 200, 200); - sp<SurfaceControl> grandchild = - mClient->createSurface(String8("Grandchild surface"), 5, 5, - PIXEL_FORMAT_RGBA_8888, 0, child.get()); + sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5, + PIXEL_FORMAT_RGBA_8888, 0, child.get()); fillSurfaceRGBA8(grandchild, 50, 50, 50); SurfaceComposerClient::Transaction() @@ -4053,9 +4045,8 @@ TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) { } TEST_F(ScreenCaptureTest, CaptureChildOnly) { - sp<SurfaceControl> child = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); + sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); fillSurfaceRGBA8(child, 200, 200, 200); auto childHandle = child->getHandle(); @@ -4068,15 +4059,13 @@ TEST_F(ScreenCaptureTest, CaptureChildOnly) { } TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) { - sp<SurfaceControl> child = - mClient->createSurface(String8("Child surface"), 10, 10, PIXEL_FORMAT_RGBA_8888, - 0, mFGSurfaceControl.get()); + sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10, + PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get()); fillSurfaceRGBA8(child, 200, 200, 200); auto childHandle = child->getHandle(); - sp<SurfaceControl> grandchild = - mClient->createSurface(String8("Grandchild surface"), 5, 5, - PIXEL_FORMAT_RGBA_8888, 0, child.get()); + sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5, + PIXEL_FORMAT_RGBA_8888, 0, child.get()); fillSurfaceRGBA8(grandchild, 50, 50, 50); SurfaceComposerClient::Transaction() @@ -4095,9 +4084,8 @@ TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) { TEST_F(ScreenCaptureTest, CaptureCrop) { sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0); - sp<SurfaceControl> blueLayer = - mClient->createSurface(String8("Blue surface"), 30, 30, PIXEL_FORMAT_RGBA_8888, - 0, redLayer.get()); + sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30, + PIXEL_FORMAT_RGBA_8888, 0, redLayer.get()); ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60)); ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30)); @@ -4128,9 +4116,8 @@ TEST_F(ScreenCaptureTest, CaptureCrop) { TEST_F(ScreenCaptureTest, CaptureSize) { sp<SurfaceControl> redLayer = createLayer(String8("Red surface"), 60, 60, 0); - sp<SurfaceControl> blueLayer = - mClient->createSurface(String8("Blue surface"), 30, 30, PIXEL_FORMAT_RGBA_8888, - 0, redLayer.get()); + sp<SurfaceControl> blueLayer = createSurface(mClient, "Blue surface", 30, 30, + PIXEL_FORMAT_RGBA_8888, 0, redLayer.get()); ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(redLayer, Color::RED, 60, 60)); ASSERT_NO_FATAL_FAILURE(fillBufferQueueLayerColor(blueLayer, Color::BLUE, 30, 30)); |