Surface_test.cpp revision 7c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64
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>
23134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis#include <utils/String8.h>
24134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
2541f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h>
267c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian#include <binder/ProcessState.h>
2741f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian
28134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android {
29134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
30134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTest : public ::testing::Test {
31134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected:
327c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian
337c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian    SurfaceTest() {
347c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian        ProcessState::self()->startThreadPool();
357c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian    }
367c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian
37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void SetUp() {
387a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        mComposerClient = new SurfaceComposerClient;
39134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
40134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
41fc850124b35abd00a31e9bcf57e14e0fa74f4cd7Jamie Gennis        mSurfaceControl = mComposerClient->createSurface(
429d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown                String8("Test Surface"), 32, 32, PIXEL_FORMAT_RGBA_8888, 0);
43134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
44134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurfaceControl != NULL);
45134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurfaceControl->isValid());
46134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
47698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceComposerClient::openGlobalTransaction();
489303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7fffffff));
49134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
50698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceComposerClient::closeGlobalTransaction();
51134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
52134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSurface = mSurfaceControl->getSurface();
53134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurface != NULL);
54134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
55134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
56134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
57134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mComposerClient->dispose();
58134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
59134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
60134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<Surface> mSurface;
61134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceComposerClient> mComposerClient;
62134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceControl> mSurfaceControl;
63134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
64134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
65134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) {
66134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<ANativeWindow> anw(mSurface);
67134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
68134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
69134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
70134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
71134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(1, result);
72134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
73134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
74134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) {
75134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    mSurfaceControl.clear();
76134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
77134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<ANativeWindow> anw(mSurface);
78134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
79134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
80134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
81134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
82134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(1, result);
83134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
84134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
857a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis// This test probably doesn't belong here.
86c901ca0abc0a7b90deb8754ae48542de0bfd1567Jamie GennisTEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersSucceed) {
877a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    sp<ANativeWindow> anw(mSurface);
887a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
897a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // Verify the screenshot works with no protected buffers.
907c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian    sp<CpuConsumer> consumer = new CpuConsumer(1);
917a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    sp<ISurfaceComposer> sf(ComposerService::getComposerService());
929d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    sp<IBinder> display(sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
937c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian    ASSERT_EQ(NO_ERROR, sf->captureScreen(display, consumer->getBufferQueue(),
947c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian            64, 64, 0, 0x7fffffff, true));
957a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
967a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // Set the PROTECTED usage bit and verify that the screenshot fails.  Note
977a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // that we need to dequeue a buffer in order for it to actually get
987a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // allocated in SurfaceFlinger.
997a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(),
1007a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            GRALLOC_USAGE_PROTECTED));
1017a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3));
102697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf = 0;
1039303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian
104d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    status_t err = native_window_dequeue_buffer_and_wait(anw.get(), &buf);
1059303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian    if (err) {
1069303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        // we could fail if GRALLOC_USAGE_PROTECTED is not supported.
1079303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        // that's okay as long as this is the reason for the failure.
1089303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        // try again without the GRALLOC_USAGE_PROTECTED bit.
1099303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0));
110d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(),
111d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis                &buf));
1129303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        return;
1139303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian    }
114d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(NO_ERROR, anw->cancelBuffer(anw.get(), buf, -1));
1159303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian
1167a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    for (int i = 0; i < 4; i++) {
1177a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        // Loop to make sure SurfaceFlinger has retired a protected buffer.
118d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(),
119d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis                &buf));
120d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf, -1));
1217a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    }
1227c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian    ASSERT_EQ(NO_ERROR, sf->captureScreen(display, consumer->getBufferQueue(),
1237c1a487ba8c0a3b591a77e2ddcb33ef9bdfaff64Mathias Agopian            64, 64, 0, 0x7fffffff, true));
1247a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis}
1257a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
126391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie GennisTEST_F(SurfaceTest, ConcreteTypeIsSurface) {
127391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    sp<ANativeWindow> anw(mSurface);
128391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int result = -123;
129391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result);
130391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
131391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis    EXPECT_EQ(NATIVE_WINDOW_SURFACE, result);
132391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis}
133391bbe2246a7547dbf3460c231b3c5ba691d4eb1Jamie Gennis
134134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
135