diff options
author | 2018-12-29 14:17:29 -0800 | |
---|---|---|
committer | 2019-01-02 11:42:24 -0800 | |
commit | d380e2c463f461cba82536043c1b2cd573f678ef (patch) | |
tree | 1527f07c70bffaf241255ea5a93cf6e50cda13da | |
parent | 1e77925bd46c700787aaf3c55d2857e73f91232d (diff) |
gralloc: create a common gralloc interface
Create gralloc interface for allocator and mapper to hide the
implementation differences between Gralloc2 and Gralloc3.
Bug: 120493579
Test: manual
Change-Id: I21aa1954aa8b79f3e35616f188e15b47dae1f0e7
-rw-r--r-- | libs/ui/Android.bp | 1 | ||||
-rw-r--r-- | libs/ui/Gralloc.cpp | 27 | ||||
-rw-r--r-- | libs/ui/Gralloc2.cpp | 62 | ||||
-rw-r--r-- | libs/ui/GraphicBufferAllocator.cpp | 9 | ||||
-rw-r--r-- | libs/ui/GraphicBufferMapper.cpp | 8 | ||||
-rw-r--r-- | libs/ui/include/ui/Gralloc.h | 88 | ||||
-rw-r--r-- | libs/ui/include/ui/Gralloc2.h | 54 | ||||
-rw-r--r-- | libs/ui/include/ui/GraphicBufferAllocator.h | 7 | ||||
-rw-r--r-- | libs/ui/include/ui/GraphicBufferMapper.h | 13 |
9 files changed, 174 insertions, 95 deletions
diff --git a/libs/ui/Android.bp b/libs/ui/Android.bp index 956465c52a..84414e2121 100644 --- a/libs/ui/Android.bp +++ b/libs/ui/Android.bp @@ -60,6 +60,7 @@ cc_library_shared { "Fence.cpp", "FenceTime.cpp", "FrameStats.cpp", + "Gralloc.cpp", "Gralloc2.cpp", "GraphicBuffer.cpp", "GraphicBufferAllocator.cpp", diff --git a/libs/ui/Gralloc.cpp b/libs/ui/Gralloc.cpp new file mode 100644 index 0000000000..8e09a13b2c --- /dev/null +++ b/libs/ui/Gralloc.cpp @@ -0,0 +1,27 @@ +/* + * Copyright 2016 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 "Gralloc" + +#include <ui/Gralloc.h> + +namespace android { + +GrallocMapper::~GrallocMapper() {} + +GrallocAllocator::~GrallocAllocator() {} + +} // namespace android diff --git a/libs/ui/Gralloc2.cpp b/libs/ui/Gralloc2.cpp index d874911f83..c2f07326a1 100644 --- a/libs/ui/Gralloc2.cpp +++ b/libs/ui/Gralloc2.cpp @@ -35,8 +35,6 @@ using android::hardware::graphics::mapper::V2_0::YCbCrLayout; namespace android { -namespace Gralloc2 { - namespace { static constexpr Error kTransactionError = Error::NO_RESOURCES; @@ -65,8 +63,8 @@ uint64_t getValid11UsageBits() { return valid11UsageBits; } -static inline Gralloc2::IMapper::Rect sGralloc2Rect(const Rect& rect) { - Gralloc2::IMapper::Rect outRect{}; +static inline IMapper::Rect sGralloc2Rect(const Rect& rect) { + IMapper::Rect outRect{}; outRect.left = rect.left; outRect.top = rect.top; outRect.width = rect.width(); @@ -76,12 +74,11 @@ static inline Gralloc2::IMapper::Rect sGralloc2Rect(const Rect& rect) { } // anonymous namespace -void Mapper::preload() { +void Gralloc2Mapper::preload() { android::hardware::preloadPassthroughService<hardware::graphics::mapper::V2_0::IMapper>(); } -Mapper::Mapper() -{ +Gralloc2Mapper::Gralloc2Mapper() { mMapper = hardware::graphics::mapper::V2_0::IMapper::getService(); if (mMapper == nullptr) { LOG_ALWAYS_FATAL("gralloc-mapper is missing"); @@ -94,7 +91,8 @@ Mapper::Mapper() mMapperV2_1 = IMapper::castFrom(mMapper); } -status_t Mapper::validateBufferDescriptorInfo(IMapper::BufferDescriptorInfo* descriptorInfo) const { +status_t Gralloc2Mapper::validateBufferDescriptorInfo( + IMapper::BufferDescriptorInfo* descriptorInfo) const { uint64_t validUsageBits = getValid10UsageBits(); if (mMapperV2_1 != nullptr) { validUsageBits = validUsageBits | getValid11UsageBits(); @@ -108,7 +106,8 @@ status_t Mapper::validateBufferDescriptorInfo(IMapper::BufferDescriptorInfo* des return NO_ERROR; } -status_t Mapper::createDescriptor(void* bufferDescriptorInfo, void* outBufferDescriptor) const { +status_t Gralloc2Mapper::createDescriptor(void* bufferDescriptorInfo, + void* outBufferDescriptor) const { IMapper::BufferDescriptorInfo* descriptorInfo = static_cast<IMapper::BufferDescriptorInfo*>(bufferDescriptorInfo); BufferDescriptor* outDescriptor = static_cast<BufferDescriptor*>(outBufferDescriptor); @@ -146,8 +145,8 @@ status_t Mapper::createDescriptor(void* bufferDescriptorInfo, void* outBufferDes return static_cast<status_t>((ret.isOk()) ? error : kTransactionError); } -status_t Mapper::importBuffer(const hardware::hidl_handle& rawHandle, - buffer_handle_t* outBufferHandle) const { +status_t Gralloc2Mapper::importBuffer(const hardware::hidl_handle& rawHandle, + buffer_handle_t* outBufferHandle) const { Error error; auto ret = mMapper->importBuffer(rawHandle, [&](const auto& tmpError, const auto& tmpBuffer) @@ -163,8 +162,7 @@ status_t Mapper::importBuffer(const hardware::hidl_handle& rawHandle, return static_cast<status_t>((ret.isOk()) ? error : kTransactionError); } -void Mapper::freeBuffer(buffer_handle_t bufferHandle) const -{ +void Gralloc2Mapper::freeBuffer(buffer_handle_t bufferHandle) const { auto buffer = const_cast<native_handle_t*>(bufferHandle); auto ret = mMapper->freeBuffer(buffer); @@ -173,9 +171,10 @@ void Mapper::freeBuffer(buffer_handle_t bufferHandle) const buffer, error); } -status_t Mapper::validateBufferSize(buffer_handle_t bufferHandle, uint32_t width, uint32_t height, - android::PixelFormat format, uint32_t layerCount, - uint64_t usage, uint32_t stride) const { +status_t Gralloc2Mapper::validateBufferSize(buffer_handle_t bufferHandle, uint32_t width, + uint32_t height, android::PixelFormat format, + uint32_t layerCount, uint64_t usage, + uint32_t stride) const { if (mMapperV2_1 == nullptr) { return NO_ERROR; } @@ -193,9 +192,8 @@ status_t Mapper::validateBufferSize(buffer_handle_t bufferHandle, uint32_t width return static_cast<status_t>((ret.isOk()) ? static_cast<Error>(ret) : kTransactionError); } -void Mapper::getTransportSize(buffer_handle_t bufferHandle, - uint32_t* outNumFds, uint32_t* outNumInts) const -{ +void Gralloc2Mapper::getTransportSize(buffer_handle_t bufferHandle, uint32_t* outNumFds, + uint32_t* outNumInts) const { *outNumFds = uint32_t(bufferHandle->numFds); *outNumInts = uint32_t(bufferHandle->numInts); @@ -221,8 +219,8 @@ void Mapper::getTransportSize(buffer_handle_t bufferHandle, ALOGE_IF(error != Error::NONE, "getTransportSize(%p) failed with %d", buffer, error); } -status_t Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, - int acquireFence, void** outData) const { +status_t Gralloc2Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, + int acquireFence, void** outData) const { auto buffer = const_cast<native_handle_t*>(bufferHandle); IMapper::Rect accessRegion = sGralloc2Rect(bounds); @@ -260,8 +258,8 @@ status_t Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& return static_cast<status_t>(error); } -status_t Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, - int acquireFence, android_ycbcr* ycbcr) const { +status_t Gralloc2Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, + int acquireFence, android_ycbcr* ycbcr) const { auto buffer = const_cast<native_handle_t*>(bufferHandle); IMapper::Rect accessRegion = sGralloc2Rect(bounds); @@ -306,8 +304,7 @@ status_t Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& return static_cast<status_t>((ret.isOk()) ? error : kTransactionError); } -int Mapper::unlock(buffer_handle_t bufferHandle) const -{ +int Gralloc2Mapper::unlock(buffer_handle_t bufferHandle) const { auto buffer = const_cast<native_handle_t*>(bufferHandle); int releaseFence = -1; @@ -340,17 +337,14 @@ int Mapper::unlock(buffer_handle_t bufferHandle) const return releaseFence; } -Allocator::Allocator(const Mapper& mapper) - : mMapper(mapper) -{ +Gralloc2Allocator::Gralloc2Allocator(const Gralloc2Mapper& mapper) : mMapper(mapper) { mAllocator = IAllocator::getService(); if (mAllocator == nullptr) { LOG_ALWAYS_FATAL("gralloc-alloc is missing"); } } -std::string Allocator::dumpDebugInfo() const -{ +std::string Gralloc2Allocator::dumpDebugInfo() const { std::string debugInfo; mAllocator->dumpDebugInfo([&](const auto& tmpDebugInfo) { @@ -360,9 +354,9 @@ std::string Allocator::dumpDebugInfo() const return debugInfo; } -status_t Allocator::allocate(uint32_t width, uint32_t height, PixelFormat format, - uint32_t layerCount, uint64_t usage, uint32_t bufferCount, - uint32_t* outStride, buffer_handle_t* outBufferHandles) const { +status_t Gralloc2Allocator::allocate(uint32_t width, uint32_t height, PixelFormat format, + uint32_t layerCount, uint64_t usage, uint32_t bufferCount, + uint32_t* outStride, buffer_handle_t* outBufferHandles) const { IMapper::BufferDescriptorInfo descriptorInfo = {}; descriptorInfo.width = width; descriptorInfo.height = height; @@ -407,6 +401,4 @@ status_t Allocator::allocate(uint32_t width, uint32_t height, PixelFormat format return (ret.isOk()) ? error : static_cast<status_t>(kTransactionError); } -} // namespace Gralloc2 - } // namespace android diff --git a/libs/ui/GraphicBufferAllocator.cpp b/libs/ui/GraphicBufferAllocator.cpp index 833d321527..3fd4e2a922 100644 --- a/libs/ui/GraphicBufferAllocator.cpp +++ b/libs/ui/GraphicBufferAllocator.cpp @@ -29,6 +29,7 @@ #include <utils/Singleton.h> #include <utils/Trace.h> +#include <ui/Gralloc.h> #include <ui/Gralloc2.h> #include <ui/GraphicBufferMapper.h> @@ -44,11 +45,9 @@ KeyedVector<buffer_handle_t, GraphicBufferAllocator::alloc_rec_t> GraphicBufferAllocator::sAllocList; GraphicBufferAllocator::GraphicBufferAllocator() - : mMapper(GraphicBufferMapper::getInstance()), - mAllocator(std::make_unique<Gralloc2::Allocator>( - mMapper.getGrallocMapper())) -{ -} + : mMapper(GraphicBufferMapper::getInstance()), + mAllocator(std::make_unique<Gralloc2Allocator>( + reinterpret_cast<const Gralloc2Mapper&>(mMapper.getGrallocMapper()))) {} GraphicBufferAllocator::~GraphicBufferAllocator() {} diff --git a/libs/ui/GraphicBufferMapper.cpp b/libs/ui/GraphicBufferMapper.cpp index 8dd939668a..d7bf4d558c 100644 --- a/libs/ui/GraphicBufferMapper.cpp +++ b/libs/ui/GraphicBufferMapper.cpp @@ -32,6 +32,7 @@ #include <utils/Log.h> #include <utils/Trace.h> +#include <ui/Gralloc.h> #include <ui/Gralloc2.h> #include <ui/GraphicBuffer.h> @@ -43,13 +44,10 @@ namespace android { ANDROID_SINGLETON_STATIC_INSTANCE( GraphicBufferMapper ) void GraphicBufferMapper::preloadHal() { - Gralloc2::Mapper::preload(); + Gralloc2Mapper::preload(); } -GraphicBufferMapper::GraphicBufferMapper() - : mMapper(std::make_unique<const Gralloc2::Mapper>()) -{ -} +GraphicBufferMapper::GraphicBufferMapper() : mMapper(std::make_unique<const Gralloc2Mapper>()) {} status_t GraphicBufferMapper::importBuffer(buffer_handle_t rawHandle, uint32_t width, uint32_t height, uint32_t layerCount, diff --git a/libs/ui/include/ui/Gralloc.h b/libs/ui/include/ui/Gralloc.h new file mode 100644 index 0000000000..db5543f640 --- /dev/null +++ b/libs/ui/include/ui/Gralloc.h @@ -0,0 +1,88 @@ +/* + * Copyright 2016 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. + */ + +#ifndef ANDROID_UI_GRALLOC_H +#define ANDROID_UI_GRALLOC_H + +#include <string> + +#include <hidl/HidlSupport.h> +#include <ui/PixelFormat.h> +#include <ui/Rect.h> +#include <utils/StrongPointer.h> + +namespace android { + +// A wrapper to IMapper +class GrallocMapper { +public: + virtual ~GrallocMapper(); + + virtual status_t createDescriptor(void* bufferDescriptorInfo, + void* outBufferDescriptor) const = 0; + + // Import a buffer that is from another HAL, another process, or is + // cloned. + // + // The returned handle must be freed with freeBuffer. + virtual status_t importBuffer(const hardware::hidl_handle& rawHandle, + buffer_handle_t* outBufferHandle) const = 0; + + virtual void freeBuffer(buffer_handle_t bufferHandle) const = 0; + + virtual status_t validateBufferSize(buffer_handle_t bufferHandle, uint32_t width, + uint32_t height, android::PixelFormat format, + uint32_t layerCount, uint64_t usage, + uint32_t stride) const = 0; + + virtual void getTransportSize(buffer_handle_t bufferHandle, uint32_t* outNumFds, + uint32_t* outNumInts) const = 0; + + // The ownership of acquireFence is always transferred to the callee, even + // on errors. + virtual status_t lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, + int acquireFence, void** outData) const = 0; + + // The ownership of acquireFence is always transferred to the callee, even + // on errors. + virtual status_t lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, + int acquireFence, android_ycbcr* ycbcr) const = 0; + + // unlock returns a fence sync object (or -1) and the fence sync object is + // owned by the caller + virtual int unlock(buffer_handle_t bufferHandle) const = 0; +}; + +// A wrapper to IAllocator +class GrallocAllocator { +public: + virtual ~GrallocAllocator(); + + virtual std::string dumpDebugInfo() const = 0; + + /* + * The returned buffers are already imported and must not be imported + * again. outBufferHandles must point to a space that can contain at + * least "bufferCount" buffer_handle_t. + */ + virtual status_t allocate(uint32_t width, uint32_t height, PixelFormat format, + uint32_t layerCount, uint64_t usage, uint32_t bufferCount, + uint32_t* outStride, buffer_handle_t* outBufferHandles) const = 0; +}; + +} // namespace android + +#endif // ANDROID_UI_GRALLOC_H diff --git a/libs/ui/include/ui/Gralloc2.h b/libs/ui/include/ui/Gralloc2.h index a77936c095..bded3e49ad 100644 --- a/libs/ui/include/ui/Gralloc2.h +++ b/libs/ui/include/ui/Gralloc2.h @@ -23,55 +23,43 @@ #include <android/hardware/graphics/common/1.1/types.h> #include <android/hardware/graphics/mapper/2.0/IMapper.h> #include <android/hardware/graphics/mapper/2.1/IMapper.h> +#include <ui/Gralloc.h> #include <ui/PixelFormat.h> #include <ui/Rect.h> #include <utils/StrongPointer.h> namespace android { -namespace Gralloc2 { - using hardware::graphics::allocator::V2_0::IAllocator; using hardware::graphics::mapper::V2_1::IMapper; -// A wrapper to IMapper -class Mapper { +class Gralloc2Mapper : public GrallocMapper { public: static void preload(); - Mapper(); + Gralloc2Mapper(); - status_t createDescriptor(void* bufferDescriptorInfo, void* outBufferDescriptor) const; + status_t createDescriptor(void* bufferDescriptorInfo, void* outBufferDescriptor) const override; - // Import a buffer that is from another HAL, another process, or is - // cloned. - // - // The returned handle must be freed with freeBuffer. status_t importBuffer(const hardware::hidl_handle& rawHandle, - buffer_handle_t* outBufferHandle) const; + buffer_handle_t* outBufferHandle) const override; - void freeBuffer(buffer_handle_t bufferHandle) const; + void freeBuffer(buffer_handle_t bufferHandle) const override; status_t validateBufferSize(buffer_handle_t bufferHandle, uint32_t width, uint32_t height, android::PixelFormat format, uint32_t layerCount, uint64_t usage, - uint32_t stride) const; + uint32_t stride) const override; - void getTransportSize(buffer_handle_t bufferHandle, - uint32_t* outNumFds, uint32_t* outNumInts) const; + void getTransportSize(buffer_handle_t bufferHandle, uint32_t* outNumFds, + uint32_t* outNumInts) const override; - // The ownership of acquireFence is always transferred to the callee, even - // on errors. status_t lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, - int acquireFence, void** outData) const; + int acquireFence, void** outData) const override; - // The ownership of acquireFence is always transferred to the callee, even - // on errors. status_t lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, - int acquireFence, android_ycbcr* ycbcr) const; + int acquireFence, android_ycbcr* ycbcr) const override; - // unlock returns a fence sync object (or -1) and the fence sync object is - // owned by the caller - int unlock(buffer_handle_t bufferHandle) const; + int unlock(buffer_handle_t bufferHandle) const override; private: // Determines whether the passed info is compatible with the mapper. @@ -81,31 +69,23 @@ private: sp<IMapper> mMapperV2_1; }; -// A wrapper to IAllocator -class Allocator { +class Gralloc2Allocator : public GrallocAllocator { public: // An allocator relies on a mapper, and that mapper must be alive at all // time. - Allocator(const Mapper& mapper); + Gralloc2Allocator(const Gralloc2Mapper& mapper); - std::string dumpDebugInfo() const; + std::string dumpDebugInfo() const override; - /* - * The returned buffers are already imported and must not be imported - * again. outBufferHandles must point to a space that can contain at - * least "bufferCount" buffer_handle_t. - */ status_t allocate(uint32_t width, uint32_t height, PixelFormat format, uint32_t layerCount, uint64_t usage, uint32_t bufferCount, uint32_t* outStride, - buffer_handle_t* outBufferHandles) const; + buffer_handle_t* outBufferHandles) const override; private: - const Mapper& mMapper; + const Gralloc2Mapper& mMapper; sp<IAllocator> mAllocator; }; -} // namespace Gralloc2 - } // namespace android #endif // ANDROID_UI_GRALLOC2_H diff --git a/libs/ui/include/ui/GraphicBufferAllocator.h b/libs/ui/include/ui/GraphicBufferAllocator.h index 7e2b230fe9..94dbbed9e3 100644 --- a/libs/ui/include/ui/GraphicBufferAllocator.h +++ b/libs/ui/include/ui/GraphicBufferAllocator.h @@ -34,10 +34,7 @@ namespace android { -namespace Gralloc2 { -class Allocator; -} - +class Gralloc2Allocator; class GraphicBufferMapper; class GraphicBufferAllocator : public Singleton<GraphicBufferAllocator> @@ -75,7 +72,7 @@ private: ~GraphicBufferAllocator(); GraphicBufferMapper& mMapper; - const std::unique_ptr<const Gralloc2::Allocator> mAllocator; + const std::unique_ptr<const Gralloc2Allocator> mAllocator; }; // --------------------------------------------------------------------------- diff --git a/libs/ui/include/ui/GraphicBufferMapper.h b/libs/ui/include/ui/GraphicBufferMapper.h index 7cf003dcba..a9bc2d4e2d 100644 --- a/libs/ui/include/ui/GraphicBufferMapper.h +++ b/libs/ui/include/ui/GraphicBufferMapper.h @@ -35,10 +35,8 @@ namespace android { // --------------------------------------------------------------------------- -namespace Gralloc2 { -class Mapper; -} - +class GrallocMapper; +class Gralloc2Mapper; class Rect; class GraphicBufferMapper : public Singleton<GraphicBufferMapper> @@ -80,9 +78,8 @@ public: status_t unlockAsync(buffer_handle_t handle, int *fenceFd); - const Gralloc2::Mapper& getGrallocMapper() const - { - return *mMapper; + const GrallocMapper& getGrallocMapper() const { + return reinterpret_cast<const GrallocMapper&>(*mMapper); } private: @@ -90,7 +87,7 @@ private: GraphicBufferMapper(); - const std::unique_ptr<const Gralloc2::Mapper> mMapper; + const std::unique_ptr<const Gralloc2Mapper> mMapper; }; // --------------------------------------------------------------------------- |