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