diff options
-rw-r--r-- | libs/nativewindow/AHardwareBuffer.cpp | 172 | ||||
-rw-r--r-- | libs/nativewindow/Android.bp | 4 | ||||
-rw-r--r-- | libs/nativewindow/include/android/hardware_buffer.h | 50 | ||||
-rw-r--r-- | libs/nativewindow/include/private/android/AHardwareBufferHelpers.h | 17 | ||||
-rw-r--r-- | libs/nativewindow/tests/AHardwareBufferTest.cpp | 186 | ||||
-rw-r--r-- | libs/nativewindow/tests/Android.bp | 21 |
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"], +} |