11a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner/*
21a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * Copyright (C) 2017 The Android Open Source Project
31a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner *
41a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * Licensed under the Apache License, Version 2.0 (the "License");
51a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * you may not use this file except in compliance with the License.
61a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * You may obtain a copy of the License at
71a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner *
81a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner *      http://www.apache.org/licenses/LICENSE-2.0
91a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner *
101a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * Unless required by applicable law or agreed to in writing, software
111a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * distributed under the License is distributed on an "AS IS" BASIS,
121a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * See the License for the specific language governing permissions and
141a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner * limitations under the License.
151a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner */
161a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
171a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#define LOG_TAG "HardwareBuffer"
181a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
191a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "jni.h"
201a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "JNIHelp.h"
211a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
221a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "android_os_Parcel.h"
231a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "android/graphics/GraphicsJNI.h"
241a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
251a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <android/hardware_buffer.h>
261a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <android_runtime/android_hardware_HardwareBuffer.h>
271a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <android_runtime/AndroidRuntime.h>
281a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <android_runtime/Log.h>
29fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian#include <private/android/AHardwareBufferHelpers.h>
301a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
311a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <binder/Parcel.h>
32fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian
33fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian#include <ui/GraphicBuffer.h>
341a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include <private/gui/ComposerService.h>
351a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
36fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian#include <hardware/gralloc1.h>
37f2c44a37352a4da6e8266cdf460b2c80b06bc294Chris Forbes#include <grallocusage/GrallocUsageConversion.h>
38fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian
391a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner#include "core_jni_helpers.h"
401a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
411a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerusing namespace android;
421a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
431a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
441a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Defines
451a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
461a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
471a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Debug
483027095761a0feaf72259eb0086590717aed8b13Craig Donnerstatic constexpr bool kDebugGraphicBuffer = false;
491a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
501a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
511a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Types
521a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
531a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
541a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic struct {
551a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jclass clazz;
561a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jfieldID mNativeObject;
571a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jmethodID ctor;
581a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner} gHardwareBufferClassInfo;
591a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
601a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerclass GraphicBufferWrapper {
611a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerpublic:
621a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    explicit GraphicBufferWrapper(const sp<GraphicBuffer>& buffer)
631a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            : buffer(buffer) {}
641a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
651a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    sp<GraphicBuffer> buffer;
661a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner};
671a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
681a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
691a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// HardwareBuffer lifecycle
701a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
711a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
721a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jlong android_hardware_HardwareBuffer_create(JNIEnv* env, jobject clazz,
731a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        jint width, jint height, jint format, jint layers, jlong usage) {
741a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
751a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    // TODO: update createGraphicBuffer to take two 64-bit values.
761a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    int pixelFormat = android_hardware_HardwareBuffer_convertToPixelFormat(format);
771a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    if (pixelFormat == 0) {
781a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        if (kDebugGraphicBuffer) {
791a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            ALOGW("createGraphicBufferAlloc() invalid pixel format in HardwareBuffer.create()");
801a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        }
811a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        return NULL;
821a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    }
832bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian
84910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopian    uint64_t grallocUsage = AHardwareBuffer_convertToGrallocUsageBits(usage);
852bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian    sp<GraphicBuffer> buffer = new GraphicBuffer(width, height, pixelFormat, layers,
86910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopian            grallocUsage, std::string("HardwareBuffer pid [") + std::to_string(getpid()) +"]");
872bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian    status_t error = buffer->initCheck();
882bd7d98fe844ebd6632a55eee9abf6d18651caf5Mathias Agopian    if (error < 0) {
891a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        if (kDebugGraphicBuffer) {
901a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            ALOGW("createGraphicBuffer() failed in HardwareBuffer.create()");
911a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        }
921a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        return NULL;
931a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    }
941a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
951a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer);
961a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return reinterpret_cast<jlong>(wrapper);
971a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
981a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
991a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic void destroyWrapper(GraphicBufferWrapper* wrapper) {
1001a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    delete wrapper;
1011a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1021a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
103fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopianstatic jlong android_hardware_HardwareBuffer_getNativeFinalizer(JNIEnv* env, jobject clazz) {
1041a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return static_cast<jlong>(reinterpret_cast<uintptr_t>(&destroyWrapper));
1051a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1061a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1071a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner//----------------------------------------------------------------------------
1081a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Accessors
1091a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
1101a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1111a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic inline GraphicBuffer* GraphicBufferWrapper_to_GraphicBuffer(
1121a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        jlong nativeObject) {
1131a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return reinterpret_cast<GraphicBufferWrapper*>(nativeObject)->buffer.get();
1141a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1151a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1161a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jint android_hardware_HardwareBuffer_getWidth(JNIEnv* env, jobject clazz,
1171a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jlong nativeObject) {
1181a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
1191a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return static_cast<jint>(buffer->getWidth());
1201a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1211a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1221a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jint android_hardware_HardwareBuffer_getHeight(JNIEnv* env,
1231a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jobject clazz, jlong nativeObject) {
1241a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
1251a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return static_cast<jint>(buffer->getHeight());
1261a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1271a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1281a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jint android_hardware_HardwareBuffer_getFormat(JNIEnv* env,
1291a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jobject clazz, jlong nativeObject) {
1301a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
1311a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return static_cast<jint>(android_hardware_HardwareBuffer_convertFromPixelFormat(
1321a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            buffer->getPixelFormat()));
1331a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1341a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1351a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jint android_hardware_HardwareBuffer_getLayers(JNIEnv* env,
1361a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jobject clazz, jlong nativeObject) {
1371a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
1381a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return static_cast<jint>(buffer->getLayerCount());
1391a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1401a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1411a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env,
1421a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jobject clazz, jlong nativeObject) {
1431a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
144910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopian    return AHardwareBuffer_convertFromGrallocUsageBits(buffer->getUsage());
1451a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1461a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1471a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
1481a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Serialization
1491a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
1501a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1511a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic void android_hardware_HardwareBuffer_write(JNIEnv* env, jobject clazz,
1521a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        jlong nativeObject, jobject dest) {
1531a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
1541a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    Parcel* parcel = parcelForJavaObject(env, dest);
1551a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    if (parcel) {
1561a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        parcel->write(*buffer);
1571a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    }
1581a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1591a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1601a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic jlong android_hardware_HardwareBuffer_read(JNIEnv* env, jobject clazz,
1611a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        jobject in) {
1621a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    Parcel* parcel = parcelForJavaObject(env, in);
1631a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    if (parcel) {
1641a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        sp<GraphicBuffer> buffer = new GraphicBuffer();
1651a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        parcel->read(*buffer);
1661a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        return reinterpret_cast<jlong>(new GraphicBufferWrapper(buffer));
1671a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    }
1681a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1691a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return NULL;
1701a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1711a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1721a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
1731a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// Public functions
1741a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
1751a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1761a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnernamespace android {
1771a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1781a4d07d9193f843ebf4403ef49bac4cd61d34165Craig DonnerAHardwareBuffer* android_hardware_HardwareBuffer_getNativeHardwareBuffer(
1791a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        JNIEnv* env, jobject hardwareBufferObj) {
1801a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    if (env->IsInstanceOf(hardwareBufferObj, gHardwareBufferClassInfo.clazz)) {
1811a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(
1821a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner                env->GetLongField(hardwareBufferObj, gHardwareBufferClassInfo.mNativeObject));
183fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian        return AHardwareBuffer_from_GraphicBuffer(buffer);
184fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian
1851a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    } else {
1861a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        return nullptr;
1871a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    }
1881a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
1891a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
1901a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerjobject android_hardware_HardwareBuffer_createFromAHardwareBuffer(
1911a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        JNIEnv* env, AHardwareBuffer* hardwareBuffer) {
192fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    GraphicBuffer* buffer = AHardwareBuffer_to_GraphicBuffer(hardwareBuffer);
1931a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    GraphicBufferWrapper* wrapper = new GraphicBufferWrapper(buffer);
1941a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jobject hardwareBufferObj = env->NewObject(gHardwareBufferClassInfo.clazz,
1951a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            gHardwareBufferClassInfo.ctor, reinterpret_cast<jlong>(wrapper));
1961a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    if (hardwareBufferObj == NULL) {
1971a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        delete wrapper;
1981a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        if (env->ExceptionCheck()) {
1991a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            ALOGE("Could not create instance of HardwareBuffer from AHardwareBuffer.");
2001a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            LOGE_EX(env);
2011a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            env->ExceptionClear();
2021a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        }
2031a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner        return nullptr;
2041a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    }
2051a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return hardwareBufferObj;
2061a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
2071a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2081a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donneruint32_t android_hardware_HardwareBuffer_convertFromPixelFormat(uint32_t format) {
209fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    return AHardwareBuffer_convertFromPixelFormat(format);
2101a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
2111a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2121a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donneruint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format) {
213fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    return AHardwareBuffer_convertToPixelFormat(format);
2141a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
2151a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
216910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopianuint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage) {
217910ab13e6639fa71b8004f4f0920dadbd41400cdMathias Agopian    return AHardwareBuffer_convertToGrallocUsageBits(usage);
2181a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
2191a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2201a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}  // namespace android
2211a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2221a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
2231a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// JNI Glue
2241a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner// ----------------------------------------------------------------------------
2251a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2261a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerconst char* const kClassPathName = "android/hardware/HardwareBuffer";
2271a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2281a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerstatic const JNINativeMethod gMethods[] = {
229fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    { "nCreateHardwareBuffer",  "(IIIIJ)J",
230fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian            (void*) android_hardware_HardwareBuffer_create },
231fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    { "nGetNativeFinalizer", "()J",
232fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian            (void*) android_hardware_HardwareBuffer_getNativeFinalizer },
2331a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    { "nWriteHardwareBufferToParcel",  "(JLandroid/os/Parcel;)V",
2341a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            (void*) android_hardware_HardwareBuffer_write },
2351a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    { "nReadHardwareBufferFromParcel", "(Landroid/os/Parcel;)J",
2361a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            (void*) android_hardware_HardwareBuffer_read },
2371a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2381a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    // --------------- @FastNative ----------------------
239fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    { "nGetWidth", "(J)I",      (void*) android_hardware_HardwareBuffer_getWidth },
240fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    { "nGetHeight", "(J)I",     (void*) android_hardware_HardwareBuffer_getHeight },
241fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    { "nGetFormat", "(J)I",     (void*) android_hardware_HardwareBuffer_getFormat },
242fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    { "nGetLayers", "(J)I",     (void*) android_hardware_HardwareBuffer_getLayers },
243fee4a985fd599e5bbfb0eb2d5d75af18ed8ae86eMathias Agopian    { "nGetUsage", "(J)J",      (void*) android_hardware_HardwareBuffer_getUsage },
2441a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner};
2451a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2461a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donnerint register_android_hardware_HardwareBuffer(JNIEnv* env) {
2471a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    int err = RegisterMethodsOrDie(env, kClassPathName, gMethods,
2481a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            NELEM(gMethods));
2491a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2501a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    jclass clazz = FindClassOrDie(env, "android/hardware/HardwareBuffer");
2511a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    gHardwareBufferClassInfo.clazz = MakeGlobalRefOrDie(env, clazz);
2521a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    gHardwareBufferClassInfo.mNativeObject = GetFieldIDOrDie(env,
2531a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            gHardwareBufferClassInfo.clazz, "mNativeObject", "J");
2541a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    gHardwareBufferClassInfo.ctor = GetMethodIDOrDie(env,
2551a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner            gHardwareBufferClassInfo.clazz, "<init>", "(J)V");
2561a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner
2571a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner    return err;
2581a4d07d9193f843ebf4403ef49bac4cd61d34165Craig Donner}
259