diff options
Diffstat (limited to 'libs/ui/Gralloc2.cpp')
-rw-r--r-- | libs/ui/Gralloc2.cpp | 197 |
1 files changed, 120 insertions, 77 deletions
diff --git a/libs/ui/Gralloc2.cpp b/libs/ui/Gralloc2.cpp index 20f27c53e3..d874911f83 100644 --- a/libs/ui/Gralloc2.cpp +++ b/libs/ui/Gralloc2.cpp @@ -27,6 +27,12 @@ #include <sync/sync.h> #pragma clang diagnostic pop +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; + namespace android { namespace Gralloc2 { @@ -59,6 +65,15 @@ uint64_t getValid11UsageBits() { return valid11UsageBits; } +static inline Gralloc2::IMapper::Rect sGralloc2Rect(const Rect& rect) { + Gralloc2::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() { @@ -79,30 +94,31 @@ Mapper::Mapper() mMapperV2_1 = IMapper::castFrom(mMapper); } -Gralloc2::Error Mapper::validateBufferDescriptorInfo( - const IMapper::BufferDescriptorInfo& descriptorInfo) const { +status_t Mapper::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 Mapper::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; @@ -115,24 +131,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 Mapper::importBuffer(const hardware::hidl_handle& rawHandle, + buffer_handle_t* outBufferHandle) const { Error error; auto ret = mMapper->importBuffer(rawHandle, [&](const auto& tmpError, const auto& tmpBuffer) @@ -145,7 +160,7 @@ 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 @@ -158,18 +173,24 @@ 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 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 { 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, @@ -195,19 +216,17 @@ 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 Mapper::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); + // put acquireFence in a hidl_handle hardware::hidl_handle acquireFenceHandle; NATIVE_HANDLE_DECLARE_STORAGE(acquireFenceStorage, 1, 0); @@ -234,15 +253,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 Mapper::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); @@ -252,6 +275,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, @@ -262,15 +286,24 @@ 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 @@ -299,10 +332,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); } @@ -330,38 +360,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 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 { + 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 |