16ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden/* 26ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * Copyright 2014 The Android Open Source Project 36ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * 46ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License"); 56ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * you may not use this file except in compliance with the License. 66ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * You may obtain a copy of the License at 76ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * 86ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * http://www.apache.org/licenses/LICENSE-2.0 96ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * 106ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * Unless required by applicable law or agreed to in writing, software 116ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS, 126ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * See the License for the specific language governing permissions and 146ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden * limitations under the License. 156ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden */ 166ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 176ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <WindowSurface.h> 186ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 196ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <gui/SurfaceComposerClient.h> 206ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <gui/ISurfaceComposer.h> 216ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <gui/Surface.h> 226ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden#include <ui/DisplayInfo.h> 236ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 246ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFaddenusing namespace android; 256ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 266ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFaddenWindowSurface::WindowSurface() { 276ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden status_t err; 286ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 296ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden sp<SurfaceComposerClient> surfaceComposerClient = new SurfaceComposerClient; 306ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden err = surfaceComposerClient->initCheck(); 316ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden if (err != NO_ERROR) { 326ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden fprintf(stderr, "SurfaceComposerClient::initCheck error: %#x\n", err); 336ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden return; 346ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden } 356ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 366ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden // Get main display parameters. 376ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden sp<IBinder> mainDpy = SurfaceComposerClient::getBuiltInDisplay( 386ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden ISurfaceComposer::eDisplayIdMain); 396ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden DisplayInfo mainDpyInfo; 406ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden err = SurfaceComposerClient::getDisplayInfo(mainDpy, &mainDpyInfo); 416ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden if (err != NO_ERROR) { 426ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden fprintf(stderr, "ERROR: unable to get display characteristics\n"); 436ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden return; 446ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden } 456ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 46709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden uint32_t width, height; 47709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden if (mainDpyInfo.orientation != DISPLAY_ORIENTATION_0 && 48709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden mainDpyInfo.orientation != DISPLAY_ORIENTATION_180) { 49709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden // rotated 50709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden width = mainDpyInfo.h; 51709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden height = mainDpyInfo.w; 52709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden } else { 53709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden width = mainDpyInfo.w; 54709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden height = mainDpyInfo.h; 55709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden } 56709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden 576ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden sp<SurfaceControl> sc = surfaceComposerClient->createSurface( 58709d7dec790f046ae3f72e7ebe9046977a46ac65Andy McFadden String8("Benchmark"), width, height, 59f3ed9a21b83df1e1b4aa8d2cdd08114de3484b59Andy McFadden PIXEL_FORMAT_RGBX_8888, ISurfaceComposerClient::eOpaque); 606ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden if (sc == NULL || !sc->isValid()) { 616ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden fprintf(stderr, "Failed to create SurfaceControl\n"); 626ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden return; 636ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden } 646ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 656ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden SurfaceComposerClient::openGlobalTransaction(); 666ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden err = sc->setLayer(0x7FFFFFFF); // always on top 676ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden if (err != NO_ERROR) { 686ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden fprintf(stderr, "SurfaceComposer::setLayer error: %#x\n", err); 696ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden return; 706ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden } 716ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 726ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden err = sc->show(); 736ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden if (err != NO_ERROR) { 746ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden fprintf(stderr, "SurfaceComposer::show error: %#x\n", err); 756ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden return; 766ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden } 776ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden SurfaceComposerClient::closeGlobalTransaction(); 786ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 796ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden mSurfaceControl = sc; 806ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden} 816ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 826ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFaddenEGLNativeWindowType WindowSurface::getSurface() const { 836ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden sp<ANativeWindow> anw = mSurfaceControl->getSurface(); 846ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden return (EGLNativeWindowType) anw.get(); 856ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden} 866ef57d7b368ebbac5f2b27c36a9032fee1cda8b1Andy McFadden 87