From 0589be587f54d3d568ae18c428f2acd8d8254d1b Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Fri, 19 Nov 2021 16:39:20 -0500 Subject: Fix memory leak in AHardwareBuffer_isSupported This function creates a new GraphicBuffer to call a single method on it. Wrap it in an sp<> so that it gets deleted when it's no longer necessary. Bug: NA Test: make and flash Change-Id: I443015d63245e49e8cf38847030c9da8142cbe50 --- libs/nativewindow/AHardwareBuffer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libs/nativewindow/AHardwareBuffer.cpp') diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp index e2f32e374a..d429551045 100644 --- a/libs/nativewindow/AHardwareBuffer.cpp +++ b/libs/nativewindow/AHardwareBuffer.cpp @@ -370,7 +370,7 @@ int AHardwareBuffer_isSupported(const AHardwareBuffer_Desc* desc) { if (!AHardwareBuffer_isValidDescription(desc, /*log=*/false)) return 0; bool supported = false; - GraphicBuffer* gBuffer = new GraphicBuffer(); + sp gBuffer(new GraphicBuffer()); status_t err = gBuffer->isSupported(desc->width, desc->height, desc->format, desc->layers, desc->usage, &supported); -- cgit v1.2.3-59-g8ed1b From 4d2588545fe9eee49a1ad5edeb4ff1c33e8081c0 Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Wed, 24 Nov 2021 14:40:53 -0500 Subject: Add AHB and Pixel- Formats for R8 Add AHARDWAREBUFFER_FORMAT_R8_UNORM and PIXEL_FORMAT_R_8. These will be used for an alpha 8 buffer representing the screen decorations. Enum value matches AIDL R_8 in I6f6b7f22e76609151a413ca6a6dbf55bd91911dd. Bug: 193170859 Test: make Change-Id: I4846327b29736ee811672801a683deb287342a8e --- libs/nativewindow/AHardwareBuffer.cpp | 8 +++++++- libs/nativewindow/include/android/hardware_buffer.h | 7 +++++++ libs/ui/DebugUtils.cpp | 2 ++ libs/ui/PixelFormat.cpp | 2 ++ libs/ui/include/ui/PixelFormat.h | 1 + services/surfaceflinger/BufferLayer.cpp | 11 ++++++----- services/surfaceflinger/BufferLayer.h | 2 +- 7 files changed, 26 insertions(+), 7 deletions(-) (limited to 'libs/nativewindow/AHardwareBuffer.cpp') diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp index d429551045..cb3361b431 100644 --- a/libs/nativewindow/AHardwareBuffer.cpp +++ b/libs/nativewindow/AHardwareBuffer.cpp @@ -30,7 +30,7 @@ #include #include - +#include static constexpr int kFdBufferSize = 128 * sizeof(int); // 128 ints @@ -588,8 +588,12 @@ bool AHardwareBuffer_isValidPixelFormat(uint32_t format) { "HAL and AHardwareBuffer pixel format don't match"); static_assert(HAL_PIXEL_FORMAT_YCBCR_422_I == AHARDWAREBUFFER_FORMAT_YCbCr_422_I, "HAL and AHardwareBuffer pixel format don't match"); + static_assert(static_cast(aidl::android::hardware::graphics::common::PixelFormat::R_8) == + AHARDWAREBUFFER_FORMAT_R8_UNORM, + "HAL and AHardwareBuffer pixel format don't match"); switch (format) { + case AHARDWAREBUFFER_FORMAT_R8_UNORM: case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM: case AHARDWAREBUFFER_FORMAT_R8G8B8X8_UNORM: case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: @@ -641,6 +645,8 @@ bool AHardwareBuffer_formatIsYuv(uint32_t format) { uint32_t AHardwareBuffer_bytesPerPixel(uint32_t format) { switch (format) { + case AHARDWAREBUFFER_FORMAT_R8_UNORM: + return 1; case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM: case AHARDWAREBUFFER_FORMAT_D16_UNORM: return 2; diff --git a/libs/nativewindow/include/android/hardware_buffer.h b/libs/nativewindow/include/android/hardware_buffer.h index d5e7cb299b..6f1f04df34 100644 --- a/libs/nativewindow/include/android/hardware_buffer.h +++ b/libs/nativewindow/include/android/hardware_buffer.h @@ -158,6 +158,13 @@ enum AHardwareBuffer_Format { * cube-maps or multi-layered textures. */ AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 = 0x23, + + /** + * Corresponding formats: + * Vulkan: VK_FORMAT_R8_UNORM + * OpenGL ES: GR_GL_R8 + */ + AHARDWAREBUFFER_FORMAT_R8_UNORM = 0x38, }; /** diff --git a/libs/ui/DebugUtils.cpp b/libs/ui/DebugUtils.cpp index 1f006ceb69..073da89758 100644 --- a/libs/ui/DebugUtils.cpp +++ b/libs/ui/DebugUtils.cpp @@ -302,6 +302,8 @@ std::string decodePixelFormat(android::PixelFormat format) { return std::string("RGB_565"); case android::PIXEL_FORMAT_BGRA_8888: return std::string("BGRA_8888"); + case android::PIXEL_FORMAT_R_8: + return std::string("R_8"); default: return StringPrintf("Unknown %#08x", format); } diff --git a/libs/ui/PixelFormat.cpp b/libs/ui/PixelFormat.cpp index d1925cb446..799fbc9d54 100644 --- a/libs/ui/PixelFormat.cpp +++ b/libs/ui/PixelFormat.cpp @@ -35,6 +35,8 @@ uint32_t bytesPerPixel(PixelFormat format) { case PIXEL_FORMAT_RGBA_5551: case PIXEL_FORMAT_RGBA_4444: return 2; + case PIXEL_FORMAT_R_8: + return 1; } return 0; } diff --git a/libs/ui/include/ui/PixelFormat.h b/libs/ui/include/ui/PixelFormat.h index 91ff39efd8..f422ce439e 100644 --- a/libs/ui/include/ui/PixelFormat.h +++ b/libs/ui/include/ui/PixelFormat.h @@ -62,6 +62,7 @@ enum { PIXEL_FORMAT_RGBA_4444 = 7, // 16-bit ARGB PIXEL_FORMAT_RGBA_FP16 = HAL_PIXEL_FORMAT_RGBA_FP16, // 64-bit RGBA PIXEL_FORMAT_RGBA_1010102 = HAL_PIXEL_FORMAT_RGBA_1010102, // 32-bit RGBA + PIXEL_FORMAT_R_8 = 0x38, }; typedef int32_t PixelFormat; diff --git a/services/surfaceflinger/BufferLayer.cpp b/services/surfaceflinger/BufferLayer.cpp index 494b61c51c..64ddd687ad 100644 --- a/services/surfaceflinger/BufferLayer.cpp +++ b/services/surfaceflinger/BufferLayer.cpp @@ -564,15 +564,16 @@ bool BufferLayer::isProtected() const { // hardware.h, instead of using hard-coded values here. #define HARDWARE_IS_DEVICE_FORMAT(f) ((f) >= 0x100 && (f) <= 0x1FF) -bool BufferLayer::getOpacityForFormat(uint32_t format) { +bool BufferLayer::getOpacityForFormat(PixelFormat format) { if (HARDWARE_IS_DEVICE_FORMAT(format)) { return true; } switch (format) { - case HAL_PIXEL_FORMAT_RGBA_8888: - case HAL_PIXEL_FORMAT_BGRA_8888: - case HAL_PIXEL_FORMAT_RGBA_FP16: - case HAL_PIXEL_FORMAT_RGBA_1010102: + case PIXEL_FORMAT_RGBA_8888: + case PIXEL_FORMAT_BGRA_8888: + case PIXEL_FORMAT_RGBA_FP16: + case PIXEL_FORMAT_RGBA_1010102: + case PIXEL_FORMAT_R_8: return false; } // in all other case, we have no blending (also for unknown formats) diff --git a/services/surfaceflinger/BufferLayer.h b/services/surfaceflinger/BufferLayer.h index a4c21f4caf..34d11ac579 100644 --- a/services/surfaceflinger/BufferLayer.h +++ b/services/surfaceflinger/BufferLayer.h @@ -153,7 +153,7 @@ protected: bool onPreComposition(nsecs_t) override; void preparePerFrameCompositionState() override; - static bool getOpacityForFormat(uint32_t format); + static bool getOpacityForFormat(PixelFormat format); // from graphics API const uint32_t mTextureName; -- cgit v1.2.3-59-g8ed1b From 6c09ee7f4ec0c38766f6de2ad922d85a5035f565 Mon Sep 17 00:00:00 2001 From: Chris Forbes Date: Wed, 26 Jan 2022 18:48:55 +1300 Subject: gralloc: Move validation of non-blob/gpu_data_buffer down to libui AIDL gralloc implementations may choose to support this combination. Existing implementations of HIDL gralloc 2/3/4 do not support it, and do not reliably reject it due to having been previously protected by validation at the AHardwareBuffer layer. Move the check down to the gralloc layer, and defer to the HAL only in the AIDL case. Bug: b/195944622 Test: build; real CTS/VTS to land soon after. Change-Id: I7b0b9de005a9b0f564915f9c71cc8aea3ef0618a --- libs/nativewindow/AHardwareBuffer.cpp | 4 ---- libs/ui/Gralloc2.cpp | 9 +++++++++ libs/ui/Gralloc3.cpp | 9 +++++++++ libs/ui/Gralloc4.cpp | 11 +++++++++++ 4 files changed, 29 insertions(+), 4 deletions(-) (limited to 'libs/nativewindow/AHardwareBuffer.cpp') diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp index cb3361b431..2578ee8467 100644 --- a/libs/nativewindow/AHardwareBuffer.cpp +++ b/libs/nativewindow/AHardwareBuffer.cpp @@ -509,10 +509,6 @@ bool AHardwareBuffer_isValidDescription(const AHardwareBuffer_Desc* desc, bool l ALOGE_IF(log, "AHARDWAREBUFFER_USAGE_SENSOR_DIRECT_DATA requires AHARDWAREBUFFER_FORMAT_BLOB"); return false; } - if (desc->usage & AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER) { - ALOGE_IF(log, "AHARDWAREBUFFER_USAGE_GPU_DATA_BUFFER requires AHARDWAREBUFFER_FORMAT_BLOB"); - return false; - } } if ((desc->usage & (AHARDWAREBUFFER_USAGE_CPU_READ_MASK | AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK)) && diff --git a/libs/ui/Gralloc2.cpp b/libs/ui/Gralloc2.cpp index 040a62b542..f23f10a1a9 100644 --- a/libs/ui/Gralloc2.cpp +++ b/libs/ui/Gralloc2.cpp @@ -110,6 +110,15 @@ status_t Gralloc2Mapper::validateBufferDescriptorInfo( descriptorInfo->usage & ~validUsageBits); return BAD_VALUE; } + + // Gralloc2 implementations never understand non-BLOB with GPU_DATA_BUFFER + // and do not reliably reject it. + if (descriptorInfo->usage & BufferUsage::GPU_DATA_BUFFER && + descriptorInfo->format != hardware::graphics::common::V1_1::PixelFormat::BLOB) { + ALOGE("gralloc2 does not support non-BLOB pixel formats with GPU_DATA_BUFFER usage"); + return BAD_VALUE; + } + return NO_ERROR; } diff --git a/libs/ui/Gralloc3.cpp b/libs/ui/Gralloc3.cpp index 882674f479..15c60bcadf 100644 --- a/libs/ui/Gralloc3.cpp +++ b/libs/ui/Gralloc3.cpp @@ -101,6 +101,15 @@ status_t Gralloc3Mapper::validateBufferDescriptorInfo( descriptorInfo->usage & ~validUsageBits); return BAD_VALUE; } + + // Gralloc3 implementations never understand non-BLOB with GPU_DATA_BUFFER + // and do not reliably reject it. + if (descriptorInfo->usage & BufferUsage::GPU_DATA_BUFFER && + descriptorInfo->format != hardware::graphics::common::V1_2::PixelFormat::BLOB) { + ALOGE("gralloc3 does not support non-BLOB pixel formats with GPU_DATA_BUFFER usage"); + return BAD_VALUE; + } + return NO_ERROR; } diff --git a/libs/ui/Gralloc4.cpp b/libs/ui/Gralloc4.cpp index e02632460f..9922d6afaf 100644 --- a/libs/ui/Gralloc4.cpp +++ b/libs/ui/Gralloc4.cpp @@ -41,6 +41,7 @@ using aidl::android::hardware::graphics::common::StandardMetadataType; using android::hardware::hidl_vec; using android::hardware::graphics::allocator::V4_0::IAllocator; using android::hardware::graphics::common::V1_2::BufferUsage; +using android::hardware::graphics::common::V1_2::PixelFormat; using android::hardware::graphics::mapper::V4_0::BufferDescriptor; using android::hardware::graphics::mapper::V4_0::Error; using android::hardware::graphics::mapper::V4_0::IMapper; @@ -120,6 +121,16 @@ static status_t validateBufferDescriptorInfo(IMapper::BufferDescriptorInfo* desc descriptorInfo->usage & ~validUsageBits); return BAD_VALUE; } + + // Combinations that are only allowed with gralloc 4.1. + // Previous grallocs must be protected from this. + if (!hasIAllocatorAidl() && + descriptorInfo->format != hardware::graphics::common::V1_2::PixelFormat::BLOB && + descriptorInfo->usage & BufferUsage::GPU_DATA_BUFFER) { + ALOGE("non-BLOB pixel format with GPU_DATA_BUFFER usage is not supported prior to gralloc 4.1"); + return BAD_VALUE; + } + return NO_ERROR; } -- cgit v1.2.3-59-g8ed1b From 240bb02edf757a51fb1480f1c812064ea6865a1a Mon Sep 17 00:00:00 2001 From: Jason Macnak Date: Fri, 11 Feb 2022 16:18:11 -0800 Subject: Add AHARDWAREBUFFER_FORMAT_YCBCR_P010 ... which corresponds to HAL_PIXEL_FORMAT_YCBCR_P010. (aosp/1982996) Bug: b/207388558 Test: build and boot Cuttlefish with P010 SwiftShader support Change-Id: Ia07db989845da4dfe1d26fa1541abd9d768ad92a --- libs/nativewindow/AHardwareBuffer.cpp | 4 ++++ libs/nativewindow/include/android/hardware_buffer.h | 8 ++++++++ 2 files changed, 12 insertions(+) (limited to 'libs/nativewindow/AHardwareBuffer.cpp') diff --git a/libs/nativewindow/AHardwareBuffer.cpp b/libs/nativewindow/AHardwareBuffer.cpp index 2578ee8467..381900e4ba 100644 --- a/libs/nativewindow/AHardwareBuffer.cpp +++ b/libs/nativewindow/AHardwareBuffer.cpp @@ -584,6 +584,8 @@ bool AHardwareBuffer_isValidPixelFormat(uint32_t format) { "HAL and AHardwareBuffer pixel format don't match"); static_assert(HAL_PIXEL_FORMAT_YCBCR_422_I == AHARDWAREBUFFER_FORMAT_YCbCr_422_I, "HAL and AHardwareBuffer pixel format don't match"); + static_assert(HAL_PIXEL_FORMAT_YCBCR_P010 == AHARDWAREBUFFER_FORMAT_YCbCr_P010, + "HAL and AHardwareBuffer pixel format don't match"); static_assert(static_cast(aidl::android::hardware::graphics::common::PixelFormat::R_8) == AHARDWAREBUFFER_FORMAT_R8_UNORM, "HAL and AHardwareBuffer pixel format don't match"); @@ -617,6 +619,7 @@ bool AHardwareBuffer_isValidPixelFormat(uint32_t format) { case AHARDWAREBUFFER_FORMAT_YCbCr_422_SP: case AHARDWAREBUFFER_FORMAT_YCrCb_420_SP: case AHARDWAREBUFFER_FORMAT_YCbCr_422_I: + case AHARDWAREBUFFER_FORMAT_YCbCr_P010: return true; default: @@ -633,6 +636,7 @@ bool AHardwareBuffer_formatIsYuv(uint32_t format) { case AHARDWAREBUFFER_FORMAT_YCbCr_422_SP: case AHARDWAREBUFFER_FORMAT_YCrCb_420_SP: case AHARDWAREBUFFER_FORMAT_YCbCr_422_I: + case AHARDWAREBUFFER_FORMAT_YCbCr_P010: return true; default: return false; diff --git a/libs/nativewindow/include/android/hardware_buffer.h b/libs/nativewindow/include/android/hardware_buffer.h index 6f1f04df34..c35507b6f1 100644 --- a/libs/nativewindow/include/android/hardware_buffer.h +++ b/libs/nativewindow/include/android/hardware_buffer.h @@ -159,6 +159,14 @@ enum AHardwareBuffer_Format { */ AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420 = 0x23, + /** + * YUV P010 format. + * Must have an even width and height. Can be accessed in OpenGL + * shaders through an external sampler. Does not support mip-maps + * cube-maps or multi-layered textures. + */ + AHARDWAREBUFFER_FORMAT_YCbCr_P010 = 0x36, + /** * Corresponding formats: * Vulkan: VK_FORMAT_R8_UNORM -- cgit v1.2.3-59-g8ed1b