summaryrefslogtreecommitdiff
path: root/cros_gralloc/mapper_stablec/Mapper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cros_gralloc/mapper_stablec/Mapper.cpp')
-rw-r--r--cros_gralloc/mapper_stablec/Mapper.cpp165
1 files changed, 52 insertions, 113 deletions
diff --git a/cros_gralloc/mapper_stablec/Mapper.cpp b/cros_gralloc/mapper_stablec/Mapper.cpp
index c28d7f9..866f0dd 100644
--- a/cros_gralloc/mapper_stablec/Mapper.cpp
+++ b/cros_gralloc/mapper_stablec/Mapper.cpp
@@ -19,7 +19,6 @@
#include "cros_gralloc/cros_gralloc_driver.h"
#include "cros_gralloc/cros_gralloc_handle.h"
-#include "cros_gralloc/gralloc4/CrosGralloc4Metadata.h"
#include "cros_gralloc/gralloc4/CrosGralloc4Utils.h"
using namespace ::aidl::android::hardware::graphics::common;
@@ -43,7 +42,7 @@ using ::android::base::unique_fd;
REQUIRE_DRIVER() \
VALIDATE_BUFFER_HANDLE(bufferHandle)
-static_assert(CROS_GRALLOC4_METADATA_MAX_NAME_SIZE >=
+static_assert(CROS_GRALLOC_BUFFER_METADATA_MAX_NAME_SIZE >=
decltype(std::declval<BufferDescriptorInfo>().name){}.size(),
"Metadata name storage too small to fit a BufferDescriptorInfo::name");
@@ -109,30 +108,12 @@ class CrosGrallocMapperV5 final : public vendor::mapper::IMapperV5Impl {
uint64_t* _Nonnull outReservedSize) override;
private:
- enum class ReservedRegionArea {
- /* CrosGralloc4Metadata */
- MAPPER4_METADATA,
-
- /* External user metadata */
- USER_METADATA,
- };
-
- AIMapper_Error getReservedRegionArea(const cros_gralloc_buffer* crosBuffer,
- ReservedRegionArea area, void** outAddr,
- uint64_t* outSize);
-
- AIMapper_Error getCrosMetadata(const cros_gralloc_buffer* crosBuffer,
- const CrosGralloc4Metadata** outMetadata);
-
- AIMapper_Error getMutableCrosMetadata(cros_gralloc_buffer* crosBuffer,
- CrosGralloc4Metadata** outMetadata);
-
template <typename F, StandardMetadataType TYPE>
int32_t getStandardMetadata(const cros_gralloc_buffer* crosBuffer, F&& provide,
StandardMetadata<TYPE>);
template <StandardMetadataType TYPE>
- AIMapper_Error setStandardMetadata(CrosGralloc4Metadata* crosMetadata,
+ AIMapper_Error setStandardMetadata(cros_gralloc_buffer* crosBuffer,
typename StandardMetadata<TYPE>::value_type&& value);
void dumpBuffer(
@@ -329,23 +310,16 @@ int32_t CrosGrallocMapperV5::getStandardMetadata(buffer_handle_t _Nonnull buffer
template <typename F, StandardMetadataType metadataType>
int32_t CrosGrallocMapperV5::getStandardMetadata(const cros_gralloc_buffer* crosBuffer, F&& provide,
StandardMetadata<metadataType>) {
- const CrosGralloc4Metadata* crosMetadata = nullptr;
- if constexpr (metadataType == StandardMetadataType::BLEND_MODE ||
- metadataType == StandardMetadataType::CTA861_3 ||
- metadataType == StandardMetadataType::DATASPACE ||
- metadataType == StandardMetadataType::NAME ||
- metadataType == StandardMetadataType::SMPTE2086) {
- AIMapper_Error error = getCrosMetadata(crosBuffer, &crosMetadata);
- if (error != AIMAPPER_ERROR_NONE) {
- ALOGE("Failed to get. Failed to get buffer metadata.");
- return -AIMAPPER_ERROR_NO_RESOURCES;
- }
- }
if constexpr (metadataType == StandardMetadataType::BUFFER_ID) {
return provide(crosBuffer->get_id());
}
if constexpr (metadataType == StandardMetadataType::NAME) {
- return provide(crosMetadata->name);
+ std::optional<std::string> name;
+ if (crosBuffer->get_name(&name)) {
+ return -AIMAPPER_ERROR_NO_RESOURCES;
+ } else {
+ return provide(*name);
+ }
}
if constexpr (metadataType == StandardMetadataType::WIDTH) {
return provide(crosBuffer->get_width());
@@ -423,16 +397,36 @@ int32_t CrosGrallocMapperV5::getStandardMetadata(const cros_gralloc_buffer* cros
return provide(crops);
}
if constexpr (metadataType == StandardMetadataType::DATASPACE) {
- return provide(crosMetadata->dataspace);
+ std::optional<Dataspace> dataspace;
+ if (crosBuffer->get_dataspace(&dataspace)) {
+ return -AIMAPPER_ERROR_NO_RESOURCES;
+ } else {
+ return provide(*dataspace);
+ }
}
if constexpr (metadataType == StandardMetadataType::BLEND_MODE) {
- return provide(crosMetadata->blendMode);
+ std::optional<BlendMode> blend;
+ if (crosBuffer->get_blend_mode(&blend)) {
+ return -AIMAPPER_ERROR_NO_RESOURCES;
+ } else {
+ return provide(*blend);
+ }
}
if constexpr (metadataType == StandardMetadataType::SMPTE2086) {
- return crosMetadata->smpte2086 ? provide(*crosMetadata->smpte2086) : 0;
+ std::optional<Smpte2086> smpte;
+ if (crosBuffer->get_smpte2086(&smpte)) {
+ return -AIMAPPER_ERROR_NO_RESOURCES;
+ } else {
+ return smpte ? provide(*smpte) : 0;
+ }
}
if constexpr (metadataType == StandardMetadataType::CTA861_3) {
- return crosMetadata->cta861_3 ? provide(*crosMetadata->cta861_3) : 0;
+ std::optional<Cta861_3> cta;
+ if (crosBuffer->get_cta861_3(&cta)) {
+ return -AIMAPPER_ERROR_NO_RESOURCES;
+ } else {
+ return cta ? provide(*cta) : 0;
+ }
}
return -AIMAPPER_ERROR_UNSUPPORTED;
}
@@ -488,14 +482,8 @@ AIMapper_Error CrosGrallocMapperV5::setStandardMetadata(buffer_handle_t _Nonnull
AIMapper_Error status = AIMAPPER_ERROR_UNSUPPORTED;
mDriver->with_buffer(crosHandle, [&](cros_gralloc_buffer* crosBuffer) {
- CrosGralloc4Metadata* crosMetadata = nullptr;
- status = getMutableCrosMetadata(crosBuffer, &crosMetadata);
- if (status != AIMAPPER_ERROR_NONE) {
- return;
- }
-
auto applier = [&]<StandardMetadataType T>(auto&& value) -> AIMapper_Error {
- return setStandardMetadata<T>(crosMetadata, std::forward<decltype(value)>(value));
+ return setStandardMetadata<T>(crosBuffer, std::forward<decltype(value)>(value));
};
status = applyStandardMetadata(standardType, metadata, metadataSize, applier);
@@ -505,19 +493,25 @@ AIMapper_Error CrosGrallocMapperV5::setStandardMetadata(buffer_handle_t _Nonnull
template <StandardMetadataType TYPE>
AIMapper_Error CrosGrallocMapperV5::setStandardMetadata(
- CrosGralloc4Metadata* crosMetadata, typename StandardMetadata<TYPE>::value_type&& value) {
+ cros_gralloc_buffer* crosBuffer, typename StandardMetadata<TYPE>::value_type&& value) {
+ int ret = 0;
if constexpr (TYPE == StandardMetadataType::BLEND_MODE) {
- crosMetadata->blendMode = value;
+ ret = crosBuffer->set_blend_mode(value);
}
if constexpr (TYPE == StandardMetadataType::CTA861_3) {
- crosMetadata->cta861_3 = value;
+ ret = crosBuffer->set_cta861_3(value);
}
if constexpr (TYPE == StandardMetadataType::DATASPACE) {
- crosMetadata->dataspace = value;
+ ret = crosBuffer->set_dataspace(value);
}
if constexpr (TYPE == StandardMetadataType::SMPTE2086) {
- crosMetadata->smpte2086 = value;
+ ret = crosBuffer->set_smpte2086(value);
}
+
+ if (ret) {
+ return AIMAPPER_ERROR_NO_RESOURCES;
+ }
+
// Unsupported metadatas were already filtered before we reached this point
return AIMAPPER_ERROR_NONE;
}
@@ -667,78 +661,23 @@ AIMapper_Error CrosGrallocMapperV5::getReservedRegion(buffer_handle_t _Nonnull b
uint64_t reservedRegionSize = 0;
AIMapper_Error error = AIMAPPER_ERROR_NONE;
- mDriver->with_buffer(crosHandle, [&, this](cros_gralloc_buffer* crosBuffer) {
- error = getReservedRegionArea(crosBuffer, ReservedRegionArea::USER_METADATA,
- &reservedRegionAddr, &reservedRegionSize);
+ mDriver->with_buffer(crosHandle, [&](cros_gralloc_buffer* crosBuffer) {
+ int ret = crosBuffer->get_client_reserved_region(&reservedRegionAddr, &reservedRegionSize);
+ if (ret) {
+ reservedRegionAddr = nullptr;
+ reservedRegionSize = 0;
+ error = AIMAPPER_ERROR_NO_RESOURCES;
+ }
});
if (error != AIMAPPER_ERROR_NONE) {
- ALOGE("Failed to getReservedRegion. Failed to getReservedRegionArea.");
+ ALOGE("Failed to getReservedRegion. Failed to getReservedRegion.");
return AIMAPPER_ERROR_BAD_BUFFER;
}
return AIMAPPER_ERROR_NONE;
}
-AIMapper_Error CrosGrallocMapperV5::getReservedRegionArea(const cros_gralloc_buffer* crosBuffer,
- ReservedRegionArea area, void** outAddr,
- uint64_t* outSize) {
- int ret = crosBuffer->get_reserved_region(outAddr, outSize);
- if (ret) {
- ALOGE("Failed to getReservedRegionArea.");
- *outAddr = nullptr;
- *outSize = 0;
- return AIMAPPER_ERROR_NO_RESOURCES;
- }
-
- switch (area) {
- case ReservedRegionArea::MAPPER4_METADATA: {
- // CrosGralloc4Metadata resides at the beginning reserved region.
- *outSize = sizeof(CrosGralloc4Metadata);
- break;
- }
- case ReservedRegionArea::USER_METADATA: {
- // User metadata resides after the CrosGralloc4Metadata.
- *outAddr = reinterpret_cast<void*>(reinterpret_cast<char*>(*outAddr) +
- sizeof(CrosGralloc4Metadata));
- *outSize = *outSize - sizeof(CrosGralloc4Metadata);
- break;
- }
- }
-
- return AIMAPPER_ERROR_NONE;
-}
-
-AIMapper_Error CrosGrallocMapperV5::getCrosMetadata(const cros_gralloc_buffer* crosBuffer,
- const CrosGralloc4Metadata** outMetadata) {
- void* addr = nullptr;
- uint64_t size;
-
- auto error =
- getReservedRegionArea(crosBuffer, ReservedRegionArea::MAPPER4_METADATA, &addr, &size);
- if (error != AIMAPPER_ERROR_NONE) {
- return error;
- }
-
- *outMetadata = reinterpret_cast<const CrosGralloc4Metadata*>(addr);
- return AIMAPPER_ERROR_NONE;
-}
-
-AIMapper_Error CrosGrallocMapperV5::getMutableCrosMetadata(cros_gralloc_buffer* crosBuffer,
- CrosGralloc4Metadata** outMetadata) {
- void* addr = nullptr;
- uint64_t size;
-
- auto error =
- getReservedRegionArea(crosBuffer, ReservedRegionArea::MAPPER4_METADATA, &addr, &size);
- if (error != AIMAPPER_ERROR_NONE) {
- return error;
- }
-
- *outMetadata = reinterpret_cast<CrosGralloc4Metadata*>(addr);
- return AIMAPPER_ERROR_NONE;
-}
-
extern "C" uint32_t ANDROID_HAL_MAPPER_VERSION = AIMAPPER_VERSION_5;
extern "C" AIMapper_Error AIMapper_loadIMapper(AIMapper* _Nullable* _Nonnull outImplementation) {