Loading core/java/android/hardware/HardwareBuffer.java +5 −4 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; import dalvik.system.CloseGuard; Loading Loading @@ -141,8 +142,6 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { /** Usage: The buffer contains a complete mipmap hierarchy */ public static final long USAGE_GPU_MIPMAP_COMPLETE = 1 << 26; // The approximate size of a native AHardwareBuffer object. private static final long NATIVE_HARDWARE_BUFFER_SIZE = 232; /** * Creates a new <code>HardwareBuffer</code> instance. * Loading Loading @@ -239,10 +238,10 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private HardwareBuffer(long nativeObject) { mNativeObject = nativeObject; long bufferSize = nEstimateSize(nativeObject); ClassLoader loader = HardwareBuffer.class.getClassLoader(); NativeAllocationRegistry registry = new NativeAllocationRegistry( loader, nGetNativeFinalizer(), NATIVE_HARDWARE_BUFFER_SIZE); loader, nGetNativeFinalizer(), bufferSize); mCleaner = registry.registerNativeAllocation(this, mNativeObject); mCloseGuard.open("close"); } Loading Loading @@ -429,4 +428,6 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { private static native long nGetUsage(long nativeObject); private static native boolean nIsSupported(int width, int height, int format, int layers, long usage); @CriticalNative private static native long nEstimateSize(long nativeObject); } core/jni/android_hardware_HardwareBuffer.cpp +21 −1 Original line number Diff line number Diff line Loading @@ -30,8 +30,9 @@ #include <binder/Parcel.h> #include <ui/GraphicBuffer.h> #include <private/gui/ComposerService.h> #include <ui/GraphicBuffer.h> #include <ui/PixelFormat.h> #include <hardware/gralloc1.h> #include <grallocusage/GrallocUsageConversion.h> Loading Loading @@ -166,6 +167,20 @@ static jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env, return AHardwareBuffer_convertFromGrallocUsageBits(buffer->getUsage()); } static jlong android_hardware_HardwareBuffer_estimateSize(jlong nativeObject) { GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); uint32_t bpp = bytesPerPixel(buffer->getPixelFormat()); if (bpp == 0) { // If the pixel format is not recognized, use 1 as default. bpp = 1; } const uint32_t bufferStride = buffer->getStride() > 0 ? buffer->getStride() : buffer->getWidth(); return static_cast<jlong>(buffer->getHeight() * bufferStride * bpp); } // ---------------------------------------------------------------------------- // Serialization // ---------------------------------------------------------------------------- Loading Loading @@ -247,6 +262,7 @@ uint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usag const char* const kClassPathName = "android/hardware/HardwareBuffer"; // clang-format off static const JNINativeMethod gMethods[] = { { "nCreateHardwareBuffer", "(IIIIJ)J", (void*) android_hardware_HardwareBuffer_create }, Loading @@ -267,7 +283,11 @@ static const JNINativeMethod gMethods[] = { { "nGetFormat", "(J)I", (void*) android_hardware_HardwareBuffer_getFormat }, { "nGetLayers", "(J)I", (void*) android_hardware_HardwareBuffer_getLayers }, { "nGetUsage", "(J)J", (void*) android_hardware_HardwareBuffer_getUsage }, // --------------- @CriticalNative ---------------------- { "nEstimateSize", "(J)J", (void*) android_hardware_HardwareBuffer_estimateSize }, }; // clang-format on int register_android_hardware_HardwareBuffer(JNIEnv* env) { int err = RegisterMethodsOrDie(env, kClassPathName, gMethods, Loading Loading
core/java/android/hardware/HardwareBuffer.java +5 −4 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; import dalvik.system.CloseGuard; Loading Loading @@ -141,8 +142,6 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { /** Usage: The buffer contains a complete mipmap hierarchy */ public static final long USAGE_GPU_MIPMAP_COMPLETE = 1 << 26; // The approximate size of a native AHardwareBuffer object. private static final long NATIVE_HARDWARE_BUFFER_SIZE = 232; /** * Creates a new <code>HardwareBuffer</code> instance. * Loading Loading @@ -239,10 +238,10 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private HardwareBuffer(long nativeObject) { mNativeObject = nativeObject; long bufferSize = nEstimateSize(nativeObject); ClassLoader loader = HardwareBuffer.class.getClassLoader(); NativeAllocationRegistry registry = new NativeAllocationRegistry( loader, nGetNativeFinalizer(), NATIVE_HARDWARE_BUFFER_SIZE); loader, nGetNativeFinalizer(), bufferSize); mCleaner = registry.registerNativeAllocation(this, mNativeObject); mCloseGuard.open("close"); } Loading Loading @@ -429,4 +428,6 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { private static native long nGetUsage(long nativeObject); private static native boolean nIsSupported(int width, int height, int format, int layers, long usage); @CriticalNative private static native long nEstimateSize(long nativeObject); }
core/jni/android_hardware_HardwareBuffer.cpp +21 −1 Original line number Diff line number Diff line Loading @@ -30,8 +30,9 @@ #include <binder/Parcel.h> #include <ui/GraphicBuffer.h> #include <private/gui/ComposerService.h> #include <ui/GraphicBuffer.h> #include <ui/PixelFormat.h> #include <hardware/gralloc1.h> #include <grallocusage/GrallocUsageConversion.h> Loading Loading @@ -166,6 +167,20 @@ static jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env, return AHardwareBuffer_convertFromGrallocUsageBits(buffer->getUsage()); } static jlong android_hardware_HardwareBuffer_estimateSize(jlong nativeObject) { GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); uint32_t bpp = bytesPerPixel(buffer->getPixelFormat()); if (bpp == 0) { // If the pixel format is not recognized, use 1 as default. bpp = 1; } const uint32_t bufferStride = buffer->getStride() > 0 ? buffer->getStride() : buffer->getWidth(); return static_cast<jlong>(buffer->getHeight() * bufferStride * bpp); } // ---------------------------------------------------------------------------- // Serialization // ---------------------------------------------------------------------------- Loading Loading @@ -247,6 +262,7 @@ uint64_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usag const char* const kClassPathName = "android/hardware/HardwareBuffer"; // clang-format off static const JNINativeMethod gMethods[] = { { "nCreateHardwareBuffer", "(IIIIJ)J", (void*) android_hardware_HardwareBuffer_create }, Loading @@ -267,7 +283,11 @@ static const JNINativeMethod gMethods[] = { { "nGetFormat", "(J)I", (void*) android_hardware_HardwareBuffer_getFormat }, { "nGetLayers", "(J)I", (void*) android_hardware_HardwareBuffer_getLayers }, { "nGetUsage", "(J)J", (void*) android_hardware_HardwareBuffer_getUsage }, // --------------- @CriticalNative ---------------------- { "nEstimateSize", "(J)J", (void*) android_hardware_HardwareBuffer_estimateSize }, }; // clang-format on int register_android_hardware_HardwareBuffer(JNIEnv* env) { int err = RegisterMethodsOrDie(env, kClassPathName, gMethods, Loading