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