diff options
Diffstat (limited to 'libs/ui/Gralloc2.cpp')
-rw-r--r-- | libs/ui/Gralloc2.cpp | 259 |
1 files changed, 158 insertions, 101 deletions
diff --git a/libs/ui/Gralloc2.cpp b/libs/ui/Gralloc2.cpp index 37cf617374..5dc453005d 100644 --- a/libs/ui/Gralloc2.cpp +++ b/libs/ui/Gralloc2.cpp @@ -27,9 +27,15 @@ #include <sync/sync.h> #pragma clang diagnostic pop -namespace android { +using android::hardware::graphics::allocator::V2_0::IAllocator; +using android::hardware::graphics::common::V1_1::BufferUsage; +using android::hardware::graphics::common::V1_1::PixelFormat; +using android::hardware::graphics::mapper::V2_0::BufferDescriptor; +using android::hardware::graphics::mapper::V2_0::Error; +using android::hardware::graphics::mapper::V2_0::YCbCrLayout; +using android::hardware::graphics::mapper::V2_1::IMapper; -namespace Gralloc2 { +namespace android { namespace { @@ -42,9 +48,6 @@ uint64_t getValid10UsageBits() { for (const auto bit : hardware::hidl_enum_range<BufferUsage>()) { bits = bits | bit; } - // TODO(b/72323293, b/72703005): Remove these additional bits - bits = bits | (1 << 10) | (1 << 13); - return bits; }(); return valid10UsageBits; @@ -62,17 +65,26 @@ uint64_t getValid11UsageBits() { return valid11UsageBits; } +static inline IMapper::Rect sGralloc2Rect(const Rect& rect) { + IMapper::Rect outRect{}; + outRect.left = rect.left; + outRect.top = rect.top; + outRect.width = rect.width(); + outRect.height = rect.height(); + return outRect; +} + } // 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"); + ALOGW("mapper 2.x is not supported"); + return; } if (mMapper->isRemote()) { LOG_ALWAYS_FATAL("gralloc-mapper must be in passthrough mode"); @@ -82,30 +94,37 @@ Mapper::Mapper() mMapperV2_1 = IMapper::castFrom(mMapper); } -Gralloc2::Error Mapper::validateBufferDescriptorInfo( - const IMapper::BufferDescriptorInfo& descriptorInfo) const { +bool Gralloc2Mapper::isLoaded() const { + return mMapper != nullptr; +} + +status_t Gralloc2Mapper::validateBufferDescriptorInfo( + IMapper::BufferDescriptorInfo* descriptorInfo) const { uint64_t validUsageBits = getValid10UsageBits(); if (mMapperV2_1 != nullptr) { validUsageBits = validUsageBits | getValid11UsageBits(); } - if (descriptorInfo.usage & ~validUsageBits) { + if (descriptorInfo->usage & ~validUsageBits) { ALOGE("buffer descriptor contains invalid usage bits 0x%" PRIx64, - descriptorInfo.usage & ~validUsageBits); - return Error::BAD_VALUE; + descriptorInfo->usage & ~validUsageBits); + return BAD_VALUE; } - return Error::NONE; + return NO_ERROR; } -Error Mapper::createDescriptor( - const IMapper::BufferDescriptorInfo& descriptorInfo, - BufferDescriptor* outDescriptor) const -{ - Error error = validateBufferDescriptorInfo(descriptorInfo); - if (error != Error::NONE) { - return error; +status_t Gralloc2Mapper::createDescriptor(void* bufferDescriptorInfo, + void* outBufferDescriptor) const { + IMapper::BufferDescriptorInfo* descriptorInfo = + static_cast<IMapper::BufferDescriptorInfo*>(bufferDescriptorInfo); + BufferDescriptor* outDescriptor = static_cast<BufferDescriptor*>(outBufferDescriptor); + + status_t status = validateBufferDescriptorInfo(descriptorInfo); + if (status != NO_ERROR) { + return status; } + Error error; auto hidl_cb = [&](const auto& tmpError, const auto& tmpDescriptor) { error = tmpError; @@ -118,24 +137,23 @@ Error Mapper::createDescriptor( hardware::Return<void> ret; if (mMapperV2_1 != nullptr) { - ret = mMapperV2_1->createDescriptor_2_1(descriptorInfo, hidl_cb); + ret = mMapperV2_1->createDescriptor_2_1(*descriptorInfo, hidl_cb); } else { const hardware::graphics::mapper::V2_0::IMapper::BufferDescriptorInfo info = { - descriptorInfo.width, - descriptorInfo.height, - descriptorInfo.layerCount, - static_cast<hardware::graphics::common::V1_0::PixelFormat>(descriptorInfo.format), - descriptorInfo.usage, + descriptorInfo->width, + descriptorInfo->height, + descriptorInfo->layerCount, + static_cast<hardware::graphics::common::V1_0::PixelFormat>(descriptorInfo->format), + descriptorInfo->usage, }; ret = mMapper->createDescriptor(info, hidl_cb); } - return (ret.isOk()) ? error : kTransactionError; + return static_cast<status_t>((ret.isOk()) ? error : kTransactionError); } -Error 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) @@ -148,11 +166,10 @@ Error Mapper::importBuffer(const hardware::hidl_handle& rawHandle, *outBufferHandle = static_cast<buffer_handle_t>(tmpBuffer); }); - return (ret.isOk()) ? error : kTransactionError; + 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); @@ -161,23 +178,29 @@ void Mapper::freeBuffer(buffer_handle_t bufferHandle) const buffer, error); } -Error Mapper::validateBufferSize(buffer_handle_t bufferHandle, - const IMapper::BufferDescriptorInfo& descriptorInfo, - 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 Error::NONE; + return NO_ERROR; } + IMapper::BufferDescriptorInfo descriptorInfo = {}; + descriptorInfo.width = width; + descriptorInfo.height = height; + descriptorInfo.layerCount = layerCount; + descriptorInfo.format = static_cast<hardware::graphics::common::V1_1::PixelFormat>(format); + descriptorInfo.usage = usage; + auto buffer = const_cast<native_handle_t*>(bufferHandle); auto ret = mMapperV2_1->validateBufferSize(buffer, descriptorInfo, stride); - return (ret.isOk()) ? static_cast<Error>(ret) : kTransactionError; + 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); @@ -198,19 +221,24 @@ void Mapper::getTransportSize(buffer_handle_t bufferHandle, *outNumInts = tmpNumInts; }); - if (!ret.isOk()) { - error = kTransactionError; - } - ALOGE_IF(error != Error::NONE, "getTransportSize(%p) failed with %d", - buffer, error); + error = (ret.isOk()) ? error : kTransactionError; + + ALOGE_IF(error != Error::NONE, "getTransportSize(%p) failed with %d", buffer, error); } -Error Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, - const IMapper::Rect& accessRegion, - int acquireFence, void** outData) const -{ +status_t Gralloc2Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect& bounds, + int acquireFence, void** outData, int32_t* outBytesPerPixel, + int32_t* outBytesPerStride) const { + if (outBytesPerPixel) { + *outBytesPerPixel = -1; + } + if (outBytesPerStride) { + *outBytesPerStride = -1; + } auto buffer = const_cast<native_handle_t*>(bufferHandle); + IMapper::Rect accessRegion = sGralloc2Rect(bounds); + // put acquireFence in a hidl_handle hardware::hidl_handle acquireFenceHandle; NATIVE_HANDLE_DECLARE_STORAGE(acquireFenceStorage, 1, 0); @@ -237,15 +265,19 @@ Error Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, close(acquireFence); } - return (ret.isOk()) ? error : kTransactionError; + error = (ret.isOk()) ? error : kTransactionError; + + ALOGW_IF(error != Error::NONE, "lock(%p, ...) failed: %d", bufferHandle, error); + + return static_cast<status_t>(error); } -Error Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, - const IMapper::Rect& accessRegion, - int acquireFence, YCbCrLayout* outLayout) 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); + // put acquireFence in a hidl_handle hardware::hidl_handle acquireFenceHandle; NATIVE_HANDLE_DECLARE_STORAGE(acquireFenceStorage, 1, 0); @@ -255,6 +287,7 @@ Error Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, acquireFenceHandle = h; } + YCbCrLayout layout; Error error; auto ret = mMapper->lockYCbCr(buffer, usage, accessRegion, acquireFenceHandle, @@ -265,19 +298,27 @@ Error Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, return; } - *outLayout = tmpLayout; + layout = tmpLayout; }); + if (error == Error::NONE) { + ycbcr->y = layout.y; + ycbcr->cb = layout.cb; + ycbcr->cr = layout.cr; + ycbcr->ystride = static_cast<size_t>(layout.yStride); + ycbcr->cstride = static_cast<size_t>(layout.cStride); + ycbcr->chroma_step = static_cast<size_t>(layout.chromaStep); + } + // we own acquireFence even on errors if (acquireFence >= 0) { close(acquireFence); } - return (ret.isOk()) ? error : kTransactionError; + 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; @@ -302,10 +343,7 @@ int Mapper::unlock(buffer_handle_t bufferHandle) const } }); - if (!ret.isOk()) { - error = kTransactionError; - } - + error = (ret.isOk()) ? error : kTransactionError; if (error != Error::NONE) { ALOGE("unlock(%p) failed with %d", buffer, error); } @@ -313,17 +351,25 @@ int Mapper::unlock(buffer_handle_t bufferHandle) const return releaseFence; } -Allocator::Allocator(const Mapper& mapper) - : mMapper(mapper) -{ +status_t Gralloc2Mapper::isSupported(uint32_t /*width*/, uint32_t /*height*/, + android::PixelFormat /*format*/, uint32_t /*layerCount*/, + uint64_t /*usage*/, bool* /*outSupported*/) const { + return INVALID_OPERATION; +} + +Gralloc2Allocator::Gralloc2Allocator(const Gralloc2Mapper& mapper) : mMapper(mapper) { mAllocator = IAllocator::getService(); if (mAllocator == nullptr) { - LOG_ALWAYS_FATAL("gralloc-alloc is missing"); + ALOGW("allocator 2.x is not supported"); + return; } } -std::string Allocator::dumpDebugInfo() const -{ +bool Gralloc2Allocator::isLoaded() const { + return mAllocator != nullptr; +} + +std::string Gralloc2Allocator::dumpDebugInfo() const { std::string debugInfo; mAllocator->dumpDebugInfo([&](const auto& tmpDebugInfo) { @@ -333,40 +379,51 @@ std::string Allocator::dumpDebugInfo() const return debugInfo; } -Error Allocator::allocate(BufferDescriptor descriptor, uint32_t count, - uint32_t* outStride, buffer_handle_t* outBufferHandles) const -{ - Error error; - auto ret = mAllocator->allocate(descriptor, count, - [&](const auto& tmpError, const auto& tmpStride, - const auto& tmpBuffers) { - error = tmpError; - if (tmpError != Error::NONE) { - return; - } - - // import buffers - for (uint32_t i = 0; i < count; i++) { - error = mMapper.importBuffer(tmpBuffers[i], - &outBufferHandles[i]); - if (error != Error::NONE) { - for (uint32_t j = 0; j < i; j++) { - mMapper.freeBuffer(outBufferHandles[j]); - outBufferHandles[j] = nullptr; - } - return; - } - } +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; + descriptorInfo.layerCount = layerCount; + descriptorInfo.format = static_cast<hardware::graphics::common::V1_1::PixelFormat>(format); + descriptorInfo.usage = usage; + + BufferDescriptor descriptor; + status_t error = mMapper.createDescriptor(static_cast<void*>(&descriptorInfo), + static_cast<void*>(&descriptor)); + if (error != NO_ERROR) { + return error; + } - *outStride = tmpStride; - }); + auto ret = mAllocator->allocate(descriptor, bufferCount, + [&](const auto& tmpError, const auto& tmpStride, + const auto& tmpBuffers) { + error = static_cast<status_t>(tmpError); + if (tmpError != Error::NONE) { + return; + } + + // import buffers + for (uint32_t i = 0; i < bufferCount; i++) { + error = mMapper.importBuffer(tmpBuffers[i], + &outBufferHandles[i]); + if (error != NO_ERROR) { + for (uint32_t j = 0; j < i; j++) { + mMapper.freeBuffer(outBufferHandles[j]); + outBufferHandles[j] = nullptr; + } + return; + } + } + + *outStride = tmpStride; + }); // make sure the kernel driver sees BC_FREE_BUFFER and closes the fds now hardware::IPCThreadState::self()->flushCommands(); - return (ret.isOk()) ? error : kTransactionError; + return (ret.isOk()) ? error : static_cast<status_t>(kTransactionError); } -} // namespace Gralloc2 - } // namespace android |