Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82839ebc authored by Bo Liu's avatar Bo Liu Committed by Android (Google) Code Review
Browse files

Merge "NDK methods to get SurfaceControl/Transction from java"

parents 5728b473 789103b9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -449,6 +449,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;
+44 −7
Original line number Diff line number Diff line
@@ -28,6 +28,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>
@@ -221,8 +222,14 @@ static struct {

static struct {
    jclass clazz;
    jfieldID mNativeObject;
} gTransactionClassInfo;

static struct {
    jclass clazz;
    jfieldID mNativeObject;
    jmethodID invokeReleaseCallback;
} gInvokeReleaseCallback;
} gSurfaceControlClassInfo;

constexpr ui::Dataspace pickDataspaceFromColorMode(const ui::ColorMode colorMode) {
    switch (colorMode) {
@@ -511,8 +518,9 @@ static ReleaseBufferCallback genReleaseCallback(JNIEnv* env, jobject releaseCall
        if (fenceCopy) {
            fenceCopy->incStrong(0);
        }
        globalCallbackRef->env()->CallStaticVoidMethod(gInvokeReleaseCallback.clazz,
                                                       gInvokeReleaseCallback.invokeReleaseCallback,
        globalCallbackRef->env()
                ->CallStaticVoidMethod(gSurfaceControlClassInfo.clazz,
                                       gSurfaceControlClassInfo.invokeReleaseCallback,
                                       globalCallbackRef->object(),
                                       reinterpret_cast<jlong>(fenceCopy));
    };
@@ -1906,6 +1914,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",
@@ -2306,11 +2336,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;
}

+38 −0
Original line number Diff line number Diff line
/*
 * 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
+2 −0
Original line number Diff line number Diff line
@@ -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
+14 −0
Original line number Diff line number Diff line
@@ -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);