diff options
| author | 2022-03-31 23:34:14 +0000 | |
|---|---|---|
| committer | 2022-03-31 23:34:14 +0000 | |
| commit | 963291017c870adf628bff8bafd98d3c4c47fc9e (patch) | |
| tree | f5d1c83a5207aa04ad039f550c8d427bde42b957 /libs/ui/Gralloc4.cpp | |
| parent | d7590c4ad67981c141a7801ac0535100b97cfaf9 (diff) | |
| parent | 9c604e3c31869d1a7a1654ea791267a29b053966 (diff) | |
Merge "Polish up metadata propagation for native window" into tm-dev
Diffstat (limited to 'libs/ui/Gralloc4.cpp')
| -rw-r--r-- | libs/ui/Gralloc4.cpp | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/libs/ui/Gralloc4.cpp b/libs/ui/Gralloc4.cpp index c72ae1b138..1fce31d877 100644 --- a/libs/ui/Gralloc4.cpp +++ b/libs/ui/Gralloc4.cpp @@ -22,6 +22,7 @@ #include <aidlcommonsupport/NativeHandle.h> #include <android/binder_enums.h> #include <android/binder_manager.h> +#include <gralloctypes/Gralloc4.h> #include <hidl/ServiceManagement.h> #include <hwbinder/IPCThreadState.h> #include <ui/Gralloc4.h> @@ -524,6 +525,37 @@ status_t Gralloc4Mapper::get(buffer_handle_t bufferHandle, const MetadataType& m return decodeFunction(vec, outMetadata); } +template <class T> +status_t Gralloc4Mapper::set(buffer_handle_t bufferHandle, const MetadataType& metadataType, + const T& metadata, EncodeFunction<T> encodeFunction) const { + hidl_vec<uint8_t> encodedMetadata; + if (const status_t status = encodeFunction(metadata, &encodedMetadata); status != OK) { + ALOGE("Encoding metadata(%s) failed with %d", metadataType.name.c_str(), status); + return status; + } + hidl_vec<uint8_t> vec; + auto ret = + mMapper->set(const_cast<native_handle_t*>(bufferHandle), metadataType, encodedMetadata); + + const Error error = ret.withDefault(kTransactionError); + switch (error) { + case Error::BAD_DESCRIPTOR: + case Error::BAD_BUFFER: + case Error::BAD_VALUE: + case Error::NO_RESOURCES: + ALOGE("set(%s, %" PRIu64 ", ...) failed with %d", metadataType.name.c_str(), + metadataType.value, error); + break; + // It is not an error to attempt to set metadata that a particular gralloc implementation + // happens to not support. + case Error::UNSUPPORTED: + case Error::NONE: + break; + } + + return static_cast<status_t>(error); +} + status_t Gralloc4Mapper::getBufferId(buffer_handle_t bufferHandle, uint64_t* outBufferId) const { return get(bufferHandle, gralloc4::MetadataType_BufferId, gralloc4::decodeBufferId, outBufferId); @@ -673,6 +705,12 @@ status_t Gralloc4Mapper::getDataspace(buffer_handle_t bufferHandle, return NO_ERROR; } +status_t Gralloc4Mapper::setDataspace(buffer_handle_t bufferHandle, ui::Dataspace dataspace) const { + return set(bufferHandle, gralloc4::MetadataType_Dataspace, + static_cast<aidl::android::hardware::graphics::common::Dataspace>(dataspace), + gralloc4::encodeDataspace); +} + status_t Gralloc4Mapper::getBlendMode(buffer_handle_t bufferHandle, ui::BlendMode* outBlendMode) const { return get(bufferHandle, gralloc4::MetadataType_BlendMode, gralloc4::decodeBlendMode, @@ -685,24 +723,47 @@ status_t Gralloc4Mapper::getSmpte2086(buffer_handle_t bufferHandle, outSmpte2086); } +status_t Gralloc4Mapper::setSmpte2086(buffer_handle_t bufferHandle, + std::optional<ui::Smpte2086> smpte2086) const { + return set(bufferHandle, gralloc4::MetadataType_Smpte2086, smpte2086, + gralloc4::encodeSmpte2086); +} + status_t Gralloc4Mapper::getCta861_3(buffer_handle_t bufferHandle, std::optional<ui::Cta861_3>* outCta861_3) const { return get(bufferHandle, gralloc4::MetadataType_Cta861_3, gralloc4::decodeCta861_3, outCta861_3); } +status_t Gralloc4Mapper::setCta861_3(buffer_handle_t bufferHandle, + std::optional<ui::Cta861_3> cta861_3) const { + return set(bufferHandle, gralloc4::MetadataType_Cta861_3, cta861_3, gralloc4::encodeCta861_3); +} + status_t Gralloc4Mapper::getSmpte2094_40( buffer_handle_t bufferHandle, std::optional<std::vector<uint8_t>>* outSmpte2094_40) const { return get(bufferHandle, gralloc4::MetadataType_Smpte2094_40, gralloc4::decodeSmpte2094_40, outSmpte2094_40); } +status_t Gralloc4Mapper::setSmpte2094_40(buffer_handle_t bufferHandle, + std::optional<std::vector<uint8_t>> smpte2094_40) const { + return set(bufferHandle, gralloc4::MetadataType_Smpte2094_40, smpte2094_40, + gralloc4::encodeSmpte2094_40); +} + status_t Gralloc4Mapper::getSmpte2094_10( buffer_handle_t bufferHandle, std::optional<std::vector<uint8_t>>* outSmpte2094_10) const { return get(bufferHandle, gralloc4::MetadataType_Smpte2094_10, gralloc4::decodeSmpte2094_10, outSmpte2094_10); } +status_t Gralloc4Mapper::setSmpte2094_10(buffer_handle_t bufferHandle, + std::optional<std::vector<uint8_t>> smpte2094_10) const { + return set(bufferHandle, gralloc4::MetadataType_Smpte2094_10, smpte2094_10, + gralloc4::encodeSmpte2094_10); +} + template <class T> status_t Gralloc4Mapper::getDefault(uint32_t width, uint32_t height, PixelFormat format, uint32_t layerCount, uint64_t usage, |