HardwareBuffer API cleanups

Add getId()
Remove invalid format check
Unify ISE throwing

Fixes: 241943759
Test: atest android.hardware.cts.HardwareBufferTest

Change-Id: I656c30365a2fbf826193c7a398b03e61102c625f
Merged-In: I656c30365a2fbf826193c7a398b03e61102c625f
This commit is contained in:
John Reck
2022-08-10 09:32:13 -04:00
committed by Sungtak Lee
parent 5bdc4b86fa
commit 8d49e953eb
4 changed files with 32 additions and 72 deletions

View File

@@ -16888,6 +16888,7 @@ package android.hardware {
method public int describeContents(); method public int describeContents();
method public int getFormat(); method public int getFormat();
method public int getHeight(); method public int getHeight();
method public long getId();
method public int getLayers(); method public int getLayers();
method public long getUsage(); method public long getUsage();
method public int getWidth(); method public int getWidth();

View File

@@ -188,9 +188,6 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
public static HardwareBuffer create( public static HardwareBuffer create(
@IntRange(from = 1) int width, @IntRange(from = 1) int height, @IntRange(from = 1) int width, @IntRange(from = 1) int height,
@Format int format, @IntRange(from = 1) int layers, @Usage long usage) { @Format int format, @IntRange(from = 1) int layers, @Usage long usage) {
if (!HardwareBuffer.isSupportedFormat(format)) {
throw new IllegalArgumentException("Invalid pixel format " + format);
}
if (width <= 0) { if (width <= 0) {
throw new IllegalArgumentException("Invalid width " + width); throw new IllegalArgumentException("Invalid width " + width);
} }
@@ -226,9 +223,6 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
*/ */
public static boolean isSupported(@IntRange(from = 1) int width, @IntRange(from = 1) int height, public static boolean isSupported(@IntRange(from = 1) int width, @IntRange(from = 1) int height,
@Format int format, @IntRange(from = 1) int layers, @Usage long usage) { @Format int format, @IntRange(from = 1) int layers, @Usage long usage) {
if (!HardwareBuffer.isSupportedFormat(format)) {
throw new IllegalArgumentException("Invalid pixel format " + format);
}
if (width <= 0) { if (width <= 0) {
throw new IllegalArgumentException("Invalid width " + width); throw new IllegalArgumentException("Invalid width " + width);
} }
@@ -286,10 +280,7 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
* Returns the width of this buffer in pixels. * Returns the width of this buffer in pixels.
*/ */
public int getWidth() { public int getWidth() {
if (isClosed()) { checkClosed("width");
throw new IllegalStateException("This HardwareBuffer has been closed and its width "
+ "cannot be obtained.");
}
return nGetWidth(mNativeObject); return nGetWidth(mNativeObject);
} }
@@ -297,10 +288,7 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
* Returns the height of this buffer in pixels. * Returns the height of this buffer in pixels.
*/ */
public int getHeight() { public int getHeight() {
if (isClosed()) { checkClosed("height");
throw new IllegalStateException("This HardwareBuffer has been closed and its height "
+ "cannot be obtained.");
}
return nGetHeight(mNativeObject); return nGetHeight(mNativeObject);
} }
@@ -309,10 +297,7 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
*/ */
@Format @Format
public int getFormat() { public int getFormat() {
if (isClosed()) { checkClosed("format");
throw new IllegalStateException("This HardwareBuffer has been closed and its format "
+ "cannot be obtained.");
}
return nGetFormat(mNativeObject); return nGetFormat(mNativeObject);
} }
@@ -320,10 +305,7 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
* Returns the number of layers in this buffer. * Returns the number of layers in this buffer.
*/ */
public int getLayers() { public int getLayers() {
if (isClosed()) { checkClosed("layer count");
throw new IllegalStateException("This HardwareBuffer has been closed and its layer "
+ "count cannot be obtained.");
}
return nGetLayers(mNativeObject); return nGetLayers(mNativeObject);
} }
@@ -331,13 +313,26 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
* Returns the usage flags of the usage hints set on this buffer. * Returns the usage flags of the usage hints set on this buffer.
*/ */
public long getUsage() { public long getUsage() {
if (isClosed()) { checkClosed("usage");
throw new IllegalStateException("This HardwareBuffer has been closed and its usage "
+ "cannot be obtained.");
}
return nGetUsage(mNativeObject); return nGetUsage(mNativeObject);
} }
/**
* Returns the system-wide unique id for this buffer
*
*/
public long getId() {
checkClosed("id");
return nGetId(mNativeObject);
}
private void checkClosed(String name) {
if (isClosed()) {
throw new IllegalStateException("This HardwareBuffer has been closed and its "
+ name + " cannot be obtained.");
}
}
/** /**
* Destroys this buffer immediately. Calling this method frees up any * Destroys this buffer immediately. Calling this method frees up any
* underlying native resources. After calling this method, this buffer * underlying native resources. After calling this method, this buffer
@@ -407,36 +402,6 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
} }
}; };
/**
* Validates whether a particular format is supported by HardwareBuffer.
*
* @param format The format to validate.
*
* @return True if <code>format</code> is a supported format. false otherwise.
* See {@link #create(int, int, int, int, long)}.
*/
private static boolean isSupportedFormat(@Format int format) {
switch(format) {
case RGBA_8888:
case RGBA_FP16:
case RGBA_1010102:
case RGBX_8888:
case RGB_565:
case RGB_888:
case BLOB:
case YCBCR_420_888:
case D_16:
case D_24:
case DS_24UI8:
case D_FP32:
case DS_FP32UI8:
case S_UI8:
case YCBCR_P010:
return true;
}
return false;
}
private static native long nCreateHardwareBuffer(int width, int height, int format, int layers, private static native long nCreateHardwareBuffer(int width, int height, int format, int layers,
long usage); long usage);
private static native long nCreateFromGraphicBuffer(GraphicBuffer graphicBuffer); private static native long nCreateFromGraphicBuffer(GraphicBuffer graphicBuffer);
@@ -457,4 +422,6 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable {
long usage); long usage);
@CriticalNative @CriticalNative
private static native long nEstimateSize(long nativeObject); private static native long nEstimateSize(long nativeObject);
@CriticalNative
private static native long nGetId(long nativeObject);
} }

View File

@@ -163,7 +163,7 @@ static jint android_hardware_HardwareBuffer_getLayers(JNIEnv* env,
static jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env, static jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env,
jobject clazz, jlong nativeObject) { jobject clazz, jlong nativeObject) {
GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
return AHardwareBuffer_convertFromGrallocUsageBits(buffer->getUsage()); return static_cast<jlong>(AHardwareBuffer_convertFromGrallocUsageBits(buffer->getUsage()));
} }
static jlong android_hardware_HardwareBuffer_estimateSize(jlong nativeObject) { static jlong android_hardware_HardwareBuffer_estimateSize(jlong nativeObject) {
@@ -177,7 +177,12 @@ static jlong android_hardware_HardwareBuffer_estimateSize(jlong nativeObject) {
const uint32_t bufferStride = const uint32_t bufferStride =
buffer->getStride() > 0 ? buffer->getStride() : buffer->getWidth(); buffer->getStride() > 0 ? buffer->getStride() : buffer->getWidth();
return static_cast<jlong>(buffer->getHeight() * bufferStride * bpp); return static_cast<jlong>(static_cast<uint64_t>(buffer->getHeight() * bufferStride * bpp));
}
static jlong android_hardware_HardwareBuffer_getId(jlong nativeObject) {
GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject);
return static_cast<jlong>(buffer->getId());
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -223,16 +228,6 @@ AHardwareBuffer* android_hardware_HardwareBuffer_getNativeHardwareBuffer(
} }
} }
GraphicBuffer* android_hardware_HardwareBuffer_getNativeGraphicBuffer(
JNIEnv* env, jobject hardwareBufferObj) {
if (env->IsInstanceOf(hardwareBufferObj, gHardwareBufferClassInfo.clazz)) {
return GraphicBufferWrapper_to_GraphicBuffer(
env->GetLongField(hardwareBufferObj, gHardwareBufferClassInfo.mNativeObject));
} else {
return nullptr;
}
}
jobject android_hardware_HardwareBuffer_createFromAHardwareBuffer( jobject android_hardware_HardwareBuffer_createFromAHardwareBuffer(
JNIEnv* env, AHardwareBuffer* hardwareBuffer) { JNIEnv* env, AHardwareBuffer* hardwareBuffer) {
GraphicBuffer* buffer = AHardwareBuffer_to_GraphicBuffer(hardwareBuffer); GraphicBuffer* buffer = AHardwareBuffer_to_GraphicBuffer(hardwareBuffer);
@@ -295,6 +290,7 @@ static const JNINativeMethod gMethods[] = {
// --------------- @CriticalNative ---------------------- // --------------- @CriticalNative ----------------------
{ "nEstimateSize", "(J)J", (void*) android_hardware_HardwareBuffer_estimateSize }, { "nEstimateSize", "(J)J", (void*) android_hardware_HardwareBuffer_estimateSize },
{ "nGetId", "(J)J", (void*) android_hardware_HardwareBuffer_getId },
}; };
// clang-format on // clang-format on

View File

@@ -28,10 +28,6 @@ namespace android {
extern AHardwareBuffer* android_hardware_HardwareBuffer_getNativeHardwareBuffer( extern AHardwareBuffer* android_hardware_HardwareBuffer_getNativeHardwareBuffer(
JNIEnv* env, jobject hardwareBufferObj); JNIEnv* env, jobject hardwareBufferObj);
/* Gets the underlying GraphicBuffer for a HardwareBuffer. */
extern GraphicBuffer* android_hardware_HardwareBuffer_getNativeGraphicBuffer(
JNIEnv* env, jobject hardwareBufferObj);
/* Returns a HardwareBuffer wrapper for the underlying AHardwareBuffer. */ /* Returns a HardwareBuffer wrapper for the underlying AHardwareBuffer. */
extern jobject android_hardware_HardwareBuffer_createFromAHardwareBuffer( extern jobject android_hardware_HardwareBuffer_createFromAHardwareBuffer(
JNIEnv* env, AHardwareBuffer* hardwareBuffer); JNIEnv* env, AHardwareBuffer* hardwareBuffer);