summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/surfaceflinger/tests/Transaction_test.cpp185
-rw-r--r--services/surfaceflinger/tests/utils/ScreenshotUtils.h2
-rw-r--r--services/surfaceflinger/tests/utils/TransactionUtils.h203
3 files changed, 202 insertions, 188 deletions
diff --git a/services/surfaceflinger/tests/Transaction_test.cpp b/services/surfaceflinger/tests/Transaction_test.cpp
index 4fff26859a..d765f68a46 100644
--- a/services/surfaceflinger/tests/Transaction_test.cpp
+++ b/services/surfaceflinger/tests/Transaction_test.cpp
@@ -136,7 +136,9 @@ protected:
int32_t bufferWidth, int32_t bufferHeight) {
ANativeWindow_Buffer buffer;
ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
- fillANativeWindowBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
+ TransactionUtils::fillANativeWindowBufferColor(buffer,
+ Rect(0, 0, bufferWidth, bufferHeight),
+ color);
postBufferQueueLayerBuffer(layer);
}
@@ -147,7 +149,8 @@ protected:
BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::COMPOSER_OVERLAY,
"test");
- fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight), color);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, bufferWidth, bufferHeight),
+ color);
Transaction().setBuffer(layer, buffer).apply();
}
@@ -193,11 +196,15 @@ protected:
const int32_t halfW = bufferWidth / 2;
const int32_t halfH = bufferHeight / 2;
- fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
- fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
- fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
- fillANativeWindowBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight),
- bottomRight);
+ TransactionUtils::fillANativeWindowBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
+ TransactionUtils::fillANativeWindowBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH),
+ topRight);
+ TransactionUtils::fillANativeWindowBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight),
+ bottomLeft);
+ TransactionUtils::fillANativeWindowBufferColor(buffer,
+ Rect(halfW, halfH, bufferWidth,
+ bufferHeight),
+ bottomRight);
postBufferQueueLayerBuffer(layer);
}
@@ -216,10 +223,14 @@ protected:
const int32_t halfW = bufferWidth / 2;
const int32_t halfH = bufferHeight / 2;
- fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
- fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH), topRight);
- fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight), bottomLeft);
- fillGraphicBufferColor(buffer, Rect(halfW, halfH, bufferWidth, bufferHeight), bottomRight);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, halfW, halfH), topLeft);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(halfW, 0, bufferWidth, halfH),
+ topRight);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, halfH, halfW, bufferHeight),
+ bottomLeft);
+ TransactionUtils::fillGraphicBufferColor(buffer,
+ Rect(halfW, halfH, bufferWidth, bufferHeight),
+ bottomRight);
Transaction().setBuffer(layer, buffer).setSize(layer, bufferWidth, bufferHeight).apply();
}
@@ -1037,8 +1048,10 @@ TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue
ANativeWindow_Buffer buffer;
ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
- ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
- ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::RED));
+ ASSERT_NO_FATAL_FAILURE(
+ TransactionUtils::fillANativeWindowBufferColor(buffer, top, Color::TRANSPARENT));
+ ASSERT_NO_FATAL_FAILURE(
+ TransactionUtils::fillANativeWindowBufferColor(buffer, bottom, Color::RED));
// setTransparentRegionHint always applies to the following buffer
Transaction().setTransparentRegionHint(layer, Region(top)).apply();
ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
@@ -1058,8 +1071,10 @@ TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferQueue
}
ASSERT_NO_FATAL_FAILURE(buffer = getBufferQueueLayerBuffer(layer));
- ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, top, Color::RED));
- ASSERT_NO_FATAL_FAILURE(fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
+ ASSERT_NO_FATAL_FAILURE(
+ TransactionUtils::fillANativeWindowBufferColor(buffer, top, Color::RED));
+ ASSERT_NO_FATAL_FAILURE(
+ TransactionUtils::fillANativeWindowBufferColor(buffer, bottom, Color::TRANSPARENT));
ASSERT_NO_FATAL_FAILURE(postBufferQueueLayerBuffer(layer));
{
SCOPED_TRACE("bottom transparent");
@@ -1082,8 +1097,9 @@ TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState
BufferUsage::COMPOSER_OVERLAY,
"test");
- ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
- ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::RED));
+ ASSERT_NO_FATAL_FAILURE(
+ TransactionUtils::fillGraphicBufferColor(buffer, top, Color::TRANSPARENT));
+ ASSERT_NO_FATAL_FAILURE(TransactionUtils::fillGraphicBufferColor(buffer, bottom, Color::RED));
Transaction()
.setTransparentRegionHint(layer, Region(top))
.setBuffer(layer, buffer)
@@ -1109,8 +1125,9 @@ TEST_P(LayerRenderTypeTransactionTest, SetTransparentRegionHintBasic_BufferState
BufferUsage::COMPOSER_OVERLAY,
"test");
- ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, top, Color::RED));
- ASSERT_NO_FATAL_FAILURE(fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
+ ASSERT_NO_FATAL_FAILURE(TransactionUtils::fillGraphicBufferColor(buffer, top, Color::RED));
+ ASSERT_NO_FATAL_FAILURE(
+ TransactionUtils::fillGraphicBufferColor(buffer, bottom, Color::TRANSPARENT));
Transaction().setBuffer(layer, buffer).apply();
{
SCOPED_TRACE("bottom transparent");
@@ -1851,8 +1868,8 @@ TEST_P(LayerRenderTypeTransactionTest, SetCropOutOfBounds_BufferState) {
BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::COMPOSER_OVERLAY,
"test");
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
- fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 16), Color::BLUE);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 16, 32, 64), Color::RED);
Transaction().setFrame(layer, Rect(0, 0, 64, 64)).apply();
@@ -2178,7 +2195,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_BufferState) {
BufferUsage::COMPOSER_OVERLAY,
"test");
Color color = colors[idx % colors.size()];
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
idx++;
}
@@ -2214,7 +2231,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_LeastRecentlyUsed_Buffer
BufferUsage::COMPOSER_OVERLAY,
"test");
Color color = colors[idx % colors.size()];
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
idx++;
}
@@ -2250,7 +2267,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetBufferCaching_DestroyedBuffer_BufferSt
BufferUsage::COMPOSER_OVERLAY,
"test");
Color color = colors[idx % colors.size()];
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), color);
idx++;
}
@@ -2347,7 +2364,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetFenceBasic_BufferState) {
BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::COMPOSER_OVERLAY,
"test");
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
sp<Fence> fence;
if (getBuffer(nullptr, &fence) != NO_ERROR) {
@@ -2376,7 +2393,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetFenceNull_BufferState) {
BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::COMPOSER_OVERLAY,
"test");
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
sp<Fence> fence = Fence::NO_FENCE;
@@ -2400,7 +2417,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetDataspaceBasic_BufferState) {
BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::COMPOSER_OVERLAY,
"test");
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
Transaction()
.setBuffer(layer, buffer)
@@ -2422,7 +2439,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetHdrMetadataBasic_BufferState) {
BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::COMPOSER_OVERLAY,
"test");
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
HdrMetadata hdrMetadata;
hdrMetadata.validTypes = 0;
@@ -2446,7 +2463,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetSurfaceDamageRegionBasic_BufferState)
BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::COMPOSER_OVERLAY,
"test");
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
Region region;
region.set(32, 32);
@@ -2470,7 +2487,7 @@ TEST_P(LayerRenderTypeTransactionTest, SetApiBasic_BufferState) {
BufferUsage::CPU_READ_OFTEN | BufferUsage::CPU_WRITE_OFTEN |
BufferUsage::COMPOSER_OVERLAY,
"test");
- fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
+ TransactionUtils::fillGraphicBufferColor(buffer, Rect(0, 0, 32, 32), Color::RED);
Transaction()
.setBuffer(layer, buffer)
@@ -3537,7 +3554,7 @@ protected:
displayHeight, 0);
ASSERT_TRUE(mBGSurfaceControl != nullptr);
ASSERT_TRUE(mBGSurfaceControl->isValid());
- fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
+ TransactionUtils::fillSurfaceRGBA8(mBGSurfaceControl, 63, 63, 195);
// Foreground surface
mFGSurfaceControl = createLayer(String8("FG Test Surface"), 64, 64, 0);
@@ -3545,14 +3562,14 @@ protected:
ASSERT_TRUE(mFGSurfaceControl != nullptr);
ASSERT_TRUE(mFGSurfaceControl->isValid());
- fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
// Synchronization surface
mSyncSurfaceControl = createLayer(String8("Sync Test Surface"), 1, 1, 0);
ASSERT_TRUE(mSyncSurfaceControl != nullptr);
ASSERT_TRUE(mSyncSurfaceControl->isValid());
- fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
+ TransactionUtils::fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
asTransaction([&](Transaction& t) {
t.setDisplayLayerStack(display, 0);
@@ -3581,9 +3598,9 @@ protected:
// posting three buffers to it should ensure that at least two
// SurfaceFlinger::handlePageFlip calls have been made, which should
// guaranteed that a buffer posted to another Surface has been retired.
- fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
- fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
- fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
+ TransactionUtils::fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
+ TransactionUtils::fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
+ TransactionUtils::fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
}
@@ -3600,7 +3617,7 @@ TEST_F(LayerUpdateTest, RelativesAreNotDetached) {
std::unique_ptr<ScreenCapture> sc;
sp<SurfaceControl> relative = createLayer(String8("relativeTestSurface"), 10, 10, 0);
- fillSurfaceRGBA8(relative, 10, 10, 10);
+ TransactionUtils::fillSurfaceRGBA8(relative, 10, 10, 10);
waitForPostedBuffers();
Transaction{}
@@ -3641,7 +3658,9 @@ protected:
sc->expectBGColor(128, 128);
}
- void lockAndFillFGBuffer() { fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false); }
+ void lockAndFillFGBuffer() {
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63, false);
+ }
void unlockFGBuffer() {
sp<Surface> s = mFGSurfaceControl->getSurface();
@@ -3650,7 +3669,7 @@ protected:
}
void completeFGResize() {
- fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
waitForPostedBuffers();
}
void restoreInitialState() {
@@ -3718,7 +3737,7 @@ TEST_F(LayerUpdateTest, DeferredTransactionTest) {
}
// should trigger the first deferred transaction, but not the second one
- fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
+ TransactionUtils::fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
{
SCOPED_TRACE("after first trigger");
ScreenCapture::captureScreen(&sc);
@@ -3731,7 +3750,7 @@ TEST_F(LayerUpdateTest, DeferredTransactionTest) {
asTransaction([&](Transaction& t) { t.setAlpha(mFGSurfaceControl, 1.0); });
// trigger the second deferred transaction
- fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
+ TransactionUtils::fillSurfaceRGBA8(mSyncSurfaceControl, 31, 31, 31);
{
SCOPED_TRACE("after second trigger");
ScreenCapture::captureScreen(&sc);
@@ -3749,7 +3768,7 @@ TEST_F(LayerUpdateTest, LayerWithNoBuffersResizesImmediately) {
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);
+ TransactionUtils::fillSurfaceRGBA8(childBuffer, 200, 200, 200);
SurfaceComposerClient::Transaction{}
.setCrop_legacy(childNoBuffer, Rect(0, 0, 10, 10))
.show(childNoBuffer)
@@ -3824,7 +3843,7 @@ protected:
LayerUpdateTest::SetUp();
mChild = createSurface(mClient, "Child surface", 10, 15, PIXEL_FORMAT_RGBA_8888, 0,
mFGSurfaceControl.get());
- fillSurfaceRGBA8(mChild, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(mChild, 200, 200, 200);
{
SCOPED_TRACE("before anything");
@@ -3955,9 +3974,9 @@ TEST_F(ChildLayerTest, ChildLayerScalingCroppedByParent) {
}
TEST_F(ChildLayerTest, ChildLayerAlpha) {
- fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
- fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
- fillSurfaceRGBA8(mChild, 0, 254, 0);
+ TransactionUtils::fillSurfaceRGBA8(mBGSurfaceControl, 0, 0, 254);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 254, 0, 0);
+ TransactionUtils::fillSurfaceRGBA8(mChild, 0, 254, 0);
waitForPostedBuffers();
asTransaction([&](Transaction& t) {
@@ -4025,7 +4044,7 @@ TEST_F(ChildLayerTest, ReparentChildren) {
TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
sp<SurfaceControl> mGrandChild =
createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
- fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
+ TransactionUtils::fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
{
SCOPED_TRACE("Grandchild visible");
@@ -4055,7 +4074,7 @@ TEST_F(ChildLayerTest, ChildrenSurviveParentDestruction) {
TEST_F(ChildLayerTest, ChildrenRelativeZSurvivesParentDestruction) {
sp<SurfaceControl> mGrandChild =
createSurface(mClient, "Grand Child", 10, 10, PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
- fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
+ TransactionUtils::fillSurfaceRGBA8(mGrandChild, 111, 111, 111);
// draw grand child behind the foreground surface
asTransaction([&](Transaction& t) {
@@ -4120,7 +4139,7 @@ TEST_F(ChildLayerTest, DetachChildrenDifferentClient) {
ASSERT_TRUE(mChildNewClient->isValid());
- fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(mChildNewClient, 200, 200, 200);
asTransaction([&](Transaction& t) {
t.hide(mChild);
@@ -4161,7 +4180,7 @@ TEST_F(ChildLayerTest, DetachChildrenThenAttach) {
ASSERT_TRUE(childNewClient != nullptr);
ASSERT_TRUE(childNewClient->isValid());
- fillSurfaceRGBA8(childNewClient, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(childNewClient, 200, 200, 200);
Transaction()
.hide(mChild)
@@ -4215,7 +4234,7 @@ TEST_F(ChildLayerTest, DetachChildrenWithDeferredTransaction) {
ASSERT_TRUE(childNewClient != nullptr);
ASSERT_TRUE(childNewClient->isValid());
- fillSurfaceRGBA8(childNewClient, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(childNewClient, 200, 200, 200);
Transaction()
.hide(mChild)
@@ -4304,7 +4323,7 @@ TEST_F(ChildLayerTest, ChildrenWithParentBufferTransform) {
auto anw = static_cast<ANativeWindow*>(s.get());
native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
native_window_set_buffers_dimensions(anw, 64, 128);
- fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
waitForPostedBuffers();
{
@@ -4324,7 +4343,7 @@ TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
t.setPosition(mFGSurfaceControl, 0, 0);
t.setSize(mChild, 100, 100);
});
- fillSurfaceRGBA8(mChild, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(mChild, 200, 200, 200);
{
mCapture = screenshot();
@@ -4340,7 +4359,7 @@ TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferTransform) {
// Apply a 90 transform on the buffer.
native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
native_window_set_buffers_dimensions(anw, 64, 128);
- fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
waitForPostedBuffers();
// The child should be cropped by the new parent bounds.
@@ -4361,7 +4380,7 @@ TEST_F(ChildLayerTest, ChildCroppedByParentWithBufferScale) {
t.setPosition(mFGSurfaceControl, 0, 0);
t.setSize(mChild, 200, 200);
});
- fillSurfaceRGBA8(mChild, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(mChild, 200, 200, 200);
{
mCapture = screenshot();
@@ -4413,7 +4432,7 @@ TEST_F(ChildLayerTest, ChildrenWithParentBufferTransformAndScale) {
// have an effective scale of 2.0 applied to the buffer along with a rotation transform.
native_window_set_buffers_transform(anw, NATIVE_WINDOW_TRANSFORM_ROT_90);
native_window_set_buffers_dimensions(anw, 32, 64);
- fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 195, 63, 63);
waitForPostedBuffers();
// The child should ignore the buffer transform but apply the 2.0 scale from parent.
@@ -4446,13 +4465,13 @@ TEST_F(ChildLayerTest, Bug36858924) {
// frame because SurfaceFlinger would never process the deferred transaction and would therefore
// never acquire/release the first buffer
ALOGI("Filling 1");
- fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
ALOGI("Filling 2");
- fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 0, 0, 255);
ALOGI("Filling 3");
- fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 255, 0, 0);
ALOGI("Filling 4");
- fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
+ TransactionUtils::fillSurfaceRGBA8(mFGSurfaceControl, 0, 255, 0);
}
TEST_F(ChildLayerTest, Reparent) {
@@ -4517,7 +4536,7 @@ TEST_F(ChildLayerTest, ReparentFromNoParent) {
ASSERT_TRUE(newSurface != nullptr);
ASSERT_TRUE(newSurface->isValid());
- fillSurfaceRGBA8(newSurface, 63, 195, 63);
+ TransactionUtils::fillSurfaceRGBA8(newSurface, 63, 195, 63);
asTransaction([&](Transaction& t) {
t.hide(mChild);
t.show(newSurface);
@@ -4549,7 +4568,7 @@ TEST_F(ChildLayerTest, ReparentFromNoParent) {
TEST_F(ChildLayerTest, NestedChildren) {
sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mChild.get());
- fillSurfaceRGBA8(grandchild, 50, 50, 50);
+ TransactionUtils::fillSurfaceRGBA8(grandchild, 50, 50, 50);
{
mCapture = screenshot();
@@ -4561,7 +4580,7 @@ TEST_F(ChildLayerTest, NestedChildren) {
TEST_F(ChildLayerTest, ChildLayerRelativeLayer) {
sp<SurfaceControl> relative = createLayer(String8("Relative surface"), 128, 128, 0);
- fillSurfaceRGBA8(relative, 255, 255, 255);
+ TransactionUtils::fillSurfaceRGBA8(relative, 255, 255, 255);
Transaction t;
t.setLayer(relative, INT32_MAX)
@@ -4798,7 +4817,7 @@ TEST_F(ScreenCaptureTest, CaptureLayerWithChild) {
sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
SurfaceComposerClient::Transaction().show(child).apply(true);
@@ -4813,7 +4832,7 @@ TEST_F(ScreenCaptureTest, CaptureLayerChildOnly) {
sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
SurfaceComposerClient::Transaction().show(child).apply(true);
@@ -4828,10 +4847,10 @@ TEST_F(ScreenCaptureTest, CaptureLayerExclude) {
sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child2, 200, 0, 200);
+ TransactionUtils::fillSurfaceRGBA8(child2, 200, 0, 200);
SurfaceComposerClient::Transaction()
.show(child)
@@ -4852,13 +4871,13 @@ TEST_F(ScreenCaptureTest, CaptureLayerExcludeTree) {
sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
sp<SurfaceControl> child2 = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child2, 200, 0, 200);
+ TransactionUtils::fillSurfaceRGBA8(child2, 200, 0, 200);
sp<SurfaceControl> child3 = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, child2.get());
- fillSurfaceRGBA8(child2, 200, 0, 200);
+ TransactionUtils::fillSurfaceRGBA8(child2, 200, 0, 200);
SurfaceComposerClient::Transaction()
.show(child)
@@ -4878,7 +4897,7 @@ TEST_F(ScreenCaptureTest, CaptureTransparent) {
sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
SurfaceComposerClient::Transaction().show(child).apply(true);
@@ -4898,8 +4917,8 @@ TEST_F(ScreenCaptureTest, DontCaptureRelativeOutsideTree) {
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);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(relative, 100, 100, 100);
SurfaceComposerClient::Transaction()
.show(child)
@@ -4921,8 +4940,8 @@ TEST_F(ScreenCaptureTest, CaptureRelativeInTree) {
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);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(relative, 100, 100, 100);
SurfaceComposerClient::Transaction()
.show(child)
@@ -4951,7 +4970,7 @@ public:
mChild = createSurface(mClient, "Child surface", 10, 10, PIXEL_FORMAT_RGBA_8888, 0,
mFGSurfaceControl.get());
- fillSurfaceRGBA8(mChild, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(mChild, 200, 200, 200);
SurfaceComposerClient::Transaction().show(mChild).apply(true);
}
@@ -5014,12 +5033,12 @@ TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
PIXEL_FORMAT_RGBA_8888, 0, child.get());
- fillSurfaceRGBA8(grandchild, 50, 50, 50);
+ TransactionUtils::fillSurfaceRGBA8(grandchild, 50, 50, 50);
SurfaceComposerClient::Transaction()
.show(child)
.setPosition(grandchild, 5, 5)
@@ -5036,7 +5055,7 @@ TEST_F(ScreenCaptureTest, CaptureLayerWithGrandchild) {
TEST_F(ScreenCaptureTest, CaptureChildOnly) {
sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
auto childHandle = child->getHandle();
SurfaceComposerClient::Transaction().setPosition(child, 5, 5).show(child).apply(true);
@@ -5050,12 +5069,12 @@ TEST_F(ScreenCaptureTest, CaptureChildOnly) {
TEST_F(ScreenCaptureTest, CaptureGrandchildOnly) {
sp<SurfaceControl> child = createSurface(mClient, "Child surface", 10, 10,
PIXEL_FORMAT_RGBA_8888, 0, mFGSurfaceControl.get());
- fillSurfaceRGBA8(child, 200, 200, 200);
+ TransactionUtils::fillSurfaceRGBA8(child, 200, 200, 200);
auto childHandle = child->getHandle();
sp<SurfaceControl> grandchild = createSurface(mClient, "Grandchild surface", 5, 5,
PIXEL_FORMAT_RGBA_8888, 0, child.get());
- fillSurfaceRGBA8(grandchild, 50, 50, 50);
+ TransactionUtils::fillSurfaceRGBA8(grandchild, 50, 50, 50);
SurfaceComposerClient::Transaction()
.show(child)
@@ -5550,8 +5569,8 @@ TEST_F(LayerTransactionTest, DISABLED_BufferQueueLayerMergeDamageRegionWhenDropp
ASSERT_NO_FATAL_FAILURE(slotToBuffer(slot1, &buf1));
sp<GraphicBuffer> buf2;
ASSERT_NO_FATAL_FAILURE(slotToBuffer(slot2, &buf2));
- fillGraphicBufferColor(buf1, Rect(width, height), color);
- fillGraphicBufferColor(buf2, Rect(width, height), color);
+ TransactionUtils::fillGraphicBufferColor(buf1, Rect(width, height), color);
+ TransactionUtils::fillGraphicBufferColor(buf2, Rect(width, height), color);
const auto displayTime = systemTime() + milliseconds_to_nanoseconds(100);
ASSERT_NO_FATAL_FAILURE(queue(slot1, Region::INVALID_REGION, displayTime));
diff --git a/services/surfaceflinger/tests/utils/ScreenshotUtils.h b/services/surfaceflinger/tests/utils/ScreenshotUtils.h
index 02e7623dbd..5480b00a4d 100644
--- a/services/surfaceflinger/tests/utils/ScreenshotUtils.h
+++ b/services/surfaceflinger/tests/utils/ScreenshotUtils.h
@@ -76,7 +76,7 @@ public:
void expectColor(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
ASSERT_EQ(HAL_PIXEL_FORMAT_RGBA_8888, mOutBuffer->getPixelFormat());
- expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
+ TransactionUtils::expectBufferColor(mOutBuffer, mPixels, rect, color, tolerance);
}
void expectBorder(const Rect& rect, const Color& color, uint8_t tolerance = 0) {
diff --git a/services/surfaceflinger/tests/utils/TransactionUtils.h b/services/surfaceflinger/tests/utils/TransactionUtils.h
index f6b33a9bc3..22df2559b1 100644
--- a/services/surfaceflinger/tests/utils/TransactionUtils.h
+++ b/services/surfaceflinger/tests/utils/TransactionUtils.h
@@ -16,13 +16,7 @@
#pragma once
-//#include <algorithm>
#include <chrono>
-//#include <cinttypes>
-//#include <functional>
-//#include <limits>
-//#include <ostream>
-//#include <thread>
#include <gtest/gtest.h>
#include <android/native_window.h>
@@ -39,130 +33,131 @@
#include <ui/Rect.h>
#include "ColorUtils.h"
-//#include <sys/types.h>
-//#include <unistd.h>
namespace android {
namespace {
using namespace std::chrono_literals;
+using Transaction = SurfaceComposerClient::Transaction;
std::ostream& operator<<(std::ostream& os, const Color& color) {
os << int(color.r) << ", " << int(color.g) << ", " << int(color.b) << ", " << int(color.a);
return os;
}
-// Fill a region with the specified color.
-void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
- const Color& color) {
- Rect r(0, 0, buffer.width, buffer.height);
- if (!r.intersect(rect, &r)) {
- return;
- }
+class TransactionUtils {
+public:
+ // Fill a region with the specified color.
+ static void fillANativeWindowBufferColor(const ANativeWindow_Buffer& buffer, const Rect& rect,
+ const Color& color) {
+ Rect r(0, 0, buffer.width, buffer.height);
+ if (!r.intersect(rect, &r)) {
+ return;
+ }
- int32_t width = r.right - r.left;
- int32_t height = r.bottom - r.top;
-
- for (int32_t row = 0; row < height; row++) {
- uint8_t* dst =
- static_cast<uint8_t*>(buffer.bits) + (buffer.stride * (r.top + row) + r.left) * 4;
- for (int32_t column = 0; column < width; column++) {
- dst[0] = color.r;
- dst[1] = color.g;
- dst[2] = color.b;
- dst[3] = color.a;
- dst += 4;
+ int32_t width = r.right - r.left;
+ int32_t height = r.bottom - r.top;
+
+ for (int32_t row = 0; row < height; row++) {
+ uint8_t* dst = static_cast<uint8_t*>(buffer.bits) +
+ (buffer.stride * (r.top + row) + r.left) * 4;
+ for (int32_t column = 0; column < width; column++) {
+ dst[0] = color.r;
+ dst[1] = color.g;
+ dst[2] = color.b;
+ dst[3] = color.a;
+ dst += 4;
+ }
}
}
-}
-// Fill a region with the specified color.
-void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect, const Color& color) {
- Rect r(0, 0, buffer->width, buffer->height);
- if (!r.intersect(rect, &r)) {
- return;
- }
+ // Fill a region with the specified color.
+ static void fillGraphicBufferColor(const sp<GraphicBuffer>& buffer, const Rect& rect,
+ const Color& color) {
+ Rect r(0, 0, buffer->width, buffer->height);
+ if (!r.intersect(rect, &r)) {
+ return;
+ }
- int32_t width = r.right - r.left;
- int32_t height = r.bottom - r.top;
-
- uint8_t* pixels;
- buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
- reinterpret_cast<void**>(&pixels));
-
- for (int32_t row = 0; row < height; row++) {
- uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
- for (int32_t column = 0; column < width; column++) {
- dst[0] = color.r;
- dst[1] = color.g;
- dst[2] = color.b;
- dst[3] = color.a;
- dst += 4;
+ int32_t width = r.right - r.left;
+ int32_t height = r.bottom - r.top;
+
+ uint8_t* pixels;
+ buffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
+ reinterpret_cast<void**>(&pixels));
+
+ for (int32_t row = 0; row < height; row++) {
+ uint8_t* dst = pixels + (buffer->getStride() * (r.top + row) + r.left) * 4;
+ for (int32_t column = 0; column < width; column++) {
+ dst[0] = color.r;
+ dst[1] = color.g;
+ dst[2] = color.b;
+ dst[3] = color.a;
+ dst += 4;
+ }
}
+ buffer->unlock();
}
- buffer->unlock();
-}
-// Check if a region has the specified color.
-void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels, const Rect& rect,
- const Color& color, uint8_t tolerance) {
- int32_t x = rect.left;
- int32_t y = rect.top;
- int32_t width = rect.right - rect.left;
- int32_t height = rect.bottom - rect.top;
-
- int32_t bufferWidth = int32_t(outBuffer->getWidth());
- int32_t bufferHeight = int32_t(outBuffer->getHeight());
- if (x + width > bufferWidth) {
- x = std::min(x, bufferWidth);
- width = bufferWidth - x;
- }
- if (y + height > bufferHeight) {
- y = std::min(y, bufferHeight);
- height = bufferHeight - y;
- }
+ // Check if a region has the specified color.
+ static void expectBufferColor(const sp<GraphicBuffer>& outBuffer, uint8_t* pixels,
+ const Rect& rect, const Color& color, uint8_t tolerance) {
+ int32_t x = rect.left;
+ int32_t y = rect.top;
+ int32_t width = rect.right - rect.left;
+ int32_t height = rect.bottom - rect.top;
+
+ int32_t bufferWidth = int32_t(outBuffer->getWidth());
+ int32_t bufferHeight = int32_t(outBuffer->getHeight());
+ if (x + width > bufferWidth) {
+ x = std::min(x, bufferWidth);
+ width = bufferWidth - x;
+ }
+ if (y + height > bufferHeight) {
+ y = std::min(y, bufferHeight);
+ height = bufferHeight - y;
+ }
- auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
- uint8_t tmp = a >= b ? a - b : b - a;
- return tmp <= tolerance;
- };
- for (int32_t j = 0; j < height; j++) {
- const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
- for (int32_t i = 0; i < width; i++) {
- const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
- EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
- << "pixel @ (" << x + i << ", " << y + j << "): "
- << "expected (" << color << "), "
- << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
- src += 4;
+ auto colorCompare = [tolerance](uint8_t a, uint8_t b) {
+ uint8_t tmp = a >= b ? a - b : b - a;
+ return tmp <= tolerance;
+ };
+ for (int32_t j = 0; j < height; j++) {
+ const uint8_t* src = pixels + (outBuffer->getStride() * (y + j) + x) * 4;
+ for (int32_t i = 0; i < width; i++) {
+ const uint8_t expected[4] = {color.r, color.g, color.b, color.a};
+ EXPECT_TRUE(std::equal(src, src + 4, expected, colorCompare))
+ << "pixel @ (" << x + i << ", " << y + j << "): "
+ << "expected (" << color << "), "
+ << "got (" << Color{src[0], src[1], src[2], src[3]} << ")";
+ src += 4;
+ }
}
}
-}
-
-using Transaction = SurfaceComposerClient::Transaction;
-// Fill an RGBA_8888 formatted surface with a single color.
-static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
- bool unlock = true) {
- ANativeWindow_Buffer outBuffer;
- sp<Surface> s = sc->getSurface();
- ASSERT_TRUE(s != nullptr);
- ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
- uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
- for (int y = 0; y < outBuffer.height; y++) {
- for (int x = 0; x < outBuffer.width; x++) {
- uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
- pixel[0] = r;
- pixel[1] = g;
- pixel[2] = b;
- pixel[3] = 255;
+ // Fill an RGBA_8888 formatted surface with a single color.
+ static void fillSurfaceRGBA8(const sp<SurfaceControl>& sc, uint8_t r, uint8_t g, uint8_t b,
+ bool unlock = true) {
+ ANativeWindow_Buffer outBuffer;
+ sp<Surface> s = sc->getSurface();
+ ASSERT_TRUE(s != nullptr);
+ ASSERT_EQ(NO_ERROR, s->lock(&outBuffer, nullptr));
+ uint8_t* img = reinterpret_cast<uint8_t*>(outBuffer.bits);
+ for (int y = 0; y < outBuffer.height; y++) {
+ for (int x = 0; x < outBuffer.width; x++) {
+ uint8_t* pixel = img + (4 * (y * outBuffer.stride + x));
+ pixel[0] = r;
+ pixel[1] = g;
+ pixel[2] = b;
+ pixel[3] = 255;
+ }
+ }
+ if (unlock) {
+ ASSERT_EQ(NO_ERROR, s->unlockAndPost());
}
}
- if (unlock) {
- ASSERT_EQ(NO_ERROR, s->unlockAndPost());
- }
-}
+};
enum class RenderPath { SCREENSHOT, VIRTUAL_DISPLAY };