Surface_test.cpp revision fc850124b35abd00a31e9bcf57e14e0fa74f4cd7
1134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis/* 2134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Copyright (C) 2011 The Android Open Source Project 3134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * 4134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 5134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * you may not use this file except in compliance with the License. 6134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * You may obtain a copy of the License at 7134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * 8134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 9134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * 10134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * Unless required by applicable law or agreed to in writing, software 11134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 12134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * See the License for the specific language governing permissions and 14134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis * limitations under the License. 15134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis */ 16134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 17134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <gtest/gtest.h> 187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 197a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis#include <binder/IMemory.h> 20134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <surfaceflinger/ISurfaceComposer.h> 21134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <surfaceflinger/Surface.h> 22134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <surfaceflinger/SurfaceComposerClient.h> 23134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/String8.h> 24134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 25134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android { 26134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 27134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTest : public ::testing::Test { 28134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected: 29134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis virtual void SetUp() { 307a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis mComposerClient = new SurfaceComposerClient; 31134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); 32134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 33fc850124b35abd00a31e9bcf57e14e0fa74f4cd7Jamie Gennis mSurfaceControl = mComposerClient->createSurface( 34134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis String8("Test Surface"), 0, 32, 32, PIXEL_FORMAT_RGB_888, 0); 35134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 36134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurfaceControl != NULL); 37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurfaceControl->isValid()); 38134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 39134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mComposerClient->openTransaction()); 40134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(30000)); 41134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mSurfaceControl->show()); 42134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mComposerClient->closeTransaction()); 43134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 44134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mSurface = mSurfaceControl->getSurface(); 45134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurface != NULL); 46134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 47134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 48134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis virtual void TearDown() { 49134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mComposerClient->dispose(); 50134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 51134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 52134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<Surface> mSurface; 53134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<SurfaceComposerClient> mComposerClient; 54134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<SurfaceControl> mSurfaceControl; 55134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}; 56134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 57134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) { 58134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<ANativeWindow> anw(mSurface); 59134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int result = -123; 60134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 61134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &result); 62134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(NO_ERROR, err); 63134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(1, result); 64134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 65134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 66134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) { 67134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mSurfaceControl.clear(); 68134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 69134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<ANativeWindow> anw(mSurface); 70134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int result = -123; 71134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 72134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &result); 73134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(NO_ERROR, err); 74134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(1, result); 75134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 76134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 777a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis// This test probably doesn't belong here. 787a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie GennisTEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersFail) { 797a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis sp<ANativeWindow> anw(mSurface); 807a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 817a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Verify the screenshot works with no protected buffers. 827a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis sp<IMemoryHeap> heap; 837a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis uint32_t w=0, h=0; 847a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis PixelFormat fmt=0; 857a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 867a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt, 64, 64, 0, 877a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 40000)); 887a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_TRUE(heap != NULL); 897a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 907a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Set the PROTECTED usage bit and verify that the screenshot fails. Note 917a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // that we need to dequeue a buffer in order for it to actually get 927a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // allocated in SurfaceFlinger. 937a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 947a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis GRALLOC_USAGE_PROTECTED)); 957a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3)); 967a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis android_native_buffer_t* buf = 0; 977a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis for (int i = 0; i < 4; i++) { 987a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Loop to make sure SurfaceFlinger has retired a protected buffer. 997a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, anw->dequeueBuffer(anw.get(), &buf)); 1007a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, anw->lockBuffer(anw.get(), buf)); 1017a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf)); 1027a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis } 1037a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis heap = 0; 1047a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis w = h = fmt = 0; 1057a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(INVALID_OPERATION, sf->captureScreen(0, &heap, &w, &h, &fmt, 1067a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 64, 64, 0, 40000)); 1077a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_TRUE(heap == NULL); 1087a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 1097a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // XXX: This should not be needed, but it seems that the new buffers don't 1107a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // correctly show up after the upcoming dequeue/lock/queue loop without it. 1117a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // We should look into this at some point. 1127a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3)); 1137a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 1147a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Un-set the PROTECTED usage bit and verify that the screenshot works 1157a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // again. Note that we have to change the buffers geometry to ensure that 1167a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // the buffers get reallocated, as the new usage bits are a subset of the 1177a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // old. 1187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0)); 1197a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_buffers_geometry(anw.get(), 32, 32, 0)); 1207a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis for (int i = 0; i < 4; i++) { 1217a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Loop to make sure SurfaceFlinger has retired a protected buffer. 1227a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, anw->dequeueBuffer(anw.get(), &buf)); 1237a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, anw->lockBuffer(anw.get(), buf)); 1247a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf)); 1257a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis } 1267a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis heap = 0; 1277a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis w = h = fmt = 0; 1287a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt, 64, 64, 0, 1297a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 40000)); 1307a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_TRUE(heap != NULL); 1317a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis} 1327a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 133391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTest, ConcreteTypeIsSurface) { 134391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis sp<ANativeWindow> anw(mSurface); 135391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis int result = -123; 136391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result); 137391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis EXPECT_EQ(NO_ERROR, err); 138391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis EXPECT_EQ(NATIVE_WINDOW_SURFACE, result); 139391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis} 140391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis 141134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 142