From 900510642a97bc1799bf82c6e1a938d17f345c81 Mon Sep 17 00:00:00 2001 From: Craig Donner Date: Thu, 2 Feb 2017 12:14:30 -0800 Subject: [PATCH] Use gralloc1 flags to allocate AHardwareBuffers Bug: 34939453 Test: cts-tradefed run cts -m CtsNativeHardwareTestCases Change-Id: I48add1b78c4e1409c0e787d6197f0582f0c3fb4c --- core/jni/android_hardware_HardwareBuffer.cpp | 70 +++++++++++-------- .../android_hardware_HardwareBuffer.h | 7 +- native/android/hardware_buffer.cpp | 29 +++++--- 3 files changed, 64 insertions(+), 42 deletions(-) diff --git a/core/jni/android_hardware_HardwareBuffer.cpp b/core/jni/android_hardware_HardwareBuffer.cpp index fadf8a47f7146..6cf5ccfa2d15b 100644 --- a/core/jni/android_hardware_HardwareBuffer.cpp +++ b/core/jni/android_hardware_HardwareBuffer.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -96,10 +97,15 @@ static jlong android_hardware_HardwareBuffer_create(JNIEnv* env, jobject clazz, } return NULL; } - uint32_t grallocUsage = android_hardware_HardwareBuffer_convertToGrallocUsageBits(usage, 0); + uint64_t producerUsage = 0; + uint64_t consumerUsage = 0; + android_hardware_HardwareBuffer_convertToGrallocUsageBits(usage, 0, &producerUsage, + &consumerUsage); status_t error; sp buffer(alloc->createGraphicBuffer(width, height, pixelFormat, - layers, grallocUsage, &error)); + layers, producerUsage, consumerUsage, + std::string("HardwareBuffer pid [") + std::to_string(getpid()) +"]", + &error)); if (buffer == NULL) { if (kDebugGraphicBuffer) { ALOGW("createGraphicBuffer() failed in HardwareBuffer.create()"); @@ -158,7 +164,7 @@ static jlong android_hardware_HardwareBuffer_getUsage(JNIEnv* env, jobject clazz, jlong nativeObject) { GraphicBuffer* buffer = GraphicBufferWrapper_to_GraphicBuffer(nativeObject); return android_hardware_HardwareBuffer_convertFromGrallocUsageBits( - buffer->getUsage()); + buffer->getUsage(), buffer->getUsage()); } // ---------------------------------------------------------------------------- @@ -261,52 +267,58 @@ uint32_t android_hardware_HardwareBuffer_convertToPixelFormat(uint32_t format) { } } -uint32_t android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage0, - uint64_t usage1) { - uint32_t bits = 0; +void android_hardware_HardwareBuffer_convertToGrallocUsageBits(uint64_t usage0, + uint64_t usage1, uint64_t* outProducerUsage, + uint64_t* outConsumerUsage) { + *outProducerUsage = 0; + *outConsumerUsage = 0; if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_CPU_READ)) - bits |= GRALLOC_USAGE_SW_READ_RARELY; + *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_CPU_READ; if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN)) - bits |= GRALLOC_USAGE_SW_READ_OFTEN; + *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN; if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_CPU_WRITE)) - bits |= GRALLOC_USAGE_SW_WRITE_RARELY; + *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_CPU_WRITE; if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN)) - bits |= GRALLOC_USAGE_SW_WRITE_OFTEN; + *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN; if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE)) - bits |= GRALLOC_USAGE_HW_TEXTURE; + *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE; if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT)) - bits |= GRALLOC_USAGE_HW_RENDER; + *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET; // Not sure what this should be. - if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_CUBEMAP)) bits |= 0; - //if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER) bits |= 0; + //if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_CUBEMAP)) bits |= 0; + if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_GPU_DATA_BUFFER)) + *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_GPU_DATA_BUFFER; if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_VIDEO_ENCODE)) - bits |= GRALLOC_USAGE_HW_VIDEO_ENCODER; + *outConsumerUsage |= GRALLOC1_CONSUMER_USAGE_VIDEO_ENCODER; if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_PROTECTED_CONTENT)) - bits |= GRALLOC_USAGE_PROTECTED; - - (void)usage1; - - return bits; + *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_PROTECTED; + if (containsBits(usage0, AHARDWAREBUFFER_USAGE0_SENSOR_DIRECT_DATA)) + *outProducerUsage |= GRALLOC1_PRODUCER_USAGE_SENSOR_DIRECT_DATA; } -uint64_t android_hardware_HardwareBuffer_convertFromGrallocUsageBits(uint64_t usage0) { +uint64_t android_hardware_HardwareBuffer_convertFromGrallocUsageBits( + uint64_t producerUsage, uint64_t consumerUsage) { uint64_t bits = 0; - if (containsBits(usage0, GRALLOC_USAGE_SW_READ_RARELY)) + if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_CPU_READ)) bits |= AHARDWAREBUFFER_USAGE0_CPU_READ; - if (containsBits(usage0, GRALLOC_USAGE_SW_READ_OFTEN)) + if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_CPU_READ_OFTEN)) bits |= AHARDWAREBUFFER_USAGE0_CPU_READ_OFTEN; - if (containsBits(usage0, GRALLOC_USAGE_SW_WRITE_RARELY)) + if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_CPU_WRITE)) bits |= AHARDWAREBUFFER_USAGE0_CPU_WRITE; - if (containsBits(usage0, GRALLOC_USAGE_SW_WRITE_OFTEN)) + if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_CPU_WRITE_OFTEN)) bits |= AHARDWAREBUFFER_USAGE0_CPU_WRITE_OFTEN; - if (containsBits(usage0, GRALLOC_USAGE_HW_TEXTURE)) + if (containsBits(consumerUsage, GRALLOC1_CONSUMER_USAGE_GPU_TEXTURE)) bits |= AHARDWAREBUFFER_USAGE0_GPU_SAMPLED_IMAGE; - if (containsBits(usage0, GRALLOC_USAGE_HW_RENDER)) + if (containsBits(producerUsage, GRALLOC1_PRODUCER_USAGE_GPU_RENDER_TARGET)) bits |= AHARDWAREBUFFER_USAGE0_GPU_COLOR_OUTPUT; - if (containsBits(usage0, GRALLOC_USAGE_HW_VIDEO_ENCODER)) + 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(usage0, GRALLOC_USAGE_PROTECTED)) + 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; } diff --git a/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h b/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h index 60e065cbd0e33..a5d0596dd98bd 100644 --- a/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h +++ b/core/jni/include/android_runtime/android_hardware_HardwareBuffer.h @@ -40,12 +40,13 @@ extern uint32_t android_hardware_HardwareBuffer_convertToPixelFormat( uint32_t format); /* Convert from AHARDWAREBUFFER_USAGE* flags to to gralloc usage flags. */ -extern uint32_t android_hardware_HardwareBuffer_convertToGrallocUsageBits( - uint64_t usage0, uint64_t usage1); +extern void android_hardware_HardwareBuffer_convertToGrallocUsageBits( + uint64_t usage0, uint64_t usage1, uint64_t* outProducerUsage, + uint64_t* outConsumerUsage); /* Convert from gralloc usage flags to to AHARDWAREBUFFER_USAGE0* flags. */ extern uint64_t android_hardware_HardwareBuffer_convertFromGrallocUsageBits( - uint64_t usage0); + uint64_t producerUsage, uint64_t consumerUsage); } // namespace android diff --git a/native/android/hardware_buffer.cpp b/native/android/hardware_buffer.cpp index 2f75c10d6764d..e5e928dee2a71 100644 --- a/native/android/hardware_buffer.cpp +++ b/native/android/hardware_buffer.cpp @@ -26,10 +26,11 @@ #include #include #include -#include #include +#include #include #include +#include #include #include #include @@ -96,10 +97,14 @@ int AHardwareBuffer_allocate(const AHardwareBuffer_Desc* desc, } status_t err; - uint32_t usage = android_hardware_HardwareBuffer_convertToGrallocUsageBits( - desc->usage0, desc->usage1); + uint64_t producerUsage = 0; + uint64_t consumerUsage = 0; + android_hardware_HardwareBuffer_convertToGrallocUsageBits(desc->usage0, + desc->usage1, &producerUsage, &consumerUsage); sp gbuffer = allocator->createGraphicBuffer(desc->width, - desc->height, format, desc->layers, usage, &err); + desc->height, format, desc->layers, producerUsage, consumerUsage, + std::string("AHardwareBuffer pid [") + std::to_string(getpid()) + + "]", &err); if (err != NO_ERROR) { return err; } @@ -131,7 +136,7 @@ void AHardwareBuffer_describe(const AHardwareBuffer* buffer, outDesc->layers = gbuffer->getLayerCount(); outDesc->usage0 = android_hardware_HardwareBuffer_convertFromGrallocUsageBits( - gbuffer->getUsage()); + gbuffer->getUsage(), gbuffer->getUsage()); outDesc->usage1 = 0; outDesc->format = android_hardware_HardwareBuffer_convertFromPixelFormat( static_cast(gbuffer->getPixelFormat())); @@ -148,15 +153,19 @@ int AHardwareBuffer_lock(AHardwareBuffer* buffer, uint64_t usage0, return BAD_VALUE; } - uint32_t usage = android_hardware_HardwareBuffer_convertToGrallocUsageBits( - usage0, 0); + uint64_t producerUsage = 0; + uint64_t consumerUsage = 0; + android_hardware_HardwareBuffer_convertToGrallocUsageBits(usage0, 0, + &producerUsage, &consumerUsage); GraphicBuffer* gBuffer = AHardwareBuffer_to_GraphicBuffer(buffer); + Rect bounds; if (!rect) { - return gBuffer->lockAsync(usage, outVirtualAddress, fence); + bounds.set(Rect(gBuffer->getWidth(), gBuffer->getHeight())); } else { - Rect bounds(rect->left, rect->top, rect->right, rect->bottom); - return gBuffer->lockAsync(usage, bounds, outVirtualAddress, fence); + bounds.set(Rect(rect->left, rect->top, rect->right, rect->bottom)); } + return gBuffer->lockAsync(producerUsage, consumerUsage, bounds, + outVirtualAddress, fence); } int AHardwareBuffer_unlock(AHardwareBuffer* buffer, int32_t* fence) {