NDK methods to get SurfaceControl/Transction from java
Test: ASurfaceControlTest#testSurfaceControl_fromSurfaceControl
and ASurfaceControlTest#testSurfaceTransaction_fromTransaction
Change-Id: Ic15bfaae22b50f70c1c82c8945c09b749654a00f
This commit is contained in:
@@ -447,6 +447,7 @@ public final class SurfaceControl implements Parcelable {
|
||||
private String mName;
|
||||
|
||||
/**
|
||||
* Note: do not rename, this field is used by native code.
|
||||
* @hide
|
||||
*/
|
||||
public long mNativeObject;
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <android_runtime/android_graphics_GraphicBuffer.h>
|
||||
#include <android_runtime/android_hardware_HardwareBuffer.h>
|
||||
#include <android_runtime/android_view_Surface.h>
|
||||
#include <android_runtime/android_view_SurfaceControl.h>
|
||||
#include <android_runtime/android_view_SurfaceSession.h>
|
||||
#include <gui/ISurfaceComposer.h>
|
||||
#include <gui/Surface.h>
|
||||
@@ -263,8 +264,14 @@ static struct {
|
||||
|
||||
static struct {
|
||||
jclass clazz;
|
||||
jfieldID mNativeObject;
|
||||
} gTransactionClassInfo;
|
||||
|
||||
static struct {
|
||||
jclass clazz;
|
||||
jfieldID mNativeObject;
|
||||
jmethodID invokeReleaseCallback;
|
||||
} gInvokeReleaseCallback;
|
||||
} gSurfaceControlClassInfo;
|
||||
|
||||
class JNamedColorSpace {
|
||||
public:
|
||||
@@ -720,10 +727,11 @@ static ReleaseBufferCallback genReleaseCallback(JNIEnv* env, jobject releaseCall
|
||||
if (fenceCopy) {
|
||||
fenceCopy->incStrong(0);
|
||||
}
|
||||
globalCallbackRef->env()->CallStaticVoidMethod(gInvokeReleaseCallback.clazz,
|
||||
gInvokeReleaseCallback.invokeReleaseCallback,
|
||||
globalCallbackRef->object(),
|
||||
reinterpret_cast<jlong>(fenceCopy));
|
||||
globalCallbackRef->env()
|
||||
->CallStaticVoidMethod(gSurfaceControlClassInfo.clazz,
|
||||
gSurfaceControlClassInfo.invokeReleaseCallback,
|
||||
globalCallbackRef->object(),
|
||||
reinterpret_cast<jlong>(fenceCopy));
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2129,6 +2137,28 @@ static jobject nativeGetDefaultApplyToken(JNIEnv* env, jclass clazz) {
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
SurfaceControl* android_view_SurfaceControl_getNativeSurfaceControl(JNIEnv* env,
|
||||
jobject surfaceControlObj) {
|
||||
if (!!surfaceControlObj &&
|
||||
env->IsInstanceOf(surfaceControlObj, gSurfaceControlClassInfo.clazz)) {
|
||||
return reinterpret_cast<SurfaceControl*>(
|
||||
env->GetLongField(surfaceControlObj, gSurfaceControlClassInfo.mNativeObject));
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
SurfaceComposerClient::Transaction* android_view_SurfaceTransaction_getNativeSurfaceTransaction(
|
||||
JNIEnv* env, jobject surfaceTransactionObj) {
|
||||
if (!!surfaceTransactionObj &&
|
||||
env->IsInstanceOf(surfaceTransactionObj, gTransactionClassInfo.clazz)) {
|
||||
return reinterpret_cast<SurfaceComposerClient::Transaction*>(
|
||||
env->GetLongField(surfaceTransactionObj, gTransactionClassInfo.mNativeObject));
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
static const JNINativeMethod sSurfaceControlMethods[] = {
|
||||
// clang-format off
|
||||
{"nativeCreate", "(Landroid/view/SurfaceSession;Ljava/lang/String;IIIIJLandroid/os/Parcel;)J",
|
||||
@@ -2594,11 +2624,18 @@ int register_android_view_SurfaceControl(JNIEnv* env)
|
||||
GetFieldIDOrDie(env, displayDecorationSupportClazz, "alphaInterpretation", "I");
|
||||
|
||||
jclass surfaceControlClazz = FindClassOrDie(env, "android/view/SurfaceControl");
|
||||
gInvokeReleaseCallback.clazz = MakeGlobalRefOrDie(env, surfaceControlClazz);
|
||||
gInvokeReleaseCallback.invokeReleaseCallback =
|
||||
gSurfaceControlClassInfo.clazz = MakeGlobalRefOrDie(env, surfaceControlClazz);
|
||||
gSurfaceControlClassInfo.mNativeObject =
|
||||
GetFieldIDOrDie(env, gSurfaceControlClassInfo.clazz, "mNativeObject", "J");
|
||||
gSurfaceControlClassInfo.invokeReleaseCallback =
|
||||
GetStaticMethodIDOrDie(env, surfaceControlClazz, "invokeReleaseCallback",
|
||||
"(Ljava/util/function/Consumer;J)V");
|
||||
|
||||
jclass surfaceTransactionClazz = FindClassOrDie(env, "android/view/SurfaceControl$Transaction");
|
||||
gTransactionClassInfo.clazz = MakeGlobalRefOrDie(env, surfaceTransactionClazz);
|
||||
gTransactionClassInfo.mNativeObject =
|
||||
GetFieldIDOrDie(env, gTransactionClassInfo.clazz, "mNativeObject", "J");
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright 2022 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#ifndef _ANDROID_VIEW_SURFACECONTROL_H
|
||||
#define _ANDROID_VIEW_SURFACECONTROL_H
|
||||
|
||||
#include <gui/SurfaceComposerClient.h>
|
||||
#include <gui/SurfaceControl.h>
|
||||
|
||||
#include "jni.h"
|
||||
|
||||
namespace android {
|
||||
|
||||
/* Gets the underlying native SurfaceControl for a java SurfaceControl. */
|
||||
extern SurfaceControl* android_view_SurfaceControl_getNativeSurfaceControl(
|
||||
JNIEnv* env, jobject surfaceControlObj);
|
||||
|
||||
/* Gets the underlying native SurfaceControl for a java SurfaceControl. */
|
||||
extern SurfaceComposerClient::Transaction*
|
||||
android_view_SurfaceTransaction_getNativeSurfaceTransaction(JNIEnv* env,
|
||||
jobject surfaceTransactionObj);
|
||||
|
||||
} // namespace android
|
||||
|
||||
#endif // _ANDROID_VIEW_SURFACECONTROL_H
|
||||
@@ -238,6 +238,7 @@ LIBANDROID {
|
||||
ASurfaceControl_createFromWindow; # introduced=29
|
||||
ASurfaceControl_acquire; # introduced=31
|
||||
ASurfaceControl_release; # introduced=29
|
||||
ASurfaceControl_fromSurfaceControl; # introduced=34
|
||||
ASurfaceTexture_acquireANativeWindow; # introduced=28
|
||||
ASurfaceTexture_attachToGLContext; # introduced=28
|
||||
ASurfaceTexture_detachFromGLContext; # introduced=28
|
||||
@@ -255,6 +256,7 @@ LIBANDROID {
|
||||
ASurfaceTransaction_apply; # introduced=29
|
||||
ASurfaceTransaction_create; # introduced=29
|
||||
ASurfaceTransaction_delete; # introduced=29
|
||||
ASurfaceTransaction_fromTransaction; # introduced=34
|
||||
ASurfaceTransaction_reparent; # introduced=29
|
||||
ASurfaceTransaction_setBuffer; # introduced=29
|
||||
ASurfaceTransaction_setBufferAlpha; # introduced=29
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
#include <android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h>
|
||||
#include <android/native_window.h>
|
||||
#include <android/surface_control.h>
|
||||
#include <android/surface_control_jni.h>
|
||||
#include <android_runtime/android_view_SurfaceControl.h>
|
||||
#include <configstore/Utils.h>
|
||||
#include <gui/HdrMetadata.h>
|
||||
#include <gui/ISurfaceComposer.h>
|
||||
@@ -28,6 +30,8 @@
|
||||
#include <ui/DynamicDisplayInfo.h>
|
||||
#include <utils/Timers.h>
|
||||
|
||||
#include <utility>
|
||||
|
||||
using namespace android::hardware::configstore;
|
||||
using namespace android::hardware::configstore::V1_0;
|
||||
using namespace android;
|
||||
@@ -134,6 +138,11 @@ void ASurfaceControl_release(ASurfaceControl* aSurfaceControl) {
|
||||
SurfaceControl_release(surfaceControl);
|
||||
}
|
||||
|
||||
ASurfaceControl* ASurfaceControl_fromSurfaceControl(JNIEnv* env, jobject surfaceControlObj) {
|
||||
return reinterpret_cast<ASurfaceControl*>(
|
||||
android_view_SurfaceControl_getNativeSurfaceControl(env, surfaceControlObj));
|
||||
}
|
||||
|
||||
struct ASurfaceControlStats {
|
||||
std::variant<int64_t, sp<Fence>> acquireTimeOrFence;
|
||||
sp<Fence> previousReleaseFence;
|
||||
@@ -190,6 +199,11 @@ void ASurfaceTransaction_delete(ASurfaceTransaction* aSurfaceTransaction) {
|
||||
delete transaction;
|
||||
}
|
||||
|
||||
ASurfaceTransaction* ASurfaceTransaction_fromTransaction(JNIEnv* env, jobject transactionObj) {
|
||||
return reinterpret_cast<ASurfaceTransaction*>(
|
||||
android_view_SurfaceTransaction_getNativeSurfaceTransaction(env, transactionObj));
|
||||
}
|
||||
|
||||
void ASurfaceTransaction_apply(ASurfaceTransaction* aSurfaceTransaction) {
|
||||
CHECK_NOT_NULL(aSurfaceTransaction);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user