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>
2641f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian
27134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisnamespace android {
28134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
29134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisclass SurfaceTest : public ::testing::Test {
30134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennisprotected:
31134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void SetUp() {
327a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        mComposerClient = new SurfaceComposerClient;
33134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mComposerClient->initCheck());
34134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
35fc850124b35abd00a31e9bcf57e14e0fa74f4cd7Jamie Gennis        mSurfaceControl = mComposerClient->createSurface(
369d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown                String8("Test Surface"), 32, 32, PIXEL_FORMAT_RGBA_8888, 0);
37134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
38134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurfaceControl != NULL);
39134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurfaceControl->isValid());
40134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
41698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceComposerClient::openGlobalTransaction();
429303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7fffffff));
43134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_EQ(NO_ERROR, mSurfaceControl->show());
44698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian        SurfaceComposerClient::closeGlobalTransaction();
45134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
46134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mSurface = mSurfaceControl->getSurface();
47134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        ASSERT_TRUE(mSurface != NULL);
48134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
49134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
50134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    virtual void TearDown() {
51134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis        mComposerClient->dispose();
52134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    }
53134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
54134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<Surface> mSurface;
55134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceComposerClient> mComposerClient;
56134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<SurfaceControl> mSurfaceControl;
57134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis};
58134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
59134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) {
60134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<ANativeWindow> anw(mSurface);
61134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
62134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
63134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
64134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
65134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(1, result);
66134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
67134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
68134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) {
69134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    mSurfaceControl.clear();
70134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
71134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    sp<ANativeWindow> anw(mSurface);
72134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int result = -123;
73134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER,
74134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis            &result);
75134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(NO_ERROR, err);
76134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis    EXPECT_EQ(1, result);
77134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis}
78134f0422866e8985188ed10dfbdcb8e6c34b87f7Jamie Gennis
797a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis// This test probably doesn't belong here.
80c901ca0abc0a7b90deb8754ae48542de0bfd1567Jamie GennisTEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersSucceed) {
817a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    sp<ANativeWindow> anw(mSurface);
827a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
837a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // Verify the screenshot works with no protected buffers.
847a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    sp<IMemoryHeap> heap;
857a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    uint32_t w=0, h=0;
867a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    PixelFormat fmt=0;
877a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    sp<ISurfaceComposer> sf(ComposerService::getComposerService());
889d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    sp<IBinder> display(sf->getBuiltInDisplay(ISurfaceComposer::eDisplayIdMain));
899d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    ASSERT_EQ(NO_ERROR, sf->captureScreen(display, &heap, &w, &h, &fmt, 64, 64, 0,
909303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian            0x7fffffff));
917a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_TRUE(heap != NULL);
927a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis
937a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // Set the PROTECTED usage bit and verify that the screenshot fails.  Note
947a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // that we need to dequeue a buffer in order for it to actually get
957a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    // allocated in SurfaceFlinger.
967a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(),
977a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis            GRALLOC_USAGE_PROTECTED));
987a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3));
99697526bc9e44ce61c88614f98387ae8bbf0a187eIliyan Malchev    ANativeWindowBuffer* buf = 0;
1009303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian
101d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    status_t err = native_window_dequeue_buffer_and_wait(anw.get(), &buf);
1029303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian    if (err) {
1039303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        // we could fail if GRALLOC_USAGE_PROTECTED is not supported.
1049303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        // that's okay as long as this is the reason for the failure.
1059303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        // try again without the GRALLOC_USAGE_PROTECTED bit.
1069303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0));
107d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(),
108d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis                &buf));
1099303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian        return;
1109303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian    }
111d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis    ASSERT_EQ(NO_ERROR, anw->cancelBuffer(anw.get(), buf, -1));
1129303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian
1137a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    for (int i = 0; i < 4; i++) {
1147a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis        // Loop to make sure SurfaceFlinger has retired a protected buffer.
115d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        ASSERT_EQ(NO_ERROR, native_window_dequeue_buffer_and_wait(anw.get(),
116d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis                &buf));
117d8e812ce6fe9ae0388e98b08456e1d18b9498239Jamie Gennis        ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf, -1));
1187a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    }
1197a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    heap = 0;
1207a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    w = h = fmt = 0;
1219d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    ASSERT_EQ(NO_ERROR, sf->captureScreen(display, &heap, &w, &h, &fmt,
1229303eee7dcfc340b2aa598b617e02cd361baa5ccMathias Agopian            64, 64, 0, 0x7fffffff));
1237a4d0dfd43558c299e6af6c4910ef76db9db3172Jamie Gennis    ASSERT_TRUE(heap != NULL);
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