summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Craig Donner <cdonner@google.com> 2017-02-24 16:02:08 -0800
committer Craig Donner <cdonner@google.com> 2017-02-27 13:48:49 -0800
commita5a719e97cbec30c8968dddf542d86788e1051a4 (patch)
tree0ce7b93ddb34f89c5db03fbccbf1add6cdda86f5
parentff192d371df0c239a973e2bd42d88aac32c9b7e3 (diff)
Add private consumer and producer flags to AHardwareBuffer.
This also generalizes and simplifies the flag conversion, making it more bulletproof in the future. To add more flags, just add new entries into the mapping arrays. Bug: 34050596 Bug: 35765937 Test: cts-tradefed run cts -m CtsNativeHardwareTestCases Also added new cc_test libs/nativewindow/tests to test gralloc flag conversion Change-Id: Ib96b277e837f2ab8c332f14df60e88580e3d868d
-rw-r--r--libs/nativewindow/AHardwareBuffer.cpp172
-rw-r--r--libs/nativewindow/Android.bp4
-rw-r--r--libs/nativewindow/include/android/hardware_buffer.h50
-rw-r--r--libs/nativewindow/include/private/android/AHardwareBufferHelpers.h17
-rw-r--r--libs/nativewindow/tests/AHardwareBufferTest.cpp186
-rw-r--r--libs/nativewindow/tests/Android.bp21
6 files changed, 382 insertions, 68 deletions
diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp
index b4b5303032..3fbab175f1 100644
--- a/libs/nativewindow/AHardwareBuffer.cpp
+++ b/libs/nativewindow/AHardwareBuffer.cpp
@@ -57,7 +57,8 @@ int AHardwareBuffer_allocate(const AHardwareBuffer_Desc* desc, AHardwareBuffer**
uint64_t producerUsage = 0;
uint64_t consumerUsage = 0;
- AHardwareBuffer_convertToGrallocUsageBits(desc->usage0, &producerUsage, &consumerUsage);
+ AHardwareBuffer_convertToGrallocUsageBits(&producerUsage, &consumerUsage, desc->usage0,
+ desc->usage1);
sp<GraphicBuffer> gbuffer(new GraphicBuffer(
desc->width, desc->height, format, desc->layers, producerUsage, consumerUsage,
@@ -97,9 +98,8 @@ void AHardwareBuffer_describe(const AHardwareBuffer* buffer,
outDesc->width = gbuffer->getWidth();
outDesc->height = gbuffer->getHeight();
outDesc->layers = gbuffer->getLayerCount();
- outDesc->usage0 = AHardwareBuffer_convertFromGrallocUsageBits(
+ AHardwareBuffer_convertFromGrallocUsageBits(&outDesc->usage0, &outDesc->usage1,
gbuffer->getUsage(), gbuffer->getUsage());
- outDesc->usage1 = 0;
outDesc->format = AHardwareBuffer_convertFromPixelFormat(
static_cast<uint32_t>(gbuffer->getPixelFormat()));
}
@@ -117,7 +117,7 @@ int AHardwareBuffer_lock(AHardwareBuffer* buffer, uint64_t usage0,
uint64_t producerUsage = 0;
uint64_t consumerUsage = 0;
- AHardwareBuffer_convertToGrallocUsageBits(usage0, &producerUsage, &consumerUsage);
+ AHardwareBuffer_convertToGrallocUsageBits(&producerUsage, &consumerUsage, usage0, 0);
GraphicBuffer* gBuffer = AHardwareBuffer_to_GraphicBuffer(buffer);
Rect bounds;
if (!rect) {
@@ -268,8 +268,76 @@ const struct native_handle* AHardwareBuffer_getNativeHandle(
namespace android {
+// A 1:1 mapping of AHardwaqreBuffer bitmasks to gralloc1 bitmasks.
+struct UsageMaskMapping {
+ uint64_t hardwareBufferMask;
+ uint64_t grallocMask;
+};
+
+static constexpr UsageMaskMapping kUsage0ProducerMapping[] = {
+ { AHARDWAREBUFFER_USAGE0_CPU_WRITE, GRALLOC1_PRODUCER_USAGE_CPU_WRITE },
+ { AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN, GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN },
+ { AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT, GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET },
+ { AHARDWAREBUFFER_USAGE0_PROTECTED_CONTENT, GRALLOC1_PRODUCER_USAGE_PROTECTED },
+ { AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA, GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA },
+};
+
+static constexpr UsageMaskMapping kUsage1ProducerMapping[] = {
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_0, GRALLOC1_PRODUCER_USAGE_PRIVATE_0 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_1, GRALLOC1_PRODUCER_USAGE_PRIVATE_1 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_2, GRALLOC1_PRODUCER_USAGE_PRIVATE_2 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_3, GRALLOC1_PRODUCER_USAGE_PRIVATE_3 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_4, GRALLOC1_PRODUCER_USAGE_PRIVATE_4 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_5, GRALLOC1_PRODUCER_USAGE_PRIVATE_5 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_6, GRALLOC1_PRODUCER_USAGE_PRIVATE_6 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_7, GRALLOC1_PRODUCER_USAGE_PRIVATE_7 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_8, GRALLOC1_PRODUCER_USAGE_PRIVATE_8 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_9, GRALLOC1_PRODUCER_USAGE_PRIVATE_9 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_10, GRALLOC1_PRODUCER_USAGE_PRIVATE_10 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_11, GRALLOC1_PRODUCER_USAGE_PRIVATE_11 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_12, GRALLOC1_PRODUCER_USAGE_PRIVATE_12 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_13, GRALLOC1_PRODUCER_USAGE_PRIVATE_13 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_14, GRALLOC1_PRODUCER_USAGE_PRIVATE_14 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_15, GRALLOC1_PRODUCER_USAGE_PRIVATE_15 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_16, GRALLOC1_PRODUCER_USAGE_PRIVATE_16 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_17, GRALLOC1_PRODUCER_USAGE_PRIVATE_17 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_18, GRALLOC1_PRODUCER_USAGE_PRIVATE_18 },
+ { AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_19, GRALLOC1_PRODUCER_USAGE_PRIVATE_19 },
+};
+
+static constexpr UsageMaskMapping kUsage0ConsumerMapping[] = {
+ { AHARDWAREBUFFER_USAGE0_CPU_READ, GRALLOC1_CONSUMER_USAGE_CPU_READ },
+ { AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN, GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN },
+ { AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE, GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE },
+ { AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER, GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER },
+ { AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE, GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER },
+};
+
+static constexpr UsageMaskMapping kUsage1ConsumerMapping[] = {
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_0, GRALLOC1_CONSUMER_USAGE_PRIVATE_0 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_1, GRALLOC1_CONSUMER_USAGE_PRIVATE_1 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_2, GRALLOC1_CONSUMER_USAGE_PRIVATE_2 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_3, GRALLOC1_CONSUMER_USAGE_PRIVATE_3 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_4, GRALLOC1_CONSUMER_USAGE_PRIVATE_4 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_5, GRALLOC1_CONSUMER_USAGE_PRIVATE_5 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_6, GRALLOC1_CONSUMER_USAGE_PRIVATE_6 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_7, GRALLOC1_CONSUMER_USAGE_PRIVATE_7 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_8, GRALLOC1_CONSUMER_USAGE_PRIVATE_8 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_9, GRALLOC1_CONSUMER_USAGE_PRIVATE_9 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_10, GRALLOC1_CONSUMER_USAGE_PRIVATE_10 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_11, GRALLOC1_CONSUMER_USAGE_PRIVATE_11 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_12, GRALLOC1_CONSUMER_USAGE_PRIVATE_12 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_13, GRALLOC1_CONSUMER_USAGE_PRIVATE_13 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_14, GRALLOC1_CONSUMER_USAGE_PRIVATE_14 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_15, GRALLOC1_CONSUMER_USAGE_PRIVATE_15 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_16, GRALLOC1_CONSUMER_USAGE_PRIVATE_16 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_17, GRALLOC1_CONSUMER_USAGE_PRIVATE_17 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_18, GRALLOC1_CONSUMER_USAGE_PRIVATE_18 },
+ { AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_19, GRALLOC1_CONSUMER_USAGE_PRIVATE_19 },
+};
+
static inline bool containsBits(uint64_t mask, uint64_t bitsToCheck) {
- return (mask & bitsToCheck) == bitsToCheck;
+ return (mask & bitsToCheck) == bitsToCheck && bitsToCheck;
}
uint32_t AHardwareBuffer_convertFromPixelFormat(uint32_t format) {
@@ -300,58 +368,56 @@ uint32_t AHardwareBuffer_convertToPixelFormat(uint32_t format) {
}
}
-void AHardwareBuffer_convertToGrallocUsageBits(uint64_t usage, uint64_t* outProducerUsage,
- uint64_t* outConsumerUsage) {
+void AHardwareBuffer_convertToGrallocUsageBits(uint64_t* outProducerUsage,
+ uint64_t* outConsumerUsage, uint64_t usage0, uint64_t usage1) {
*outProducerUsage = 0;
*outConsumerUsage = 0;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_CPU_READ))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_CPU_READ;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_CPU_WRITE))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_CPU_WRITE;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET;
- // Not sure what this should be.
- //if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_CUBEMAP)) bits |= 0;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE))
- *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_PROTECTED_CONTENT))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_PROTECTED;
- if (containsBits(usage, AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA))
- *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA;
+ for (const UsageMaskMapping& mapping : kUsage0ProducerMapping) {
+ if (containsBits(usage0, mapping.hardwareBufferMask)) {
+ *outProducerUsage |= mapping.grallocMask;
+ }
+ }
+ for (const UsageMaskMapping& mapping : kUsage1ProducerMapping) {
+ if (containsBits(usage1, mapping.hardwareBufferMask)) {
+ *outProducerUsage |= mapping.grallocMask;
+ }
+ }
+ for (const UsageMaskMapping& mapping : kUsage0ConsumerMapping) {
+ if (containsBits(usage0, mapping.hardwareBufferMask)) {
+ *outConsumerUsage |= mapping.grallocMask;
+ }
+ }
+ for (const UsageMaskMapping& mapping : kUsage1ConsumerMapping) {
+ if (containsBits(usage1, mapping.hardwareBufferMask)) {
+ *outConsumerUsage |= mapping.grallocMask;
+ }
+ }
}
-uint64_t AHardwareBuffer_convertFromGrallocUsageBits(uint64_t producerUsage, uint64_t consumerUsage) {
- uint64_t bits = 0;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_CPU_READ))
- bits |= AHARDWAREBUFFER_USAGE0_CPU_READ;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN))
- bits |= AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_CPU_WRITE))
- bits |= AHARDWAREBUFFER_USAGE0_CPU_WRITE;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN))
- bits |= AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE))
- bits |= AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET))
- bits |= AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER))
- bits |= AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER;
- if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER))
- bits |= AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_PROTECTED))
- bits |= AHARDWAREBUFFER_USAGE0_PROTECTED_CONTENT;
- if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA))
- bits |= AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA;
-
- return bits;
+void AHardwareBuffer_convertFromGrallocUsageBits(uint64_t* outUsage0, uint64_t* outUsage1,
+ uint64_t producerUsage, uint64_t consumerUsage) {
+ *outUsage0 = 0;
+ *outUsage1 = 0;
+ for (const UsageMaskMapping& mapping : kUsage0ProducerMapping) {
+ if (containsBits(producerUsage, mapping.grallocMask)) {
+ *outUsage0 |= mapping.hardwareBufferMask;
+ }
+ }
+ for (const UsageMaskMapping& mapping : kUsage1ProducerMapping) {
+ if (containsBits(producerUsage, mapping.grallocMask)) {
+ *outUsage1 |= mapping.hardwareBufferMask;
+ }
+ }
+ for (const UsageMaskMapping& mapping : kUsage0ConsumerMapping) {
+ if (containsBits(consumerUsage, mapping.grallocMask)) {
+ *outUsage0 |= mapping.hardwareBufferMask;
+ }
+ }
+ for (const UsageMaskMapping& mapping : kUsage1ConsumerMapping) {
+ if (containsBits(consumerUsage, mapping.grallocMask)) {
+ *outUsage1 |= mapping.hardwareBufferMask;
+ }
+ }
}
const GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(const AHardwareBuffer* buffer) {
diff --git a/libs/nativewindow/Android.bp b/libs/nativewindow/Android.bp
index 46e5d50721..d0e4161d04 100644
--- a/libs/nativewindow/Android.bp
+++ b/libs/nativewindow/Android.bp
@@ -13,7 +13,7 @@
// limitations under the License.
ndk_headers {
- name: "libnativewindwow_headers",
+ name: "libnativewindow_headers",
from: "include/android",
to: "android",
srcs: ["include/android/*.h"],
@@ -48,3 +48,5 @@ cc_library {
"libarect",
],
}
+
+subdirs = ["tests"]
diff --git a/libs/nativewindow/include/android/hardware_buffer.h b/libs/nativewindow/include/android/hardware_buffer.h
index 9c08c7b0b0..ef49995b74 100644
--- a/libs/nativewindow/include/android/hardware_buffer.h
+++ b/libs/nativewindow/include/android/hardware_buffer.h
@@ -97,10 +97,6 @@ enum {
AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE = 1ULL << 10,
/* The buffer will be written to by the GPU */
AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT = 1ULL << 11,
- /* The buffer will be read from and written to by the GPU */
- AHARDWAREBUFFER_USAGE0_GPU_STORAGE_IMAGE =
- AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE |
- AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT,
/* The buffer will be used as a cubemap texture */
AHARDWAREBUFFER_USAGE0_GPU_CUBEMAP = 1ULL << 13,
/* The buffer will be used as a shader storage or uniform buffer object*/
@@ -113,13 +109,57 @@ enum {
AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE = 1ULL << 21,
};
+/* These flags are intended only for use by device-specific graphics drivers. */
+enum {
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_19 = 1ULL << 24,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_19 = 1ULL << 25,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_18 = 1ULL << 26,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_18 = 1ULL << 27,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_17 = 1ULL << 28,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_17 = 1ULL << 29,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_16 = 1ULL << 30,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_16 = 1ULL << 31,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_15 = 1ULL << 32,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_15 = 1ULL << 33,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_14 = 1ULL << 34,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_14 = 1ULL << 35,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_13 = 1ULL << 36,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_13 = 1ULL << 37,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_12 = 1ULL << 38,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_12 = 1ULL << 39,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_11 = 1ULL << 40,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_11 = 1ULL << 41,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_10 = 1ULL << 42,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_10 = 1ULL << 43,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_9 = 1ULL << 44,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_9 = 1ULL << 45,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_8 = 1ULL << 46,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_8 = 1ULL << 47,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_7 = 1ULL << 48,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_7 = 1ULL << 49,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_6 = 1ULL << 50,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_6 = 1ULL << 51,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_5 = 1ULL << 52,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_5 = 1ULL << 53,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_4 = 1ULL << 54,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_4 = 1ULL << 55,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_3 = 1ULL << 56,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_3 = 1ULL << 57,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_2 = 1ULL << 58,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_2 = 1ULL << 59,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_1 = 1ULL << 60,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_1 = 1ULL << 61,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_0 = 1ULL << 62,
+ AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_0 = 1ULL << 63,
+};
+
typedef struct AHardwareBuffer_Desc {
uint32_t width;
uint32_t height;
uint32_t layers;
+ uint32_t format; // One of AHARDWAREBUFFER_FORMAT_*
uint64_t usage0; // Combination of AHARDWAREBUFFER_USAGE0_*
uint64_t usage1; // Initialize to zero, reserved for future use
- uint32_t format; // One of AHARDWAREBUFFER_FORMAT_*
} AHardwareBuffer_Desc;
typedef struct AHardwareBuffer AHardwareBuffer;
diff --git a/libs/nativewindow/include/private/android/AHardwareBufferHelpers.h b/libs/nativewindow/include/private/android/AHardwareBufferHelpers.h
index f138fa7787..612ee80f73 100644
--- a/libs/nativewindow/include/private/android/AHardwareBufferHelpers.h
+++ b/libs/nativewindow/include/private/android/AHardwareBufferHelpers.h
@@ -18,11 +18,11 @@
#define ANDROID_PRIVATE_NATIVE_AHARDWARE_BUFFER_HELPERS_H
/*
- * This file contains utility functions related to AHardwareBuffer, mostly to convert
- * to/from HAL formats.
+ * This file contains utility functions related to AHardwareBuffer, mostly to
+ * convert to/from HAL formats.
*
- * These are PRIVATE methods, so this file can NEVER appear in a public NDK header.
- * They are used by higher level libraries such as core/jni.
+ * These are PRIVATE methods, so this file can NEVER appear in a public NDK
+ * header. They are used by higher level libraries such as core/jni.
*/
#include <stdint.h>
@@ -35,12 +35,11 @@ uint32_t AHardwareBuffer_convertFromPixelFormat(uint32_t format);
uint32_t AHardwareBuffer_convertToPixelFormat(uint32_t format);
-void AHardwareBuffer_convertToGrallocUsageBits(uint64_t usage,
- uint64_t* outProducerUsage, uint64_t* outConsumerUsage);
-
-uint64_t AHardwareBuffer_convertFromGrallocUsageBits(
- uint64_t producerUsage, uint64_t consumerUsage);
+void AHardwareBuffer_convertToGrallocUsageBits(uint64_t* outProducerUsage,
+ uint64_t* outConsumerUsage, uint64_t usage0, uint64_t usage1);
+void AHardwareBuffer_convertFromGrallocUsageBits(uint64_t* outUsage0, uint64_t* outUsage1,
+ uint64_t producerUsage, uint64_t consumerUsage);
class GraphicBuffer;
const GraphicBuffer* AHardwareBuffer_to_GraphicBuffer(const AHardwareBuffer* buffer);
diff --git a/libs/nativewindow/tests/AHardwareBufferTest.cpp b/libs/nativewindow/tests/AHardwareBufferTest.cpp
new file mode 100644
index 0000000000..10990432c6
--- /dev/null
+++ b/libs/nativewindow/tests/AHardwareBufferTest.cpp
@@ -0,0 +1,186 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#define LOG_TAG "AHardwareBuffer_test"
+//#define LOG_NDEBUG 0
+
+#include <android/hardware_buffer.h>
+#include <private/android/AHardwareBufferHelpers.h>
+#include <hardware/gralloc1.h>
+
+#include <gtest/gtest.h>
+
+using namespace android;
+
+static ::testing::AssertionResult BuildHexFailureMessage(uint64_t expected,
+ uint64_t actual, const char* type) {
+ std::ostringstream ss;
+ ss << type << " 0x" << std::hex << actual
+ << " does not match expected " << type << " 0x" << std::hex
+ << expected;
+ return ::testing::AssertionFailure() << ss.str();
+}
+
+static ::testing::AssertionResult TestUsageConversion(
+ uint64_t grallocProducerUsage, uint64_t grallocConsumerUsage,
+ uint64_t hardwareBufferUsage0, uint64_t hardwareBufferUsage1) {
+ uint64_t producerUsage = 0;
+ uint64_t consumerUsage = 0;
+ uint64_t usage0 = 0;
+ uint64_t usage1 = 0;
+
+ AHardwareBuffer_convertToGrallocUsageBits(
+ &producerUsage, &consumerUsage, hardwareBufferUsage0, hardwareBufferUsage1);
+ if (producerUsage != grallocProducerUsage)
+ return BuildHexFailureMessage(grallocProducerUsage, producerUsage,
+ "producer");
+ if (consumerUsage != grallocConsumerUsage)
+ return BuildHexFailureMessage(grallocConsumerUsage, consumerUsage,
+ "consumer");
+
+ AHardwareBuffer_convertFromGrallocUsageBits(
+ &usage0, &usage1, grallocProducerUsage, grallocConsumerUsage);
+ if (usage0 != hardwareBufferUsage0)
+ return BuildHexFailureMessage(hardwareBufferUsage0, usage0, "usage0");
+ if (usage1 != hardwareBufferUsage1)
+ return BuildHexFailureMessage(hardwareBufferUsage1, usage1, "usage1");
+
+ return testing::AssertionSuccess();
+}
+
+// This is a unit test rather than going through AHardwareBuffer because not
+// all flags may be supported by the host device.
+TEST(AHardwareBufferTest, ConvertToAndFromGrallocBits) {
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_CPU_READ,
+ AHARDWAREBUFFER_USAGE0_CPU_READ, 0));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN,
+ AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN, 0));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_CPU_WRITE, 0,
+ AHARDWAREBUFFER_USAGE0_CPU_WRITE, 0));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN, 0,
+ AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN, 0));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE,
+ AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE, 0));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET,
+ 0, AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT, 0));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER,
+ AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER, 0));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PROTECTED, 0,
+ AHARDWAREBUFFER_USAGE0_PROTECTED_CONTENT, 0));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA,
+ 0, AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA, 0));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER,
+ AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE, 0));
+
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_0, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_0));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_1, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_1));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_2, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_2));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_3, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_3));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_4, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_4));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_5, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_5));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_6, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_6));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_7, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_7));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_8, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_8));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_9, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_9));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_10, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_10));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_11, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_11));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_12, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_12));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_13, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_13));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_14, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_14));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_15, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_15));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_16, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_16));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_17, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_17));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_18, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_18));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_PRIVATE_19, 0,
+ 0, AHARDWAREBUFFER_USAGE1_PRODUCER_PRIVATE_19));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_0,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_0));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_1,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_1));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_2,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_2));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_3,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_3));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_4,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_4));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_5,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_5));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_6,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_6));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_7,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_7));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_8,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_8));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_9,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_9));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_10,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_10));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_11,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_11));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_12,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_12));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_13,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_13));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_14,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_14));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_15,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_15));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_16,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_16));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_17,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_17));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_18,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_18));
+ EXPECT_TRUE(TestUsageConversion(0, GRALLOC1_CONSUMER_USAGE_PRIVATE_19,
+ 0, AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_19));
+
+ // Test some more complex flag combinations.
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_CPU_WRITE,
+ GRALLOC1_CONSUMER_USAGE_CPU_READ,
+ AHARDWAREBUFFER_USAGE0_CPU_READ | AHARDWAREBUFFER_USAGE0_CPU_WRITE,
+ 0));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN, 0,
+ AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN, 0));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET,
+ GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE |
+ GRALLOC1_CONSUMER_USAGE_PRIVATE_17,
+ AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT |
+ AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE,
+ AHARDWAREBUFFER_USAGE1_CONSUMER_PRIVATE_17));
+ EXPECT_TRUE(TestUsageConversion(GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA,
+ GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER,
+ AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER |
+ AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA, 0));
+}
diff --git a/libs/nativewindow/tests/Android.bp b/libs/nativewindow/tests/Android.bp
new file mode 100644
index 0000000000..437ab7546c
--- /dev/null
+++ b/libs/nativewindow/tests/Android.bp
@@ -0,0 +1,21 @@
+//
+// Copyright (C) 2017 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.
+//
+
+cc_test {
+ name: "AHardwareBufferTest",
+ shared_libs: ["libnativewindow"],
+ srcs: ["AHardwareBufferTest.cpp"],
+}