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