Surface_test.cpp revision c18790018be5d7ea7061ccbc81f3044e74adc823
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> 2090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 2190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 2290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 23f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala#include <gui/BufferItemConsumer.h> 24c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza#include <ui/Rect.h> 25134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/String8.h> 26134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 2741f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h> 287c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian#include <binder/ProcessState.h> 2941f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian 30134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android { 31134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 32134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTest : public ::testing::Test { 33134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected: 347c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian 357c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian SurfaceTest() { 367c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian ProcessState::self()->startThreadPool(); 377c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian } 387c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian 39134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis virtual void SetUp() { 407a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis mComposerClient = new SurfaceComposerClient; 41134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); 42134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 43fc850124b35abd00a31e9bcf57e14e0fa74f4cd7Jamie Gennis mSurfaceControl = mComposerClient->createSurface( 449d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown String8("Test Surface"), 32, 32, PIXEL_FORMAT_RGBA_8888, 0); 45134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 46134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurfaceControl != NULL); 47134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurfaceControl->isValid()); 48134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 49698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceComposerClient::openGlobalTransaction(); 509303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7fffffff)); 51134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mSurfaceControl->show()); 52698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceComposerClient::closeGlobalTransaction(); 53134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 54134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mSurface = mSurfaceControl->getSurface(); 55134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurface != NULL); 56134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 57134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 58134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis virtual void TearDown() { 59134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mComposerClient->dispose(); 60134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 61134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 62134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<Surface> mSurface; 63134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<SurfaceComposerClient> mComposerClient; 64134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<SurfaceControl> mSurfaceControl; 65134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}; 66134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 67134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) { 68134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<ANativeWindow> anw(mSurface); 69134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int result = -123; 70134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 71134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &result); 72134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(NO_ERROR, err); 73134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(1, result); 74134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 75134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 76134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) { 77134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mSurfaceControl.clear(); 78134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 79134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<ANativeWindow> anw(mSurface); 80134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int result = -123; 81134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 82134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &result); 83134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(NO_ERROR, err); 84134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(1, result); 85134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 86134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 877a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis// This test probably doesn't belong here. 88c901ca0abc0a7b90deb8754ae48542de0bfd1567Jamie GennisTEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersSucceed) { 897a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis sp<ANativeWindow> anw(mSurface); 907a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 917a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Verify the screenshot works with no protected buffers. 925603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferProducer> producer; 935603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferConsumer> consumer; 945603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 955603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1); 967a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 979d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> display(sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); 98c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer, Rect(), 998d7599633fedba38d2aba28cc95e0c66c3456694Dan Stoza 64, 64, 0, 0x7fffffff, false)); 1007a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 1017a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Set the PROTECTED usage bit and verify that the screenshot fails. Note 1027a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // that we need to dequeue a buffer in order for it to actually get 1037a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // allocated in SurfaceFlinger. 1047a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 1057a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis GRALLOC_USAGE_PROTECTED)); 1067a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3)); 107697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buf = 0; 1089303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian 109d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis status_t err = native_window_dequeue_buffer_and_wait(anw.get(), &buf); 1109303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian if (err) { 1119303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian // we could fail if GRALLOC_USAGE_PROTECTED is not supported. 1129303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian // that's okay as long as this is the reason for the failure. 1139303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian // try again without the GRALLOC_USAGE_PROTECTED bit. 1149303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0)); 115d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(), 116d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis &buf)); 1179303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian return; 1189303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian } 119d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis ASSERT_EQ(NO_ERROR, anw->cancelBuffer(anw.get(), buf, -1)); 1209303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian 1217a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis for (int i = 0; i < 4; i++) { 1227a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Loop to make sure SurfaceFlinger has retired a protected buffer. 123d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(), 124d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis &buf)); 125d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf, -1)); 1267a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis } 127c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer, Rect(), 1288d7599633fedba38d2aba28cc95e0c66c3456694Dan Stoza 64, 64, 0, 0x7fffffff, false)); 1297a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis} 1307a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 131391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTest, ConcreteTypeIsSurface) { 132391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis sp<ANativeWindow> anw(mSurface); 133391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis int result = -123; 134391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result); 135391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis EXPECT_EQ(NO_ERROR, err); 136391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis EXPECT_EQ(NATIVE_WINDOW_SURFACE, result); 137391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis} 138391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis 139f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville TalvalaTEST_F(SurfaceTest, QueryConsumerUsage) { 140f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala const int TEST_USAGE_FLAGS = 141f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER; 1425603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferProducer> producer; 1435603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferConsumer> consumer; 1445603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 1455603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<BufferItemConsumer> c = new BufferItemConsumer(consumer, 146f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala TEST_USAGE_FLAGS); 1475603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<Surface> s = new Surface(producer); 148f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala 149f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala sp<ANativeWindow> anw(s); 150f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala 151f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala int flags = -1; 152f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala int err = anw->query(anw.get(), NATIVE_WINDOW_CONSUMER_USAGE_BITS, &flags); 153f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala 154f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala ASSERT_EQ(NO_ERROR, err); 155f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala ASSERT_EQ(TEST_USAGE_FLAGS, flags); 156f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala} 157f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala 158134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 159