1 /*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #define LOG_TAG "SurfaceControl"
18 #define LOG_NDEBUG 0
19
20 #include <aidl/android/hardware/graphics/common/PixelFormat.h>
21 #include <android-base/chrono_utils.h>
22 #include <android/graphics/properties.h>
23 #include <android/graphics/region.h>
24 #include <android/gui/BnWindowInfosReportedListener.h>
25 #include <android/hardware/display/IDeviceProductInfoConstants.h>
26 #include <android/os/IInputConstants.h>
27 #include <android_runtime/AndroidRuntime.h>
28 #include <android_runtime/android_graphics_GraphicBuffer.h>
29 #include <android_runtime/android_hardware_HardwareBuffer.h>
30 #include <android_runtime/android_hardware_OverlayProperties.h>
31 #include <android_runtime/android_view_Surface.h>
32 #include <android_runtime/android_view_SurfaceControl.h>
33 #include <android_runtime/android_view_SurfaceSession.h>
34 #include <gui/ISurfaceComposer.h>
35 #include <gui/Surface.h>
36 #include <gui/SurfaceComposerClient.h>
37 #include <jni.h>
38 #include <nativehelper/JNIHelp.h>
39 #include <nativehelper/ScopedUtfChars.h>
40 #include <private/gui/ComposerService.h>
41 #include <stdio.h>
42 #include <system/graphics.h>
43 #include <ui/BlurRegion.h>
44 #include <ui/ConfigStoreTypes.h>
45 #include <ui/DeviceProductInfo.h>
46 #include <ui/DisplayMode.h>
47 #include <ui/DisplayedFrameStats.h>
48 #include <ui/DynamicDisplayInfo.h>
49 #include <ui/FrameStats.h>
50 #include <ui/GraphicTypes.h>
51 #include <ui/HdrCapabilities.h>
52 #include <ui/Rect.h>
53 #include <ui/Region.h>
54 #include <ui/StaticDisplayInfo.h>
55 #include <utils/LightRefBase.h>
56 #include <utils/Log.h>
57
58 #include <memory>
59
60 #include "android_hardware_input_InputWindowHandle.h"
61 #include "android_os_Parcel.h"
62 #include "android_util_Binder.h"
63 #include "core_jni_helpers.h"
64 #include "jni_common.h"
65
66 // ----------------------------------------------------------------------------
67
68 namespace android {
69
70 using gui::FocusRequest;
71
doThrowNPE(JNIEnv * env)72 static void doThrowNPE(JNIEnv* env) {
73 jniThrowNullPointerException(env, NULL);
74 }
75
doThrowIAE(JNIEnv * env,const char * msg=nullptr)76 static void doThrowIAE(JNIEnv* env, const char* msg = nullptr) {
77 jniThrowException(env, "java/lang/IllegalArgumentException", msg);
78 }
79
80 static const char* const OutOfResourcesException =
81 "android/view/Surface$OutOfResourcesException";
82
83 static struct {
84 jclass clazz;
85 jmethodID ctor;
86 } gIntegerClassInfo;
87
toInteger(JNIEnv * env,int32_t i)88 static jobject toInteger(JNIEnv* env, int32_t i) {
89 return env->NewObject(gIntegerClassInfo.clazz, gIntegerClassInfo.ctor, i);
90 }
91
92 static struct {
93 jclass clazz;
94 jmethodID run;
95 } gRunnableClassInfo;
96
97 static struct {
98 jclass clazz;
99 jmethodID ctor;
100 jfieldID isInternal;
101 jfieldID density;
102 jfieldID secure;
103 jfieldID deviceProductInfo;
104 jfieldID installOrientation;
105 } gStaticDisplayInfoClassInfo;
106
107 static struct {
108 jclass clazz;
109 jmethodID ctor;
110 jfieldID supportedDisplayModes;
111 jfieldID activeDisplayModeId;
112 jfieldID renderFrameRate;
113 jfieldID supportedColorModes;
114 jfieldID activeColorMode;
115 jfieldID hdrCapabilities;
116 jfieldID autoLowLatencyModeSupported;
117 jfieldID gameContentTypeSupported;
118 jfieldID preferredBootDisplayMode;
119 } gDynamicDisplayInfoClassInfo;
120
121 static struct {
122 jclass clazz;
123 jmethodID ctor;
124 jfieldID id;
125 jfieldID width;
126 jfieldID height;
127 jfieldID xDpi;
128 jfieldID yDpi;
129 jfieldID refreshRate;
130 jfieldID appVsyncOffsetNanos;
131 jfieldID presentationDeadlineNanos;
132 jfieldID group;
133 jfieldID supportedHdrTypes;
134 } gDisplayModeClassInfo;
135
136 // Implements SkMallocPixelRef::ReleaseProc, to delete the screenshot on unref.
DeleteScreenshot(void * addr,void * context)137 void DeleteScreenshot(void* addr, void* context) {
138 delete ((ScreenshotClient*) context);
139 }
140
141 static struct {
142 nsecs_t UNDEFINED_TIME_NANO;
143 jmethodID init;
144 } gWindowContentFrameStatsClassInfo;
145
146 static struct {
147 nsecs_t UNDEFINED_TIME_NANO;
148 jmethodID init;
149 } gWindowAnimationFrameStatsClassInfo;
150
151 static struct {
152 jclass clazz;
153 jmethodID ctor;
154 } gHdrCapabilitiesClassInfo;
155
156 static struct {
157 jclass clazz;
158 jmethodID ctor;
159 } gDeviceProductInfoClassInfo;
160
161 static struct {
162 jclass clazz;
163 jmethodID ctor;
164 } gDeviceProductInfoManufactureDateClassInfo;
165
166 static struct {
167 jclass clazz;
168 jmethodID ctor;
169 } gDisplayedContentSampleClassInfo;
170
171 static struct {
172 jclass clazz;
173 jmethodID ctor;
174 } gDisplayedContentSamplingAttributesClassInfo;
175
176 static struct {
177 jclass clazz;
178 jmethodID ctor;
179 jfieldID X;
180 jfieldID Y;
181 jfieldID Z;
182 } gCieXyzClassInfo;
183
184 static struct {
185 jclass clazz;
186 jmethodID ctor;
187 jfieldID red;
188 jfieldID green;
189 jfieldID blue;
190 jfieldID white;
191 } gDisplayPrimariesClassInfo;
192
193 static struct {
194 jclass clazz;
195 jmethodID ctor;
196 jfieldID min;
197 jfieldID max;
198 } gRefreshRateRangeClassInfo;
199
200 static struct {
201 jclass clazz;
202 jmethodID ctor;
203 jfieldID physical;
204 jfieldID render;
205 } gRefreshRateRangesClassInfo;
206
207 static struct {
208 jclass clazz;
209 jmethodID ctor;
210 jfieldID defaultMode;
211 jfieldID allowGroupSwitching;
212 jfieldID primaryRanges;
213 jfieldID appRequestRanges;
214 } gDesiredDisplayModeSpecsClassInfo;
215
216 static struct {
217 jclass clazz;
218 jmethodID onJankDataAvailable;
219 } gJankDataListenerClassInfo;
220
221 static struct {
222 jclass clazz;
223 jmethodID ctor;
224 } gJankDataClassInfo;
225
226 static struct {
227 jclass clazz;
228 jmethodID onTransactionCommitted;
229 } gTransactionCommittedListenerClassInfo;
230
231 static struct {
232 jclass clazz;
233 jmethodID ctor;
234 jfieldID format;
235 jfieldID alphaInterpretation;
236 } gDisplayDecorationSupportInfo;
237
238 static struct {
239 jclass clazz;
240 jfieldID mNativeObject;
241 } gTransactionClassInfo;
242
243 static struct {
244 jclass clazz;
245 jfieldID mNativeObject;
246 jmethodID invokeReleaseCallback;
247 } gSurfaceControlClassInfo;
248
249 static struct {
250 jclass clazz;
251 jfieldID mMinAlpha;
252 jfieldID mMinFractionRendered;
253 jfieldID mStabilityRequirementMs;
254 } gTrustedPresentationThresholdsClassInfo;
255
256 static struct {
257 jmethodID onTrustedPresentationChanged;
258 } gTrustedPresentationCallbackClassInfo;
259
260 static struct {
261 jclass clazz;
262 jmethodID ctor;
263 jfieldID layerName;
264 jfieldID bufferId;
265 jfieldID frameNumber;
266 } gStalledTransactionInfoClassInfo;
267
pickDataspaceFromColorMode(const ui::ColorMode colorMode)268 constexpr ui::Dataspace pickDataspaceFromColorMode(const ui::ColorMode colorMode) {
269 switch (colorMode) {
270 case ui::ColorMode::DISPLAY_P3:
271 case ui::ColorMode::BT2100_PQ:
272 case ui::ColorMode::BT2100_HLG:
273 case ui::ColorMode::DISPLAY_BT2020:
274 return ui::Dataspace::DISPLAY_P3;
275 default:
276 return ui::Dataspace::V0_SRGB;
277 }
278 }
279
280 class TransactionCommittedListenerWrapper {
281 public:
TransactionCommittedListenerWrapper(JNIEnv * env,jobject object)282 explicit TransactionCommittedListenerWrapper(JNIEnv* env, jobject object) {
283 env->GetJavaVM(&mVm);
284 mTransactionCommittedListenerObject = env->NewGlobalRef(object);
285 LOG_ALWAYS_FATAL_IF(!mTransactionCommittedListenerObject, "Failed to make global ref");
286 }
287
~TransactionCommittedListenerWrapper()288 ~TransactionCommittedListenerWrapper() {
289 getenv()->DeleteGlobalRef(mTransactionCommittedListenerObject);
290 }
291
callback()292 void callback() {
293 JNIEnv* env = getenv();
294 env->CallVoidMethod(mTransactionCommittedListenerObject,
295 gTransactionCommittedListenerClassInfo.onTransactionCommitted);
296 DieIfException(env, "Uncaught exception in TransactionCommittedListener.");
297 }
298
transactionCallbackThunk(void * context,nsecs_t,const sp<Fence> &,const std::vector<SurfaceControlStats> &)299 static void transactionCallbackThunk(void* context, nsecs_t /*latchTime*/,
300 const sp<Fence>& /*presentFence*/,
301 const std::vector<SurfaceControlStats>& /*stats*/) {
302 TransactionCommittedListenerWrapper* listener =
303 reinterpret_cast<TransactionCommittedListenerWrapper*>(context);
304 listener->callback();
305 delete listener;
306 }
307
308 private:
309 jobject mTransactionCommittedListenerObject;
310 JavaVM* mVm;
311
getenv()312 JNIEnv* getenv() {
313 JNIEnv* env;
314 mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
315 return env;
316 }
317 };
318
319 class WindowInfosReportedListenerWrapper : public gui::BnWindowInfosReportedListener {
320 public:
WindowInfosReportedListenerWrapper(JNIEnv * env,jobject listener)321 explicit WindowInfosReportedListenerWrapper(JNIEnv* env, jobject listener) {
322 env->GetJavaVM(&mVm);
323 mListener = env->NewGlobalRef(listener);
324 LOG_ALWAYS_FATAL_IF(!mListener, "Failed to make global ref");
325 }
326
~WindowInfosReportedListenerWrapper()327 ~WindowInfosReportedListenerWrapper() {
328 if (mListener) {
329 getenv()->DeleteGlobalRef(mListener);
330 mListener = nullptr;
331 }
332 }
333
onWindowInfosReported()334 binder::Status onWindowInfosReported() override {
335 JNIEnv* env = getenv();
336 env->CallVoidMethod(mListener, gRunnableClassInfo.run);
337 DieIfException(env, "Uncaught exception in WindowInfosReportedListener.");
338 return binder::Status::ok();
339 }
340
341 private:
342 jobject mListener;
343 JavaVM* mVm;
344
getenv()345 JNIEnv* getenv() {
346 JNIEnv* env;
347 mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
348 return env;
349 }
350 };
351
352 class TrustedPresentationCallbackWrapper {
353 public:
TrustedPresentationCallbackWrapper(JNIEnv * env,jobject trustedPresentationListener)354 explicit TrustedPresentationCallbackWrapper(JNIEnv* env, jobject trustedPresentationListener) {
355 env->GetJavaVM(&mVm);
356 mTrustedPresentationCallback = env->NewGlobalRef(trustedPresentationListener);
357 LOG_ALWAYS_FATAL_IF(!mTrustedPresentationCallback, "Failed to make global ref");
358 }
359
~TrustedPresentationCallbackWrapper()360 ~TrustedPresentationCallbackWrapper() {
361 getenv()->DeleteGlobalRef(mTrustedPresentationCallback);
362 }
363
onTrustedPresentationChanged(bool inTrustedPresentationState)364 void onTrustedPresentationChanged(bool inTrustedPresentationState) {
365 JNIEnv* env = getenv();
366 env->CallVoidMethod(mTrustedPresentationCallback,
367 gTrustedPresentationCallbackClassInfo.onTrustedPresentationChanged,
368 inTrustedPresentationState);
369 DieIfException(env, "Uncaught exception in TrustedPresentationCallback.");
370 }
371
addCallbackRef(const sp<SurfaceComposerClient::PresentationCallbackRAII> & callbackRef)372 void addCallbackRef(const sp<SurfaceComposerClient::PresentationCallbackRAII>& callbackRef) {
373 mCallbackRef = callbackRef;
374 }
375
onTrustedPresentationChangedThunk(void * context,bool inTrustedPresentationState)376 static void onTrustedPresentationChangedThunk(void* context, bool inTrustedPresentationState) {
377 TrustedPresentationCallbackWrapper* listener =
378 reinterpret_cast<TrustedPresentationCallbackWrapper*>(context);
379 listener->onTrustedPresentationChanged(inTrustedPresentationState);
380 }
381
382 private:
383 jobject mTrustedPresentationCallback;
384 JavaVM* mVm;
385 sp<SurfaceComposerClient::PresentationCallbackRAII> mCallbackRef;
386
getenv()387 JNIEnv* getenv() {
388 JNIEnv* env;
389 mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
390 return env;
391 }
392 };
393
394 // ----------------------------------------------------------------------------
395
nativeCreateTransaction(JNIEnv * env,jclass clazz)396 static jlong nativeCreateTransaction(JNIEnv* env, jclass clazz) {
397 return reinterpret_cast<jlong>(new SurfaceComposerClient::Transaction);
398 }
399
releaseTransaction(SurfaceComposerClient::Transaction * t)400 static void releaseTransaction(SurfaceComposerClient::Transaction* t) {
401 delete t;
402 }
403
nativeGetNativeTransactionFinalizer(JNIEnv * env,jclass clazz)404 static jlong nativeGetNativeTransactionFinalizer(JNIEnv* env, jclass clazz) {
405 return static_cast<jlong>(reinterpret_cast<uintptr_t>(&releaseTransaction));
406 }
407
nativeCreate(JNIEnv * env,jclass clazz,jobject sessionObj,jstring nameStr,jint w,jint h,jint format,jint flags,jlong parentObject,jobject metadataParcel)408 static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,
409 jstring nameStr, jint w, jint h, jint format, jint flags, jlong parentObject,
410 jobject metadataParcel) {
411 ScopedUtfChars name(env, nameStr);
412 sp<SurfaceComposerClient> client;
413 if (sessionObj != NULL) {
414 client = android_view_SurfaceSession_getClient(env, sessionObj);
415 } else {
416 client = SurfaceComposerClient::getDefault();
417 }
418 SurfaceControl *parent = reinterpret_cast<SurfaceControl*>(parentObject);
419 sp<SurfaceControl> surface;
420 LayerMetadata metadata;
421 Parcel* parcel = parcelForJavaObject(env, metadataParcel);
422 if (parcel && !parcel->objectsCount()) {
423 status_t err = metadata.readFromParcel(parcel);
424 if (err != NO_ERROR) {
425 jniThrowException(env, "java/lang/IllegalArgumentException",
426 "Metadata parcel has wrong format");
427 }
428 }
429
430 sp<IBinder> parentHandle;
431 if (parent != nullptr) {
432 parentHandle = parent->getHandle();
433 }
434
435 status_t err = client->createSurfaceChecked(String8(name.c_str()), w, h, format, &surface,
436 flags, parentHandle, std::move(metadata));
437 if (err == NAME_NOT_FOUND) {
438 jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
439 return 0;
440 } else if (err != NO_ERROR) {
441 jniThrowException(env, OutOfResourcesException, statusToString(err).c_str());
442 return 0;
443 }
444
445 surface->incStrong((void *)nativeCreate);
446 return reinterpret_cast<jlong>(surface.get());
447 }
448
release(SurfaceControl * ctrl)449 static void release(SurfaceControl* ctrl) {
450 ctrl->decStrong((void *)nativeCreate);
451 }
452
nativeGetNativeSurfaceControlFinalizer(JNIEnv * env,jclass clazz)453 static jlong nativeGetNativeSurfaceControlFinalizer(JNIEnv* env, jclass clazz) {
454 return static_cast<jlong>(reinterpret_cast<uintptr_t>(&release));
455 }
456
nativeDisconnect(JNIEnv * env,jclass clazz,jlong nativeObject)457 static void nativeDisconnect(JNIEnv* env, jclass clazz, jlong nativeObject) {
458 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
459 if (ctrl != NULL) {
460 ctrl->disconnect();
461 }
462 }
463
nativeSetDefaultBufferSize(JNIEnv * env,jclass clazz,jlong nativeObject,jint width,jint height)464 static void nativeSetDefaultBufferSize(JNIEnv* env, jclass clazz, jlong nativeObject,
465 jint width, jint height) {
466 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
467 if (ctrl != NULL) {
468 ctrl->updateDefaultBufferSize(width, height);
469 }
470 }
471
nativeApplyTransaction(JNIEnv * env,jclass clazz,jlong transactionObj,jboolean sync)472 static void nativeApplyTransaction(JNIEnv* env, jclass clazz, jlong transactionObj, jboolean sync) {
473 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
474 transaction->apply(sync);
475 }
476
nativeMergeTransaction(JNIEnv * env,jclass clazz,jlong transactionObj,jlong otherTransactionObj)477 static void nativeMergeTransaction(JNIEnv* env, jclass clazz,
478 jlong transactionObj, jlong otherTransactionObj) {
479 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
480 auto otherTransaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(
481 otherTransactionObj);
482 transaction->merge(std::move(*otherTransaction));
483 }
484
nativeSetAnimationTransaction(JNIEnv * env,jclass clazz,jlong transactionObj)485 static void nativeSetAnimationTransaction(JNIEnv* env, jclass clazz, jlong transactionObj) {
486 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
487 transaction->setAnimationTransaction();
488 }
489
nativeSetEarlyWakeupStart(JNIEnv * env,jclass clazz,jlong transactionObj)490 static void nativeSetEarlyWakeupStart(JNIEnv* env, jclass clazz, jlong transactionObj) {
491 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
492 transaction->setEarlyWakeupStart();
493 }
494
nativeSetEarlyWakeupEnd(JNIEnv * env,jclass clazz,jlong transactionObj)495 static void nativeSetEarlyWakeupEnd(JNIEnv* env, jclass clazz, jlong transactionObj) {
496 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
497 transaction->setEarlyWakeupEnd();
498 }
499
nativeGetTransactionId(JNIEnv * env,jclass clazz,jlong transactionObj)500 static jlong nativeGetTransactionId(JNIEnv* env, jclass clazz, jlong transactionObj) {
501 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
502 return transaction->getId();
503 }
504
nativeSetLayer(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint zorder)505 static void nativeSetLayer(JNIEnv* env, jclass clazz, jlong transactionObj,
506 jlong nativeObject, jint zorder) {
507 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
508
509 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
510 transaction->setLayer(ctrl, zorder);
511 }
512
nativeSetRelativeLayer(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jlong relativeToObject,jint zorder)513 static void nativeSetRelativeLayer(JNIEnv* env, jclass clazz, jlong transactionObj,
514 jlong nativeObject,
515 jlong relativeToObject, jint zorder) {
516
517 auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
518 auto relative = reinterpret_cast<SurfaceControl *>(relativeToObject);
519 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
520 transaction->setRelativeLayer(ctrl, relative, zorder);
521 }
522
nativeSetPosition(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat x,jfloat y)523 static void nativeSetPosition(JNIEnv* env, jclass clazz, jlong transactionObj,
524 jlong nativeObject, jfloat x, jfloat y) {
525 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
526
527 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
528 transaction->setPosition(ctrl, x, y);
529 }
530
nativeSetScale(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat xScale,jfloat yScale)531 static void nativeSetScale(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
532 jfloat xScale, jfloat yScale) {
533 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
534
535 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
536 transaction->setMatrix(ctrl, xScale, 0, 0, yScale);
537 }
538
nativeSetGeometry(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject sourceObj,jobject dstObj,jlong orientation)539 static void nativeSetGeometry(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
540 jobject sourceObj, jobject dstObj, jlong orientation) {
541 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
542 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
543
544 Rect source, dst;
545 if (sourceObj != NULL) {
546 source = JNICommon::rectFromObj(env, sourceObj);
547 } else {
548 source.makeInvalid();
549 }
550 if (dstObj != NULL) {
551 dst = JNICommon::rectFromObj(env, dstObj);
552 } else {
553 dst.makeInvalid();
554 }
555 transaction->setGeometry(ctrl, source, dst, orientation);
556 }
557
558 class JGlobalRefHolder {
559 public:
JGlobalRefHolder(JavaVM * vm,jobject object)560 JGlobalRefHolder(JavaVM* vm, jobject object) : mVm(vm), mObject(object) {}
561
~JGlobalRefHolder()562 virtual ~JGlobalRefHolder() {
563 env()->DeleteGlobalRef(mObject);
564 mObject = nullptr;
565 }
566
object()567 jobject object() { return mObject; }
vm()568 JavaVM* vm() { return mVm; }
569
env()570 JNIEnv* env() {
571 JNIEnv* env = nullptr;
572 if (mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
573 if (mVm->AttachCurrentThreadAsDaemon(&env, nullptr) != JNI_OK) {
574 LOG_ALWAYS_FATAL("Failed to AttachCurrentThread!");
575 }
576 }
577 return env;
578 }
579
580 private:
581 JGlobalRefHolder(const JGlobalRefHolder&) = delete;
582 void operator=(const JGlobalRefHolder&) = delete;
583
584 JavaVM* mVm;
585 jobject mObject;
586 };
587
genReleaseCallback(JNIEnv * env,jobject releaseCallback)588 static ReleaseBufferCallback genReleaseCallback(JNIEnv* env, jobject releaseCallback) {
589 if (releaseCallback == nullptr) return nullptr;
590
591 JavaVM* vm = nullptr;
592 LOG_ALWAYS_FATAL_IF(env->GetJavaVM(&vm) != JNI_OK, "Unable to get Java VM");
593 auto globalCallbackRef =
594 std::make_shared<JGlobalRefHolder>(vm, env->NewGlobalRef(releaseCallback));
595 return [globalCallbackRef](const ReleaseCallbackId&, const sp<Fence>& releaseFence,
596 std::optional<uint32_t> currentMaxAcquiredBufferCount) {
597 Fence* fenceCopy = releaseFence.get();
598 // We need to grab an extra ref as Java's SyncFence takes ownership
599 if (fenceCopy) {
600 fenceCopy->incStrong(0);
601 }
602 globalCallbackRef->env()
603 ->CallStaticVoidMethod(gSurfaceControlClassInfo.clazz,
604 gSurfaceControlClassInfo.invokeReleaseCallback,
605 globalCallbackRef->object(),
606 reinterpret_cast<jlong>(fenceCopy));
607 };
608 }
609
nativeSetBuffer(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject bufferObject,jlong fencePtr,jobject releaseCallback)610 static void nativeSetBuffer(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
611 jobject bufferObject, jlong fencePtr, jobject releaseCallback) {
612 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
613 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
614 sp<GraphicBuffer> graphicBuffer;
615 if (bufferObject != nullptr) {
616 graphicBuffer = GraphicBuffer::fromAHardwareBuffer(
617 android_hardware_HardwareBuffer_getNativeHardwareBuffer(env, bufferObject));
618 }
619 std::optional<sp<Fence>> optFence = std::nullopt;
620 if (fencePtr != 0) {
621 optFence = sp<Fence>{reinterpret_cast<Fence*>(fencePtr)};
622 }
623 transaction->setBuffer(ctrl, graphicBuffer, optFence, std::nullopt, 0 /* producerId */,
624 genReleaseCallback(env, releaseCallback));
625 }
626
nativeUnsetBuffer(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject)627 static void nativeUnsetBuffer(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject) {
628 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
629 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
630 transaction->unsetBuffer(ctrl);
631 }
632
nativeSetBufferTransform(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint transform)633 static void nativeSetBufferTransform(JNIEnv* env, jclass clazz, jlong transactionObj,
634 jlong nativeObject, jint transform) {
635 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
636 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
637 transaction->setTransform(ctrl, transform);
638 bool transformToInverseDisplay = (NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY & transform) ==
639 NATIVE_WINDOW_TRANSFORM_INVERSE_DISPLAY;
640 transaction->setTransformToDisplayInverse(ctrl, transformToInverseDisplay);
641 }
642
nativeSetDataSpace(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint dataSpace)643 static void nativeSetDataSpace(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
644 jint dataSpace) {
645 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
646 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
647 ui::Dataspace dataspace = static_cast<ui::Dataspace>(dataSpace);
648 transaction->setDataspace(ctrl, dataspace);
649 }
650
nativeSetExtendedRangeBrightness(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,float currentBufferRatio,float desiredRatio)651 static void nativeSetExtendedRangeBrightness(JNIEnv* env, jclass clazz, jlong transactionObj,
652 jlong nativeObject, float currentBufferRatio,
653 float desiredRatio) {
654 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
655 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
656 transaction->setExtendedRangeBrightness(ctrl, currentBufferRatio, desiredRatio);
657 }
658
nativeSetCachingHint(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint cachingHint)659 static void nativeSetCachingHint(JNIEnv* env, jclass clazz, jlong transactionObj,
660 jlong nativeObject, jint cachingHint) {
661 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
662 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
663 transaction->setCachingHint(ctrl, static_cast<gui::CachingHint>(cachingHint));
664 }
665
nativeSetBlurRegions(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobjectArray regions,jint regionsLength)666 static void nativeSetBlurRegions(JNIEnv* env, jclass clazz, jlong transactionObj,
667 jlong nativeObject, jobjectArray regions, jint regionsLength) {
668 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
669 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
670
671 std::vector<BlurRegion> blurRegionVector;
672 const int size = regionsLength;
673 float region[10];
674 for (int i = 0; i < size; i++) {
675 jfloatArray regionArray = (jfloatArray)env->GetObjectArrayElement(regions, i);
676 env->GetFloatArrayRegion(regionArray, 0, 10, region);
677 float blurRadius = region[0];
678 float alpha = region[1];
679 float left = region[2];
680 float top = region[3];
681 float right = region[4];
682 float bottom = region[5];
683 float cornerRadiusTL = region[6];
684 float cornerRadiusTR = region[7];
685 float cornerRadiusBL = region[8];
686 float cornerRadiusBR = region[9];
687
688 blurRegionVector.push_back(BlurRegion{.blurRadius = static_cast<uint32_t>(blurRadius),
689 .cornerRadiusTL = cornerRadiusTL,
690 .cornerRadiusTR = cornerRadiusTR,
691 .cornerRadiusBL = cornerRadiusBL,
692 .cornerRadiusBR = cornerRadiusBR,
693 .alpha = alpha,
694 .left = static_cast<int>(left),
695 .top = static_cast<int>(top),
696 .right = static_cast<int>(right),
697 .bottom = static_cast<int>(bottom)});
698 }
699
700 transaction->setBlurRegions(ctrl, blurRegionVector);
701 }
702
nativeSetStretchEffect(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat width,jfloat height,jfloat vecX,jfloat vecY,jfloat maxStretchAmountX,jfloat maxStretchAmountY,jfloat childRelativeLeft,jfloat childRelativeTop,jfloat childRelativeRight,jfloat childRelativeBottom)703 static void nativeSetStretchEffect(JNIEnv* env, jclass clazz, jlong transactionObj,
704 jlong nativeObject, jfloat width, jfloat height,
705 jfloat vecX, jfloat vecY,
706 jfloat maxStretchAmountX, jfloat maxStretchAmountY,
707 jfloat childRelativeLeft, jfloat childRelativeTop,
708 jfloat childRelativeRight, jfloat childRelativeBottom) {
709 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
710 auto* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
711 auto stretch = StretchEffect{
712 .width = width,
713 .height = height,
714 .vectorX = vecX,
715 .vectorY = vecY,
716 .maxAmountX = maxStretchAmountX,
717 .maxAmountY = maxStretchAmountY,
718 .mappedChildBounds = FloatRect(
719 childRelativeLeft, childRelativeTop, childRelativeRight, childRelativeBottom)
720 };
721 transaction->setStretchEffect(ctrl, stretch);
722 }
723
nativeSetFlags(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint flags,jint mask)724 static void nativeSetFlags(JNIEnv* env, jclass clazz, jlong transactionObj,
725 jlong nativeObject, jint flags, jint mask) {
726 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
727
728 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
729 transaction->setFlags(ctrl, flags, mask);
730 }
731
nativeSetFrameRateSelectionPriority(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint priority)732 static void nativeSetFrameRateSelectionPriority(JNIEnv* env, jclass clazz, jlong transactionObj,
733 jlong nativeObject, jint priority) {
734 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
735
736 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
737 transaction->setFrameRateSelectionPriority(ctrl, priority);
738 }
739
nativeSetTransparentRegionHint(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject regionObj)740 static void nativeSetTransparentRegionHint(JNIEnv* env, jclass clazz, jlong transactionObj,
741 jlong nativeObject, jobject regionObj) {
742 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
743 graphics::RegionIterator iterator(env, regionObj);
744 if (!iterator.isValid()) {
745 doThrowIAE(env);
746 return;
747 }
748
749 ARect bounds = iterator.getTotalBounds();
750 Region reg({bounds.left, bounds.top, bounds.right, bounds.bottom});
751 if (iterator.isComplex()) {
752 while (!iterator.isDone()) {
753 ARect rect = iterator.getRect();
754 reg.addRectUnchecked(rect.left, rect.top, rect.right, rect.bottom);
755 iterator.next();
756 }
757 }
758
759 {
760 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
761 transaction->setTransparentRegionHint(ctrl, reg);
762 }
763 }
764
nativeSetDamageRegion(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject regionObj)765 static void nativeSetDamageRegion(JNIEnv* env, jclass clazz, jlong transactionObj,
766 jlong nativeObject, jobject regionObj) {
767 SurfaceControl* const surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
768 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
769
770 if (regionObj == nullptr) {
771 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
772 return;
773 }
774
775 graphics::RegionIterator iterator(env, regionObj);
776 if (!iterator.isValid()) {
777 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
778 return;
779 }
780
781 Region region;
782 while (!iterator.isDone()) {
783 ARect rect = iterator.getRect();
784 region.orSelf(static_cast<const Rect&>(rect));
785 iterator.next();
786 }
787
788 if (region.getBounds().isEmpty()) {
789 transaction->setSurfaceDamageRegion(surfaceControl, Region::INVALID_REGION);
790 return;
791 }
792
793 transaction->setSurfaceDamageRegion(surfaceControl, region);
794 }
795
nativeSetDimmingEnabled(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jboolean dimmingEnabled)796 static void nativeSetDimmingEnabled(JNIEnv* env, jclass clazz, jlong transactionObj,
797 jlong nativeObject, jboolean dimmingEnabled) {
798 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
799
800 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
801 transaction->setDimmingEnabled(ctrl, dimmingEnabled);
802 }
803
nativeSetAlpha(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat alpha)804 static void nativeSetAlpha(JNIEnv* env, jclass clazz, jlong transactionObj,
805 jlong nativeObject, jfloat alpha) {
806 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
807
808 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
809 transaction->setAlpha(ctrl, alpha);
810 }
811
nativeSetInputWindowInfo(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jobject inputWindow)812 static void nativeSetInputWindowInfo(JNIEnv* env, jclass clazz, jlong transactionObj,
813 jlong nativeObject, jobject inputWindow) {
814 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
815
816 sp<NativeInputWindowHandle> handle = android_view_InputWindowHandle_getHandle(
817 env, inputWindow);
818 handle->updateInfo();
819
820 auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
821 transaction->setInputWindowInfo(ctrl, *handle->getInfo());
822 }
823
nativeAddWindowInfosReportedListener(JNIEnv * env,jclass clazz,jlong transactionObj,jobject runnable)824 static void nativeAddWindowInfosReportedListener(JNIEnv* env, jclass clazz, jlong transactionObj,
825 jobject runnable) {
826 auto listener = sp<WindowInfosReportedListenerWrapper>::make(env, runnable);
827 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
828 transaction->addWindowInfosReportedListener(listener);
829 }
830
nativeSetMetadata(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint id,jobject parcelObj)831 static void nativeSetMetadata(JNIEnv* env, jclass clazz, jlong transactionObj,
832 jlong nativeObject, jint id, jobject parcelObj) {
833 Parcel* parcel = parcelForJavaObject(env, parcelObj);
834 if (!parcel) {
835 jniThrowNullPointerException(env, "attribute data");
836 return;
837 }
838 if (parcel->objectsCount()) {
839 jniThrowException(env, "java/lang/RuntimeException",
840 "Tried to marshall a Parcel that contained Binder objects.");
841 return;
842 }
843
844 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
845
846 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
847 transaction->setMetadata(ctrl, id, *parcel);
848 }
849
nativeSetColor(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloatArray fColor)850 static void nativeSetColor(JNIEnv* env, jclass clazz, jlong transactionObj,
851 jlong nativeObject, jfloatArray fColor) {
852 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
853 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
854
855 float* floatColors = env->GetFloatArrayElements(fColor, 0);
856 half3 color(floatColors[0], floatColors[1], floatColors[2]);
857 transaction->setColor(ctrl, color);
858 env->ReleaseFloatArrayElements(fColor, floatColors, 0);
859 }
860
nativeSetMatrix(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat dsdx,jfloat dtdx,jfloat dtdy,jfloat dsdy)861 static void nativeSetMatrix(JNIEnv* env, jclass clazz, jlong transactionObj,
862 jlong nativeObject,
863 jfloat dsdx, jfloat dtdx, jfloat dtdy, jfloat dsdy) {
864 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
865
866 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
867 transaction->setMatrix(ctrl, dsdx, dtdx, dtdy, dsdy);
868 }
869
nativeSetColorTransform(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloatArray fMatrix,jfloatArray fTranslation)870 static void nativeSetColorTransform(JNIEnv* env, jclass clazz, jlong transactionObj,
871 jlong nativeObject, jfloatArray fMatrix, jfloatArray fTranslation) {
872 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
873 SurfaceControl* const surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
874 float* floatMatrix = env->GetFloatArrayElements(fMatrix, 0);
875 mat3 matrix(static_cast<float const*>(floatMatrix));
876 env->ReleaseFloatArrayElements(fMatrix, floatMatrix, 0);
877
878 float* floatTranslation = env->GetFloatArrayElements(fTranslation, 0);
879 vec3 translation(floatTranslation[0], floatTranslation[1], floatTranslation[2]);
880 env->ReleaseFloatArrayElements(fTranslation, floatTranslation, 0);
881
882 transaction->setColorTransform(surfaceControl, matrix, translation);
883 }
884
nativeSetColorSpaceAgnostic(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jboolean agnostic)885 static void nativeSetColorSpaceAgnostic(JNIEnv* env, jclass clazz, jlong transactionObj,
886 jlong nativeObject, jboolean agnostic) {
887 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
888 SurfaceControl* const surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
889 transaction->setColorSpaceAgnostic(surfaceControl, agnostic);
890 }
891
nativeSetWindowCrop(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint l,jint t,jint r,jint b)892 static void nativeSetWindowCrop(JNIEnv* env, jclass clazz, jlong transactionObj,
893 jlong nativeObject,
894 jint l, jint t, jint r, jint b) {
895 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
896
897 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
898 Rect crop(l, t, r, b);
899 transaction->setCrop(ctrl, crop);
900 }
901
nativeSetCornerRadius(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat cornerRadius)902 static void nativeSetCornerRadius(JNIEnv* env, jclass clazz, jlong transactionObj,
903 jlong nativeObject, jfloat cornerRadius) {
904 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
905
906 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
907 transaction->setCornerRadius(ctrl, cornerRadius);
908 }
909
nativeSetBackgroundBlurRadius(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint blurRadius)910 static void nativeSetBackgroundBlurRadius(JNIEnv* env, jclass clazz, jlong transactionObj,
911 jlong nativeObject, jint blurRadius) {
912 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
913
914 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
915 transaction->setBackgroundBlurRadius(ctrl, blurRadius);
916 }
917
nativeSetLayerStack(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint layerStack)918 static void nativeSetLayerStack(JNIEnv* env, jclass clazz, jlong transactionObj,
919 jlong nativeObject, jint layerStack) {
920 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
921
922 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
923 transaction->setLayerStack(ctrl, ui::LayerStack::fromValue(layerStack));
924 }
925
nativeSetShadowRadius(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat shadowRadius)926 static void nativeSetShadowRadius(JNIEnv* env, jclass clazz, jlong transactionObj,
927 jlong nativeObject, jfloat shadowRadius) {
928 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
929
930 const auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
931 transaction->setShadowRadius(ctrl, shadowRadius);
932 }
933
nativeSetTrustedOverlay(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jboolean isTrustedOverlay)934 static void nativeSetTrustedOverlay(JNIEnv* env, jclass clazz, jlong transactionObj,
935 jlong nativeObject, jboolean isTrustedOverlay) {
936 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
937
938 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
939 transaction->setTrustedOverlay(ctrl, isTrustedOverlay);
940 }
941
nativeSetFrameRate(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jfloat frameRate,jint compatibility,jint changeFrameRateStrategy)942 static void nativeSetFrameRate(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject,
943 jfloat frameRate, jint compatibility, jint changeFrameRateStrategy) {
944 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
945
946 const auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
947 // Our compatibility is a Surface.FRAME_RATE_COMPATIBILITY_* value, and
948 // Transaction::setFrameRate() takes an ANATIVEWINDOW_FRAME_RATE_COMPATIBILITY_* value. The
949 // values are identical though, so no need to convert anything.
950 transaction->setFrameRate(ctrl, frameRate, static_cast<int8_t>(compatibility),
951 static_cast<int8_t>(changeFrameRateStrategy));
952 }
953
nativeSetDefaultFrameRateCompatibility(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint compatibility)954 static void nativeSetDefaultFrameRateCompatibility(JNIEnv* env, jclass clazz, jlong transactionObj,
955 jlong nativeObject, jint compatibility) {
956 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
957
958 const auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
959
960 transaction->setDefaultFrameRateCompatibility(ctrl, static_cast<int8_t>(compatibility));
961 }
962
nativeSetFixedTransformHint(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint transformHint)963 static void nativeSetFixedTransformHint(JNIEnv* env, jclass clazz, jlong transactionObj,
964 jlong nativeObject, jint transformHint) {
965 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
966
967 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
968 transaction->setFixedTransformHint(ctrl, transformHint);
969 }
970
nativeSetDropInputMode(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint mode)971 static void nativeSetDropInputMode(JNIEnv* env, jclass clazz, jlong transactionObj,
972 jlong nativeObject, jint mode) {
973 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
974 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
975 transaction->setDropInputMode(ctrl, static_cast<gui::DropInputMode>(mode));
976 }
977
nativeSurfaceFlushJankData(JNIEnv * env,jclass clazz,jlong nativeObject)978 static void nativeSurfaceFlushJankData(JNIEnv* env, jclass clazz, jlong nativeObject) {
979 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
980 SurfaceComposerClient::Transaction::sendSurfaceFlushJankDataTransaction(ctrl);
981 }
982
nativeSanitize(JNIEnv * env,jclass clazz,jlong transactionObj,jint pid,jint uid)983 static void nativeSanitize(JNIEnv* env, jclass clazz, jlong transactionObj, jint pid, jint uid) {
984 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
985 transaction->sanitize(pid, uid);
986 }
987
nativeSetDestinationFrame(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jint l,jint t,jint r,jint b)988 static void nativeSetDestinationFrame(JNIEnv* env, jclass clazz, jlong transactionObj,
989 jlong nativeObject, jint l, jint t, jint r, jint b) {
990 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
991 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
992 Rect crop(l, t, r, b);
993 transaction->setDestinationFrame(ctrl, crop);
994 }
995
nativeGetDisplayedContentSamplingAttributes(JNIEnv * env,jclass clazz,jobject tokenObj)996 static jobject nativeGetDisplayedContentSamplingAttributes(JNIEnv* env, jclass clazz,
997 jobject tokenObj) {
998 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
999
1000 ui::PixelFormat format;
1001 ui::Dataspace dataspace;
1002 uint8_t componentMask;
1003 status_t err = SurfaceComposerClient::getDisplayedContentSamplingAttributes(
1004 token, &format, &dataspace, &componentMask);
1005 if (err != OK) {
1006 return nullptr;
1007 }
1008 return env->NewObject(gDisplayedContentSamplingAttributesClassInfo.clazz,
1009 gDisplayedContentSamplingAttributesClassInfo.ctor,
1010 format, dataspace, componentMask);
1011 }
1012
nativeSetDisplayedContentSamplingEnabled(JNIEnv * env,jclass clazz,jobject tokenObj,jboolean enable,jint componentMask,jint maxFrames)1013 static jboolean nativeSetDisplayedContentSamplingEnabled(JNIEnv* env, jclass clazz,
1014 jobject tokenObj, jboolean enable, jint componentMask, jint maxFrames) {
1015 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1016 status_t rc = SurfaceComposerClient::setDisplayContentSamplingEnabled(
1017 token, enable, componentMask, maxFrames);
1018 return rc == OK;
1019 }
1020
nativeGetDisplayedContentSample(JNIEnv * env,jclass clazz,jobject tokenObj,jlong maxFrames,jlong timestamp)1021 static jobject nativeGetDisplayedContentSample(JNIEnv* env, jclass clazz, jobject tokenObj,
1022 jlong maxFrames, jlong timestamp) {
1023 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1024
1025 DisplayedFrameStats stats;
1026 status_t err = SurfaceComposerClient::getDisplayedContentSample(
1027 token, maxFrames, timestamp, &stats);
1028 if (err != OK) {
1029 return nullptr;
1030 }
1031
1032 jlongArray histogramComponent0 = env->NewLongArray(stats.component_0_sample.size());
1033 jlongArray histogramComponent1 = env->NewLongArray(stats.component_1_sample.size());
1034 jlongArray histogramComponent2 = env->NewLongArray(stats.component_2_sample.size());
1035 jlongArray histogramComponent3 = env->NewLongArray(stats.component_3_sample.size());
1036 if ((histogramComponent0 == nullptr) ||
1037 (histogramComponent1 == nullptr) ||
1038 (histogramComponent2 == nullptr) ||
1039 (histogramComponent3 == nullptr)) {
1040 return JNI_FALSE;
1041 }
1042
1043 env->SetLongArrayRegion(histogramComponent0, 0,
1044 stats.component_0_sample.size(),
1045 reinterpret_cast<jlong*>(stats.component_0_sample.data()));
1046 env->SetLongArrayRegion(histogramComponent1, 0,
1047 stats.component_1_sample.size(),
1048 reinterpret_cast<jlong*>(stats.component_1_sample.data()));
1049 env->SetLongArrayRegion(histogramComponent2, 0,
1050 stats.component_2_sample.size(),
1051 reinterpret_cast<jlong*>(stats.component_2_sample.data()));
1052 env->SetLongArrayRegion(histogramComponent3, 0,
1053 stats.component_3_sample.size(),
1054 reinterpret_cast<jlong*>(stats.component_3_sample.data()));
1055 return env->NewObject(gDisplayedContentSampleClassInfo.clazz,
1056 gDisplayedContentSampleClassInfo.ctor,
1057 stats.numFrames,
1058 histogramComponent0,
1059 histogramComponent1,
1060 histogramComponent2,
1061 histogramComponent3);
1062 }
1063
nativeSetDisplaySurface(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jlong nativeSurfaceObject)1064 static void nativeSetDisplaySurface(JNIEnv* env, jclass clazz,
1065 jlong transactionObj,
1066 jobject tokenObj, jlong nativeSurfaceObject) {
1067 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1068 if (token == NULL) return;
1069 sp<IGraphicBufferProducer> bufferProducer;
1070 sp<Surface> sur(reinterpret_cast<Surface *>(nativeSurfaceObject));
1071 if (sur != NULL) {
1072 bufferProducer = sur->getIGraphicBufferProducer();
1073 }
1074
1075
1076 status_t err = NO_ERROR;
1077 {
1078 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1079 err = transaction->setDisplaySurface(token,
1080 bufferProducer);
1081 }
1082 if (err != NO_ERROR) {
1083 doThrowIAE(env, "Illegal Surface, could not enable async mode. Was this"
1084 " Surface created with singleBufferMode?");
1085 }
1086 }
1087
nativeSetDisplayLayerStack(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jint layerStack)1088 static void nativeSetDisplayLayerStack(JNIEnv* env, jclass clazz,
1089 jlong transactionObj,
1090 jobject tokenObj, jint layerStack) {
1091
1092 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1093 if (token == NULL) return;
1094
1095 {
1096 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1097 transaction->setDisplayLayerStack(token, ui::LayerStack::fromValue(layerStack));
1098 }
1099 }
1100
nativeSetDisplayFlags(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jint flags)1101 static void nativeSetDisplayFlags(JNIEnv* env, jclass clazz, jlong transactionObj, jobject tokenObj,
1102 jint flags) {
1103 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1104 if (token == NULL) return;
1105
1106 {
1107 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1108 transaction->setDisplayFlags(token, flags);
1109 }
1110 }
1111
nativeSetDisplayProjection(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jint orientation,jint layerStackRect_left,jint layerStackRect_top,jint layerStackRect_right,jint layerStackRect_bottom,jint displayRect_left,jint displayRect_top,jint displayRect_right,jint displayRect_bottom)1112 static void nativeSetDisplayProjection(JNIEnv* env, jclass clazz,
1113 jlong transactionObj,
1114 jobject tokenObj, jint orientation,
1115 jint layerStackRect_left, jint layerStackRect_top, jint layerStackRect_right, jint layerStackRect_bottom,
1116 jint displayRect_left, jint displayRect_top, jint displayRect_right, jint displayRect_bottom) {
1117 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1118 if (token == NULL) return;
1119 Rect layerStackRect(layerStackRect_left, layerStackRect_top, layerStackRect_right, layerStackRect_bottom);
1120 Rect displayRect(displayRect_left, displayRect_top, displayRect_right, displayRect_bottom);
1121
1122 {
1123 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1124 transaction->setDisplayProjection(token, static_cast<ui::Rotation>(orientation),
1125 layerStackRect, displayRect);
1126 }
1127 }
1128
nativeSetDisplaySize(JNIEnv * env,jclass clazz,jlong transactionObj,jobject tokenObj,jint width,jint height)1129 static void nativeSetDisplaySize(JNIEnv* env, jclass clazz,
1130 jlong transactionObj,
1131 jobject tokenObj, jint width, jint height) {
1132 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1133 if (token == NULL) return;
1134
1135 {
1136 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1137 transaction->setDisplaySize(token, width, height);
1138 }
1139 }
1140
convertDeviceProductInfoToJavaObject(JNIEnv * env,const std::optional<DeviceProductInfo> & info)1141 static jobject convertDeviceProductInfoToJavaObject(
1142 JNIEnv* env, const std::optional<DeviceProductInfo>& info) {
1143 using ModelYear = android::DeviceProductInfo::ModelYear;
1144 using ManufactureYear = android::DeviceProductInfo::ManufactureYear;
1145 using ManufactureWeekAndYear = android::DeviceProductInfo::ManufactureWeekAndYear;
1146
1147 if (!info) return nullptr;
1148 jstring name = env->NewStringUTF(info->name.data());
1149 jstring manufacturerPnpId = env->NewStringUTF(info->manufacturerPnpId.data());
1150 jobject productId = env->NewStringUTF(info->productId.data());
1151 const auto& date = info->manufactureOrModelDate;
1152 jobject modelYear, manufactureDate;
1153 if (const auto* model = std::get_if<ModelYear>(&date)) {
1154 modelYear = toInteger(env, model->year);
1155 manufactureDate = nullptr;
1156 } else if (const auto* manufactureWeekAndYear = std::get_if<ManufactureWeekAndYear>(&date)) {
1157 modelYear = nullptr;
1158 manufactureDate = env->NewObject(gDeviceProductInfoManufactureDateClassInfo.clazz,
1159 gDeviceProductInfoManufactureDateClassInfo.ctor,
1160 toInteger(env, manufactureWeekAndYear->week),
1161 toInteger(env, manufactureWeekAndYear->year));
1162 } else if (const auto* manufactureYear = std::get_if<ManufactureYear>(&date)) {
1163 modelYear = nullptr;
1164 manufactureDate = env->NewObject(gDeviceProductInfoManufactureDateClassInfo.clazz,
1165 gDeviceProductInfoManufactureDateClassInfo.ctor,
1166 nullptr,
1167 toInteger(env, manufactureYear->year));
1168 } else {
1169 LOG_FATAL("Unknown alternative for variant DeviceProductInfo::ManufactureOrModelDate");
1170 }
1171 jint connectionToSinkType;
1172 // Relative address maps to HDMI physical address. All addresses are 4 digits long allowing
1173 // for a 5–device-deep hierarchy. For more information, refer:
1174 // Section 8.7 - Physical Address of HDMI Specification Version 1.3a
1175 using android::hardware::display::IDeviceProductInfoConstants;
1176 if (info->relativeAddress.size() != 4) {
1177 connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_UNKNOWN;
1178 } else if (info->relativeAddress[0] == 0) {
1179 connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_BUILT_IN;
1180 } else if (info->relativeAddress[1] == 0) {
1181 connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_DIRECT;
1182 } else {
1183 connectionToSinkType = IDeviceProductInfoConstants::CONNECTION_TO_SINK_TRANSITIVE;
1184 }
1185
1186 return env->NewObject(gDeviceProductInfoClassInfo.clazz, gDeviceProductInfoClassInfo.ctor, name,
1187 manufacturerPnpId, productId, modelYear, manufactureDate,
1188 connectionToSinkType);
1189 }
1190
nativeGetStaticDisplayInfo(JNIEnv * env,jclass clazz,jlong id)1191 static jobject nativeGetStaticDisplayInfo(JNIEnv* env, jclass clazz, jlong id) {
1192 ui::StaticDisplayInfo info;
1193 if (SurfaceComposerClient::getStaticDisplayInfo(id, &info) != NO_ERROR) {
1194 return nullptr;
1195 }
1196
1197 jobject object =
1198 env->NewObject(gStaticDisplayInfoClassInfo.clazz, gStaticDisplayInfoClassInfo.ctor);
1199 env->SetBooleanField(object, gStaticDisplayInfoClassInfo.isInternal,
1200 info.connectionType == ui::DisplayConnectionType::Internal);
1201 env->SetFloatField(object, gStaticDisplayInfoClassInfo.density, info.density);
1202 env->SetBooleanField(object, gStaticDisplayInfoClassInfo.secure, info.secure);
1203 env->SetObjectField(object, gStaticDisplayInfoClassInfo.deviceProductInfo,
1204 convertDeviceProductInfoToJavaObject(env, info.deviceProductInfo));
1205 env->SetIntField(object, gStaticDisplayInfoClassInfo.installOrientation,
1206 static_cast<uint32_t>(info.installOrientation));
1207 return object;
1208 }
1209
convertDisplayModeToJavaObject(JNIEnv * env,const ui::DisplayMode & config)1210 static jobject convertDisplayModeToJavaObject(JNIEnv* env, const ui::DisplayMode& config) {
1211 jobject object = env->NewObject(gDisplayModeClassInfo.clazz, gDisplayModeClassInfo.ctor);
1212 env->SetIntField(object, gDisplayModeClassInfo.id, config.id);
1213 env->SetIntField(object, gDisplayModeClassInfo.width, config.resolution.getWidth());
1214 env->SetIntField(object, gDisplayModeClassInfo.height, config.resolution.getHeight());
1215 env->SetFloatField(object, gDisplayModeClassInfo.xDpi, config.xDpi);
1216 env->SetFloatField(object, gDisplayModeClassInfo.yDpi, config.yDpi);
1217
1218 env->SetFloatField(object, gDisplayModeClassInfo.refreshRate, config.refreshRate);
1219 env->SetLongField(object, gDisplayModeClassInfo.appVsyncOffsetNanos, config.appVsyncOffset);
1220 env->SetLongField(object, gDisplayModeClassInfo.presentationDeadlineNanos,
1221 config.presentationDeadline);
1222 env->SetIntField(object, gDisplayModeClassInfo.group, config.group);
1223
1224 const auto& types = config.supportedHdrTypes;
1225 std::vector<jint> intTypes;
1226 for (auto type : types) {
1227 intTypes.push_back(static_cast<jint>(type));
1228 }
1229 auto typesArray = env->NewIntArray(types.size());
1230 env->SetIntArrayRegion(typesArray, 0, intTypes.size(), intTypes.data());
1231 env->SetObjectField(object, gDisplayModeClassInfo.supportedHdrTypes, typesArray);
1232
1233 return object;
1234 }
1235
convertHdrCapabilitiesToJavaObject(JNIEnv * env,const HdrCapabilities & capabilities)1236 jobject convertHdrCapabilitiesToJavaObject(JNIEnv* env, const HdrCapabilities& capabilities) {
1237 const auto& types = capabilities.getSupportedHdrTypes();
1238 std::vector<int32_t> intTypes;
1239 for (auto type : types) {
1240 intTypes.push_back(static_cast<int32_t>(type));
1241 }
1242 auto typesArray = env->NewIntArray(types.size());
1243 env->SetIntArrayRegion(typesArray, 0, intTypes.size(), intTypes.data());
1244
1245 return env->NewObject(gHdrCapabilitiesClassInfo.clazz, gHdrCapabilitiesClassInfo.ctor,
1246 typesArray, capabilities.getDesiredMaxLuminance(),
1247 capabilities.getDesiredMaxAverageLuminance(),
1248 capabilities.getDesiredMinLuminance());
1249 }
1250
nativeGetDynamicDisplayInfo(JNIEnv * env,jclass clazz,jlong displayId)1251 static jobject nativeGetDynamicDisplayInfo(JNIEnv* env, jclass clazz, jlong displayId) {
1252 ui::DynamicDisplayInfo info;
1253 if (SurfaceComposerClient::getDynamicDisplayInfoFromId(displayId, &info) != NO_ERROR) {
1254 return nullptr;
1255 }
1256
1257 jobject object =
1258 env->NewObject(gDynamicDisplayInfoClassInfo.clazz, gDynamicDisplayInfoClassInfo.ctor);
1259 if (object == NULL) {
1260 jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1261 return NULL;
1262 }
1263
1264 const auto numModes = info.supportedDisplayModes.size();
1265 jobjectArray modesArray = env->NewObjectArray(numModes, gDisplayModeClassInfo.clazz, nullptr);
1266 for (size_t i = 0; i < numModes; i++) {
1267 const ui::DisplayMode& mode = info.supportedDisplayModes[i];
1268 jobject displayModeObj = convertDisplayModeToJavaObject(env, mode);
1269 env->SetObjectArrayElement(modesArray, static_cast<jsize>(i), displayModeObj);
1270 env->DeleteLocalRef(displayModeObj);
1271 }
1272 env->SetObjectField(object, gDynamicDisplayInfoClassInfo.supportedDisplayModes, modesArray);
1273 env->SetIntField(object, gDynamicDisplayInfoClassInfo.activeDisplayModeId,
1274 info.activeDisplayModeId);
1275 env->SetFloatField(object, gDynamicDisplayInfoClassInfo.renderFrameRate, info.renderFrameRate);
1276
1277 jintArray colorModesArray = env->NewIntArray(info.supportedColorModes.size());
1278 if (colorModesArray == NULL) {
1279 jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1280 return NULL;
1281 }
1282 jint* colorModesArrayValues = env->GetIntArrayElements(colorModesArray, 0);
1283 for (size_t i = 0; i < info.supportedColorModes.size(); i++) {
1284 colorModesArrayValues[i] = static_cast<jint>(info.supportedColorModes[i]);
1285 }
1286 env->ReleaseIntArrayElements(colorModesArray, colorModesArrayValues, 0);
1287 env->SetObjectField(object, gDynamicDisplayInfoClassInfo.supportedColorModes, colorModesArray);
1288
1289 env->SetIntField(object, gDynamicDisplayInfoClassInfo.activeColorMode,
1290 static_cast<jint>(info.activeColorMode));
1291
1292 env->SetObjectField(object, gDynamicDisplayInfoClassInfo.hdrCapabilities,
1293 convertHdrCapabilitiesToJavaObject(env, info.hdrCapabilities));
1294
1295 env->SetBooleanField(object, gDynamicDisplayInfoClassInfo.autoLowLatencyModeSupported,
1296 info.autoLowLatencyModeSupported);
1297
1298 env->SetBooleanField(object, gDynamicDisplayInfoClassInfo.gameContentTypeSupported,
1299 info.gameContentTypeSupported);
1300
1301 env->SetIntField(object, gDynamicDisplayInfoClassInfo.preferredBootDisplayMode,
1302 info.preferredBootDisplayMode);
1303 return object;
1304 }
1305
nativeSetDesiredDisplayModeSpecs(JNIEnv * env,jclass clazz,jobject tokenObj,jobject DesiredDisplayModeSpecs)1306 static jboolean nativeSetDesiredDisplayModeSpecs(JNIEnv* env, jclass clazz, jobject tokenObj,
1307 jobject DesiredDisplayModeSpecs) {
1308 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1309 if (token == nullptr) return JNI_FALSE;
1310
1311 const auto makeRanges = [env](jobject obj) {
1312 const auto makeRange = [env](jobject obj) {
1313 gui::DisplayModeSpecs::RefreshRateRanges::RefreshRateRange range;
1314 range.min = env->GetFloatField(obj, gRefreshRateRangeClassInfo.min);
1315 range.max = env->GetFloatField(obj, gRefreshRateRangeClassInfo.max);
1316 return range;
1317 };
1318
1319 gui::DisplayModeSpecs::RefreshRateRanges ranges;
1320 ranges.physical = makeRange(env->GetObjectField(obj, gRefreshRateRangesClassInfo.physical));
1321 ranges.render = makeRange(env->GetObjectField(obj, gRefreshRateRangesClassInfo.render));
1322 return ranges;
1323 };
1324
1325 gui::DisplayModeSpecs specs;
1326 specs.defaultMode = env->GetIntField(DesiredDisplayModeSpecs,
1327 gDesiredDisplayModeSpecsClassInfo.defaultMode);
1328 specs.allowGroupSwitching =
1329 env->GetBooleanField(DesiredDisplayModeSpecs,
1330 gDesiredDisplayModeSpecsClassInfo.allowGroupSwitching);
1331
1332 specs.primaryRanges =
1333 makeRanges(env->GetObjectField(DesiredDisplayModeSpecs,
1334 gDesiredDisplayModeSpecsClassInfo.primaryRanges));
1335 specs.appRequestRanges =
1336 makeRanges(env->GetObjectField(DesiredDisplayModeSpecs,
1337 gDesiredDisplayModeSpecsClassInfo.appRequestRanges));
1338
1339 size_t result = SurfaceComposerClient::setDesiredDisplayModeSpecs(token, specs);
1340 return result == NO_ERROR ? JNI_TRUE : JNI_FALSE;
1341 }
1342
nativeGetDesiredDisplayModeSpecs(JNIEnv * env,jclass clazz,jobject tokenObj)1343 static jobject nativeGetDesiredDisplayModeSpecs(JNIEnv* env, jclass clazz, jobject tokenObj) {
1344 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1345 if (token == nullptr) return nullptr;
1346
1347 const auto rangesToJava = [env](const gui::DisplayModeSpecs::RefreshRateRanges& ranges) {
1348 const auto rangeToJava =
1349 [env](const gui::DisplayModeSpecs::RefreshRateRanges::RefreshRateRange& range) {
1350 return env->NewObject(gRefreshRateRangeClassInfo.clazz,
1351 gRefreshRateRangeClassInfo.ctor, range.min, range.max);
1352 };
1353
1354 return env->NewObject(gRefreshRateRangesClassInfo.clazz, gRefreshRateRangesClassInfo.ctor,
1355 rangeToJava(ranges.physical), rangeToJava(ranges.render));
1356 };
1357
1358 gui::DisplayModeSpecs specs;
1359 if (SurfaceComposerClient::getDesiredDisplayModeSpecs(token, &specs) != NO_ERROR) {
1360 return nullptr;
1361 }
1362
1363 return env->NewObject(gDesiredDisplayModeSpecsClassInfo.clazz,
1364 gDesiredDisplayModeSpecsClassInfo.ctor, specs.defaultMode,
1365 specs.allowGroupSwitching, rangesToJava(specs.primaryRanges),
1366 rangesToJava(specs.appRequestRanges));
1367 }
1368
nativeGetDisplayNativePrimaries(JNIEnv * env,jclass,jobject tokenObj)1369 static jobject nativeGetDisplayNativePrimaries(JNIEnv* env, jclass, jobject tokenObj) {
1370 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1371 if (token == NULL) return NULL;
1372
1373 ui::DisplayPrimaries primaries;
1374 if (SurfaceComposerClient::getDisplayNativePrimaries(token, primaries) != NO_ERROR) {
1375 return NULL;
1376 }
1377
1378 jobject jred = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
1379 if (jred == NULL) {
1380 jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1381 return NULL;
1382 }
1383
1384 jobject jgreen = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
1385 if (jgreen == NULL) {
1386 jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1387 return NULL;
1388 }
1389
1390 jobject jblue = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
1391 if (jblue == NULL) {
1392 jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1393 return NULL;
1394 }
1395
1396 jobject jwhite = env->NewObject(gCieXyzClassInfo.clazz, gCieXyzClassInfo.ctor);
1397 if (jwhite == NULL) {
1398 jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1399 return NULL;
1400 }
1401
1402 jobject jprimaries = env->NewObject(gDisplayPrimariesClassInfo.clazz,
1403 gDisplayPrimariesClassInfo.ctor);
1404 if (jprimaries == NULL) {
1405 jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
1406 return NULL;
1407 }
1408
1409 env->SetFloatField(jred, gCieXyzClassInfo.X, primaries.red.X);
1410 env->SetFloatField(jred, gCieXyzClassInfo.Y, primaries.red.Y);
1411 env->SetFloatField(jred, gCieXyzClassInfo.Z, primaries.red.Z);
1412 env->SetFloatField(jgreen, gCieXyzClassInfo.X, primaries.green.X);
1413 env->SetFloatField(jgreen, gCieXyzClassInfo.Y, primaries.green.Y);
1414 env->SetFloatField(jgreen, gCieXyzClassInfo.Z, primaries.green.Z);
1415 env->SetFloatField(jblue, gCieXyzClassInfo.X, primaries.blue.X);
1416 env->SetFloatField(jblue, gCieXyzClassInfo.Y, primaries.blue.Y);
1417 env->SetFloatField(jblue, gCieXyzClassInfo.Z, primaries.blue.Z);
1418 env->SetFloatField(jwhite, gCieXyzClassInfo.X, primaries.white.X);
1419 env->SetFloatField(jwhite, gCieXyzClassInfo.Y, primaries.white.Y);
1420 env->SetFloatField(jwhite, gCieXyzClassInfo.Z, primaries.white.Z);
1421 env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.red, jred);
1422 env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.green, jgreen);
1423 env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.blue, jblue);
1424 env->SetObjectField(jprimaries, gDisplayPrimariesClassInfo.white, jwhite);
1425
1426 return jprimaries;
1427 }
1428
nativeGetCompositionDataspaces(JNIEnv * env,jclass)1429 static jintArray nativeGetCompositionDataspaces(JNIEnv* env, jclass) {
1430 ui::Dataspace defaultDataspace, wcgDataspace;
1431 ui::PixelFormat defaultPixelFormat, wcgPixelFormat;
1432 if (SurfaceComposerClient::getCompositionPreference(&defaultDataspace,
1433 &defaultPixelFormat,
1434 &wcgDataspace,
1435 &wcgPixelFormat) != NO_ERROR) {
1436 return nullptr;
1437 }
1438 jintArray array = env->NewIntArray(2);
1439 if (array == nullptr) {
1440 jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
1441 return nullptr;
1442 }
1443 jint* arrayValues = env->GetIntArrayElements(array, 0);
1444 arrayValues[0] = static_cast<jint>(defaultDataspace);
1445 arrayValues[1] = static_cast<jint>(wcgDataspace);
1446 env->ReleaseIntArrayElements(array, arrayValues, 0);
1447 return array;
1448 }
1449
nativeGetOverlaySupport(JNIEnv * env,jclass)1450 static jobject nativeGetOverlaySupport(JNIEnv* env, jclass) {
1451 gui::OverlayProperties* overlayProperties = new gui::OverlayProperties;
1452 if (SurfaceComposerClient::getOverlaySupport(overlayProperties) != NO_ERROR) {
1453 delete overlayProperties;
1454 return nullptr;
1455 }
1456 return android_hardware_OverlayProperties_convertToJavaObject(env, overlayProperties);
1457 }
1458
nativeSetActiveColorMode(JNIEnv * env,jclass,jobject tokenObj,jint colorMode)1459 static jboolean nativeSetActiveColorMode(JNIEnv* env, jclass,
1460 jobject tokenObj, jint colorMode) {
1461 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1462 if (token == NULL) return JNI_FALSE;
1463 status_t err = SurfaceComposerClient::setActiveColorMode(token,
1464 static_cast<ui::ColorMode>(colorMode));
1465 return err == NO_ERROR ? JNI_TRUE : JNI_FALSE;
1466 }
1467
nativeSetDisplayPowerMode(JNIEnv * env,jclass clazz,jobject tokenObj,jint mode)1468 static void nativeSetDisplayPowerMode(JNIEnv* env, jclass clazz, jobject tokenObj, jint mode) {
1469 sp<IBinder> token(ibinderForJavaObject(env, tokenObj));
1470 if (token == NULL) return;
1471
1472 android::base::Timer t;
1473 SurfaceComposerClient::setDisplayPowerMode(token, mode);
1474 if (t.duration() > 100ms) ALOGD("Excessive delay in setPowerMode()");
1475 }
1476
nativeGetProtectedContentSupport(JNIEnv * env,jclass)1477 static jboolean nativeGetProtectedContentSupport(JNIEnv* env, jclass) {
1478 return static_cast<jboolean>(SurfaceComposerClient::getProtectedContentSupport());
1479 }
1480
nativeClearContentFrameStats(JNIEnv * env,jclass clazz,jlong nativeObject)1481 static jboolean nativeClearContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject) {
1482 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
1483 status_t err = ctrl->clearLayerFrameStats();
1484
1485 if (err < 0 && err != NO_INIT) {
1486 doThrowIAE(env);
1487 }
1488
1489 // The other end is not ready, just report we failed.
1490 if (err == NO_INIT) {
1491 return JNI_FALSE;
1492 }
1493
1494 return JNI_TRUE;
1495 }
1496
nativeGetContentFrameStats(JNIEnv * env,jclass clazz,jlong nativeObject,jobject outStats)1497 static jboolean nativeGetContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject,
1498 jobject outStats) {
1499 FrameStats stats;
1500
1501 SurfaceControl* const ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
1502 status_t err = ctrl->getLayerFrameStats(&stats);
1503 if (err < 0 && err != NO_INIT) {
1504 doThrowIAE(env);
1505 }
1506
1507 // The other end is not ready, fine just return empty stats.
1508 if (err == NO_INIT) {
1509 return JNI_FALSE;
1510 }
1511
1512 jlong refreshPeriodNano = static_cast<jlong>(stats.refreshPeriodNano);
1513 size_t frameCount = stats.desiredPresentTimesNano.size();
1514
1515 jlongArray postedTimesNanoDst = env->NewLongArray(frameCount);
1516 if (postedTimesNanoDst == NULL) {
1517 return JNI_FALSE;
1518 }
1519
1520 jlongArray presentedTimesNanoDst = env->NewLongArray(frameCount);
1521 if (presentedTimesNanoDst == NULL) {
1522 return JNI_FALSE;
1523 }
1524
1525 jlongArray readyTimesNanoDst = env->NewLongArray(frameCount);
1526 if (readyTimesNanoDst == NULL) {
1527 return JNI_FALSE;
1528 }
1529
1530 nsecs_t postedTimesNanoSrc[frameCount];
1531 nsecs_t presentedTimesNanoSrc[frameCount];
1532 nsecs_t readyTimesNanoSrc[frameCount];
1533
1534 for (size_t i = 0; i < frameCount; i++) {
1535 nsecs_t postedTimeNano = stats.desiredPresentTimesNano[i];
1536 if (postedTimeNano == INT64_MAX) {
1537 postedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
1538 }
1539 postedTimesNanoSrc[i] = postedTimeNano;
1540
1541 nsecs_t presentedTimeNano = stats.actualPresentTimesNano[i];
1542 if (presentedTimeNano == INT64_MAX) {
1543 presentedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
1544 }
1545 presentedTimesNanoSrc[i] = presentedTimeNano;
1546
1547 nsecs_t readyTimeNano = stats.frameReadyTimesNano[i];
1548 if (readyTimeNano == INT64_MAX) {
1549 readyTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
1550 }
1551 readyTimesNanoSrc[i] = readyTimeNano;
1552 }
1553
1554 env->SetLongArrayRegion(postedTimesNanoDst, 0, frameCount, postedTimesNanoSrc);
1555 env->SetLongArrayRegion(presentedTimesNanoDst, 0, frameCount, presentedTimesNanoSrc);
1556 env->SetLongArrayRegion(readyTimesNanoDst, 0, frameCount, readyTimesNanoSrc);
1557
1558 env->CallVoidMethod(outStats, gWindowContentFrameStatsClassInfo.init, refreshPeriodNano,
1559 postedTimesNanoDst, presentedTimesNanoDst, readyTimesNanoDst);
1560
1561 if (env->ExceptionCheck()) {
1562 return JNI_FALSE;
1563 }
1564
1565 return JNI_TRUE;
1566 }
1567
nativeClearAnimationFrameStats(JNIEnv * env,jclass clazz)1568 static jboolean nativeClearAnimationFrameStats(JNIEnv* env, jclass clazz) {
1569 status_t err = SurfaceComposerClient::clearAnimationFrameStats();
1570
1571 if (err < 0 && err != NO_INIT) {
1572 doThrowIAE(env);
1573 }
1574
1575 // The other end is not ready, just report we failed.
1576 if (err == NO_INIT) {
1577 return JNI_FALSE;
1578 }
1579
1580 return JNI_TRUE;
1581 }
1582
nativeGetAnimationFrameStats(JNIEnv * env,jclass clazz,jobject outStats)1583 static jboolean nativeGetAnimationFrameStats(JNIEnv* env, jclass clazz, jobject outStats) {
1584 FrameStats stats;
1585
1586 status_t err = SurfaceComposerClient::getAnimationFrameStats(&stats);
1587 if (err < 0 && err != NO_INIT) {
1588 doThrowIAE(env);
1589 }
1590
1591 // The other end is not ready, fine just return empty stats.
1592 if (err == NO_INIT) {
1593 return JNI_FALSE;
1594 }
1595
1596 jlong refreshPeriodNano = static_cast<jlong>(stats.refreshPeriodNano);
1597 size_t frameCount = stats.desiredPresentTimesNano.size();
1598
1599 jlongArray presentedTimesNanoDst = env->NewLongArray(frameCount);
1600 if (presentedTimesNanoDst == NULL) {
1601 return JNI_FALSE;
1602 }
1603
1604 nsecs_t presentedTimesNanoSrc[frameCount];
1605
1606 for (size_t i = 0; i < frameCount; i++) {
1607 nsecs_t presentedTimeNano = stats.actualPresentTimesNano[i];
1608 if (presentedTimeNano == INT64_MAX) {
1609 presentedTimeNano = gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO;
1610 }
1611 presentedTimesNanoSrc[i] = presentedTimeNano;
1612 }
1613
1614 env->SetLongArrayRegion(presentedTimesNanoDst, 0, frameCount, presentedTimesNanoSrc);
1615
1616 env->CallVoidMethod(outStats, gWindowAnimationFrameStatsClassInfo.init, refreshPeriodNano,
1617 presentedTimesNanoDst);
1618
1619 if (env->ExceptionCheck()) {
1620 return JNI_FALSE;
1621 }
1622
1623 return JNI_TRUE;
1624 }
1625
nativeReparent(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jlong newParentObject)1626 static void nativeReparent(JNIEnv* env, jclass clazz, jlong transactionObj,
1627 jlong nativeObject,
1628 jlong newParentObject) {
1629 auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject);
1630 auto newParent = reinterpret_cast<SurfaceControl *>(newParentObject);
1631 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1632 transaction->reparent(ctrl, newParent);
1633 }
1634
nativeGetBootDisplayModeSupport(JNIEnv * env,jclass clazz)1635 static jboolean nativeGetBootDisplayModeSupport(JNIEnv* env, jclass clazz) {
1636 bool isBootDisplayModeSupported = false;
1637 SurfaceComposerClient::getBootDisplayModeSupport(&isBootDisplayModeSupported);
1638 return static_cast<jboolean>(isBootDisplayModeSupported);
1639 }
1640
nativeSetBootDisplayMode(JNIEnv * env,jclass clazz,jobject tokenObject,jint displayModId)1641 static void nativeSetBootDisplayMode(JNIEnv* env, jclass clazz, jobject tokenObject,
1642 jint displayModId) {
1643 sp<IBinder> token(ibinderForJavaObject(env, tokenObject));
1644 if (token == NULL) return;
1645
1646 SurfaceComposerClient::setBootDisplayMode(token, displayModId);
1647 }
1648
nativeClearBootDisplayMode(JNIEnv * env,jclass clazz,jobject tokenObject)1649 static void nativeClearBootDisplayMode(JNIEnv* env, jclass clazz, jobject tokenObject) {
1650 sp<IBinder> token(ibinderForJavaObject(env, tokenObject));
1651 if (token == NULL) return;
1652
1653 SurfaceComposerClient::clearBootDisplayMode(token);
1654 }
1655
nativeSetAutoLowLatencyMode(JNIEnv * env,jclass clazz,jobject tokenObject,jboolean on)1656 static void nativeSetAutoLowLatencyMode(JNIEnv* env, jclass clazz, jobject tokenObject, jboolean on) {
1657 sp<IBinder> token(ibinderForJavaObject(env, tokenObject));
1658 if (token == NULL) return;
1659
1660 SurfaceComposerClient::setAutoLowLatencyMode(token, on);
1661 }
1662
nativeSetGameContentType(JNIEnv * env,jclass clazz,jobject tokenObject,jboolean on)1663 static void nativeSetGameContentType(JNIEnv* env, jclass clazz, jobject tokenObject, jboolean on) {
1664 sp<IBinder> token(ibinderForJavaObject(env, tokenObject));
1665 if (token == NULL) return;
1666
1667 SurfaceComposerClient::setGameContentType(token, on);
1668 }
1669
nativeReadFromParcel(JNIEnv * env,jclass clazz,jobject parcelObj)1670 static jlong nativeReadFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj) {
1671 Parcel* parcel = parcelForJavaObject(env, parcelObj);
1672 if (parcel == NULL) {
1673 doThrowNPE(env);
1674 return 0;
1675 }
1676 sp<SurfaceControl> surface;
1677 SurfaceControl::readFromParcel(*parcel, &surface);
1678 if (surface == nullptr) {
1679 return 0;
1680 }
1681 surface->incStrong((void *)nativeCreate);
1682 return reinterpret_cast<jlong>(surface.get());
1683 }
1684
nativeCopyFromSurfaceControl(JNIEnv * env,jclass clazz,jlong surfaceControlNativeObj)1685 static jlong nativeCopyFromSurfaceControl(JNIEnv* env, jclass clazz, jlong surfaceControlNativeObj) {
1686 sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl *>(surfaceControlNativeObj));
1687 if (surface == nullptr) {
1688 return 0;
1689 }
1690
1691 sp<SurfaceControl> newSurface = new SurfaceControl(surface);
1692 newSurface->incStrong((void *)nativeCreate);
1693 return reinterpret_cast<jlong>(newSurface.get());
1694 }
1695
nativeWriteToParcel(JNIEnv * env,jclass clazz,jlong nativeObject,jobject parcelObj)1696 static void nativeWriteToParcel(JNIEnv* env, jclass clazz,
1697 jlong nativeObject, jobject parcelObj) {
1698 Parcel* parcel = parcelForJavaObject(env, parcelObj);
1699 if (parcel == NULL) {
1700 doThrowNPE(env);
1701 return;
1702 }
1703 SurfaceControl* const self = reinterpret_cast<SurfaceControl *>(nativeObject);
1704 if (self != nullptr) {
1705 self->writeToParcel(*parcel);
1706 }
1707 }
1708
nativeGetDisplayBrightnessSupport(JNIEnv * env,jclass clazz,jobject displayTokenObject)1709 static jboolean nativeGetDisplayBrightnessSupport(JNIEnv* env, jclass clazz,
1710 jobject displayTokenObject) {
1711 sp<IBinder> displayToken(ibinderForJavaObject(env, displayTokenObject));
1712 if (displayToken == nullptr) {
1713 return JNI_FALSE;
1714 }
1715 return static_cast<jboolean>(SurfaceComposerClient::getDisplayBrightnessSupport(displayToken));
1716 }
1717
nativeSetDisplayBrightness(JNIEnv * env,jclass clazz,jobject displayTokenObject,jfloat sdrBrightness,jfloat sdrBrightnessNits,jfloat displayBrightness,jfloat displayBrightnessNits)1718 static jboolean nativeSetDisplayBrightness(JNIEnv* env, jclass clazz, jobject displayTokenObject,
1719 jfloat sdrBrightness, jfloat sdrBrightnessNits,
1720 jfloat displayBrightness, jfloat displayBrightnessNits) {
1721 sp<IBinder> displayToken(ibinderForJavaObject(env, displayTokenObject));
1722 if (displayToken == nullptr) {
1723 return JNI_FALSE;
1724 }
1725 gui::DisplayBrightness brightness;
1726 brightness.sdrWhitePoint = sdrBrightness;
1727 brightness.sdrWhitePointNits = sdrBrightnessNits;
1728 brightness.displayBrightness = displayBrightness;
1729 brightness.displayBrightnessNits = displayBrightnessNits;
1730 status_t error = SurfaceComposerClient::setDisplayBrightness(displayToken, brightness);
1731 return error == OK ? JNI_TRUE : JNI_FALSE;
1732 }
1733
nativeWriteTransactionToParcel(JNIEnv * env,jclass clazz,jlong nativeObject,jobject parcelObj)1734 static void nativeWriteTransactionToParcel(JNIEnv* env, jclass clazz, jlong nativeObject,
1735 jobject parcelObj) {
1736 Parcel* parcel = parcelForJavaObject(env, parcelObj);
1737 if (parcel == NULL) {
1738 doThrowNPE(env);
1739 return;
1740 }
1741 SurfaceComposerClient::Transaction* const self =
1742 reinterpret_cast<SurfaceComposerClient::Transaction *>(nativeObject);
1743 if (self != nullptr) {
1744 self->writeToParcel(parcel);
1745 }
1746 }
1747
nativeClearTransaction(JNIEnv * env,jclass clazz,jlong nativeObject)1748 static void nativeClearTransaction(JNIEnv* env, jclass clazz, jlong nativeObject) {
1749 SurfaceComposerClient::Transaction* const self =
1750 reinterpret_cast<SurfaceComposerClient::Transaction*>(nativeObject);
1751 if (self != nullptr) {
1752 self->clear();
1753 }
1754 }
1755
nativeReadTransactionFromParcel(JNIEnv * env,jclass clazz,jobject parcelObj)1756 static jlong nativeReadTransactionFromParcel(JNIEnv* env, jclass clazz, jobject parcelObj) {
1757 Parcel* parcel = parcelForJavaObject(env, parcelObj);
1758 if (parcel == NULL) {
1759 doThrowNPE(env);
1760 return 0;
1761 }
1762 std::unique_ptr<SurfaceComposerClient::Transaction> transaction =
1763 SurfaceComposerClient::Transaction::createFromParcel(parcel);
1764
1765 return reinterpret_cast<jlong>(transaction.release());
1766 }
1767
nativeMirrorSurface(JNIEnv * env,jclass clazz,jlong mirrorOfObj)1768 static jlong nativeMirrorSurface(JNIEnv* env, jclass clazz, jlong mirrorOfObj) {
1769 sp<SurfaceComposerClient> client = SurfaceComposerClient::getDefault();
1770 SurfaceControl *mirrorOf = reinterpret_cast<SurfaceControl*>(mirrorOfObj);
1771 sp<SurfaceControl> surface = client->mirrorSurface(mirrorOf);
1772
1773 surface->incStrong((void *)nativeCreate);
1774 return reinterpret_cast<jlong>(surface.get());
1775 }
1776
nativeSetGlobalShadowSettings(JNIEnv * env,jclass clazz,jfloatArray jAmbientColor,jfloatArray jSpotColor,jfloat lightPosY,jfloat lightPosZ,jfloat lightRadius)1777 static void nativeSetGlobalShadowSettings(JNIEnv* env, jclass clazz, jfloatArray jAmbientColor,
1778 jfloatArray jSpotColor, jfloat lightPosY, jfloat lightPosZ, jfloat lightRadius) {
1779 sp<SurfaceComposerClient> client = SurfaceComposerClient::getDefault();
1780
1781 float* floatAmbientColor = env->GetFloatArrayElements(jAmbientColor, 0);
1782 half4 ambientColor = half4(floatAmbientColor[0], floatAmbientColor[1], floatAmbientColor[2],
1783 floatAmbientColor[3]);
1784 env->ReleaseFloatArrayElements(jAmbientColor, floatAmbientColor, 0);
1785
1786 float* floatSpotColor = env->GetFloatArrayElements(jSpotColor, 0);
1787 half4 spotColor = half4(floatSpotColor[0], floatSpotColor[1], floatSpotColor[2],
1788 floatSpotColor[3]);
1789 env->ReleaseFloatArrayElements(jSpotColor, floatSpotColor, 0);
1790
1791 client->setGlobalShadowSettings(ambientColor, spotColor, lightPosY, lightPosZ, lightRadius);
1792 }
1793
nativeGetDisplayDecorationSupport(JNIEnv * env,jclass clazz,jobject displayTokenObject)1794 static jobject nativeGetDisplayDecorationSupport(JNIEnv* env, jclass clazz,
1795 jobject displayTokenObject) {
1796 sp<IBinder> displayToken(ibinderForJavaObject(env, displayTokenObject));
1797 if (displayToken == nullptr) {
1798 return nullptr;
1799 }
1800 const auto support = SurfaceComposerClient::getDisplayDecorationSupport(displayToken);
1801 if (!support) {
1802 return nullptr;
1803 }
1804
1805 using aidl::android::hardware::graphics::common::PixelFormat;
1806 if (support.value().format == PixelFormat::R_8 && !hwui_uses_vulkan()) {
1807 return nullptr;
1808 }
1809
1810 jobject jDisplayDecorationSupport =
1811 env->NewObject(gDisplayDecorationSupportInfo.clazz, gDisplayDecorationSupportInfo.ctor);
1812 if (jDisplayDecorationSupport == nullptr) {
1813 jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
1814 return nullptr;
1815 }
1816
1817 env->SetIntField(jDisplayDecorationSupport, gDisplayDecorationSupportInfo.format,
1818 static_cast<jint>(support.value().format));
1819 env->SetIntField(jDisplayDecorationSupport, gDisplayDecorationSupportInfo.alphaInterpretation,
1820 static_cast<jint>(support.value().alphaInterpretation));
1821 return jDisplayDecorationSupport;
1822 }
1823
nativeGetHandle(JNIEnv * env,jclass clazz,jlong nativeObject)1824 static jlong nativeGetHandle(JNIEnv* env, jclass clazz, jlong nativeObject) {
1825 SurfaceControl *surfaceControl = reinterpret_cast<SurfaceControl*>(nativeObject);
1826 return reinterpret_cast<jlong>(surfaceControl->getHandle().get());
1827 }
1828
nativeRemoveCurrentInputFocus(JNIEnv * env,jclass clazz,jlong transactionObj,jint displayId)1829 static void nativeRemoveCurrentInputFocus(JNIEnv* env, jclass clazz, jlong transactionObj,
1830 jint displayId) {
1831 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1832 FocusRequest request;
1833 request.timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
1834 request.displayId = displayId;
1835 request.windowName = "<null>";
1836 transaction->setFocusedWindow(request);
1837 }
1838
nativeSetFocusedWindow(JNIEnv * env,jclass clazz,jlong transactionObj,jobject toTokenObj,jstring windowNameJstr,jint displayId)1839 static void nativeSetFocusedWindow(JNIEnv* env, jclass clazz, jlong transactionObj,
1840 jobject toTokenObj, jstring windowNameJstr, jint displayId) {
1841 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1842 if (toTokenObj == NULL) return;
1843
1844 sp<IBinder> toToken(ibinderForJavaObject(env, toTokenObj));
1845
1846 FocusRequest request;
1847 request.token = toToken;
1848 if (windowNameJstr != NULL) {
1849 ScopedUtfChars windowName(env, windowNameJstr);
1850 request.windowName = windowName.c_str();
1851 }
1852
1853 request.timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
1854 request.displayId = displayId;
1855 transaction->setFocusedWindow(request);
1856 }
1857
nativeSetFrameTimelineVsync(JNIEnv * env,jclass clazz,jlong transactionObj,jlong frameTimelineVsyncId)1858 static void nativeSetFrameTimelineVsync(JNIEnv* env, jclass clazz, jlong transactionObj,
1859 jlong frameTimelineVsyncId) {
1860 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1861
1862 FrameTimelineInfo ftInfo;
1863 ftInfo.vsyncId = frameTimelineVsyncId;
1864 ftInfo.inputEventId = android::os::IInputConstants::INVALID_INPUT_EVENT_ID;
1865 transaction->setFrameTimelineInfo(ftInfo);
1866 }
1867
nativeAddTransactionCommittedListener(JNIEnv * env,jclass clazz,jlong transactionObj,jobject transactionCommittedListenerObject)1868 static void nativeAddTransactionCommittedListener(JNIEnv* env, jclass clazz, jlong transactionObj,
1869 jobject transactionCommittedListenerObject) {
1870 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1871
1872 void* context =
1873 new TransactionCommittedListenerWrapper(env, transactionCommittedListenerObject);
1874 transaction->addTransactionCommittedCallback(TransactionCommittedListenerWrapper::
1875 transactionCallbackThunk,
1876 context);
1877 }
1878
nativeSetTrustedPresentationCallback(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject,jlong trustedPresentationCallbackObject,jobject trustedPresentationThresholds)1879 static void nativeSetTrustedPresentationCallback(JNIEnv* env, jclass clazz, jlong transactionObj,
1880 jlong nativeObject,
1881 jlong trustedPresentationCallbackObject,
1882 jobject trustedPresentationThresholds) {
1883 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1884 auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
1885
1886 TrustedPresentationThresholds thresholds;
1887 thresholds.minAlpha = env->GetFloatField(trustedPresentationThresholds,
1888 gTrustedPresentationThresholdsClassInfo.mMinAlpha);
1889 thresholds.minFractionRendered =
1890 env->GetFloatField(trustedPresentationThresholds,
1891 gTrustedPresentationThresholdsClassInfo.mMinFractionRendered);
1892 thresholds.stabilityRequirementMs =
1893 env->GetIntField(trustedPresentationThresholds,
1894 gTrustedPresentationThresholdsClassInfo.mStabilityRequirementMs);
1895
1896 sp<SurfaceComposerClient::PresentationCallbackRAII> callbackRef;
1897 TrustedPresentationCallbackWrapper* wrapper =
1898 reinterpret_cast<TrustedPresentationCallbackWrapper*>(
1899 trustedPresentationCallbackObject);
1900 transaction->setTrustedPresentationCallback(ctrl,
1901 TrustedPresentationCallbackWrapper::
1902 onTrustedPresentationChangedThunk,
1903 thresholds, wrapper, callbackRef);
1904 wrapper->addCallbackRef(callbackRef);
1905 }
1906
nativeClearTrustedPresentationCallback(JNIEnv * env,jclass clazz,jlong transactionObj,jlong nativeObject)1907 static void nativeClearTrustedPresentationCallback(JNIEnv* env, jclass clazz, jlong transactionObj,
1908 jlong nativeObject) {
1909 auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj);
1910 auto ctrl = reinterpret_cast<SurfaceControl*>(nativeObject);
1911
1912 transaction->clearTrustedPresentationCallback(ctrl);
1913 }
1914
1915 class JankDataListenerWrapper : public JankDataListener {
1916 public:
JankDataListenerWrapper(JNIEnv * env,jobject onJankDataListenerObject)1917 JankDataListenerWrapper(JNIEnv* env, jobject onJankDataListenerObject) {
1918 mOnJankDataListenerWeak = env->NewWeakGlobalRef(onJankDataListenerObject);
1919 env->GetJavaVM(&mVm);
1920 }
1921
~JankDataListenerWrapper()1922 ~JankDataListenerWrapper() {
1923 JNIEnv* env = getEnv();
1924 env->DeleteWeakGlobalRef(mOnJankDataListenerWeak);
1925 }
1926
onJankDataAvailable(const std::vector<JankData> & jankData)1927 void onJankDataAvailable(const std::vector<JankData>& jankData) {
1928 JNIEnv* env = getEnv();
1929
1930 jobject target = env->NewLocalRef(mOnJankDataListenerWeak);
1931 if (target == nullptr) return;
1932
1933 jobjectArray jJankDataArray = env->NewObjectArray(jankData.size(),
1934 gJankDataClassInfo.clazz, nullptr);
1935 for (int i = 0; i < jankData.size(); i++) {
1936 jobject jJankData = env->NewObject(gJankDataClassInfo.clazz,
1937 gJankDataClassInfo.ctor, jankData[i].frameVsyncId, jankData[i].jankType);
1938 env->SetObjectArrayElement(jJankDataArray, i, jJankData);
1939 env->DeleteLocalRef(jJankData);
1940 }
1941 env->CallVoidMethod(target,
1942 gJankDataListenerClassInfo.onJankDataAvailable,
1943 jJankDataArray);
1944 env->DeleteLocalRef(jJankDataArray);
1945 env->DeleteLocalRef(target);
1946 }
1947
1948 private:
1949
getEnv()1950 JNIEnv* getEnv() {
1951 JNIEnv* env;
1952 mVm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6);
1953 return env;
1954 }
1955
1956 JavaVM* mVm;
1957 jobject mOnJankDataListenerWeak;
1958 };
1959
nativeAddJankDataListener(JNIEnv * env,jclass clazz,jlong jankDataCallbackListenerPtr,jlong nativeSurfaceControl)1960 static void nativeAddJankDataListener(JNIEnv* env, jclass clazz,
1961 jlong jankDataCallbackListenerPtr,
1962 jlong nativeSurfaceControl) {
1963 sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl *>(nativeSurfaceControl));
1964 if (surface == nullptr) {
1965 return;
1966 }
1967 sp<JankDataListenerWrapper> wrapper =
1968 reinterpret_cast<JankDataListenerWrapper*>(jankDataCallbackListenerPtr);
1969 TransactionCompletedListener::getInstance()->addJankListener(wrapper, surface);
1970 }
1971
nativeRemoveJankDataListener(JNIEnv * env,jclass clazz,jlong jankDataCallbackListenerPtr)1972 static void nativeRemoveJankDataListener(JNIEnv* env, jclass clazz,
1973 jlong jankDataCallbackListenerPtr) {
1974 sp<JankDataListenerWrapper> wrapper =
1975 reinterpret_cast<JankDataListenerWrapper*>(jankDataCallbackListenerPtr);
1976 TransactionCompletedListener::getInstance()->removeJankListener(wrapper);
1977 }
1978
nativeCreateJankDataListenerWrapper(JNIEnv * env,jclass clazz,jobject jankDataListenerObject)1979 static jlong nativeCreateJankDataListenerWrapper(JNIEnv* env, jclass clazz,
1980 jobject jankDataListenerObject) {
1981 return reinterpret_cast<jlong>(
1982 new JankDataListenerWrapper(env, jankDataListenerObject));
1983 }
1984
nativeGetGPUContextPriority(JNIEnv * env,jclass clazz)1985 static jint nativeGetGPUContextPriority(JNIEnv* env, jclass clazz) {
1986 return static_cast<jint>(SurfaceComposerClient::getGpuContextPriority());
1987 }
1988
nativeSetTransformHint(JNIEnv * env,jclass clazz,jlong nativeSurfaceControl,jint transformHint)1989 static void nativeSetTransformHint(JNIEnv* env, jclass clazz, jlong nativeSurfaceControl,
1990 jint transformHint) {
1991 sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl*>(nativeSurfaceControl));
1992 if (surface == nullptr) {
1993 return;
1994 }
1995 surface->setTransformHint(transformHint);
1996 }
1997
nativeGetTransformHint(JNIEnv * env,jclass clazz,jlong nativeSurfaceControl)1998 static jint nativeGetTransformHint(JNIEnv* env, jclass clazz, jlong nativeSurfaceControl) {
1999 sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl*>(nativeSurfaceControl));
2000 return surface->getTransformHint();
2001 }
2002
nativeGetLayerId(JNIEnv * env,jclass clazz,jlong nativeSurfaceControl)2003 static jint nativeGetLayerId(JNIEnv* env, jclass clazz, jlong nativeSurfaceControl) {
2004 sp<SurfaceControl> surface(reinterpret_cast<SurfaceControl*>(nativeSurfaceControl));
2005
2006 return surface->getLayerId();
2007 }
2008
nativeSetDefaultApplyToken(JNIEnv * env,jclass clazz,jobject applyToken)2009 static void nativeSetDefaultApplyToken(JNIEnv* env, jclass clazz, jobject applyToken) {
2010 sp<IBinder> token(ibinderForJavaObject(env, applyToken));
2011 if (token == nullptr) {
2012 ALOGE("Null apply token provided.");
2013 return;
2014 }
2015 SurfaceComposerClient::Transaction::setDefaultApplyToken(token);
2016 }
2017
nativeGetDefaultApplyToken(JNIEnv * env,jclass clazz)2018 static jobject nativeGetDefaultApplyToken(JNIEnv* env, jclass clazz) {
2019 sp<IBinder> token = SurfaceComposerClient::Transaction::getDefaultApplyToken();
2020 return javaObjectForIBinder(env, token);
2021 }
2022
nativeBootFinished(JNIEnv * env,jclass clazz)2023 static jboolean nativeBootFinished(JNIEnv* env, jclass clazz) {
2024 status_t error = SurfaceComposerClient::bootFinished();
2025 return error == OK ? JNI_TRUE : JNI_FALSE;
2026 }
2027
nativeCreateTpc(JNIEnv * env,jclass clazz,jobject trustedPresentationCallback)2028 jlong nativeCreateTpc(JNIEnv* env, jclass clazz, jobject trustedPresentationCallback) {
2029 return reinterpret_cast<jlong>(
2030 new TrustedPresentationCallbackWrapper(env, trustedPresentationCallback));
2031 }
2032
destroyNativeTpc(void * ptr)2033 void destroyNativeTpc(void* ptr) {
2034 TrustedPresentationCallbackWrapper* callback =
2035 reinterpret_cast<TrustedPresentationCallbackWrapper*>(ptr);
2036 delete callback;
2037 }
2038
getNativeTrustedPresentationCallbackFinalizer(JNIEnv * env,jclass clazz)2039 static jlong getNativeTrustedPresentationCallbackFinalizer(JNIEnv* env, jclass clazz) {
2040 return static_cast<jlong>(reinterpret_cast<uintptr_t>(&destroyNativeTpc));
2041 }
2042
nativeGetStalledTransactionInfo(JNIEnv * env,jclass clazz,jint pid)2043 static jobject nativeGetStalledTransactionInfo(JNIEnv* env, jclass clazz, jint pid) {
2044 std::optional<gui::StalledTransactionInfo> stalledTransactionInfo =
2045 SurfaceComposerClient::getStalledTransactionInfo(pid);
2046 if (!stalledTransactionInfo) {
2047 return nullptr;
2048 }
2049
2050 jobject jStalledTransactionInfo = env->NewObject(gStalledTransactionInfoClassInfo.clazz,
2051 gStalledTransactionInfoClassInfo.ctor);
2052 if (!jStalledTransactionInfo) {
2053 jniThrowException(env, "java/lang/OutOfMemoryError", nullptr);
2054 return nullptr;
2055 }
2056
2057 env->SetObjectField(jStalledTransactionInfo, gStalledTransactionInfoClassInfo.layerName,
2058 env->NewStringUTF(String8{stalledTransactionInfo->layerName}));
2059 env->SetLongField(jStalledTransactionInfo, gStalledTransactionInfoClassInfo.bufferId,
2060 static_cast<jlong>(stalledTransactionInfo->bufferId));
2061 env->SetLongField(jStalledTransactionInfo, gStalledTransactionInfoClassInfo.frameNumber,
2062 static_cast<jlong>(stalledTransactionInfo->frameNumber));
2063 return jStalledTransactionInfo;
2064 }
2065
2066 // ----------------------------------------------------------------------------
2067
android_view_SurfaceControl_getNativeSurfaceControl(JNIEnv * env,jobject surfaceControlObj)2068 SurfaceControl* android_view_SurfaceControl_getNativeSurfaceControl(JNIEnv* env,
2069 jobject surfaceControlObj) {
2070 if (!!surfaceControlObj &&
2071 env->IsInstanceOf(surfaceControlObj, gSurfaceControlClassInfo.clazz)) {
2072 return reinterpret_cast<SurfaceControl*>(
2073 env->GetLongField(surfaceControlObj, gSurfaceControlClassInfo.mNativeObject));
2074 } else {
2075 return nullptr;
2076 }
2077 }
2078
android_view_SurfaceTransaction_getNativeSurfaceTransaction(JNIEnv * env,jobject surfaceTransactionObj)2079 SurfaceComposerClient::Transaction* android_view_SurfaceTransaction_getNativeSurfaceTransaction(
2080 JNIEnv* env, jobject surfaceTransactionObj) {
2081 if (!!surfaceTransactionObj &&
2082 env->IsInstanceOf(surfaceTransactionObj, gTransactionClassInfo.clazz)) {
2083 return reinterpret_cast<SurfaceComposerClient::Transaction*>(
2084 env->GetLongField(surfaceTransactionObj, gTransactionClassInfo.mNativeObject));
2085 } else {
2086 return nullptr;
2087 }
2088 }
2089
2090 static const JNINativeMethod sSurfaceControlMethods[] = {
2091 // clang-format off
2092 {"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIIIJLandroid/os/Parcel;)J",
2093 (void*)nativeCreate },
2094 {"nativeReadFromParcel", "(Landroid/os/Parcel;)J",
2095 (void*)nativeReadFromParcel },
2096 {"nativeCopyFromSurfaceControl", "(J)J" ,
2097 (void*)nativeCopyFromSurfaceControl },
2098 {"nativeWriteToParcel", "(JLandroid/os/Parcel;)V",
2099 (void*)nativeWriteToParcel },
2100 {"nativeGetNativeSurfaceControlFinalizer", "()J",
2101 (void*) nativeGetNativeSurfaceControlFinalizer },
2102 {"nativeDisconnect", "(J)V",
2103 (void*)nativeDisconnect },
2104 {"nativeUpdateDefaultBufferSize", "(JII)V",
2105 (void*)nativeSetDefaultBufferSize},
2106 {"nativeCreateTransaction", "()J",
2107 (void*)nativeCreateTransaction },
2108 {"nativeApplyTransaction", "(JZ)V",
2109 (void*)nativeApplyTransaction },
2110 {"nativeGetNativeTransactionFinalizer", "()J",
2111 (void*)nativeGetNativeTransactionFinalizer },
2112 {"nativeMergeTransaction", "(JJ)V",
2113 (void*)nativeMergeTransaction },
2114 {"nativeSetAnimationTransaction", "(J)V",
2115 (void*)nativeSetAnimationTransaction },
2116 {"nativeSetEarlyWakeupStart", "(J)V",
2117 (void*)nativeSetEarlyWakeupStart },
2118 {"nativeSetEarlyWakeupEnd", "(J)V",
2119 (void*)nativeSetEarlyWakeupEnd },
2120 {"nativeGetTransactionId", "(J)J",
2121 (void*)nativeGetTransactionId },
2122 {"nativeSetLayer", "(JJI)V",
2123 (void*)nativeSetLayer },
2124 {"nativeSetRelativeLayer", "(JJJI)V",
2125 (void*)nativeSetRelativeLayer },
2126 {"nativeSetPosition", "(JJFF)V",
2127 (void*)nativeSetPosition },
2128 {"nativeSetScale", "(JJFF)V",
2129 (void*)nativeSetScale },
2130 {"nativeSetTransparentRegionHint", "(JJLandroid/graphics/Region;)V",
2131 (void*)nativeSetTransparentRegionHint },
2132 {"nativeSetDamageRegion", "(JJLandroid/graphics/Region;)V",
2133 (void*)nativeSetDamageRegion },
2134 {"nativeSetDimmingEnabled", "(JJZ)V", (void*)nativeSetDimmingEnabled },
2135 {"nativeSetAlpha", "(JJF)V",
2136 (void*)nativeSetAlpha },
2137 {"nativeSetColor", "(JJ[F)V",
2138 (void*)nativeSetColor },
2139 {"nativeSetMatrix", "(JJFFFF)V",
2140 (void*)nativeSetMatrix },
2141 {"nativeSetColorTransform", "(JJ[F[F)V",
2142 (void*)nativeSetColorTransform },
2143 {"nativeSetColorSpaceAgnostic", "(JJZ)V",
2144 (void*)nativeSetColorSpaceAgnostic },
2145 {"nativeSetFlags", "(JJII)V",
2146 (void*)nativeSetFlags },
2147 {"nativeSetFrameRateSelectionPriority", "(JJI)V",
2148 (void*)nativeSetFrameRateSelectionPriority },
2149 {"nativeSetWindowCrop", "(JJIIII)V",
2150 (void*)nativeSetWindowCrop },
2151 {"nativeSetCornerRadius", "(JJF)V",
2152 (void*)nativeSetCornerRadius },
2153 {"nativeSetBackgroundBlurRadius", "(JJI)V",
2154 (void*)nativeSetBackgroundBlurRadius },
2155 {"nativeSetLayerStack", "(JJI)V",
2156 (void*)nativeSetLayerStack },
2157 {"nativeSetBlurRegions", "(JJ[[FI)V",
2158 (void*)nativeSetBlurRegions },
2159 {"nativeSetStretchEffect", "(JJFFFFFFFFFF)V",
2160 (void*) nativeSetStretchEffect },
2161 {"nativeSetShadowRadius", "(JJF)V",
2162 (void*)nativeSetShadowRadius },
2163 {"nativeSetFrameRate", "(JJFII)V",
2164 (void*)nativeSetFrameRate },
2165 {"nativeSetDefaultFrameRateCompatibility", "(JJI)V",
2166 (void*)nativeSetDefaultFrameRateCompatibility},
2167 {"nativeSetDisplaySurface", "(JLandroid/os/IBinder;J)V",
2168 (void*)nativeSetDisplaySurface },
2169 {"nativeSetDisplayLayerStack", "(JLandroid/os/IBinder;I)V",
2170 (void*)nativeSetDisplayLayerStack },
2171 {"nativeSetDisplayFlags", "(JLandroid/os/IBinder;I)V",
2172 (void*)nativeSetDisplayFlags },
2173 {"nativeSetDisplayProjection", "(JLandroid/os/IBinder;IIIIIIIII)V",
2174 (void*)nativeSetDisplayProjection },
2175 {"nativeSetDisplaySize", "(JLandroid/os/IBinder;II)V",
2176 (void*)nativeSetDisplaySize },
2177 {"nativeGetStaticDisplayInfo",
2178 "(J)Landroid/view/SurfaceControl$StaticDisplayInfo;",
2179 (void*)nativeGetStaticDisplayInfo },
2180 {"nativeGetDynamicDisplayInfo",
2181 "(J)Landroid/view/SurfaceControl$DynamicDisplayInfo;",
2182 (void*)nativeGetDynamicDisplayInfo },
2183 {"nativeSetDesiredDisplayModeSpecs",
2184 "(Landroid/os/IBinder;Landroid/view/SurfaceControl$DesiredDisplayModeSpecs;)Z",
2185 (void*)nativeSetDesiredDisplayModeSpecs },
2186 {"nativeGetDesiredDisplayModeSpecs",
2187 "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DesiredDisplayModeSpecs;",
2188 (void*)nativeGetDesiredDisplayModeSpecs },
2189 {"nativeGetDisplayNativePrimaries",
2190 "(Landroid/os/IBinder;)Landroid/view/SurfaceControl$DisplayPrimaries;",
2191 (void*)nativeGetDisplayNativePrimaries },
2192 {"nativeSetActiveColorMode", "(Landroid/os/IBinder;I)Z",
2193 (void*)nativeSetActiveColorMode},
2194 {"nativeGetBootDisplayModeSupport", "()Z",
2195 (void*)nativeGetBootDisplayModeSupport },
2196 {"nativeSetBootDisplayMode", "(Landroid/os/IBinder;I)V",
2197 (void*)nativeSetBootDisplayMode },
2198 {"nativeClearBootDisplayMode", "(Landroid/os/IBinder;)V",
2199 (void*)nativeClearBootDisplayMode },
2200 {"nativeSetAutoLowLatencyMode", "(Landroid/os/IBinder;Z)V",
2201 (void*)nativeSetAutoLowLatencyMode },
2202 {"nativeSetGameContentType", "(Landroid/os/IBinder;Z)V",
2203 (void*)nativeSetGameContentType },
2204 {"nativeGetCompositionDataspaces", "()[I",
2205 (void*)nativeGetCompositionDataspaces},
2206 {"nativeGetOverlaySupport", "()Landroid/hardware/OverlayProperties;",
2207 (void*) nativeGetOverlaySupport},
2208 {"nativeClearContentFrameStats", "(J)Z",
2209 (void*)nativeClearContentFrameStats },
2210 {"nativeGetContentFrameStats", "(JLandroid/view/WindowContentFrameStats;)Z",
2211 (void*)nativeGetContentFrameStats },
2212 {"nativeClearAnimationFrameStats", "()Z",
2213 (void*)nativeClearAnimationFrameStats },
2214 {"nativeGetAnimationFrameStats", "(Landroid/view/WindowAnimationFrameStats;)Z",
2215 (void*)nativeGetAnimationFrameStats },
2216 {"nativeSetDisplayPowerMode", "(Landroid/os/IBinder;I)V",
2217 (void*)nativeSetDisplayPowerMode },
2218 {"nativeGetProtectedContentSupport", "()Z",
2219 (void*)nativeGetProtectedContentSupport },
2220 {"nativeReparent", "(JJJ)V",
2221 (void*)nativeReparent },
2222 {"nativeSetInputWindowInfo", "(JJLandroid/view/InputWindowHandle;)V",
2223 (void*)nativeSetInputWindowInfo },
2224 {"nativeSetMetadata", "(JJILandroid/os/Parcel;)V",
2225 (void*)nativeSetMetadata },
2226 {"nativeGetDisplayedContentSamplingAttributes",
2227 "(Landroid/os/IBinder;)Landroid/hardware/display/DisplayedContentSamplingAttributes;",
2228 (void*)nativeGetDisplayedContentSamplingAttributes },
2229 {"nativeSetDisplayedContentSamplingEnabled", "(Landroid/os/IBinder;ZII)Z",
2230 (void*)nativeSetDisplayedContentSamplingEnabled },
2231 {"nativeGetDisplayedContentSample",
2232 "(Landroid/os/IBinder;JJ)Landroid/hardware/display/DisplayedContentSample;",
2233 (void*)nativeGetDisplayedContentSample },
2234 {"nativeSetGeometry", "(JJLandroid/graphics/Rect;Landroid/graphics/Rect;J)V",
2235 (void*)nativeSetGeometry },
2236 {"nativeSetBuffer", "(JJLandroid/hardware/HardwareBuffer;JLjava/util/function/Consumer;)V",
2237 (void*)nativeSetBuffer },
2238 {"nativeUnsetBuffer", "(JJ)V", (void*)nativeUnsetBuffer },
2239
2240 {"nativeSetBufferTransform", "(JJI)V", (void*) nativeSetBufferTransform},
2241 {"nativeSetDataSpace", "(JJI)V",
2242 (void*)nativeSetDataSpace },
2243 {"nativeSetExtendedRangeBrightness", "(JJFF)V",
2244 (void*)nativeSetExtendedRangeBrightness },
2245 {"nativeSetCachingHint", "(JJI)V",
2246 (void*)nativeSetCachingHint },
2247 {"nativeAddWindowInfosReportedListener", "(JLjava/lang/Runnable;)V",
2248 (void*)nativeAddWindowInfosReportedListener },
2249 {"nativeGetDisplayBrightnessSupport", "(Landroid/os/IBinder;)Z",
2250 (void*)nativeGetDisplayBrightnessSupport },
2251 {"nativeSetDisplayBrightness", "(Landroid/os/IBinder;FFFF)Z",
2252 (void*)nativeSetDisplayBrightness },
2253 {"nativeReadTransactionFromParcel", "(Landroid/os/Parcel;)J",
2254 (void*)nativeReadTransactionFromParcel },
2255 {"nativeWriteTransactionToParcel", "(JLandroid/os/Parcel;)V",
2256 (void*)nativeWriteTransactionToParcel },
2257 {"nativeClearTransaction", "(J)V",
2258 (void*)nativeClearTransaction },
2259 {"nativeMirrorSurface", "(J)J",
2260 (void*)nativeMirrorSurface },
2261 {"nativeSetGlobalShadowSettings", "([F[FFFF)V",
2262 (void*)nativeSetGlobalShadowSettings },
2263 {"nativeGetDisplayDecorationSupport",
2264 "(Landroid/os/IBinder;)Landroid/hardware/graphics/common/DisplayDecorationSupport;",
2265 (void*)nativeGetDisplayDecorationSupport},
2266 {"nativeGetHandle", "(J)J",
2267 (void*)nativeGetHandle },
2268 {"nativeSetFixedTransformHint", "(JJI)V",
2269 (void*)nativeSetFixedTransformHint},
2270 {"nativeSetFocusedWindow", "(JLandroid/os/IBinder;Ljava/lang/String;I)V",
2271 (void*)nativeSetFocusedWindow},
2272 {"nativeRemoveCurrentInputFocus", "(JI)V",
2273 (void*)nativeRemoveCurrentInputFocus},
2274 {"nativeSetFrameTimelineVsync", "(JJ)V",
2275 (void*)nativeSetFrameTimelineVsync },
2276 {"nativeAddJankDataListener", "(JJ)V",
2277 (void*)nativeAddJankDataListener },
2278 {"nativeRemoveJankDataListener", "(J)V",
2279 (void*)nativeRemoveJankDataListener },
2280 {"nativeCreateJankDataListenerWrapper", "(Landroid/view/SurfaceControl$OnJankDataListener;)J",
2281 (void*)nativeCreateJankDataListenerWrapper },
2282 {"nativeGetGPUContextPriority", "()I",
2283 (void*)nativeGetGPUContextPriority },
2284 {"nativeSetTransformHint", "(JI)V",
2285 (void*)nativeSetTransformHint },
2286 {"nativeGetTransformHint", "(J)I",
2287 (void*)nativeGetTransformHint },
2288 {"nativeSetTrustedOverlay", "(JJZ)V",
2289 (void*)nativeSetTrustedOverlay },
2290 {"nativeGetLayerId", "(J)I",
2291 (void*)nativeGetLayerId },
2292 {"nativeSetDropInputMode", "(JJI)V",
2293 (void*)nativeSetDropInputMode },
2294 {"nativeSurfaceFlushJankData", "(J)V",
2295 (void*)nativeSurfaceFlushJankData },
2296 {"nativeAddTransactionCommittedListener", "(JLandroid/view/SurfaceControl$TransactionCommittedListener;)V",
2297 (void*) nativeAddTransactionCommittedListener },
2298 {"nativeSetTrustedPresentationCallback", "(JJJLandroid/view/SurfaceControl$TrustedPresentationThresholds;)V",
2299 (void*) nativeSetTrustedPresentationCallback },
2300 {"nativeClearTrustedPresentationCallback", "(JJ)V",
2301 (void*) nativeClearTrustedPresentationCallback },
2302 {"nativeSanitize", "(JII)V",
2303 (void*) nativeSanitize },
2304 {"nativeSetDestinationFrame", "(JJIIII)V",
2305 (void*)nativeSetDestinationFrame },
2306 {"nativeSetDefaultApplyToken", "(Landroid/os/IBinder;)V",
2307 (void*)nativeSetDefaultApplyToken },
2308 {"nativeGetDefaultApplyToken", "()Landroid/os/IBinder;",
2309 (void*)nativeGetDefaultApplyToken },
2310 {"nativeBootFinished", "()Z",
2311 (void*)nativeBootFinished },
2312 {"nativeCreateTpc", "(Landroid/view/SurfaceControl$TrustedPresentationCallback;)J",
2313 (void*)nativeCreateTpc},
2314 {"getNativeTrustedPresentationCallbackFinalizer", "()J", (void*)getNativeTrustedPresentationCallbackFinalizer },
2315 {"nativeGetStalledTransactionInfo", "(I)Landroid/gui/StalledTransactionInfo;",
2316 (void*) nativeGetStalledTransactionInfo },
2317 // clang-format on
2318 };
2319
register_android_view_SurfaceControl(JNIEnv * env)2320 int register_android_view_SurfaceControl(JNIEnv* env)
2321 {
2322 int err = RegisterMethodsOrDie(env, "android/view/SurfaceControl",
2323 sSurfaceControlMethods, NELEM(sSurfaceControlMethods));
2324
2325 jclass integerClass = FindClassOrDie(env, "java/lang/Integer");
2326 gIntegerClassInfo.clazz = MakeGlobalRefOrDie(env, integerClass);
2327 gIntegerClassInfo.ctor = GetMethodIDOrDie(env, gIntegerClassInfo.clazz, "<init>", "(I)V");
2328
2329 jclass runnableClazz = FindClassOrDie(env, "java/lang/Runnable");
2330 gRunnableClassInfo.clazz = MakeGlobalRefOrDie(env, runnableClazz);
2331 gRunnableClassInfo.run = GetMethodIDOrDie(env, runnableClazz, "run", "()V");
2332
2333 jclass infoClazz = FindClassOrDie(env, "android/view/SurfaceControl$StaticDisplayInfo");
2334 gStaticDisplayInfoClassInfo.clazz = MakeGlobalRefOrDie(env, infoClazz);
2335 gStaticDisplayInfoClassInfo.ctor = GetMethodIDOrDie(env, infoClazz, "<init>", "()V");
2336 gStaticDisplayInfoClassInfo.isInternal = GetFieldIDOrDie(env, infoClazz, "isInternal", "Z");
2337 gStaticDisplayInfoClassInfo.density = GetFieldIDOrDie(env, infoClazz, "density", "F");
2338 gStaticDisplayInfoClassInfo.secure = GetFieldIDOrDie(env, infoClazz, "secure", "Z");
2339 gStaticDisplayInfoClassInfo.deviceProductInfo =
2340 GetFieldIDOrDie(env, infoClazz, "deviceProductInfo",
2341 "Landroid/hardware/display/DeviceProductInfo;");
2342 gStaticDisplayInfoClassInfo.installOrientation =
2343 GetFieldIDOrDie(env, infoClazz, "installOrientation", "I");
2344
2345 jclass dynamicInfoClazz = FindClassOrDie(env, "android/view/SurfaceControl$DynamicDisplayInfo");
2346 gDynamicDisplayInfoClassInfo.clazz = MakeGlobalRefOrDie(env, dynamicInfoClazz);
2347 gDynamicDisplayInfoClassInfo.ctor = GetMethodIDOrDie(env, dynamicInfoClazz, "<init>", "()V");
2348 gDynamicDisplayInfoClassInfo.supportedDisplayModes =
2349 GetFieldIDOrDie(env, dynamicInfoClazz, "supportedDisplayModes",
2350 "[Landroid/view/SurfaceControl$DisplayMode;");
2351 gDynamicDisplayInfoClassInfo.activeDisplayModeId =
2352 GetFieldIDOrDie(env, dynamicInfoClazz, "activeDisplayModeId", "I");
2353 gDynamicDisplayInfoClassInfo.renderFrameRate =
2354 GetFieldIDOrDie(env, dynamicInfoClazz, "renderFrameRate", "F");
2355 gDynamicDisplayInfoClassInfo.supportedColorModes =
2356 GetFieldIDOrDie(env, dynamicInfoClazz, "supportedColorModes", "[I");
2357 gDynamicDisplayInfoClassInfo.activeColorMode =
2358 GetFieldIDOrDie(env, dynamicInfoClazz, "activeColorMode", "I");
2359 gDynamicDisplayInfoClassInfo.hdrCapabilities =
2360 GetFieldIDOrDie(env, dynamicInfoClazz, "hdrCapabilities",
2361 "Landroid/view/Display$HdrCapabilities;");
2362 gDynamicDisplayInfoClassInfo.autoLowLatencyModeSupported =
2363 GetFieldIDOrDie(env, dynamicInfoClazz, "autoLowLatencyModeSupported", "Z");
2364 gDynamicDisplayInfoClassInfo.gameContentTypeSupported =
2365 GetFieldIDOrDie(env, dynamicInfoClazz, "gameContentTypeSupported", "Z");
2366 gDynamicDisplayInfoClassInfo.preferredBootDisplayMode =
2367 GetFieldIDOrDie(env, dynamicInfoClazz, "preferredBootDisplayMode", "I");
2368
2369 jclass modeClazz = FindClassOrDie(env, "android/view/SurfaceControl$DisplayMode");
2370 gDisplayModeClassInfo.clazz = MakeGlobalRefOrDie(env, modeClazz);
2371 gDisplayModeClassInfo.ctor = GetMethodIDOrDie(env, modeClazz, "<init>", "()V");
2372 gDisplayModeClassInfo.id = GetFieldIDOrDie(env, modeClazz, "id", "I");
2373 gDisplayModeClassInfo.width = GetFieldIDOrDie(env, modeClazz, "width", "I");
2374 gDisplayModeClassInfo.height = GetFieldIDOrDie(env, modeClazz, "height", "I");
2375 gDisplayModeClassInfo.xDpi = GetFieldIDOrDie(env, modeClazz, "xDpi", "F");
2376 gDisplayModeClassInfo.yDpi = GetFieldIDOrDie(env, modeClazz, "yDpi", "F");
2377 gDisplayModeClassInfo.refreshRate = GetFieldIDOrDie(env, modeClazz, "refreshRate", "F");
2378 gDisplayModeClassInfo.appVsyncOffsetNanos =
2379 GetFieldIDOrDie(env, modeClazz, "appVsyncOffsetNanos", "J");
2380 gDisplayModeClassInfo.presentationDeadlineNanos =
2381 GetFieldIDOrDie(env, modeClazz, "presentationDeadlineNanos", "J");
2382 gDisplayModeClassInfo.group = GetFieldIDOrDie(env, modeClazz, "group", "I");
2383 gDisplayModeClassInfo.supportedHdrTypes =
2384 GetFieldIDOrDie(env, modeClazz, "supportedHdrTypes", "[I");
2385
2386 jclass frameStatsClazz = FindClassOrDie(env, "android/view/FrameStats");
2387 jfieldID undefined_time_nano_field = GetStaticFieldIDOrDie(env,
2388 frameStatsClazz, "UNDEFINED_TIME_NANO", "J");
2389 nsecs_t undefined_time_nano = env->GetStaticLongField(frameStatsClazz, undefined_time_nano_field);
2390
2391 jclass contFrameStatsClazz = FindClassOrDie(env, "android/view/WindowContentFrameStats");
2392 gWindowContentFrameStatsClassInfo.init = GetMethodIDOrDie(env,
2393 contFrameStatsClazz, "init", "(J[J[J[J)V");
2394 gWindowContentFrameStatsClassInfo.UNDEFINED_TIME_NANO = undefined_time_nano;
2395
2396 jclass animFrameStatsClazz = FindClassOrDie(env, "android/view/WindowAnimationFrameStats");
2397 gWindowAnimationFrameStatsClassInfo.init = GetMethodIDOrDie(env,
2398 animFrameStatsClazz, "init", "(J[J)V");
2399 gWindowAnimationFrameStatsClassInfo.UNDEFINED_TIME_NANO = undefined_time_nano;
2400
2401 jclass hdrCapabilitiesClazz = FindClassOrDie(env, "android/view/Display$HdrCapabilities");
2402 gHdrCapabilitiesClassInfo.clazz = MakeGlobalRefOrDie(env, hdrCapabilitiesClazz);
2403 gHdrCapabilitiesClassInfo.ctor = GetMethodIDOrDie(env, hdrCapabilitiesClazz, "<init>",
2404 "([IFFF)V");
2405
2406 jclass deviceProductInfoClazz =
2407 FindClassOrDie(env, "android/hardware/display/DeviceProductInfo");
2408 gDeviceProductInfoClassInfo.clazz = MakeGlobalRefOrDie(env, deviceProductInfoClazz);
2409 gDeviceProductInfoClassInfo.ctor =
2410 GetMethodIDOrDie(env, deviceProductInfoClazz, "<init>",
2411 "(Ljava/lang/String;"
2412 "Ljava/lang/String;"
2413 "Ljava/lang/String;"
2414 "Ljava/lang/Integer;"
2415 "Landroid/hardware/display/DeviceProductInfo$ManufactureDate;"
2416 "I)V");
2417
2418 jclass deviceProductInfoManufactureDateClazz =
2419 FindClassOrDie(env, "android/hardware/display/DeviceProductInfo$ManufactureDate");
2420 gDeviceProductInfoManufactureDateClassInfo.clazz =
2421 MakeGlobalRefOrDie(env, deviceProductInfoManufactureDateClazz);
2422 gDeviceProductInfoManufactureDateClassInfo.ctor =
2423 GetMethodIDOrDie(env, deviceProductInfoManufactureDateClazz, "<init>",
2424 "(Ljava/lang/Integer;Ljava/lang/Integer;)V");
2425
2426 jclass displayedContentSampleClazz = FindClassOrDie(env,
2427 "android/hardware/display/DisplayedContentSample");
2428 gDisplayedContentSampleClassInfo.clazz = MakeGlobalRefOrDie(env, displayedContentSampleClazz);
2429 gDisplayedContentSampleClassInfo.ctor = GetMethodIDOrDie(env,
2430 displayedContentSampleClazz, "<init>", "(J[J[J[J[J)V");
2431
2432 jclass displayedContentSamplingAttributesClazz = FindClassOrDie(env,
2433 "android/hardware/display/DisplayedContentSamplingAttributes");
2434 gDisplayedContentSamplingAttributesClassInfo.clazz = MakeGlobalRefOrDie(env,
2435 displayedContentSamplingAttributesClazz);
2436 gDisplayedContentSamplingAttributesClassInfo.ctor = GetMethodIDOrDie(env,
2437 displayedContentSamplingAttributesClazz, "<init>", "(III)V");
2438
2439 jclass cieXyzClazz = FindClassOrDie(env, "android/view/SurfaceControl$CieXyz");
2440 gCieXyzClassInfo.clazz = MakeGlobalRefOrDie(env, cieXyzClazz);
2441 gCieXyzClassInfo.ctor = GetMethodIDOrDie(env, gCieXyzClassInfo.clazz, "<init>", "()V");
2442 gCieXyzClassInfo.X = GetFieldIDOrDie(env, cieXyzClazz, "X", "F");
2443 gCieXyzClassInfo.Y = GetFieldIDOrDie(env, cieXyzClazz, "Y", "F");
2444 gCieXyzClassInfo.Z = GetFieldIDOrDie(env, cieXyzClazz, "Z", "F");
2445
2446 jclass displayPrimariesClazz = FindClassOrDie(env,
2447 "android/view/SurfaceControl$DisplayPrimaries");
2448 gDisplayPrimariesClassInfo.clazz = MakeGlobalRefOrDie(env, displayPrimariesClazz);
2449 gDisplayPrimariesClassInfo.ctor = GetMethodIDOrDie(env, gDisplayPrimariesClassInfo.clazz,
2450 "<init>", "()V");
2451 gDisplayPrimariesClassInfo.red = GetFieldIDOrDie(env, displayPrimariesClazz, "red",
2452 "Landroid/view/SurfaceControl$CieXyz;");
2453 gDisplayPrimariesClassInfo.green = GetFieldIDOrDie(env, displayPrimariesClazz, "green",
2454 "Landroid/view/SurfaceControl$CieXyz;");
2455 gDisplayPrimariesClassInfo.blue = GetFieldIDOrDie(env, displayPrimariesClazz, "blue",
2456 "Landroid/view/SurfaceControl$CieXyz;");
2457 gDisplayPrimariesClassInfo.white = GetFieldIDOrDie(env, displayPrimariesClazz, "white",
2458 "Landroid/view/SurfaceControl$CieXyz;");
2459
2460 jclass RefreshRateRangeClazz =
2461 FindClassOrDie(env, "android/view/SurfaceControl$RefreshRateRange");
2462 gRefreshRateRangeClassInfo.clazz = MakeGlobalRefOrDie(env, RefreshRateRangeClazz);
2463 gRefreshRateRangeClassInfo.ctor =
2464 GetMethodIDOrDie(env, gRefreshRateRangeClassInfo.clazz, "<init>", "(FF)V");
2465 gRefreshRateRangeClassInfo.min = GetFieldIDOrDie(env, RefreshRateRangeClazz, "min", "F");
2466 gRefreshRateRangeClassInfo.max = GetFieldIDOrDie(env, RefreshRateRangeClazz, "max", "F");
2467
2468 jclass RefreshRateRangesClazz =
2469 FindClassOrDie(env, "android/view/SurfaceControl$RefreshRateRanges");
2470 gRefreshRateRangesClassInfo.clazz = MakeGlobalRefOrDie(env, RefreshRateRangesClazz);
2471 gRefreshRateRangesClassInfo.ctor =
2472 GetMethodIDOrDie(env, gRefreshRateRangesClassInfo.clazz, "<init>",
2473 "(Landroid/view/SurfaceControl$RefreshRateRange;Landroid/view/"
2474 "SurfaceControl$RefreshRateRange;)V");
2475 gRefreshRateRangesClassInfo.physical =
2476 GetFieldIDOrDie(env, RefreshRateRangesClazz, "physical",
2477 "Landroid/view/SurfaceControl$RefreshRateRange;");
2478 gRefreshRateRangesClassInfo.render =
2479 GetFieldIDOrDie(env, RefreshRateRangesClazz, "render",
2480 "Landroid/view/SurfaceControl$RefreshRateRange;");
2481
2482 jclass DesiredDisplayModeSpecsClazz =
2483 FindClassOrDie(env, "android/view/SurfaceControl$DesiredDisplayModeSpecs");
2484 gDesiredDisplayModeSpecsClassInfo.clazz = MakeGlobalRefOrDie(env, DesiredDisplayModeSpecsClazz);
2485 gDesiredDisplayModeSpecsClassInfo.ctor =
2486 GetMethodIDOrDie(env, gDesiredDisplayModeSpecsClassInfo.clazz, "<init>",
2487 "(IZLandroid/view/SurfaceControl$RefreshRateRanges;Landroid/view/"
2488 "SurfaceControl$RefreshRateRanges;)V");
2489 gDesiredDisplayModeSpecsClassInfo.defaultMode =
2490 GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "defaultMode", "I");
2491 gDesiredDisplayModeSpecsClassInfo.allowGroupSwitching =
2492 GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "allowGroupSwitching", "Z");
2493 gDesiredDisplayModeSpecsClassInfo.primaryRanges =
2494 GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "primaryRanges",
2495 "Landroid/view/SurfaceControl$RefreshRateRanges;");
2496 gDesiredDisplayModeSpecsClassInfo.appRequestRanges =
2497 GetFieldIDOrDie(env, DesiredDisplayModeSpecsClazz, "appRequestRanges",
2498 "Landroid/view/SurfaceControl$RefreshRateRanges;");
2499
2500 jclass jankDataClazz =
2501 FindClassOrDie(env, "android/view/SurfaceControl$JankData");
2502 gJankDataClassInfo.clazz = MakeGlobalRefOrDie(env, jankDataClazz);
2503 gJankDataClassInfo.ctor =
2504 GetMethodIDOrDie(env, gJankDataClassInfo.clazz, "<init>", "(JI)V");
2505 jclass onJankDataListenerClazz =
2506 FindClassOrDie(env, "android/view/SurfaceControl$OnJankDataListener");
2507 gJankDataListenerClassInfo.clazz = MakeGlobalRefOrDie(env, onJankDataListenerClazz);
2508 gJankDataListenerClassInfo.onJankDataAvailable =
2509 GetMethodIDOrDie(env, onJankDataListenerClazz, "onJankDataAvailable",
2510 "([Landroid/view/SurfaceControl$JankData;)V");
2511
2512 jclass transactionCommittedListenerClazz =
2513 FindClassOrDie(env, "android/view/SurfaceControl$TransactionCommittedListener");
2514 gTransactionCommittedListenerClassInfo.clazz =
2515 MakeGlobalRefOrDie(env, transactionCommittedListenerClazz);
2516 gTransactionCommittedListenerClassInfo.onTransactionCommitted =
2517 GetMethodIDOrDie(env, transactionCommittedListenerClazz, "onTransactionCommitted",
2518 "()V");
2519
2520 jclass displayDecorationSupportClazz =
2521 FindClassOrDie(env, "android/hardware/graphics/common/DisplayDecorationSupport");
2522 gDisplayDecorationSupportInfo.clazz = MakeGlobalRefOrDie(env, displayDecorationSupportClazz);
2523 gDisplayDecorationSupportInfo.ctor =
2524 GetMethodIDOrDie(env, displayDecorationSupportClazz, "<init>", "()V");
2525 gDisplayDecorationSupportInfo.format =
2526 GetFieldIDOrDie(env, displayDecorationSupportClazz, "format", "I");
2527 gDisplayDecorationSupportInfo.alphaInterpretation =
2528 GetFieldIDOrDie(env, displayDecorationSupportClazz, "alphaInterpretation", "I");
2529
2530 jclass surfaceControlClazz = FindClassOrDie(env, "android/view/SurfaceControl");
2531 gSurfaceControlClassInfo.clazz = MakeGlobalRefOrDie(env, surfaceControlClazz);
2532 gSurfaceControlClassInfo.mNativeObject =
2533 GetFieldIDOrDie(env, gSurfaceControlClassInfo.clazz, "mNativeObject", "J");
2534 gSurfaceControlClassInfo.invokeReleaseCallback =
2535 GetStaticMethodIDOrDie(env, surfaceControlClazz, "invokeReleaseCallback",
2536 "(Ljava/util/function/Consumer;J)V");
2537
2538 jclass surfaceTransactionClazz = FindClassOrDie(env, "android/view/SurfaceControl$Transaction");
2539 gTransactionClassInfo.clazz = MakeGlobalRefOrDie(env, surfaceTransactionClazz);
2540 gTransactionClassInfo.mNativeObject =
2541 GetFieldIDOrDie(env, gTransactionClassInfo.clazz, "mNativeObject", "J");
2542
2543 jclass trustedPresentationThresholdsClazz =
2544 FindClassOrDie(env, "android/view/SurfaceControl$TrustedPresentationThresholds");
2545 gTrustedPresentationThresholdsClassInfo.clazz =
2546 MakeGlobalRefOrDie(env, trustedPresentationThresholdsClazz);
2547 gTrustedPresentationThresholdsClassInfo.mMinAlpha =
2548 GetFieldIDOrDie(env, trustedPresentationThresholdsClazz, "mMinAlpha", "F");
2549 gTrustedPresentationThresholdsClassInfo.mMinFractionRendered =
2550 GetFieldIDOrDie(env, trustedPresentationThresholdsClazz, "mMinFractionRendered", "F");
2551 gTrustedPresentationThresholdsClassInfo.mStabilityRequirementMs =
2552 GetFieldIDOrDie(env, trustedPresentationThresholdsClazz, "mStabilityRequirementMs",
2553 "I");
2554
2555 jclass trustedPresentationCallbackClazz =
2556 FindClassOrDie(env, "android/view/SurfaceControl$TrustedPresentationCallback");
2557 gTrustedPresentationCallbackClassInfo.onTrustedPresentationChanged =
2558 GetMethodIDOrDie(env, trustedPresentationCallbackClazz, "onTrustedPresentationChanged",
2559 "(Z)V");
2560
2561 jclass stalledTransactionInfoClazz = FindClassOrDie(env, "android/gui/StalledTransactionInfo");
2562 gStalledTransactionInfoClassInfo.clazz = MakeGlobalRefOrDie(env, stalledTransactionInfoClazz);
2563 gStalledTransactionInfoClassInfo.ctor =
2564 GetMethodIDOrDie(env, stalledTransactionInfoClazz, "<init>", "()V");
2565 gStalledTransactionInfoClassInfo.layerName =
2566 GetFieldIDOrDie(env, stalledTransactionInfoClazz, "layerName", "Ljava/lang/String;");
2567 gStalledTransactionInfoClassInfo.bufferId =
2568 GetFieldIDOrDie(env, stalledTransactionInfoClazz, "bufferId", "J");
2569 gStalledTransactionInfoClassInfo.frameNumber =
2570 GetFieldIDOrDie(env, stalledTransactionInfoClazz, "frameNumber", "J");
2571
2572 return err;
2573 }
2574
2575 } // namespace android
2576