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