android_view_SurfaceControl.cpp revision 904f485bc6013060e81b627be61314b3d7fe5ef8
1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/*
2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2013 The Android Open Source Project
3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * you may not use this file except in compliance with the License.
6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * You may obtain a copy of the License at
7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy *
10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Unless required by applicable law or agreed to in writing, software
11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * See the License for the specific language governing permissions and
14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * limitations under the License.
15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */
16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define LOG_TAG "SurfaceControl"
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
199d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include <stdio.h>
209d5316e3f56d138504565ff311145ac01621dff4Romain Guy
219d5316e3f56d138504565ff311145ac01621dff4Romain Guy#include "jni.h"
2285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include "JNIHelp.h"
23ce0537b80087a6225273040a987414b1dd081aa0Romain Guy
24f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include "android_os_Parcel.h"
25ce0537b80087a6225273040a987414b1dd081aa0Romain Guy#include "android_util_Binder.h"
26079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy#include "android/graphics/Bitmap.h"
27d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy#include "android/graphics/GraphicsJNI.h"
2885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy#include "android/graphics/Region.h"
29e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy
30daf98e941e140e8739458126640183b9f296a2abChet Haase#include "core_jni_helpers.h"
31bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy#include <android_runtime/android_view_Surface.h>
32ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy#include <android_runtime/android_view_SurfaceSession.h>
338694230ff25fa0a60e480d424843e56b718f0516Romain Guy
34bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy#include <gui/Surface.h>
357953745dd565167113f8cbfc461bc0521d32d870Romain Guy#include <gui/SurfaceComposerClient.h>
367953745dd565167113f8cbfc461bc0521d32d870Romain Guy
37c15008e72ec00ca20a271c3006dac649fd07533bRomain Guy#include <ui/DisplayInfo.h>
3851769a68a5cb34e9564740c6a854fcb93018789dRomain Guy#include <ui/FrameStats.h>
39f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy#include <ui/Rect.h>
405cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <ui/Region.h>
41bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
425cbbce535744b89df5ecea95de21ee3733298260Romain Guy#include <utils/Log.h>
43f7f93556c8fcc640ab5adef79d021a80a72a645aRomain Guy
4406f96e2652e4855b6520ad9dd70583677605b79aRomain Guy#include <ScopedUtfChars.h>
45db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy
46fb8b763f762ae21923c58d64caa729b012f40e05Romain Guy#include "SkTemplates.h"
47bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy
48e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy// ----------------------------------------------------------------------------
499d5316e3f56d138504565ff311145ac01621dff4Romain Guy
50e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guynamespace android {
51c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
52c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikstatic const char* const OutOfResourcesException =
53c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    "android/view/Surface$OutOfResourcesException";
54c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
55c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikstatic struct {
56c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jclass clazz;
57c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jmethodID ctor;
58c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID width;
59c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID height;
60c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID refreshRate;
61c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID density;
62c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID xDpi;
63c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID yDpi;
64c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID secure;
65c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID appVsyncOffsetNanos;
66c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID presentationDeadlineNanos;
67c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID colorTransform;
68ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik} gPhysicalDisplayInfoClassInfo;
69ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
70ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craikstatic struct {
71ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    jfieldID bottom;
72ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    jfieldID left;
73c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID right;
74c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    jfieldID top;
75c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik} gRectClassInfo;
76c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
77c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik// Implements SkMallocPixelRef::ReleaseProc, to delete the screenshot on unref.
78c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craikvoid DeleteScreenshot(void* addr, void* context) {
79c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    SkASSERT(addr == ((ScreenshotClient*) context)->getPixels());
80ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    delete ((ScreenshotClient*) context);
81c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik}
82c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik
83f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic struct {
84f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    nsecs_t UNDEFINED_TIME_NANO;
85f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    jmethodID init;
86f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy} gWindowContentFrameStatsClassInfo;
870fe478ea04720a57ef3919dbc23711bc7eba517fRomain Guy
8865cd612face362d054a85d0f7e5881c59cd523beChris Craikstatic struct {
89b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    nsecs_t UNDEFINED_TIME_NANO;
905cbbce535744b89df5ecea95de21ee3733298260Romain Guy    jmethodID init;
915cbbce535744b89df5ecea95de21ee3733298260Romain Guy} gWindowAnimationFrameStatsClassInfo;
925cbbce535744b89df5ecea95de21ee3733298260Romain Guy
935cbbce535744b89df5ecea95de21ee3733298260Romain Guy// ----------------------------------------------------------------------------
9485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy
95e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guystatic jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,
967953745dd565167113f8cbfc461bc0521d32d870Romain Guy        jstring nameStr, jint w, jint h, jint format, jint flags) {
97e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    ScopedUtfChars name(env, nameStr);
98e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy    sp<SurfaceComposerClient> client(android_view_SurfaceSession_getClient(env, sessionObj));
9917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    sp<SurfaceControl> surface = client->createSurface(
100ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy            String8(name.c_str()), w, h, format, flags);
101ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    if (surface == NULL) {
102ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy        jniThrowException(env, OutOfResourcesException, NULL);
103ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy        return 0;
104ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    }
105ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    surface->incStrong((void *)nativeCreate);
106ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    return reinterpret_cast<jlong>(surface.get());
107ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy}
108ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy
109ef35927abcd089652f87a985dd6dde7afde58b92Romain Guystatic void nativeRelease(JNIEnv* env, jclass clazz, jlong nativeObject) {
110ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    sp<SurfaceControl> ctrl(reinterpret_cast<SurfaceControl *>(nativeObject));
111ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy    ctrl->decStrong((void *)nativeCreate);
112ef35927abcd089652f87a985dd6dde7afde58b92Romain Guy}
11387e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy
11487e2f757be9b24d369bab354e37c276e851b1fc7Romain Guystatic void nativeDestroy(JNIEnv* env, jclass clazz, jlong nativeObject) {
11587e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    sp<SurfaceControl> ctrl(reinterpret_cast<SurfaceControl *>(nativeObject));
11687e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    ctrl->clear();
11787e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy    ctrl->decStrong((void *)nativeCreate);
11887e2f757be9b24d369bab354e37c276e851b1fc7Romain Guy}
11917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
12017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guystatic jobject nativeScreenshotBitmap(JNIEnv* env, jclass clazz,
12117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        jobject displayTokenObj, jobject sourceCropObj, jint width, jint height,
12217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        jint minLayer, jint maxLayer, bool allLayers, bool useIdentityTransform,
12349c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy        int rotation) {
12449c5fc0b9e850497233e189ff9dcc71a78ebe6e7Romain Guy    sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
12517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    if (displayToken == NULL) {
12617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        return NULL;
12717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    }
12817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
12917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    int left = env->GetIntField(sourceCropObj, gRectClassInfo.left);
13017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    int top = env->GetIntField(sourceCropObj, gRectClassInfo.top);
13117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    int right = env->GetIntField(sourceCropObj, gRectClassInfo.right);
132b051e895ccb696604349c6c5efe7c4747e1d1ab6Romain Guy    int bottom = env->GetIntField(sourceCropObj, gRectClassInfo.bottom);
133e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    Rect sourceCrop(left, top, right, bottom);
13417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
13517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    SkAutoTDelete<ScreenshotClient> screenshot(new ScreenshotClient());
13617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    status_t res;
13717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    if (allLayers) {
13817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        minLayer = 0;
13917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        maxLayer = -1;
14017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    }
14117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
14217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    res = screenshot->update(displayToken, sourceCrop, width, height,
1437c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy        minLayer, maxLayer, useIdentityTransform, static_cast<uint32_t>(rotation));
14417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    if (res != NO_ERROR) {
14517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        return NULL;
14617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    }
14717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
14817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    SkImageInfo screenshotInfo;
14917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    screenshotInfo.fWidth = screenshot->getWidth();
15017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    screenshotInfo.fHeight = screenshot->getHeight();
15117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
15217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    switch (screenshot->getFormat()) {
15317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        case PIXEL_FORMAT_RGBX_8888: {
15417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            screenshotInfo.fColorType = kRGBA_8888_SkColorType;
15517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            screenshotInfo.fAlphaType = kOpaque_SkAlphaType;
15617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            break;
15717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        }
15817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        case PIXEL_FORMAT_RGBA_8888: {
1597c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy            screenshotInfo.fColorType = kRGBA_8888_SkColorType;
160e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy            screenshotInfo.fAlphaType = kPremul_SkAlphaType;
16117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            break;
16217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        }
16317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        case PIXEL_FORMAT_RGB_565: {
16417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            screenshotInfo.fColorType = kRGB_565_SkColorType;
16517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy            screenshotInfo.fAlphaType = kOpaque_SkAlphaType;
1666c319ca1275c8db892c39b48fc54864c949f9171Romain Guy            break;
167c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        }
168c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        default: {
169c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy            return NULL;
170c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        }
171c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    }
172c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
173c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    const size_t rowBytes =
174c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy            screenshot->getStride() * android::bytesPerPixel(screenshot->getFormat());
175c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
176c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    if (!screenshotInfo.fWidth || !screenshotInfo.fHeight) {
177c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy        return NULL;
178c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    }
179c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy
180c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy    Bitmap* bitmap = new Bitmap(
181c89b14bba0f6cc2c91629080617f7ed215f697f3Romain Guy            (void*) screenshot->getPixels(), (void*) screenshot.get(), DeleteScreenshot,
1828f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy            screenshotInfo, rowBytes, nullptr);
183ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    screenshot.detach();
184ba6be8a62dcdb3ffd210cd36b9af4e3a658eac47Romain Guy    bitmap->peekAtPixelRef()->setImmutable();
1858f3b8e32993d190a26c70c839a63d8ce4c3b16d9Romain Guy
18608ae317c21ec3086b5017672bba87420cc38a407Romain Guy    return GraphicsJNI::createBitmap(env, bitmap,
18711cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy            GraphicsJNI::kBitmapCreateFlag_Premultiplied, NULL);
18811cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy}
18911cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
1907953745dd565167113f8cbfc461bc0521d32d870Romain Guystatic void nativeScreenshot(JNIEnv* env, jclass clazz, jobject displayTokenObj,
1914aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        jobject surfaceObj, jobject sourceCropObj, jint width, jint height,
1924aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        jint minLayer, jint maxLayer, bool allLayers, bool useIdentityTransform) {
1934aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    sp<IBinder> displayToken = ibinderForJavaObject(env, displayTokenObj);
194bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    if (displayToken != NULL) {
195ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        sp<Surface> consumer = android_view_Surface_getSurface(env, surfaceObj);
196ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        if (consumer != NULL) {
197ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            int left = env->GetIntField(sourceCropObj, gRectClassInfo.left);
198ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            int top = env->GetIntField(sourceCropObj, gRectClassInfo.top);
199ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            int right = env->GetIntField(sourceCropObj, gRectClassInfo.right);
200ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            int bottom = env->GetIntField(sourceCropObj, gRectClassInfo.bottom);
201ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            Rect sourceCrop(left, top, right, bottom);
202ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik
203ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            if (allLayers) {
204ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik                minLayer = 0;
205e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy                maxLayer = -1;
206ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik            }
207bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy            ScreenshotClient::capture(displayToken,
208d90144db52c7297879b950cbbc85137ed123ab5bChris Craik                    consumer->getIGraphicBufferProducer(), sourceCrop,
209d90144db52c7297879b950cbbc85137ed123ab5bChris Craik                    width, height, uint32_t(minLayer), uint32_t(maxLayer),
210d90144db52c7297879b950cbbc85137ed123ab5bChris Craik                    useIdentityTransform);
2114aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        }
2124aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2134aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy}
214807daf7df615b60ce6fc41355aabe3aa353cebabRomain Guy
215f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guystatic void nativeOpenTransaction(JNIEnv* env, jclass clazz) {
216b98a016c6769b9e80d392df22fe77a2fca048d9fChris Craik    SurfaceComposerClient::openGlobalTransaction();
2177953745dd565167113f8cbfc461bc0521d32d870Romain Guy}
2184aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
2194aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guystatic void nativeCloseTransaction(JNIEnv* env, jclass clazz) {
220f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy    SurfaceComposerClient::closeGlobalTransaction();
2217953745dd565167113f8cbfc461bc0521d32d870Romain Guy}
2227953745dd565167113f8cbfc461bc0521d32d870Romain Guy
2238a4ac610e1aaf04931ac1af54b146a7fc8e66114Romain Guystatic void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz) {
2244aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    SurfaceComposerClient::setAnimationTransaction();
225735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy}
226735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy
227a23eed808a1ae4ec0d818c0a9238385e797fd056Chet Haasestatic void nativeSetLayer(JNIEnv* env, jclass clazz, jlong nativeObject, jint zorder) {
228bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
229ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    status_t err = ctrl->setLayer(zorder);
230c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    if (err < 0 && err != NO_INIT) {
231a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik        doThrowIAE(env);
232486590963e2207d68eebd6944fec70d50d41116aChet Haase    }
233486590963e2207d68eebd6944fec70d50d41116aChet Haase}
234486590963e2207d68eebd6944fec70d50d41116aChet Haase
235e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guystatic void nativeSetPosition(JNIEnv* env, jclass clazz, jlong nativeObject, jfloat x, jfloat y) {
2365c13d89c1332fcc499379b9064b891187b75ca32Chet Haase    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
237486590963e2207d68eebd6944fec70d50d41116aChet Haase    status_t err = ctrl->setPosition(x, y);
238486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (err < 0 && err != NO_INIT) {
2395a7b466a2b4b7ced739bd5c31e022de61650545aRomain Guy        doThrowIAE(env);
240486590963e2207d68eebd6944fec70d50d41116aChet Haase    }
2414bb942083a0d4db746adf95349108dd8ef842e32Romain Guy}
2425c13d89c1332fcc499379b9064b891187b75ca32Chet Haase
243be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guystatic void nativeSetSize(JNIEnv* env, jclass clazz, jlong nativeObject, jint w, jint h) {
244be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
245be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    status_t err = ctrl->setSize(w, h);
246486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (err < 0 && err != NO_INIT) {
247486590963e2207d68eebd6944fec70d50d41116aChet Haase        doThrowIAE(env);
248486590963e2207d68eebd6944fec70d50d41116aChet Haase    }
24901d58e43ede5ca98cbebdd166f9b0c545032c01bRomain Guy}
250486590963e2207d68eebd6944fec70d50d41116aChet Haase
251486590963e2207d68eebd6944fec70d50d41116aChet Haasestatic void nativeSetFlags(JNIEnv* env, jclass clazz, jlong nativeObject, jint flags, jint mask) {
252486590963e2207d68eebd6944fec70d50d41116aChet Haase    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
2538b2f5267f16c295f12faab810527cd6311997e34Romain Guy    status_t err = ctrl->setFlags(flags, mask);
254486590963e2207d68eebd6944fec70d50d41116aChet Haase    if (err < 0 && err != NO_INIT) {
255486590963e2207d68eebd6944fec70d50d41116aChet Haase        doThrowIAE(env);
256486590963e2207d68eebd6944fec70d50d41116aChet Haase    }
257486590963e2207d68eebd6944fec70d50d41116aChet Haase}
258325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy
259486590963e2207d68eebd6944fec70d50d41116aChet Haasestatic void nativeSetTransparentRegionHint(JNIEnv* env, jclass clazz, jlong nativeObject, jobject regionObj) {
260325740fb444af8fc7fb0119b2e30ce322c2ae134Romain Guy    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
261c25259519f1b74bb62a2b051b74537f073436b5cRomain Guy    SkRegion* region = android_graphics_Region_getSkRegion(env, regionObj);
262996e57c84368058be793897ebc355b917a59abc2Raph Levien    if (!region) {
263672433d90fab7383cd28beac9d4485b566a90940Romain Guy        doThrowIAE(env);
26485bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy        return;
2654aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    }
2664aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy
267d27977d1a91d5a6b3cc9fa7664ac7e835e7bd895Romain Guy    const SkIRect& b(region->getBounds());
2684aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    Region reg(Rect(b.fLeft, b.fTop, b.fRight, b.fBottom));
2694aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy    if (region->isComplex()) {
270db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy        SkRegion::Iterator it(*region);
2714aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy        while (!it.done()) {
2724aa90573bbf86db0d33a3a790c5dbd0d93b95cfeRomain Guy            const SkIRect& r(it.rect());
2731e45aae5de003657e5d18f74d34998f5de5db5b7Romain Guy            reg.addRectUnchecked(r.fLeft, r.fTop, r.fRight, r.fBottom);
2745ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy            it.next();
2755ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy        }
2765ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    }
277a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik
2785ff9df658230d49e42c43586997a02d8e4dd417eRomain Guy    status_t err = ctrl->setTransparentRegionHint(reg);
279ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    if (err < 0 && err != NO_INIT) {
280ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        doThrowIAE(env);
281c3566d06421c8acc0aafb18f7e307e5725ce87e1Chris Craik    }
282d90144db52c7297879b950cbbc85137ed123ab5bChris Craik}
283d90144db52c7297879b950cbbc85137ed123ab5bChris Craik
284d90144db52c7297879b950cbbc85137ed123ab5bChris Craikstatic void nativeSetAlpha(JNIEnv* env, jclass clazz, jlong nativeObject, jfloat alpha) {
285ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
286672433d90fab7383cd28beac9d4485b566a90940Romain Guy    status_t err = ctrl->setAlpha(alpha);
287672433d90fab7383cd28beac9d4485b566a90940Romain Guy    if (err < 0 && err != NO_INIT) {
288672433d90fab7383cd28beac9d4485b566a90940Romain Guy        doThrowIAE(env);
289672433d90fab7383cd28beac9d4485b566a90940Romain Guy    }
2900f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy}
2910f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy
2920f6675332c04c74909425d1d328f02b32c0ff40eRomain Guystatic void nativeSetMatrix(JNIEnv* env, jclass clazz, jlong nativeObject,
2930f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy        jfloat dsdx, jfloat dtdx, jfloat dsdy, jfloat dtdy) {
294ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
295ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    status_t err = ctrl->setMatrix(dsdx, dtdx, dsdy, dtdy);
296ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    if (err < 0 && err != NO_INIT) {
297ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik        doThrowIAE(env);
298ff78583d8a73ca35ce65b5d2592570ff6fb9901bChris Craik    }
29917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy}
300a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik
30117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guystatic void nativeSetWindowCrop(JNIEnv* env, jclass clazz, jlong nativeObject,
30217112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        jint l, jint t, jint r, jint b) {
303a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
304a08f95cfeca7217f9c533b03663bf0dceedd259aChris Craik    Rect crop(l, t, r, b);
30517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    status_t err = ctrl->setCrop(crop);
30617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    if (err < 0 && err != NO_INIT) {
30717112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        doThrowIAE(env);
3080f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    }
3090f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy}
3100f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy
3110f6675332c04c74909425d1d328f02b32c0ff40eRomain Guystatic void nativeSetLayerStack(JNIEnv* env, jclass clazz, jlong nativeObject, jint layerStack) {
3120f6675332c04c74909425d1d328f02b32c0ff40eRomain Guy    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
31317112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    status_t err = ctrl->setLayerStack(layerStack);
31417112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    if (err < 0 && err != NO_INIT) {
31517112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy        doThrowIAE(env);
31617112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    }
31713631f3da855f200a151e7837ed9f6b079622b58Romain Guy}
31817112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy
31917112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guystatic jobject nativeGetBuiltInDisplay(JNIEnv* env, jclass clazz, jint id) {
32017112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    sp<IBinder> token(SurfaceComposerClient::getBuiltInDisplay(id));
32117112ad8a21a77620eb1ff14dcf8bdd6b7859712Romain Guy    return javaObjectForIBinder(env, token);
32213631f3da855f200a151e7837ed9f6b079622b58Romain Guy}
32313631f3da855f200a151e7837ed9f6b079622b58Romain Guy
324d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haasestatic jobject nativeCreateDisplay(JNIEnv* env, jclass clazz, jstring nameObj,
325d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase        jboolean secure) {
326d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    ScopedUtfChars name(env, nameObj);
327d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    sp<IBinder> token(SurfaceComposerClient::createDisplay(
328d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase            String8(name.c_str()), bool(secure)));
329d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    return javaObjectForIBinder(env, token);
330d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase}
331d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase
332d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haasestatic void nativeDestroyDisplay(JNIEnv* env, jclass clazz, jobject tokenObj) {
333d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
334d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    if (token == NULL) return;
335d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    SurfaceComposerClient::destroyDisplay(token);
336d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase}
337d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase
338d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haasestatic void nativeSetDisplaySurface(JNIEnv* env, jclass clazz,
339d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase        jobject tokenObj, jlong nativeSurfaceObject) {
340d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
341d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    if (token == NULL) return;
342d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    sp<IGraphicBufferProducer> bufferProducer;
343d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    sp<Surface> sur(reinterpret_cast<Surface *>(nativeSurfaceObject));
344d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    if (sur != NULL) {
345d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase        bufferProducer = sur->getIGraphicBufferProducer();
346d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    }
347d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase    SurfaceComposerClient::setDisplaySurface(token, bufferProducer);
348d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase}
349d15ebf25c595b855f6978d0600218e3ea5f31e92Chet Haase
350624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guystatic void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz,
351624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy        jobject tokenObj, jint layerStack) {
352624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
353624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    if (token == NULL) return;
354624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy
355624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy    SurfaceComposerClient::setDisplayLayerStack(token, layerStack);
356e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy}
357e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
35835643ddc689913f5b5f80ceed864470d987bd6cdRomain Guystatic void nativeSetDisplayProjection(JNIEnv* env, jclass clazz,
35935643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy        jobject tokenObj, jint orientation,
36035643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy        jint layerStackRect_left, jint layerStackRect_top, jint layerStackRect_right, jint layerStackRect_bottom,
36135643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy        jint displayRect_left, jint displayRect_top, jint displayRect_right, jint displayRect_bottom) {
36235643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
36335643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    if (token == NULL) return;
3647c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    Rect layerStackRect(layerStackRect_left, layerStackRect_top, layerStackRect_right, layerStackRect_bottom);
3657c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    Rect displayRect(displayRect_left, displayRect_top, displayRect_right, displayRect_bottom);
3667c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy    SurfaceComposerClient::setDisplayProjection(token, orientation, layerStackRect, displayRect);
3677c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy}
3687c25aab491707f7324f9941b8cfa9bd2b4b97e76Romain Guy
36935643ddc689913f5b5f80ceed864470d987bd6cdRomain Guystatic void nativeSetDisplaySize(JNIEnv* env, jclass clazz,
37035643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy        jobject tokenObj, jint width, jint height) {
37135643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
37235643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    if (token == NULL) return;
37335643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    SurfaceComposerClient::setDisplaySize(token, width, height);
3748ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy}
3758ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
3768ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guystatic jobjectArray nativeGetDisplayConfigs(JNIEnv* env, jclass clazz,
3778ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy        jobject tokenObj) {
3788ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
3798ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    if (token == NULL) return NULL;
3808ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
3818ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    Vector<DisplayInfo> configs;
3828ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    if (SurfaceComposerClient::getDisplayConfigs(token, &configs) != NO_ERROR ||
3838ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy            configs.size() == 0) {
3848ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy        return NULL;
3858ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    }
3868ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
387e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    jobjectArray configArray = env->NewObjectArray(configs.size(),
388e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy            gPhysicalDisplayInfoClassInfo.clazz, NULL);
389e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy
390e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy    for (size_t c = 0; c < configs.size(); ++c) {
391e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        const DisplayInfo& info = configs[c];
392e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        jobject infoObj = env->NewObject(gPhysicalDisplayInfoClassInfo.clazz,
393e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy                gPhysicalDisplayInfoClassInfo.ctor);
394e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.width, info.w);
395e2d345ea67e2960b37bfdc0fc8626d1bfa747404Romain Guy        env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.height, info.h);
396694b519ac647fe998fd396fe0784cc8e179aadc4Romain Guy        env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.refreshRate, info.fps);
397ada830f639591b99c3e40de22b07296c7932a33fRomain Guy        env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.density, info.density);
398f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy        env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.xDpi, info.xdpi);
399ada830f639591b99c3e40de22b07296c7932a33fRomain Guy        env->SetFloatField(infoObj, gPhysicalDisplayInfoClassInfo.yDpi, info.ydpi);
400f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy        env->SetBooleanField(infoObj, gPhysicalDisplayInfoClassInfo.secure, info.secure);
401ada830f639591b99c3e40de22b07296c7932a33fRomain Guy        env->SetLongField(infoObj, gPhysicalDisplayInfoClassInfo.appVsyncOffsetNanos,
402ada830f639591b99c3e40de22b07296c7932a33fRomain Guy                info.appVsyncOffset);
403f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy        env->SetLongField(infoObj, gPhysicalDisplayInfoClassInfo.presentationDeadlineNanos,
404ada830f639591b99c3e40de22b07296c7932a33fRomain Guy                info.presentationDeadline);
405624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy        env->SetIntField(infoObj, gPhysicalDisplayInfoClassInfo.colorTransform,
406f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy                info.colorTransform);
407f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy        env->SetObjectArrayElement(configArray, static_cast<jsize>(c), infoObj);
408ada830f639591b99c3e40de22b07296c7932a33fRomain Guy        env->DeleteLocalRef(infoObj);
40942f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    }
41042f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy
41142f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    return configArray;
412624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy}
413f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy
414f219da5e32e85deb442468ee9a63bb28eb198557Romain Guystatic jint nativeGetActiveConfig(JNIEnv* env, jclass clazz, jobject tokenObj) {
415f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
41642f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    if (token == NULL) return -1;
41742f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    return static_cast<jint>(SurfaceComposerClient::getActiveConfig(token));
41842f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy}
419624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy
420f219da5e32e85deb442468ee9a63bb28eb198557Romain Guystatic jboolean nativeSetActiveConfig(JNIEnv* env, jclass clazz, jobject tokenObj, jint id) {
421f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
4221bd1bad0b4a75e633c5edbe802bf6fb4dd765161Romain Guy    if (token == NULL) return JNI_FALSE;
42342f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    status_t err = SurfaceComposerClient::setActiveConfig(token, static_cast<int>(id));
42442f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    return err == NO_ERROR ? JNI_TRUE : JNI_FALSE;
42542f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy}
426624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy
42742f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guystatic void nativeSetDisplayPowerMode(JNIEnv* env, jclass clazz, jobject tokenObj, jint mode) {
42842f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
42942f3a4b7c35dd1ea1922356eb3611af8cde05179Romain Guy    if (token == NULL) return;
43077a811610f99e21da7f88dafef60d09f345d0506Romain Guy
43177a811610f99e21da7f88dafef60d09f345d0506Romain Guy    ALOGD_IF_SLOW(100, "Excessive delay in setPowerMode()");
43277a811610f99e21da7f88dafef60d09f345d0506Romain Guy    SurfaceComposerClient::setDisplayPowerMode(token, mode);
43377a811610f99e21da7f88dafef60d09f345d0506Romain Guy}
43477a811610f99e21da7f88dafef60d09f345d0506Romain Guy
43577a811610f99e21da7f88dafef60d09f345d0506Romain Guystatic jboolean nativeClearContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject) {
43677a811610f99e21da7f88dafef60d09f345d0506Romain Guy    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
43777a811610f99e21da7f88dafef60d09f345d0506Romain Guy    status_t err = ctrl->clearLayerFrameStats();
438be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
439be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    if (err < 0 && err != NO_INIT) {
440be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy        doThrowIAE(env);
441be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    }
442be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
443be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    // The other end is not ready, just report we failed.
444be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    if (err == NO_INIT) {
445be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy        return JNI_FALSE;
446be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    }
447be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
448be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    return JNI_TRUE;
449be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy}
450be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
451be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guystatic jboolean nativeGetContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject,
452be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    jobject outStats) {
453be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    FrameStats stats;
454be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy
455be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
456be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    status_t err = ctrl->getLayerFrameStats(&stats);
457be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    if (err < 0 && err != NO_INIT) {
458be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy        doThrowIAE(env);
459be6f9dc1e71b425b7ac1c40c0a2c72d03eb9fbeeRomain Guy    }
46011cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
46111cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    // The other end is not ready, fine just return empty stats.
46211cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    if (err == NO_INIT) {
463624234f69b2a4781d24f3e4c6ae6450729e38397Romain Guy        return JNI_FALSE;
46411cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    }
46511cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy
46611cb642756093a4af901b1525375b1eb2b5c3e2bRomain Guy    jlong refreshPeriodNano = static_cast<jlong>(stats.refreshPeriodNano);
46708ae317c21ec3086b5017672bba87420cc38a407Romain Guy    size_t frameCount = stats.desiredPresentTimesNano.size();
4685cbbce535744b89df5ecea95de21ee3733298260Romain Guy
469dcfc836b457a87881da409e1acf251515f121446Romain Guy    jlongArray postedTimesNanoDst = env->NewLongArray(frameCount);
470dcfc836b457a87881da409e1acf251515f121446Romain Guy    if (postedTimesNanoDst == NULL) {
471dcfc836b457a87881da409e1acf251515f121446Romain Guy        return JNI_FALSE;
472dcfc836b457a87881da409e1acf251515f121446Romain Guy    }
473dcfc836b457a87881da409e1acf251515f121446Romain Guy
474dcfc836b457a87881da409e1acf251515f121446Romain Guy    jlongArray presentedTimesNanoDst = env->NewLongArray(frameCount);
475dcfc836b457a87881da409e1acf251515f121446Romain Guy    if (presentedTimesNanoDst == NULL) {
476ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy        return JNI_FALSE;
477ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    }
478ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy
479ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    jlongArray readyTimesNanoDst = env->NewLongArray(frameCount);
480ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy    if (readyTimesNanoDst == NULL) {
481ddf74373616c89e0880a28a2185fd7ce3db91de6Romain Guy        return JNI_FALSE;
4822b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    }
483c3fedafc5f50100219449125a000e3138f6fb987Romain Guy
484c3fedafc5f50100219449125a000e3138f6fb987Romain Guy    nsecs_t postedTimesNanoSrc[frameCount];
4852b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    nsecs_t presentedTimesNanoSrc[frameCount];
4862b7028eabac80cec170572bc0e945a1d4224e595Romain Guy    nsecs_t readyTimesNanoSrc[frameCount];
4872b7028eabac80cec170572bc0e945a1d4224e595Romain Guy
48857b5268708c3b974296c7d4e58a02a957979224aRomain Guy    for (size_t i = 0; i < frameCount; i++) {
4892b7028eabac80cec170572bc0e945a1d4224e595Romain Guy        nsecs_t postedTimeNano = stats.desiredPresentTimesNano[i];
4902b7028eabac80cec170572bc0e945a1d4224e595Romain Guy        if (postedTimeNano == INT64_MAX) {
491c3fedafc5f50100219449125a000e3138f6fb987Romain Guy            postedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
492c3fedafc5f50100219449125a000e3138f6fb987Romain Guy        }
493c3fedafc5f50100219449125a000e3138f6fb987Romain Guy        postedTimesNanoSrc[i] = postedTimeNano;
494c3fedafc5f50100219449125a000e3138f6fb987Romain Guy
495c3fedafc5f50100219449125a000e3138f6fb987Romain Guy        nsecs_t presentedTimeNano = stats.actualPresentTimesNano[i];
496c3fedafc5f50100219449125a000e3138f6fb987Romain Guy        if (presentedTimeNano == INT64_MAX) {
497c3fedafc5f50100219449125a000e3138f6fb987Romain Guy            presentedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
4982b7028eabac80cec170572bc0e945a1d4224e595Romain Guy        }
4992b7028eabac80cec170572bc0e945a1d4224e595Romain Guy        presentedTimesNanoSrc[i] = presentedTimeNano;
5002b7028eabac80cec170572bc0e945a1d4224e595Romain Guy
5012b7028eabac80cec170572bc0e945a1d4224e595Romain Guy        nsecs_t readyTimeNano = stats.frameReadyTimesNano[i];
5022b7028eabac80cec170572bc0e945a1d4224e595Romain Guy        if (readyTimeNano == INT64_MAX) {
5032b7028eabac80cec170572bc0e945a1d4224e595Romain Guy            readyTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
5045cbbce535744b89df5ecea95de21ee3733298260Romain Guy        }
5055cbbce535744b89df5ecea95de21ee3733298260Romain Guy        readyTimesNanoSrc[i] = readyTimeNano;
5065cbbce535744b89df5ecea95de21ee3733298260Romain Guy    }
5075cbbce535744b89df5ecea95de21ee3733298260Romain Guy
5088aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy    env->SetLongArrayRegion(postedTimesNanoDst, 0, frameCount, postedTimesNanoSrc);
5098aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy    env->SetLongArrayRegion(presentedTimesNanoDst, 0, frameCount, presentedTimesNanoSrc);
5105cbbce535744b89df5ecea95de21ee3733298260Romain Guy    env->SetLongArrayRegion(readyTimesNanoDst, 0, frameCount, readyTimesNanoSrc);
5115cbbce535744b89df5ecea95de21ee3733298260Romain Guy
5128aef54fa17f2a3753d9a8f2027629bc480088f69Romain Guy    env->CallVoidMethod(outStats, gWindowContentFrameStatsClassInfo.init, refreshPeriodNano,
5135cbbce535744b89df5ecea95de21ee3733298260Romain Guy            postedTimesNanoDst, presentedTimesNanoDst, readyTimesNanoDst);
5145cbbce535744b89df5ecea95de21ee3733298260Romain Guy
5155cbbce535744b89df5ecea95de21ee3733298260Romain Guy    if (env->ExceptionCheck()) {
5165cbbce535744b89df5ecea95de21ee3733298260Romain Guy        return JNI_FALSE;
5172542d199745cdf3ec910b8e3e4cff5851ed24e9bRomain Guy    }
5185cbbce535744b89df5ecea95de21ee3733298260Romain Guy
519bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    return JNI_TRUE;
520bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy}
5215cbbce535744b89df5ecea95de21ee3733298260Romain Guy
5225cbbce535744b89df5ecea95de21ee3733298260Romain Guystatic jboolean nativeClearAnimationFrameStats(JNIEnv* env, jclass clazz) {
5235cbbce535744b89df5ecea95de21ee3733298260Romain Guy    status_t err = SurfaceComposerClient::clearAnimationFrameStats();
5245cbbce535744b89df5ecea95de21ee3733298260Romain Guy
525bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy    if (err < 0 && err != NO_INIT) {
526bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy        doThrowIAE(env);
5275cbbce535744b89df5ecea95de21ee3733298260Romain Guy    }
5288ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
5298ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    // The other end is not ready, just report we failed.
5308ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    if (err == NO_INIT) {
5318ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy        return JNI_FALSE;
5328ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy    }
5338ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy
53435643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    return JNI_TRUE;
53535643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy}
53635643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy
53735643ddc689913f5b5f80ceed864470d987bd6cdRomain Guystatic jboolean nativeGetAnimationFrameStats(JNIEnv* env, jclass clazz, jobject outStats) {
53835643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    FrameStats stats;
53935643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy
54035643ddc689913f5b5f80ceed864470d987bd6cdRomain Guy    status_t err = SurfaceComposerClient::getAnimationFrameStats(&stats);
541cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik    if (err < 0 && err != NO_INIT) {
542cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik        doThrowIAE(env);
543cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik    }
544cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik
545cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik    // The other end is not ready, fine just return empty stats.
546d90144db52c7297879b950cbbc85137ed123ab5bChris Craik    if (err == NO_INIT) {
547d90144db52c7297879b950cbbc85137ed123ab5bChris Craik        return JNI_FALSE;
548d90144db52c7297879b950cbbc85137ed123ab5bChris Craik    }
549d90144db52c7297879b950cbbc85137ed123ab5bChris Craik
550d90144db52c7297879b950cbbc85137ed123ab5bChris Craik    jlong refreshPeriodNano = static_cast<jlong>(stats.refreshPeriodNano);
551d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy    size_t frameCount = stats.desiredPresentTimesNano.size();
552d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy
553d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy    jlongArray presentedTimesNanoDst = env->NewLongArray(frameCount);
554d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy    if (presentedTimesNanoDst == NULL) {
555d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy        return JNI_FALSE;
556d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy    }
557d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy
558d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy    nsecs_t presentedTimesNanoSrc[frameCount];
559d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy
560d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy    for (size_t i = 0; i < frameCount; i++) {
561eb99356a0548684a501766e6a524529ab93304c8Romain Guy        nsecs_t presentedTimeNano = stats.actualPresentTimesNano[i];
562d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy        if (presentedTimeNano == INT64_MAX) {
563d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy            presentedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
564d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy        }
565d48885a6c8cd27a8a62552c33b5282e9882e19f6Chet Haase        presentedTimesNanoSrc[i] = presentedTimeNano;
566eb99356a0548684a501766e6a524529ab93304c8Romain Guy    }
567d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy
568d55a86120dd1e8ebcc6906c9ffd463f7460348daRomain Guy    env->SetLongArrayRegion(presentedTimesNanoDst, 0, frameCount, presentedTimesNanoSrc);
5695b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5705b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    env->CallVoidMethod(outStats, gWindowAnimationFrameStatsClassInfo.init, refreshPeriodNano,
5715b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            presentedTimesNanoDst);
5725b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5735b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    if (env->ExceptionCheck()) {
5745b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy        return JNI_FALSE;
5755b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    }
576d48885a6c8cd27a8a62552c33b5282e9882e19f6Chet Haase
5775b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    return JNI_TRUE;
5785b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy}
5795b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5805b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy// ----------------------------------------------------------------------------
5815b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy
5825b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guystatic JNINativeMethod sSurfaceControlMethods[] = {
5835b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIII)J",
5845b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            (void*)nativeCreate },
5855b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    {"nativeRelease", "(J)V",
5865b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            (void*)nativeRelease },
5875b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    {"nativeDestroy", "(J)V",
5885b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            (void*)nativeDestroy },
5895b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/graphics/Rect;IIIIZZI)Landroid/graphics/Bitmap;",
5905b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            (void*)nativeScreenshotBitmap },
5915b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    {"nativeScreenshot", "(Landroid/os/IBinder;Landroid/view/Surface;Landroid/graphics/Rect;IIIIZZ)V",
5925b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            (void*)nativeScreenshot },
5935b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy    {"nativeOpenTransaction", "()V",
5945b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy            (void*)nativeOpenTransaction },
59554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    {"nativeCloseTransaction", "()V",
59654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy            (void*)nativeCloseTransaction },
59754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    {"nativeSetAnimationTransaction", "()V",
59854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy            (void*)nativeSetAnimationTransaction },
59954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    {"nativeSetLayer", "(JI)V",
60054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy            (void*)nativeSetLayer },
60154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    {"nativeSetPosition", "(JFF)V",
602f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            (void*)nativeSetPosition },
603f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    {"nativeSetSize", "(JII)V",
604f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            (void*)nativeSetSize },
605f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    {"nativeSetTransparentRegionHint", "(JLandroid/graphics/Region;)V",
606f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            (void*)nativeSetTransparentRegionHint },
607f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    {"nativeSetAlpha", "(JF)V",
608f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            (void*)nativeSetAlpha },
609f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    {"nativeSetMatrix", "(JFFFF)V",
610f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            (void*)nativeSetMatrix },
611f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    {"nativeSetFlags", "(JII)V",
612f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            (void*)nativeSetFlags },
613f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy    {"nativeSetWindowCrop", "(JIIII)V",
614f219da5e32e85deb442468ee9a63bb28eb198557Romain Guy            (void*)nativeSetWindowCrop },
6155cbbce535744b89df5ecea95de21ee3733298260Romain Guy    {"nativeSetLayerStack", "(JI)V",
616735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            (void*)nativeSetLayerStack },
617735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    {"nativeGetBuiltInDisplay", "(I)Landroid/os/IBinder;",
6185cbbce535744b89df5ecea95de21ee3733298260Romain Guy            (void*)nativeGetBuiltInDisplay },
6195cbbce535744b89df5ecea95de21ee3733298260Romain Guy    {"nativeCreateDisplay", "(Ljava/lang/String;Z)Landroid/os/IBinder;",
6205cbbce535744b89df5ecea95de21ee3733298260Romain Guy            (void*)nativeCreateDisplay },
6215cbbce535744b89df5ecea95de21ee3733298260Romain Guy    {"nativeDestroyDisplay", "(Landroid/os/IBinder;)V",
6225cbbce535744b89df5ecea95de21ee3733298260Romain Guy            (void*)nativeDestroyDisplay },
6235cbbce535744b89df5ecea95de21ee3733298260Romain Guy    {"nativeSetDisplaySurface", "(Landroid/os/IBinder;J)V",
624026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy            (void*)nativeSetDisplaySurface },
6253d58c03de0d8877b36cdb78b0ca8b5cac7f600e2Romain Guy    {"nativeSetDisplayLayerStack", "(Landroid/os/IBinder;I)V",
6265cbbce535744b89df5ecea95de21ee3733298260Romain Guy            (void*)nativeSetDisplayLayerStack },
627026c5e16704e817cac7d9c382914c947e34f87e0Romain Guy    {"nativeSetDisplayProjection", "(Landroid/os/IBinder;IIIIIIIII)V",
6281c740bce8a762f02b5283045a0e2de7c8fb41277Romain Guy            (void*)nativeSetDisplayProjection },
6295cbbce535744b89df5ecea95de21ee3733298260Romain Guy    {"nativeSetDisplaySize", "(Landroid/os/IBinder;II)V",
63054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy            (void*)nativeSetDisplaySize },
631735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    {"nativeGetDisplayConfigs", "(Landroid/os/IBinder;)[Landroid/view/SurfaceControl$PhysicalDisplayInfo;",
632735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            (void*)nativeGetDisplayConfigs },
633735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    {"nativeGetActiveConfig", "(Landroid/os/IBinder;)I",
634735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            (void*)nativeGetActiveConfig },
635735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    {"nativeSetActiveConfig", "(Landroid/os/IBinder;I)Z",
636735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            (void*)nativeSetActiveConfig },
637735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    {"nativeClearContentFrameStats", "(J)Z",
638735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            (void*)nativeClearContentFrameStats },
639735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    {"nativeGetContentFrameStats", "(JLandroid/view/WindowContentFrameStats;)Z",
6408ce00301a023eecaeb8891ce906f67b513ebb42aRomain Guy            (void*)nativeGetContentFrameStats },
6413bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy    {"nativeClearAnimationFrameStats", "()Z",
642735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            (void*)nativeClearAnimationFrameStats },
643735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy    {"nativeGetAnimationFrameStats", "(Landroid/view/WindowAnimationFrameStats;)Z",
6443bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy            (void*)nativeGetAnimationFrameStats },
6453bbacf27c0be1bae4e4483577fc89ae3113abe5dRomain Guy    {"nativeSetDisplayPowerMode", "(Landroid/os/IBinder;I)V",
646735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy            (void*)nativeSetDisplayPowerMode },
647735738c4ddf3229caa5f6e634bf591953ac29944Romain Guy};
64854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy
64954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guyint register_android_view_SurfaceControl(JNIEnv* env)
65054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy{
65154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    int err = RegisterMethodsOrDie(env, "android/view/SurfaceControl",
65254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy            sSurfaceControlMethods, NELEM(sSurfaceControlMethods));
65354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy
65454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    jclass clazz = FindClassOrDie(env, "android/view/SurfaceControl$PhysicalDisplayInfo");
65554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
65654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.ctor = GetMethodIDOrDie(env,
65754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy            gPhysicalDisplayInfoClassInfo.clazz, "<init>", "()V");
658486590963e2207d68eebd6944fec70d50d41116aChet Haase    gPhysicalDisplayInfoClassInfo.width =       GetFieldIDOrDie(env, clazz, "width", "I");
65954be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.height =      GetFieldIDOrDie(env, clazz, "height", "I");
66054be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.refreshRate = GetFieldIDOrDie(env, clazz, "refreshRate", "F");
66154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.density =     GetFieldIDOrDie(env, clazz, "density", "F");
66254be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.xDpi =        GetFieldIDOrDie(env, clazz, "xDpi", "F");
66354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.yDpi =        GetFieldIDOrDie(env, clazz, "yDpi", "F");
66454be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.secure =      GetFieldIDOrDie(env, clazz, "secure", "Z");
66554be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.appVsyncOffsetNanos = GetFieldIDOrDie(env,
66654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy            clazz, "appVsyncOffsetNanos", "J");
66754be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gPhysicalDisplayInfoClassInfo.presentationDeadlineNanos = GetFieldIDOrDie(env,
66854be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy            clazz, "presentationDeadlineNanos", "J");
669a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy    gPhysicalDisplayInfoClassInfo.colorTransform = GetFieldIDOrDie(env, clazz,
670a168d7372132d6c87835878794b6ed43d0d282fdRomain Guy            "colorTransform", "I");
67154be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy
67265cd612face362d054a85d0f7e5881c59cd523beChris Craik    jclass rectClazz = FindClassOrDie(env, "android/graphics/Rect");
67365cd612face362d054a85d0f7e5881c59cd523beChris Craik    gRectClassInfo.bottom = GetFieldIDOrDie(env, rectClazz, "bottom", "I");
67465cd612face362d054a85d0f7e5881c59cd523beChris Craik    gRectClassInfo.left =   GetFieldIDOrDie(env, rectClazz, "left", "I");
67565cd612face362d054a85d0f7e5881c59cd523beChris Craik    gRectClassInfo.right =  GetFieldIDOrDie(env, rectClazz, "right", "I");
67665cd612face362d054a85d0f7e5881c59cd523beChris Craik    gRectClassInfo.top =    GetFieldIDOrDie(env, rectClazz, "top", "I");
67765cd612face362d054a85d0f7e5881c59cd523beChris Craik
67865cd612face362d054a85d0f7e5881c59cd523beChris Craik    jclass frameStatsClazz = FindClassOrDie(env, "android/view/FrameStats");
67965cd612face362d054a85d0f7e5881c59cd523beChris Craik    jfieldID undefined_time_nano_field = GetStaticFieldIDOrDie(env,
68065cd612face362d054a85d0f7e5881c59cd523beChris Craik            frameStatsClazz, "UNDEFINED_TIME_NANO", "J");
68165cd612face362d054a85d0f7e5881c59cd523beChris Craik    nsecs_t undefined_time_nano = env->GetStaticLongField(frameStatsClazz, undefined_time_nano_field);
682710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik
68354be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    jclass contFrameStatsClazz = FindClassOrDie(env, "android/view/WindowContentFrameStats");
684710f46d9d6a5bf9ea1c1833384caf61e1934124fChris Craik    gWindowContentFrameStatsClassInfo.init = GetMethodIDOrDie(env,
685cb4d6009576cf08195dc23f341a3f4939c0878bbChris Craik            contFrameStatsClazz, "init", "(J[J[J[J)V");
68654be1cdf3d63095512120fa7ced5c16e462abffaRomain Guy    gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO = undefined_time_nano;
68765cd612face362d054a85d0f7e5881c59cd523beChris Craik
688858aa93ddb6e69e0503382af63bb681b6728aef1Chet Haase    jclass animFrameStatsClazz = FindClassOrDie(env, "android/view/WindowAnimationFrameStats");
6895cbbce535744b89df5ecea95de21ee3733298260Romain Guy    gWindowAnimationFrameStatsClassInfo.init =  GetMethodIDOrDie(env,
6905cbbce535744b89df5ecea95de21ee3733298260Romain Guy            animFrameStatsClazz, "init", "(J[J)V");
6915cbbce535744b89df5ecea95de21ee3733298260Romain Guy    gWindowAnimationFrameStatsClassInfo.UNDEFINED_TIME_NANO = undefined_time_nano;
6925cbbce535744b89df5ecea95de21ee3733298260Romain Guy
6935cbbce535744b89df5ecea95de21ee3733298260Romain Guy    return err;
6945cbbce535744b89df5ecea95de21ee3733298260Romain Guy}
6955cbbce535744b89df5ecea95de21ee3733298260Romain Guy
6965cbbce535744b89df5ecea95de21ee3733298260Romain Guy};
6975cbbce535744b89df5ecea95de21ee3733298260Romain Guy