164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown/*
264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * Copyright (C) 2012 The Android Open Source Project
364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown *
464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * you may not use this file except in compliance with the License.
664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * You may obtain a copy of the License at
764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown *
864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown *
1064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * Unless required by applicable law or agreed to in writing, software
1164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
1264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * See the License for the specific language governing permissions and
1464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown * limitations under the License.
1564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown */
1664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
1764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#define LOG_TAG "SurfaceSession"
1864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
1964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include "JNIHelp.h"
2064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
2164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <android_runtime/AndroidRuntime.h>
2264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <android_runtime/android_view_SurfaceSession.h>
2364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <utils/Log.h>
2464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <utils/RefBase.h>
2564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
2664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown#include <gui/SurfaceComposerClient.h>
27d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr#include <gui/Surface.h>
2864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
2964a55af0ac700baecb0877235eb42caac59a3560Jeff Brownnamespace android {
3064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
3164a55af0ac700baecb0877235eb42caac59a3560Jeff Brownstatic struct {
3264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jfieldID mNativeClient;
3364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} gSurfaceSessionClassInfo;
3464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
3564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
3664a55af0ac700baecb0877235eb42caac59a3560Jeff Brownsp<SurfaceComposerClient> android_view_SurfaceSession_getClient(
3764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown        JNIEnv* env, jobject surfaceSessionObj) {
3864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return reinterpret_cast<SurfaceComposerClient*>(
39a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhat            env->GetLongField(surfaceSessionObj, gSurfaceSessionClassInfo.mNativeClient));
4064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
4164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
4264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
43a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhatstatic jlong nativeCreate(JNIEnv* env, jclass clazz) {
4464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient* client = new SurfaceComposerClient();
45b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian    client->incStrong((void*)nativeCreate);
46a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhat    return reinterpret_cast<jlong>(client);
4764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
4864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
49d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carrstatic jlong nativeCreateScoped(JNIEnv* env, jclass clazz, jlong surfaceObject) {
50d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    Surface *parent = reinterpret_cast<Surface*>(surfaceObject);
51d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    SurfaceComposerClient* client = new SurfaceComposerClient(parent->getIGraphicBufferProducer());
52d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    client->incStrong((void*)nativeCreate);
53d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    return reinterpret_cast<jlong>(client);
54d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr}
55d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr
56a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhatstatic void nativeDestroy(JNIEnv* env, jclass clazz, jlong ptr) {
5764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient* client = reinterpret_cast<SurfaceComposerClient*>(ptr);
58b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian    client->decStrong((void*)nativeCreate);
5964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
6064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
61a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhatstatic void nativeKill(JNIEnv* env, jclass clazz, jlong ptr) {
6264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    SurfaceComposerClient* client = reinterpret_cast<SurfaceComposerClient*>(ptr);
6364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    client->dispose();
6464a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
6564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
6676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = {
6764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    /* name, signature, funcPtr */
68a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhat    { "nativeCreate", "()J",
6964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeCreate },
70d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr    { "nativeCreateScoped", "(J)J",
71d5c7dd6da810a6b89151b337bea79fd817e6b72aRobert Carr            (void*)nativeCreateScoped },
72a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhat    { "nativeDestroy", "(J)V",
7364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeDestroy },
74a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhat    { "nativeKill", "(J)V",
7564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            (void*)nativeKill }
7664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown};
7764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
7864a55af0ac700baecb0877235eb42caac59a3560Jeff Brownint register_android_view_SurfaceSession(JNIEnv* env) {
7964a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    int res = jniRegisterNativeMethods(env, "android/view/SurfaceSession",
8064a55af0ac700baecb0877235eb42caac59a3560Jeff Brown            gMethods, NELEM(gMethods));
8164a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
8264a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
8364a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    jclass clazz = env->FindClass("android/view/SurfaceSession");
84a3850d8f8fc096a7195d34f05f45a4e29926e36cAshok Bhat    gSurfaceSessionClassInfo.mNativeClient = env->GetFieldID(clazz, "mNativeClient", "J");
8564a55af0ac700baecb0877235eb42caac59a3560Jeff Brown    return 0;
8664a55af0ac700baecb0877235eb42caac59a3560Jeff Brown}
8764a55af0ac700baecb0877235eb42caac59a3560Jeff Brown
8864a55af0ac700baecb0877235eb42caac59a3560Jeff Brown} // namespace android
89