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 17c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza#include "DummyConsumer.h" 18c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 19134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <gtest/gtest.h> 207a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 217a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis#include <binder/IMemory.h> 2290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 2390ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/Surface.h> 2490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 25f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala#include <gui/BufferItemConsumer.h> 26c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza#include <ui/Rect.h> 27134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/String8.h> 28134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 2941f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h> 307c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian#include <binder/ProcessState.h> 3141f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian 32134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android { 33134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 34134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTest : public ::testing::Test { 35134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected: 367c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian 377c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian SurfaceTest() { 387c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian ProcessState::self()->startThreadPool(); 397c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian } 407c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian 41134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis virtual void SetUp() { 427a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis mComposerClient = new SurfaceComposerClient; 43134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); 44134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 45fc850124b35abd00a31e9bcf57e14e0fa74f4cd7Jamie Gennis mSurfaceControl = mComposerClient->createSurface( 469d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown String8("Test Surface"), 32, 32, PIXEL_FORMAT_RGBA_8888, 0); 47134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 48134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurfaceControl != NULL); 49134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurfaceControl->isValid()); 50134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 51698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceComposerClient::openGlobalTransaction(); 529303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7fffffff)); 53134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_EQ(NO_ERROR, mSurfaceControl->show()); 54698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceComposerClient::closeGlobalTransaction(); 55134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 56134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mSurface = mSurfaceControl->getSurface(); 57134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis ASSERT_TRUE(mSurface != NULL); 58134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 59134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 60134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis virtual void TearDown() { 61134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mComposerClient->dispose(); 62134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis } 63134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 64134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<Surface> mSurface; 65134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<SurfaceComposerClient> mComposerClient; 66134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<SurfaceControl> mSurfaceControl; 67134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}; 68134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 69134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) { 70134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<ANativeWindow> anw(mSurface); 71134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int result = -123; 72134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 73134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &result); 74134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(NO_ERROR, err); 75134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(1, result); 76134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 77134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 78134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) { 79134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis mSurfaceControl.clear(); 80134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 81134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis sp<ANativeWindow> anw(mSurface); 82134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int result = -123; 83134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 84134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis &result); 85134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(NO_ERROR, err); 86134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis EXPECT_EQ(1, result); 87134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 88134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis 897a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis// This test probably doesn't belong here. 90c901ca0abc0a7b90deb8754ae48542de0bfd1567Jamie GennisTEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersSucceed) { 917a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis sp<ANativeWindow> anw(mSurface); 927a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 937a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Verify the screenshot works with no protected buffers. 945603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferProducer> producer; 955603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferConsumer> consumer; 965603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 975603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1); 987a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 999d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> display(sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain)); 100c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer, Rect(), 1018d7599633fedba38d2aba28cc95e0c66c3456694Dan Stoza 64, 64, 0, 0x7fffffff, false)); 1027a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 103583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(NO_ERROR, native_window_api_connect(anw.get(), 104583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos NATIVE_WINDOW_API_CPU)); 1057a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Set the PROTECTED usage bit and verify that the screenshot fails. Note 1067a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // that we need to dequeue a buffer in order for it to actually get 1077a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // allocated in SurfaceFlinger. 1087a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 1097a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis GRALLOC_USAGE_PROTECTED)); 1107a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3)); 111697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev ANativeWindowBuffer* buf = 0; 1129303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian 113d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis status_t err = native_window_dequeue_buffer_and_wait(anw.get(), &buf); 1149303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian if (err) { 1159303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian // we could fail if GRALLOC_USAGE_PROTECTED is not supported. 1169303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian // that's okay as long as this is the reason for the failure. 1179303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian // try again without the GRALLOC_USAGE_PROTECTED bit. 1189303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0)); 119d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(), 120d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis &buf)); 1219303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian return; 1229303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian } 123d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis ASSERT_EQ(NO_ERROR, anw->cancelBuffer(anw.get(), buf, -1)); 1249303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian 1257a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis for (int i = 0; i < 4; i++) { 1267a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis // Loop to make sure SurfaceFlinger has retired a protected buffer. 127d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(), 128d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis &buf)); 129d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf, -1)); 1307a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis } 131c18790018be5d7ea7061ccbc81f3044e74adc823Dan Stoza ASSERT_EQ(NO_ERROR, sf->captureScreen(display, producer, Rect(), 1328d7599633fedba38d2aba28cc95e0c66c3456694Dan Stoza 64, 64, 0, 0x7fffffff, false)); 1337a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis} 1347a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis 135391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTest, ConcreteTypeIsSurface) { 136391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis sp<ANativeWindow> anw(mSurface); 137391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis int result = -123; 138391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result); 139391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis EXPECT_EQ(NO_ERROR, err); 140391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis EXPECT_EQ(NATIVE_WINDOW_SURFACE, result); 141391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis} 142391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis 143f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville TalvalaTEST_F(SurfaceTest, QueryConsumerUsage) { 144f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala const int TEST_USAGE_FLAGS = 145f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_HW_RENDER; 1465603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferProducer> producer; 1475603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<IGraphicBufferConsumer> consumer; 1485603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 1495603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<BufferItemConsumer> c = new BufferItemConsumer(consumer, 150f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala TEST_USAGE_FLAGS); 1515603a2fbbd1aae74c4635e2f600819fb05d112e0Dan Stoza sp<Surface> s = new Surface(producer); 152f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala 153f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala sp<ANativeWindow> anw(s); 154f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala 155f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala int flags = -1; 156f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala int err = anw->query(anw.get(), NATIVE_WINDOW_CONSUMER_USAGE_BITS, &flags); 157f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala 158f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala ASSERT_EQ(NO_ERROR, err); 159f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala ASSERT_EQ(TEST_USAGE_FLAGS, flags); 160f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala} 161f7c6087bcc6a85cc82fd8dd83566550f880600ecEino-Ville Talvala 1625b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville TalvalaTEST_F(SurfaceTest, QueryDefaultBuffersDataSpace) { 1635b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala const android_dataspace TEST_DATASPACE = HAL_DATASPACE_SRGB; 1645b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala sp<IGraphicBufferProducer> producer; 1655b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala sp<IGraphicBufferConsumer> consumer; 1665b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala BufferQueue::createBufferQueue(&producer, &consumer); 1675b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1); 1685b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala 1695b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala cpuConsumer->setDefaultBufferDataSpace(TEST_DATASPACE); 1705b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala 1715b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala sp<Surface> s = new Surface(producer); 1725b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala 1735b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala sp<ANativeWindow> anw(s); 1745b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala 1755b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala android_dataspace dataSpace; 1765b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala 1775b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala int err = anw->query(anw.get(), NATIVE_WINDOW_DEFAULT_DATASPACE, 1785b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala reinterpret_cast<int*>(&dataSpace)); 1795b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala 1805b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala ASSERT_EQ(NO_ERROR, err); 1815b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala ASSERT_EQ(TEST_DATASPACE, dataSpace); 1825b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala} 1835b75a513e431c097ae704cba2f7affa6bfaecec9Eino-Ville Talvala 184812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan StozaTEST_F(SurfaceTest, SettingGenerationNumber) { 185812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza sp<IGraphicBufferProducer> producer; 186812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza sp<IGraphicBufferConsumer> consumer; 187812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 188812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza sp<CpuConsumer> cpuConsumer = new CpuConsumer(consumer, 1); 189812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza sp<Surface> surface = new Surface(producer); 190812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza sp<ANativeWindow> window(surface); 191812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 192812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza // Allocate a buffer with a generation number of 0 193812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ANativeWindowBuffer* buffer; 194812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza int fenceFd; 195583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos ASSERT_EQ(NO_ERROR, native_window_api_connect(window.get(), 196583b1b32191992d6ada58b3c61c71932a71c0c4bPablo Ceballos NATIVE_WINDOW_API_CPU)); 197812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffer, &fenceFd)); 198812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(NO_ERROR, window->cancelBuffer(window.get(), buffer, fenceFd)); 199812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 200812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza // Detach the buffer and check its generation number 201812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza sp<GraphicBuffer> graphicBuffer; 202812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza sp<Fence> fence; 203812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(NO_ERROR, surface->detachNextBuffer(&graphicBuffer, &fence)); 204812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(0U, graphicBuffer->getGenerationNumber()); 205812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 206812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(NO_ERROR, surface->setGenerationNumber(1)); 207812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza buffer = static_cast<ANativeWindowBuffer*>(graphicBuffer.get()); 208812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 209812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza // This should change the generation number of the GraphicBuffer 210812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(NO_ERROR, surface->attachBuffer(buffer)); 211812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 212812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza // Check that the new generation number sticks with the buffer 213812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(NO_ERROR, window->cancelBuffer(window.get(), buffer, -1)); 214812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffer, &fenceFd)); 215812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza graphicBuffer = static_cast<GraphicBuffer*>(buffer); 216812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza ASSERT_EQ(1U, graphicBuffer->getGenerationNumber()); 217812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza} 218812ed0644f8f8f71ca403f4e5793f0dbc1fcf9b2Dan Stoza 219c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan StozaTEST_F(SurfaceTest, GetConsumerName) { 220c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza sp<IGraphicBufferProducer> producer; 221c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza sp<IGraphicBufferConsumer> consumer; 222c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza BufferQueue::createBufferQueue(&producer, &consumer); 223c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 224c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza sp<DummyConsumer> dummyConsumer(new DummyConsumer); 225c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza consumer->consumerConnect(dummyConsumer, false); 226c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza consumer->setConsumerName(String8("TestConsumer")); 227c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 228c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza sp<Surface> surface = new Surface(producer); 229c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza sp<ANativeWindow> window(surface); 230c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza native_window_api_connect(window.get(), NATIVE_WINDOW_API_CPU); 231c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 232c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza EXPECT_STREQ("TestConsumer", surface->getConsumerName().string()); 233c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza} 234c6f30bdee1f634eb90d68cb76efe935b6535a1e8Dan Stoza 235789a0c82cb370d6b82f401cc130af58c85802cbfPablo CeballosTEST_F(SurfaceTest, DynamicSetBufferCount) { 236789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos sp<IGraphicBufferProducer> producer; 237789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos sp<IGraphicBufferConsumer> consumer; 238789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos BufferQueue::createBufferQueue(&producer, &consumer); 239789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos 240789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos sp<DummyConsumer> dummyConsumer(new DummyConsumer); 241789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos consumer->consumerConnect(dummyConsumer, false); 242789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos consumer->setConsumerName(String8("TestConsumer")); 243789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos 244789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos sp<Surface> surface = new Surface(producer); 245789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos sp<ANativeWindow> window(surface); 246789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos 247789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos ASSERT_EQ(NO_ERROR, native_window_api_connect(window.get(), 248789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos NATIVE_WINDOW_API_CPU)); 249789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos native_window_set_buffer_count(window.get(), 4); 250789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos 251789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos int fence; 252789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos ANativeWindowBuffer* buffer; 253789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffer, &fence)); 254789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos native_window_set_buffer_count(window.get(), 3); 255789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos ASSERT_EQ(NO_ERROR, window->queueBuffer(window.get(), buffer, fence)); 256789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos native_window_set_buffer_count(window.get(), 2); 257789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos ASSERT_EQ(NO_ERROR, window->dequeueBuffer(window.get(), &buffer, &fence)); 258789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos ASSERT_EQ(NO_ERROR, window->queueBuffer(window.get(), buffer, fence)); 259789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos} 260789a0c82cb370d6b82f401cc130af58c85802cbfPablo Ceballos 261134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis} 262