1d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis/* 2d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * Copyright (C) 2011 The Android Open Source Project 3d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * 4d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * Licensed under the Apache License, Version 2.0 (the "License"); 5d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * you may not use this file except in compliance with the License. 6d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * You may obtain a copy of the License at 7d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * 8d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * http://www.apache.org/licenses/LICENSE-2.0 9d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * 10d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * Unless required by applicable law or agreed to in writing, software 11d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * distributed under the License is distributed on an "AS IS" BASIS, 12d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * See the License for the specific language governing permissions and 14d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis * limitations under the License. 15d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis */ 16d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 17d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <gtest/gtest.h> 18f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis 19f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis#include <binder/IMemory.h> 20d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <surfaceflinger/ISurfaceComposer.h> 21d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <surfaceflinger/Surface.h> 22d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <surfaceflinger/SurfaceComposerClient.h> 23d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis#include <utils/String8.h> 24d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 25d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennisnamespace android { 26d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 27d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennisclass SurfaceTest : public ::testing::Test { 28d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennisprotected: 29d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis virtual void SetUp() { 30f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis mComposerClient = new SurfaceComposerClient; 31d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis ASSERT_EQ(NO_ERROR, mComposerClient->initCheck()); 32d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 335dbf2ed575c424a0d65e70458d5a02eb21872b33Jamie Gennis mSurfaceControl = mComposerClient->createSurface( 34994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian String8("Test Surface"), 0, 32, 32, PIXEL_FORMAT_RGBA_8888, 0); 35d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 36d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis ASSERT_TRUE(mSurfaceControl != NULL); 37d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis ASSERT_TRUE(mSurfaceControl->isValid()); 38d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 39439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian SurfaceComposerClient::openGlobalTransaction(); 40994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian ASSERT_EQ(NO_ERROR, mSurfaceControl->setLayer(0x7fffffff)); 41d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis ASSERT_EQ(NO_ERROR, mSurfaceControl->show()); 42439863f3b3e725b5de1cba4940a21900369961c0Mathias Agopian SurfaceComposerClient::closeGlobalTransaction(); 43d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 44d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis mSurface = mSurfaceControl->getSurface(); 45d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis ASSERT_TRUE(mSurface != NULL); 46d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis } 47d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 48d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis virtual void TearDown() { 49d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis mComposerClient->dispose(); 50d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis } 51d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 52d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis sp<Surface> mSurface; 53d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis sp<SurfaceComposerClient> mComposerClient; 54d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis sp<SurfaceControl> mSurfaceControl; 55d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis}; 56d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 57d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenVisible) { 58d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis sp<ANativeWindow> anw(mSurface); 59d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis int result = -123; 60d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 61d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis &result); 62d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis EXPECT_EQ(NO_ERROR, err); 63d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis EXPECT_EQ(1, result); 64d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis} 65d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 66d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie GennisTEST_F(SurfaceTest, QueuesToWindowComposerIsTrueWhenPurgatorized) { 67d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis mSurfaceControl.clear(); 68d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 69d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis sp<ANativeWindow> anw(mSurface); 70d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis int result = -123; 71d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER, 72d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis &result); 73d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis EXPECT_EQ(NO_ERROR, err); 74d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis EXPECT_EQ(1, result); 75d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis} 76d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis 77f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis// This test probably doesn't belong here. 7874f7dfa8033732a614ad0a755bc2b917032155d0Jamie GennisTEST_F(SurfaceTest, ScreenshotsOfProtectedBuffersSucceed) { 79f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis sp<ANativeWindow> anw(mSurface); 80f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis 81f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis // Verify the screenshot works with no protected buffers. 82f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis sp<IMemoryHeap> heap; 83f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis uint32_t w=0, h=0; 84f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis PixelFormat fmt=0; 85f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis sp<ISurfaceComposer> sf(ComposerService::getComposerService()); 86f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt, 64, 64, 0, 87994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian 0x7fffffff)); 88f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis ASSERT_TRUE(heap != NULL); 89f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis 90f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis // Set the PROTECTED usage bit and verify that the screenshot fails. Note 91f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis // that we need to dequeue a buffer in order for it to actually get 92f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis // allocated in SurfaceFlinger. 93f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 94f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis GRALLOC_USAGE_PROTECTED)); 95f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis ASSERT_EQ(NO_ERROR, native_window_set_buffer_count(anw.get(), 3)); 96b2a153adc9860616acdb96d7cdd64494d5a2a0f2Iliyan Malchev ANativeWindowBuffer* buf = 0; 97994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian 98994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian status_t err = anw->dequeueBuffer(anw.get(), &buf); 99994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian if (err) { 100994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian // we could fail if GRALLOC_USAGE_PROTECTED is not supported. 101994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian // that's okay as long as this is the reason for the failure. 102994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian // try again without the GRALLOC_USAGE_PROTECTED bit. 103994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian ASSERT_EQ(NO_ERROR, native_window_set_usage(anw.get(), 0)); 104994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian ASSERT_EQ(NO_ERROR, anw->dequeueBuffer(anw.get(), &buf)); 105994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian return; 106994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian } 107994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian ASSERT_EQ(NO_ERROR, anw->cancelBuffer(anw.get(), buf)); 108994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian 109f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis for (int i = 0; i < 4; i++) { 110f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis // Loop to make sure SurfaceFlinger has retired a protected buffer. 111f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis ASSERT_EQ(NO_ERROR, anw->dequeueBuffer(anw.get(), &buf)); 112f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis ASSERT_EQ(NO_ERROR, anw->lockBuffer(anw.get(), buf)); 113f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis ASSERT_EQ(NO_ERROR, anw->queueBuffer(anw.get(), buf)); 114f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis } 115f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis heap = 0; 116f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis w = h = fmt = 0; 11774f7dfa8033732a614ad0a755bc2b917032155d0Jamie Gennis ASSERT_EQ(NO_ERROR, sf->captureScreen(0, &heap, &w, &h, &fmt, 118994e7619a676716de1b018b79946d415f2a305d3Mathias Agopian 64, 64, 0, 0x7fffffff)); 119f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis ASSERT_TRUE(heap != NULL); 120f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis} 121f72606ce3ea8cb787e5c71325f08b1898e0718d9Jamie Gennis 122c4ca7c511499693f13622b135637f600ec913e57Jamie GennisTEST_F(SurfaceTest, ConcreteTypeIsSurface) { 123c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis sp<ANativeWindow> anw(mSurface); 124c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis int result = -123; 125c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis int err = anw->query(anw.get(), NATIVE_WINDOW_CONCRETE_TYPE, &result); 126c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis EXPECT_EQ(NO_ERROR, err); 127c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis EXPECT_EQ(NATIVE_WINDOW_SURFACE, result); 128c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis} 129c4ca7c511499693f13622b135637f600ec913e57Jamie Gennis 130d2acedf18c9a3527f6e3dc5d578a85fdc0ad4338Jamie Gennis} 131