xref: /aosp_15_r20/frameworks/native/libs/ui/Gralloc5.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "Gralloc5"
18*38e8c45fSAndroid Build Coastguard Worker #define ATRACE_TAG ATRACE_TAG_GRAPHICS
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <ui/Gralloc5.h>
21*38e8c45fSAndroid Build Coastguard Worker 
22*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/graphics/allocator/AllocationError.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <aidlcommonsupport/NativeHandle.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <android/binder_manager.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <android/hardware/graphics/mapper/utils/IMapperMetadataTypes.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
27*38e8c45fSAndroid Build Coastguard Worker #include <dlfcn.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <ui/FatVector.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <vndksupport/linker.h>
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker using namespace aidl::android::hardware::graphics::allocator;
32*38e8c45fSAndroid Build Coastguard Worker using namespace aidl::android::hardware::graphics::common;
33*38e8c45fSAndroid Build Coastguard Worker using namespace ::android::hardware::graphics::mapper;
34*38e8c45fSAndroid Build Coastguard Worker 
35*38e8c45fSAndroid Build Coastguard Worker using ADataspace = aidl::android::hardware::graphics::common::Dataspace;
36*38e8c45fSAndroid Build Coastguard Worker using APixelFormat = aidl::android::hardware::graphics::common::PixelFormat;
37*38e8c45fSAndroid Build Coastguard Worker 
38*38e8c45fSAndroid Build Coastguard Worker namespace android {
39*38e8c45fSAndroid Build Coastguard Worker 
40*38e8c45fSAndroid Build Coastguard Worker static const auto kIAllocatorServiceName = IAllocator::descriptor + std::string("/default");
41*38e8c45fSAndroid Build Coastguard Worker static const auto kIAllocatorMinimumVersion = 2;
42*38e8c45fSAndroid Build Coastguard Worker constexpr const char* kStandardMetadataName =
43*38e8c45fSAndroid Build Coastguard Worker         "android.hardware.graphics.common.StandardMetadataType";
44*38e8c45fSAndroid Build Coastguard Worker 
45*38e8c45fSAndroid Build Coastguard Worker // TODO(b/72323293, b/72703005): Remove these invalid bits from callers
46*38e8c45fSAndroid Build Coastguard Worker static constexpr uint64_t kRemovedUsageBits = static_cast<uint64_t>((1 << 10) | (1 << 13));
47*38e8c45fSAndroid Build Coastguard Worker 
48*38e8c45fSAndroid Build Coastguard Worker typedef AIMapper_Error (*AIMapper_loadIMapperFn)(AIMapper *_Nullable *_Nonnull outImplementation);
49*38e8c45fSAndroid Build Coastguard Worker 
50*38e8c45fSAndroid Build Coastguard Worker struct Gralloc5 {
51*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<IAllocator> allocator;
52*38e8c45fSAndroid Build Coastguard Worker     AIMapper *mapper = nullptr;
53*38e8c45fSAndroid Build Coastguard Worker };
54*38e8c45fSAndroid Build Coastguard Worker 
waitForAllocator()55*38e8c45fSAndroid Build Coastguard Worker static std::shared_ptr<IAllocator> waitForAllocator() {
56*38e8c45fSAndroid Build Coastguard Worker     if (__builtin_available(android 31, *)) {
57*38e8c45fSAndroid Build Coastguard Worker         if (!AServiceManager_isDeclared(kIAllocatorServiceName.c_str())) {
58*38e8c45fSAndroid Build Coastguard Worker             return nullptr;
59*38e8c45fSAndroid Build Coastguard Worker         }
60*38e8c45fSAndroid Build Coastguard Worker         auto allocator = IAllocator::fromBinder(
61*38e8c45fSAndroid Build Coastguard Worker                 ndk::SpAIBinder(AServiceManager_waitForService(kIAllocatorServiceName.c_str())));
62*38e8c45fSAndroid Build Coastguard Worker         if (!allocator) {
63*38e8c45fSAndroid Build Coastguard Worker             ALOGE("AIDL IAllocator declared but failed to get service");
64*38e8c45fSAndroid Build Coastguard Worker             return nullptr;
65*38e8c45fSAndroid Build Coastguard Worker         }
66*38e8c45fSAndroid Build Coastguard Worker 
67*38e8c45fSAndroid Build Coastguard Worker         int32_t version = 0;
68*38e8c45fSAndroid Build Coastguard Worker         if (!allocator->getInterfaceVersion(&version).isOk()) {
69*38e8c45fSAndroid Build Coastguard Worker             ALOGE("Failed to query interface version");
70*38e8c45fSAndroid Build Coastguard Worker             return nullptr;
71*38e8c45fSAndroid Build Coastguard Worker         }
72*38e8c45fSAndroid Build Coastguard Worker         if (version < kIAllocatorMinimumVersion) {
73*38e8c45fSAndroid Build Coastguard Worker             return nullptr;
74*38e8c45fSAndroid Build Coastguard Worker         }
75*38e8c45fSAndroid Build Coastguard Worker         return allocator;
76*38e8c45fSAndroid Build Coastguard Worker     } else {
77*38e8c45fSAndroid Build Coastguard Worker         // TODO: LOG_ALWAYS_FATAL("libui is not backwards compatible");
78*38e8c45fSAndroid Build Coastguard Worker         return nullptr;
79*38e8c45fSAndroid Build Coastguard Worker     }
80*38e8c45fSAndroid Build Coastguard Worker }
81*38e8c45fSAndroid Build Coastguard Worker 
loadIMapperLibrary()82*38e8c45fSAndroid Build Coastguard Worker static void *loadIMapperLibrary() {
83*38e8c45fSAndroid Build Coastguard Worker     static void *imapperLibrary = []() -> void * {
84*38e8c45fSAndroid Build Coastguard Worker         auto allocator = waitForAllocator();
85*38e8c45fSAndroid Build Coastguard Worker         std::string mapperSuffix;
86*38e8c45fSAndroid Build Coastguard Worker         auto status = allocator->getIMapperLibrarySuffix(&mapperSuffix);
87*38e8c45fSAndroid Build Coastguard Worker         if (!status.isOk()) {
88*38e8c45fSAndroid Build Coastguard Worker             ALOGE("Failed to get IMapper library suffix");
89*38e8c45fSAndroid Build Coastguard Worker             return nullptr;
90*38e8c45fSAndroid Build Coastguard Worker         }
91*38e8c45fSAndroid Build Coastguard Worker 
92*38e8c45fSAndroid Build Coastguard Worker         void* so = nullptr;
93*38e8c45fSAndroid Build Coastguard Worker         if (__builtin_available(android __ANDROID_API_V__, *)) {
94*38e8c45fSAndroid Build Coastguard Worker             so = AServiceManager_openDeclaredPassthroughHal("mapper", mapperSuffix.c_str(),
95*38e8c45fSAndroid Build Coastguard Worker                                                             RTLD_LOCAL | RTLD_NOW);
96*38e8c45fSAndroid Build Coastguard Worker         } else {
97*38e8c45fSAndroid Build Coastguard Worker             std::string lib_name = "mapper." + mapperSuffix + ".so";
98*38e8c45fSAndroid Build Coastguard Worker             so = android_load_sphal_library(lib_name.c_str(), RTLD_LOCAL | RTLD_NOW);
99*38e8c45fSAndroid Build Coastguard Worker         }
100*38e8c45fSAndroid Build Coastguard Worker         if (!so) {
101*38e8c45fSAndroid Build Coastguard Worker             ALOGE("Failed to load mapper.%s.so", mapperSuffix.c_str());
102*38e8c45fSAndroid Build Coastguard Worker         }
103*38e8c45fSAndroid Build Coastguard Worker         return so;
104*38e8c45fSAndroid Build Coastguard Worker     }();
105*38e8c45fSAndroid Build Coastguard Worker     return imapperLibrary;
106*38e8c45fSAndroid Build Coastguard Worker }
107*38e8c45fSAndroid Build Coastguard Worker 
getInstance()108*38e8c45fSAndroid Build Coastguard Worker static const Gralloc5 &getInstance() {
109*38e8c45fSAndroid Build Coastguard Worker     static Gralloc5 instance = []() {
110*38e8c45fSAndroid Build Coastguard Worker         auto allocator = waitForAllocator();
111*38e8c45fSAndroid Build Coastguard Worker         if (!allocator) {
112*38e8c45fSAndroid Build Coastguard Worker             return Gralloc5{};
113*38e8c45fSAndroid Build Coastguard Worker         }
114*38e8c45fSAndroid Build Coastguard Worker         void *so = loadIMapperLibrary();
115*38e8c45fSAndroid Build Coastguard Worker         if (!so) {
116*38e8c45fSAndroid Build Coastguard Worker             return Gralloc5{};
117*38e8c45fSAndroid Build Coastguard Worker         }
118*38e8c45fSAndroid Build Coastguard Worker         auto loadIMapper = (AIMapper_loadIMapperFn)dlsym(so, "AIMapper_loadIMapper");
119*38e8c45fSAndroid Build Coastguard Worker         AIMapper *mapper = nullptr;
120*38e8c45fSAndroid Build Coastguard Worker         AIMapper_Error error = loadIMapper(&mapper);
121*38e8c45fSAndroid Build Coastguard Worker         if (error != AIMAPPER_ERROR_NONE) {
122*38e8c45fSAndroid Build Coastguard Worker             ALOGE("AIMapper_loadIMapper failed %d", error);
123*38e8c45fSAndroid Build Coastguard Worker             return Gralloc5{};
124*38e8c45fSAndroid Build Coastguard Worker         }
125*38e8c45fSAndroid Build Coastguard Worker         return Gralloc5{std::move(allocator), mapper};
126*38e8c45fSAndroid Build Coastguard Worker     }();
127*38e8c45fSAndroid Build Coastguard Worker     return instance;
128*38e8c45fSAndroid Build Coastguard Worker }
129*38e8c45fSAndroid Build Coastguard Worker 
130*38e8c45fSAndroid Build Coastguard Worker template <StandardMetadataType T>
getStandardMetadata(AIMapper * mapper,buffer_handle_t bufferHandle)131*38e8c45fSAndroid Build Coastguard Worker static auto getStandardMetadata(AIMapper *mapper, buffer_handle_t bufferHandle)
132*38e8c45fSAndroid Build Coastguard Worker         -> decltype(StandardMetadata<T>::value::decode(nullptr, 0)) {
133*38e8c45fSAndroid Build Coastguard Worker     using Value = typename StandardMetadata<T>::value;
134*38e8c45fSAndroid Build Coastguard Worker     // TODO: Tune for common-case better
135*38e8c45fSAndroid Build Coastguard Worker     FatVector<uint8_t, 128> buffer;
136*38e8c45fSAndroid Build Coastguard Worker     int32_t sizeRequired = mapper->v5.getStandardMetadata(bufferHandle, static_cast<int64_t>(T),
137*38e8c45fSAndroid Build Coastguard Worker                                                           buffer.data(), buffer.size());
138*38e8c45fSAndroid Build Coastguard Worker     if (sizeRequired < 0) {
139*38e8c45fSAndroid Build Coastguard Worker         ALOGW_IF(-AIMAPPER_ERROR_UNSUPPORTED != sizeRequired,
140*38e8c45fSAndroid Build Coastguard Worker                  "Unexpected error %d from valid getStandardMetadata call", -sizeRequired);
141*38e8c45fSAndroid Build Coastguard Worker         return std::nullopt;
142*38e8c45fSAndroid Build Coastguard Worker     }
143*38e8c45fSAndroid Build Coastguard Worker     if ((size_t)sizeRequired > buffer.size()) {
144*38e8c45fSAndroid Build Coastguard Worker         buffer.resize(sizeRequired);
145*38e8c45fSAndroid Build Coastguard Worker         sizeRequired = mapper->v5.getStandardMetadata(bufferHandle, static_cast<int64_t>(T),
146*38e8c45fSAndroid Build Coastguard Worker                                                       buffer.data(), buffer.size());
147*38e8c45fSAndroid Build Coastguard Worker     }
148*38e8c45fSAndroid Build Coastguard Worker     if (sizeRequired < 0 || (size_t)sizeRequired > buffer.size()) {
149*38e8c45fSAndroid Build Coastguard Worker         ALOGW("getStandardMetadata failed, received %d with buffer size %zd", sizeRequired,
150*38e8c45fSAndroid Build Coastguard Worker               buffer.size());
151*38e8c45fSAndroid Build Coastguard Worker         // Generate a fail type
152*38e8c45fSAndroid Build Coastguard Worker         return std::nullopt;
153*38e8c45fSAndroid Build Coastguard Worker     }
154*38e8c45fSAndroid Build Coastguard Worker     return Value::decode(buffer.data(), sizeRequired);
155*38e8c45fSAndroid Build Coastguard Worker }
156*38e8c45fSAndroid Build Coastguard Worker 
157*38e8c45fSAndroid Build Coastguard Worker template <StandardMetadataType T>
setStandardMetadata(AIMapper * mapper,buffer_handle_t bufferHandle,const typename StandardMetadata<T>::value_type & value)158*38e8c45fSAndroid Build Coastguard Worker static AIMapper_Error setStandardMetadata(AIMapper *mapper, buffer_handle_t bufferHandle,
159*38e8c45fSAndroid Build Coastguard Worker                                           const typename StandardMetadata<T>::value_type &value) {
160*38e8c45fSAndroid Build Coastguard Worker     using Value = typename StandardMetadata<T>::value;
161*38e8c45fSAndroid Build Coastguard Worker     int32_t sizeRequired = Value::encode(value, nullptr, 0);
162*38e8c45fSAndroid Build Coastguard Worker     if (sizeRequired < 0) {
163*38e8c45fSAndroid Build Coastguard Worker         ALOGW("Failed to calculate required size");
164*38e8c45fSAndroid Build Coastguard Worker         return static_cast<AIMapper_Error>(-sizeRequired);
165*38e8c45fSAndroid Build Coastguard Worker     }
166*38e8c45fSAndroid Build Coastguard Worker     FatVector<uint8_t, 128> buffer;
167*38e8c45fSAndroid Build Coastguard Worker     buffer.resize(sizeRequired);
168*38e8c45fSAndroid Build Coastguard Worker     sizeRequired = Value::encode(value, buffer.data(), buffer.size());
169*38e8c45fSAndroid Build Coastguard Worker     if (sizeRequired < 0 || (size_t)sizeRequired > buffer.size()) {
170*38e8c45fSAndroid Build Coastguard Worker         ALOGW("Failed to encode with calculated size %d; buffer size %zd", sizeRequired,
171*38e8c45fSAndroid Build Coastguard Worker               buffer.size());
172*38e8c45fSAndroid Build Coastguard Worker         return static_cast<AIMapper_Error>(-sizeRequired);
173*38e8c45fSAndroid Build Coastguard Worker     }
174*38e8c45fSAndroid Build Coastguard Worker     return mapper->v5.setStandardMetadata(bufferHandle, static_cast<int64_t>(T), buffer.data(),
175*38e8c45fSAndroid Build Coastguard Worker                                           sizeRequired);
176*38e8c45fSAndroid Build Coastguard Worker }
177*38e8c45fSAndroid Build Coastguard Worker 
Gralloc5Allocator(const Gralloc5Mapper & mapper)178*38e8c45fSAndroid Build Coastguard Worker Gralloc5Allocator::Gralloc5Allocator(const Gralloc5Mapper &mapper) : mMapper(mapper) {
179*38e8c45fSAndroid Build Coastguard Worker     mAllocator = getInstance().allocator;
180*38e8c45fSAndroid Build Coastguard Worker }
181*38e8c45fSAndroid Build Coastguard Worker 
isLoaded() const182*38e8c45fSAndroid Build Coastguard Worker bool Gralloc5Allocator::isLoaded() const {
183*38e8c45fSAndroid Build Coastguard Worker     return mAllocator != nullptr;
184*38e8c45fSAndroid Build Coastguard Worker }
185*38e8c45fSAndroid Build Coastguard Worker 
getValidUsageBits()186*38e8c45fSAndroid Build Coastguard Worker static uint64_t getValidUsageBits() {
187*38e8c45fSAndroid Build Coastguard Worker     static const uint64_t validUsageBits = []() -> uint64_t {
188*38e8c45fSAndroid Build Coastguard Worker         uint64_t bits = 0;
189*38e8c45fSAndroid Build Coastguard Worker         for (const auto bit : ndk::enum_range<BufferUsage>{}) {
190*38e8c45fSAndroid Build Coastguard Worker             bits |= static_cast<int64_t>(bit);
191*38e8c45fSAndroid Build Coastguard Worker         }
192*38e8c45fSAndroid Build Coastguard Worker         return bits;
193*38e8c45fSAndroid Build Coastguard Worker     }();
194*38e8c45fSAndroid Build Coastguard Worker     return validUsageBits | kRemovedUsageBits;
195*38e8c45fSAndroid Build Coastguard Worker }
196*38e8c45fSAndroid Build Coastguard Worker 
makeDescriptor(std::string requestorName,uint32_t width,uint32_t height,PixelFormat format,uint32_t layerCount,uint64_t usage)197*38e8c45fSAndroid Build Coastguard Worker static std::optional<BufferDescriptorInfo> makeDescriptor(std::string requestorName, uint32_t width,
198*38e8c45fSAndroid Build Coastguard Worker                                                           uint32_t height, PixelFormat format,
199*38e8c45fSAndroid Build Coastguard Worker                                                           uint32_t layerCount, uint64_t usage) {
200*38e8c45fSAndroid Build Coastguard Worker     uint64_t validUsageBits = getValidUsageBits();
201*38e8c45fSAndroid Build Coastguard Worker     if (usage & ~validUsageBits) {
202*38e8c45fSAndroid Build Coastguard Worker         ALOGE("buffer descriptor contains invalid usage bits 0x%" PRIx64, usage & ~validUsageBits);
203*38e8c45fSAndroid Build Coastguard Worker         return std::nullopt;
204*38e8c45fSAndroid Build Coastguard Worker     }
205*38e8c45fSAndroid Build Coastguard Worker 
206*38e8c45fSAndroid Build Coastguard Worker     BufferDescriptorInfo descriptorInfo{
207*38e8c45fSAndroid Build Coastguard Worker             .width = static_cast<int32_t>(width),
208*38e8c45fSAndroid Build Coastguard Worker             .height = static_cast<int32_t>(height),
209*38e8c45fSAndroid Build Coastguard Worker             .layerCount = static_cast<int32_t>(layerCount),
210*38e8c45fSAndroid Build Coastguard Worker             .format = static_cast<::aidl::android::hardware::graphics::common::PixelFormat>(format),
211*38e8c45fSAndroid Build Coastguard Worker             .usage = static_cast<BufferUsage>(usage),
212*38e8c45fSAndroid Build Coastguard Worker     };
213*38e8c45fSAndroid Build Coastguard Worker     auto nameLength = std::min(requestorName.length(), descriptorInfo.name.size() - 1);
214*38e8c45fSAndroid Build Coastguard Worker     memcpy(descriptorInfo.name.data(), requestorName.data(), nameLength);
215*38e8c45fSAndroid Build Coastguard Worker     requestorName.data()[nameLength] = 0;
216*38e8c45fSAndroid Build Coastguard Worker     return descriptorInfo;
217*38e8c45fSAndroid Build Coastguard Worker }
218*38e8c45fSAndroid Build Coastguard Worker 
dumpDebugInfo(bool less) const219*38e8c45fSAndroid Build Coastguard Worker std::string Gralloc5Allocator::dumpDebugInfo(bool less) const {
220*38e8c45fSAndroid Build Coastguard Worker     return mMapper.dumpBuffers(less);
221*38e8c45fSAndroid Build Coastguard Worker }
222*38e8c45fSAndroid Build Coastguard Worker 
allocate(std::string requestorName,uint32_t width,uint32_t height,android::PixelFormat format,uint32_t layerCount,uint64_t usage,uint32_t * outStride,buffer_handle_t * outBufferHandles,bool importBuffers) const223*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Allocator::allocate(std::string requestorName, uint32_t width, uint32_t height,
224*38e8c45fSAndroid Build Coastguard Worker                                      android::PixelFormat format, uint32_t layerCount,
225*38e8c45fSAndroid Build Coastguard Worker                                      uint64_t usage, uint32_t* outStride,
226*38e8c45fSAndroid Build Coastguard Worker                                      buffer_handle_t* outBufferHandles, bool importBuffers) const {
227*38e8c45fSAndroid Build Coastguard Worker     auto result = allocate(GraphicBufferAllocator::AllocationRequest{
228*38e8c45fSAndroid Build Coastguard Worker             .importBuffer = importBuffers,
229*38e8c45fSAndroid Build Coastguard Worker             .width = width,
230*38e8c45fSAndroid Build Coastguard Worker             .height = height,
231*38e8c45fSAndroid Build Coastguard Worker             .format = format,
232*38e8c45fSAndroid Build Coastguard Worker             .layerCount = layerCount,
233*38e8c45fSAndroid Build Coastguard Worker             .usage = usage,
234*38e8c45fSAndroid Build Coastguard Worker             .requestorName = requestorName,
235*38e8c45fSAndroid Build Coastguard Worker     });
236*38e8c45fSAndroid Build Coastguard Worker 
237*38e8c45fSAndroid Build Coastguard Worker     *outStride = result.stride;
238*38e8c45fSAndroid Build Coastguard Worker     outBufferHandles[0] = result.handle;
239*38e8c45fSAndroid Build Coastguard Worker     return result.status;
240*38e8c45fSAndroid Build Coastguard Worker }
241*38e8c45fSAndroid Build Coastguard Worker 
allocate(const GraphicBufferAllocator::AllocationRequest & request) const242*38e8c45fSAndroid Build Coastguard Worker GraphicBufferAllocator::AllocationResult Gralloc5Allocator::allocate(
243*38e8c45fSAndroid Build Coastguard Worker         const GraphicBufferAllocator::AllocationRequest& request) const {
244*38e8c45fSAndroid Build Coastguard Worker     auto descriptorInfo = makeDescriptor(request.requestorName, request.width, request.height,
245*38e8c45fSAndroid Build Coastguard Worker                                          request.format, request.layerCount, request.usage);
246*38e8c45fSAndroid Build Coastguard Worker     if (!descriptorInfo) {
247*38e8c45fSAndroid Build Coastguard Worker         return GraphicBufferAllocator::AllocationResult{BAD_VALUE};
248*38e8c45fSAndroid Build Coastguard Worker     }
249*38e8c45fSAndroid Build Coastguard Worker 
250*38e8c45fSAndroid Build Coastguard Worker     descriptorInfo->additionalOptions.reserve(request.extras.size());
251*38e8c45fSAndroid Build Coastguard Worker     for (const auto& option : request.extras) {
252*38e8c45fSAndroid Build Coastguard Worker         ExtendableType type;
253*38e8c45fSAndroid Build Coastguard Worker         type.name = option.name;
254*38e8c45fSAndroid Build Coastguard Worker         type.value = option.value;
255*38e8c45fSAndroid Build Coastguard Worker         descriptorInfo->additionalOptions.push_back(std::move(type));
256*38e8c45fSAndroid Build Coastguard Worker     }
257*38e8c45fSAndroid Build Coastguard Worker 
258*38e8c45fSAndroid Build Coastguard Worker     AllocationResult result;
259*38e8c45fSAndroid Build Coastguard Worker     auto status = mAllocator->allocate2(*descriptorInfo, 1, &result);
260*38e8c45fSAndroid Build Coastguard Worker     if (!status.isOk()) {
261*38e8c45fSAndroid Build Coastguard Worker         auto error = status.getExceptionCode();
262*38e8c45fSAndroid Build Coastguard Worker         if (error == EX_SERVICE_SPECIFIC) {
263*38e8c45fSAndroid Build Coastguard Worker             switch (static_cast<AllocationError>(status.getServiceSpecificError())) {
264*38e8c45fSAndroid Build Coastguard Worker                 case AllocationError::BAD_DESCRIPTOR:
265*38e8c45fSAndroid Build Coastguard Worker                     error = BAD_VALUE;
266*38e8c45fSAndroid Build Coastguard Worker                     break;
267*38e8c45fSAndroid Build Coastguard Worker                 case AllocationError::NO_RESOURCES:
268*38e8c45fSAndroid Build Coastguard Worker                     error = NO_MEMORY;
269*38e8c45fSAndroid Build Coastguard Worker                     break;
270*38e8c45fSAndroid Build Coastguard Worker                 default:
271*38e8c45fSAndroid Build Coastguard Worker                     error = UNKNOWN_ERROR;
272*38e8c45fSAndroid Build Coastguard Worker                     break;
273*38e8c45fSAndroid Build Coastguard Worker             }
274*38e8c45fSAndroid Build Coastguard Worker         }
275*38e8c45fSAndroid Build Coastguard Worker         return GraphicBufferAllocator::AllocationResult{error};
276*38e8c45fSAndroid Build Coastguard Worker     }
277*38e8c45fSAndroid Build Coastguard Worker 
278*38e8c45fSAndroid Build Coastguard Worker     GraphicBufferAllocator::AllocationResult ret{OK};
279*38e8c45fSAndroid Build Coastguard Worker     if (request.importBuffer) {
280*38e8c45fSAndroid Build Coastguard Worker         auto handle = makeFromAidl(result.buffers[0]);
281*38e8c45fSAndroid Build Coastguard Worker         auto error = mMapper.importBuffer(handle, &ret.handle);
282*38e8c45fSAndroid Build Coastguard Worker         native_handle_delete(handle);
283*38e8c45fSAndroid Build Coastguard Worker         if (error != NO_ERROR) {
284*38e8c45fSAndroid Build Coastguard Worker             return GraphicBufferAllocator::AllocationResult{error};
285*38e8c45fSAndroid Build Coastguard Worker         }
286*38e8c45fSAndroid Build Coastguard Worker     } else {
287*38e8c45fSAndroid Build Coastguard Worker         ret.handle = dupFromAidl(result.buffers[0]);
288*38e8c45fSAndroid Build Coastguard Worker         if (!ret.handle) {
289*38e8c45fSAndroid Build Coastguard Worker             return GraphicBufferAllocator::AllocationResult{NO_MEMORY};
290*38e8c45fSAndroid Build Coastguard Worker         }
291*38e8c45fSAndroid Build Coastguard Worker     }
292*38e8c45fSAndroid Build Coastguard Worker 
293*38e8c45fSAndroid Build Coastguard Worker     ret.stride = result.stride;
294*38e8c45fSAndroid Build Coastguard Worker 
295*38e8c45fSAndroid Build Coastguard Worker     // Release all the resources held by AllocationResult (specifically any remaining FDs)
296*38e8c45fSAndroid Build Coastguard Worker     result = {};
297*38e8c45fSAndroid Build Coastguard Worker     // make sure the kernel driver sees BC_FREE_BUFFER and closes the fds now
298*38e8c45fSAndroid Build Coastguard Worker     // TODO: Re-enable this at some point if it's necessary. We can't do it now because libui
299*38e8c45fSAndroid Build Coastguard Worker     // is marked apex_available (b/214400477) and libbinder isn't (which of course is correct)
300*38e8c45fSAndroid Build Coastguard Worker     // IPCThreadState::self()->flushCommands();
301*38e8c45fSAndroid Build Coastguard Worker 
302*38e8c45fSAndroid Build Coastguard Worker     return ret;
303*38e8c45fSAndroid Build Coastguard Worker }
304*38e8c45fSAndroid Build Coastguard Worker 
preload()305*38e8c45fSAndroid Build Coastguard Worker void Gralloc5Mapper::preload() {
306*38e8c45fSAndroid Build Coastguard Worker     // TODO(b/261858155): Implement. We can't bounce off of IAllocator for this because zygote can't
307*38e8c45fSAndroid Build Coastguard Worker     // use binder. So when an alternate strategy of retrieving the library prefix is available,
308*38e8c45fSAndroid Build Coastguard Worker     // use that here.
309*38e8c45fSAndroid Build Coastguard Worker }
310*38e8c45fSAndroid Build Coastguard Worker 
Gralloc5Mapper()311*38e8c45fSAndroid Build Coastguard Worker Gralloc5Mapper::Gralloc5Mapper() {
312*38e8c45fSAndroid Build Coastguard Worker     mMapper = getInstance().mapper;
313*38e8c45fSAndroid Build Coastguard Worker }
314*38e8c45fSAndroid Build Coastguard Worker 
isLoaded() const315*38e8c45fSAndroid Build Coastguard Worker bool Gralloc5Mapper::isLoaded() const {
316*38e8c45fSAndroid Build Coastguard Worker     return mMapper != nullptr && mMapper->version >= AIMAPPER_VERSION_5;
317*38e8c45fSAndroid Build Coastguard Worker }
318*38e8c45fSAndroid Build Coastguard Worker 
isStandardMetadata(AIMapper_MetadataType metadataType)319*38e8c45fSAndroid Build Coastguard Worker static bool isStandardMetadata(AIMapper_MetadataType metadataType) {
320*38e8c45fSAndroid Build Coastguard Worker     return strcmp(kStandardMetadataName, metadataType.name) == 0;
321*38e8c45fSAndroid Build Coastguard Worker }
322*38e8c45fSAndroid Build Coastguard Worker 
323*38e8c45fSAndroid Build Coastguard Worker struct DumpBufferResult {
324*38e8c45fSAndroid Build Coastguard Worker     uint64_t bufferId;
325*38e8c45fSAndroid Build Coastguard Worker     std::string name;
326*38e8c45fSAndroid Build Coastguard Worker     uint64_t width;
327*38e8c45fSAndroid Build Coastguard Worker     uint64_t height;
328*38e8c45fSAndroid Build Coastguard Worker     uint64_t layerCount;
329*38e8c45fSAndroid Build Coastguard Worker     APixelFormat pixelFormatRequested;
330*38e8c45fSAndroid Build Coastguard Worker     uint32_t pixelFormatFourCC;
331*38e8c45fSAndroid Build Coastguard Worker     uint64_t pixelFormatModifier;
332*38e8c45fSAndroid Build Coastguard Worker     BufferUsage usage;
333*38e8c45fSAndroid Build Coastguard Worker     ADataspace dataspace;
334*38e8c45fSAndroid Build Coastguard Worker     uint64_t allocationSize;
335*38e8c45fSAndroid Build Coastguard Worker     uint64_t protectedContent;
336*38e8c45fSAndroid Build Coastguard Worker     ExtendableType compression;
337*38e8c45fSAndroid Build Coastguard Worker     ExtendableType interlaced;
338*38e8c45fSAndroid Build Coastguard Worker     ExtendableType chromaSiting;
339*38e8c45fSAndroid Build Coastguard Worker     std::vector<ui::PlaneLayout> planeLayouts;
340*38e8c45fSAndroid Build Coastguard Worker };
341*38e8c45fSAndroid Build Coastguard Worker 
342*38e8c45fSAndroid Build Coastguard Worker #define DECODE_TO(name, output)                                                                 \
343*38e8c45fSAndroid Build Coastguard Worker     case StandardMetadataType::name:                                                            \
344*38e8c45fSAndroid Build Coastguard Worker         output = StandardMetadata<StandardMetadataType::name>::value ::decode(value, valueSize) \
345*38e8c45fSAndroid Build Coastguard Worker                          .value();                                                              \
346*38e8c45fSAndroid Build Coastguard Worker         break
347*38e8c45fSAndroid Build Coastguard Worker 
dumpBufferCommon(DumpBufferResult * outResult,AIMapper_MetadataType metadataType,const void * value,size_t valueSize)348*38e8c45fSAndroid Build Coastguard Worker static void dumpBufferCommon(DumpBufferResult* outResult, AIMapper_MetadataType metadataType,
349*38e8c45fSAndroid Build Coastguard Worker                              const void* value, size_t valueSize) {
350*38e8c45fSAndroid Build Coastguard Worker     if (!isStandardMetadata(metadataType)) {
351*38e8c45fSAndroid Build Coastguard Worker         return;
352*38e8c45fSAndroid Build Coastguard Worker     }
353*38e8c45fSAndroid Build Coastguard Worker     StandardMetadataType type = (StandardMetadataType)metadataType.value;
354*38e8c45fSAndroid Build Coastguard Worker     switch (type) {
355*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(BUFFER_ID, outResult->bufferId);
356*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(NAME, outResult->name);
357*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(WIDTH, outResult->width);
358*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(HEIGHT, outResult->height);
359*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(LAYER_COUNT, outResult->layerCount);
360*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(PIXEL_FORMAT_REQUESTED, outResult->pixelFormatRequested);
361*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(PIXEL_FORMAT_FOURCC, outResult->pixelFormatFourCC);
362*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(PIXEL_FORMAT_MODIFIER, outResult->pixelFormatModifier);
363*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(USAGE, outResult->usage);
364*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(DATASPACE, outResult->dataspace);
365*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(ALLOCATION_SIZE, outResult->allocationSize);
366*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(PROTECTED_CONTENT, outResult->protectedContent);
367*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(COMPRESSION, outResult->compression);
368*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(INTERLACED, outResult->interlaced);
369*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(CHROMA_SITING, outResult->chromaSiting);
370*38e8c45fSAndroid Build Coastguard Worker         DECODE_TO(PLANE_LAYOUTS, outResult->planeLayouts);
371*38e8c45fSAndroid Build Coastguard Worker         default:
372*38e8c45fSAndroid Build Coastguard Worker             break;
373*38e8c45fSAndroid Build Coastguard Worker     }
374*38e8c45fSAndroid Build Coastguard Worker }
375*38e8c45fSAndroid Build Coastguard Worker 
376*38e8c45fSAndroid Build Coastguard Worker #undef DECODE_TO
377*38e8c45fSAndroid Build Coastguard Worker 
378*38e8c45fSAndroid Build Coastguard Worker template <typename EnumT, typename = std::enable_if_t<std::is_enum<EnumT>{}>>
to_underlying(EnumT e)379*38e8c45fSAndroid Build Coastguard Worker constexpr std::underlying_type_t<EnumT> to_underlying(EnumT e) noexcept {
380*38e8c45fSAndroid Build Coastguard Worker     return static_cast<std::underlying_type_t<EnumT>>(e);
381*38e8c45fSAndroid Build Coastguard Worker }
382*38e8c45fSAndroid Build Coastguard Worker 
writeDumpToStream(const DumpBufferResult & bufferDump,std::ostream & outDump,bool less)383*38e8c45fSAndroid Build Coastguard Worker static void writeDumpToStream(const DumpBufferResult& bufferDump, std::ostream& outDump,
384*38e8c45fSAndroid Build Coastguard Worker                               bool less) {
385*38e8c45fSAndroid Build Coastguard Worker     double allocationSizeKiB = static_cast<double>(bufferDump.allocationSize) / 1024;
386*38e8c45fSAndroid Build Coastguard Worker 
387*38e8c45fSAndroid Build Coastguard Worker     outDump << "+ name:" << bufferDump.name << ", id:" << bufferDump.bufferId
388*38e8c45fSAndroid Build Coastguard Worker             << ", size:" << std::fixed << allocationSizeKiB << "KiB, w/h:" << bufferDump.width
389*38e8c45fSAndroid Build Coastguard Worker             << "x" << bufferDump.height << ", usage: 0x" << std::hex
390*38e8c45fSAndroid Build Coastguard Worker             << to_underlying(bufferDump.usage) << std::dec
391*38e8c45fSAndroid Build Coastguard Worker             << ", req fmt:" << to_underlying(bufferDump.pixelFormatRequested)
392*38e8c45fSAndroid Build Coastguard Worker             << ", fourcc/mod:" << bufferDump.pixelFormatFourCC << "/"
393*38e8c45fSAndroid Build Coastguard Worker             << bufferDump.pixelFormatModifier << ", dataspace: 0x" << std::hex
394*38e8c45fSAndroid Build Coastguard Worker             << to_underlying(bufferDump.dataspace) << std::dec << ", compressed: ";
395*38e8c45fSAndroid Build Coastguard Worker 
396*38e8c45fSAndroid Build Coastguard Worker     if (less) {
397*38e8c45fSAndroid Build Coastguard Worker         bool isCompressed = !gralloc4::isStandardCompression(bufferDump.compression) ||
398*38e8c45fSAndroid Build Coastguard Worker                 (gralloc4::getStandardCompressionValue(bufferDump.compression) !=
399*38e8c45fSAndroid Build Coastguard Worker                  ui::Compression::NONE);
400*38e8c45fSAndroid Build Coastguard Worker         outDump << std::boolalpha << isCompressed << "\n";
401*38e8c45fSAndroid Build Coastguard Worker     } else {
402*38e8c45fSAndroid Build Coastguard Worker         outDump << gralloc4::getCompressionName(bufferDump.compression) << "\n";
403*38e8c45fSAndroid Build Coastguard Worker     }
404*38e8c45fSAndroid Build Coastguard Worker 
405*38e8c45fSAndroid Build Coastguard Worker     if (!less) {
406*38e8c45fSAndroid Build Coastguard Worker         bool firstPlane = true;
407*38e8c45fSAndroid Build Coastguard Worker         for (const auto& planeLayout : bufferDump.planeLayouts) {
408*38e8c45fSAndroid Build Coastguard Worker             if (firstPlane) {
409*38e8c45fSAndroid Build Coastguard Worker                 firstPlane = false;
410*38e8c45fSAndroid Build Coastguard Worker                 outDump << "\tplanes: ";
411*38e8c45fSAndroid Build Coastguard Worker             } else {
412*38e8c45fSAndroid Build Coastguard Worker                 outDump << "\t        ";
413*38e8c45fSAndroid Build Coastguard Worker             }
414*38e8c45fSAndroid Build Coastguard Worker 
415*38e8c45fSAndroid Build Coastguard Worker             for (size_t i = 0; i < planeLayout.components.size(); i++) {
416*38e8c45fSAndroid Build Coastguard Worker                 const auto& planeLayoutComponent = planeLayout.components[i];
417*38e8c45fSAndroid Build Coastguard Worker                 outDump << gralloc4::getPlaneLayoutComponentTypeName(planeLayoutComponent.type);
418*38e8c45fSAndroid Build Coastguard Worker                 if (i < planeLayout.components.size() - 1) {
419*38e8c45fSAndroid Build Coastguard Worker                     outDump << "/";
420*38e8c45fSAndroid Build Coastguard Worker                 } else {
421*38e8c45fSAndroid Build Coastguard Worker                     outDump << ":\t";
422*38e8c45fSAndroid Build Coastguard Worker                 }
423*38e8c45fSAndroid Build Coastguard Worker             }
424*38e8c45fSAndroid Build Coastguard Worker             outDump << " w/h:" << planeLayout.widthInSamples << "x" << planeLayout.heightInSamples
425*38e8c45fSAndroid Build Coastguard Worker                     << ", stride:" << planeLayout.strideInBytes
426*38e8c45fSAndroid Build Coastguard Worker                     << " bytes, size:" << planeLayout.totalSizeInBytes;
427*38e8c45fSAndroid Build Coastguard Worker             outDump << ", inc:" << planeLayout.sampleIncrementInBits
428*38e8c45fSAndroid Build Coastguard Worker                     << " bits, subsampling w/h:" << planeLayout.horizontalSubsampling << "x"
429*38e8c45fSAndroid Build Coastguard Worker                     << planeLayout.verticalSubsampling;
430*38e8c45fSAndroid Build Coastguard Worker             outDump << "\n";
431*38e8c45fSAndroid Build Coastguard Worker         }
432*38e8c45fSAndroid Build Coastguard Worker 
433*38e8c45fSAndroid Build Coastguard Worker         outDump << "\tlayer cnt: " << bufferDump.layerCount
434*38e8c45fSAndroid Build Coastguard Worker                 << ", protected content: " << bufferDump.protectedContent
435*38e8c45fSAndroid Build Coastguard Worker                 << ", interlaced: " << gralloc4::getInterlacedName(bufferDump.interlaced)
436*38e8c45fSAndroid Build Coastguard Worker                 << ", chroma siting:" << gralloc4::getChromaSitingName(bufferDump.chromaSiting)
437*38e8c45fSAndroid Build Coastguard Worker                 << "\n";
438*38e8c45fSAndroid Build Coastguard Worker     }
439*38e8c45fSAndroid Build Coastguard Worker }
440*38e8c45fSAndroid Build Coastguard Worker 
dumpBuffer(buffer_handle_t bufferHandle,bool less) const441*38e8c45fSAndroid Build Coastguard Worker std::string Gralloc5Mapper::dumpBuffer(buffer_handle_t bufferHandle, bool less) const {
442*38e8c45fSAndroid Build Coastguard Worker     DumpBufferResult bufferInfo;
443*38e8c45fSAndroid Build Coastguard Worker     AIMapper_DumpBufferCallback dumpBuffer = [](void* contextPtr,
444*38e8c45fSAndroid Build Coastguard Worker                                                 AIMapper_MetadataType metadataType,
445*38e8c45fSAndroid Build Coastguard Worker                                                 const void* _Nonnull value, size_t valueSize) {
446*38e8c45fSAndroid Build Coastguard Worker         DumpBufferResult* context = reinterpret_cast<DumpBufferResult*>(contextPtr);
447*38e8c45fSAndroid Build Coastguard Worker         dumpBufferCommon(context, metadataType, value, valueSize);
448*38e8c45fSAndroid Build Coastguard Worker     };
449*38e8c45fSAndroid Build Coastguard Worker     AIMapper_Error error = mMapper->v5.dumpBuffer(bufferHandle, dumpBuffer, &bufferInfo);
450*38e8c45fSAndroid Build Coastguard Worker     if (error != AIMAPPER_ERROR_NONE) {
451*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Error dumping buffer: %d", error);
452*38e8c45fSAndroid Build Coastguard Worker         return std::string{};
453*38e8c45fSAndroid Build Coastguard Worker     }
454*38e8c45fSAndroid Build Coastguard Worker     std::ostringstream stream;
455*38e8c45fSAndroid Build Coastguard Worker     stream.precision(2);
456*38e8c45fSAndroid Build Coastguard Worker     writeDumpToStream(bufferInfo, stream, less);
457*38e8c45fSAndroid Build Coastguard Worker     return stream.str();
458*38e8c45fSAndroid Build Coastguard Worker }
459*38e8c45fSAndroid Build Coastguard Worker 
dumpBuffers(bool less) const460*38e8c45fSAndroid Build Coastguard Worker std::string Gralloc5Mapper::dumpBuffers(bool less) const {
461*38e8c45fSAndroid Build Coastguard Worker     class DumpAllBuffersContext {
462*38e8c45fSAndroid Build Coastguard Worker     private:
463*38e8c45fSAndroid Build Coastguard Worker         bool mHasPending = false;
464*38e8c45fSAndroid Build Coastguard Worker         DumpBufferResult mPending;
465*38e8c45fSAndroid Build Coastguard Worker         std::vector<DumpBufferResult> mResults;
466*38e8c45fSAndroid Build Coastguard Worker 
467*38e8c45fSAndroid Build Coastguard Worker     public:
468*38e8c45fSAndroid Build Coastguard Worker         DumpAllBuffersContext() { mResults.reserve(10); }
469*38e8c45fSAndroid Build Coastguard Worker 
470*38e8c45fSAndroid Build Coastguard Worker         void commit() {
471*38e8c45fSAndroid Build Coastguard Worker             if (mHasPending) {
472*38e8c45fSAndroid Build Coastguard Worker                 mResults.push_back(mPending);
473*38e8c45fSAndroid Build Coastguard Worker                 mHasPending = false;
474*38e8c45fSAndroid Build Coastguard Worker             }
475*38e8c45fSAndroid Build Coastguard Worker         }
476*38e8c45fSAndroid Build Coastguard Worker 
477*38e8c45fSAndroid Build Coastguard Worker         DumpBufferResult* write() {
478*38e8c45fSAndroid Build Coastguard Worker             mHasPending = true;
479*38e8c45fSAndroid Build Coastguard Worker             return &mPending;
480*38e8c45fSAndroid Build Coastguard Worker         }
481*38e8c45fSAndroid Build Coastguard Worker 
482*38e8c45fSAndroid Build Coastguard Worker         const std::vector<DumpBufferResult>& results() {
483*38e8c45fSAndroid Build Coastguard Worker             commit();
484*38e8c45fSAndroid Build Coastguard Worker             return mResults;
485*38e8c45fSAndroid Build Coastguard Worker         }
486*38e8c45fSAndroid Build Coastguard Worker     } context;
487*38e8c45fSAndroid Build Coastguard Worker 
488*38e8c45fSAndroid Build Coastguard Worker     AIMapper_BeginDumpBufferCallback beginCallback = [](void* contextPtr) {
489*38e8c45fSAndroid Build Coastguard Worker         DumpAllBuffersContext* context = reinterpret_cast<DumpAllBuffersContext*>(contextPtr);
490*38e8c45fSAndroid Build Coastguard Worker         context->commit();
491*38e8c45fSAndroid Build Coastguard Worker     };
492*38e8c45fSAndroid Build Coastguard Worker 
493*38e8c45fSAndroid Build Coastguard Worker     AIMapper_DumpBufferCallback dumpBuffer = [](void* contextPtr,
494*38e8c45fSAndroid Build Coastguard Worker                                                 AIMapper_MetadataType metadataType,
495*38e8c45fSAndroid Build Coastguard Worker                                                 const void* _Nonnull value, size_t valueSize) {
496*38e8c45fSAndroid Build Coastguard Worker         DumpAllBuffersContext* context = reinterpret_cast<DumpAllBuffersContext*>(contextPtr);
497*38e8c45fSAndroid Build Coastguard Worker         dumpBufferCommon(context->write(), metadataType, value, valueSize);
498*38e8c45fSAndroid Build Coastguard Worker     };
499*38e8c45fSAndroid Build Coastguard Worker 
500*38e8c45fSAndroid Build Coastguard Worker     AIMapper_Error error = mMapper->v5.dumpAllBuffers(beginCallback, dumpBuffer, &context);
501*38e8c45fSAndroid Build Coastguard Worker     if (error != AIMAPPER_ERROR_NONE) {
502*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Error dumping buffers: %d", error);
503*38e8c45fSAndroid Build Coastguard Worker         return std::string{};
504*38e8c45fSAndroid Build Coastguard Worker     }
505*38e8c45fSAndroid Build Coastguard Worker     uint64_t totalAllocationSize = 0;
506*38e8c45fSAndroid Build Coastguard Worker     std::ostringstream stream;
507*38e8c45fSAndroid Build Coastguard Worker     stream.precision(2);
508*38e8c45fSAndroid Build Coastguard Worker     stream << "Imported gralloc buffers:\n";
509*38e8c45fSAndroid Build Coastguard Worker 
510*38e8c45fSAndroid Build Coastguard Worker     for (const auto& bufferDump : context.results()) {
511*38e8c45fSAndroid Build Coastguard Worker         writeDumpToStream(bufferDump, stream, less);
512*38e8c45fSAndroid Build Coastguard Worker         totalAllocationSize += bufferDump.allocationSize;
513*38e8c45fSAndroid Build Coastguard Worker     }
514*38e8c45fSAndroid Build Coastguard Worker 
515*38e8c45fSAndroid Build Coastguard Worker     double totalAllocationSizeKiB = static_cast<double>(totalAllocationSize) / 1024;
516*38e8c45fSAndroid Build Coastguard Worker     stream << "Total imported by gralloc: " << totalAllocationSizeKiB << "KiB\n";
517*38e8c45fSAndroid Build Coastguard Worker     return stream.str();
518*38e8c45fSAndroid Build Coastguard Worker }
519*38e8c45fSAndroid Build Coastguard Worker 
importBuffer(const native_handle_t * rawHandle,buffer_handle_t * outBufferHandle) const520*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::importBuffer(const native_handle_t *rawHandle,
521*38e8c45fSAndroid Build Coastguard Worker                                       buffer_handle_t *outBufferHandle) const {
522*38e8c45fSAndroid Build Coastguard Worker     return mMapper->v5.importBuffer(rawHandle, outBufferHandle);
523*38e8c45fSAndroid Build Coastguard Worker }
524*38e8c45fSAndroid Build Coastguard Worker 
freeBuffer(buffer_handle_t bufferHandle) const525*38e8c45fSAndroid Build Coastguard Worker void Gralloc5Mapper::freeBuffer(buffer_handle_t bufferHandle) const {
526*38e8c45fSAndroid Build Coastguard Worker     mMapper->v5.freeBuffer(bufferHandle);
527*38e8c45fSAndroid Build Coastguard Worker }
528*38e8c45fSAndroid Build Coastguard Worker 
validateBufferSize(buffer_handle_t bufferHandle,uint32_t width,uint32_t height,PixelFormat format,uint32_t layerCount,uint64_t usage,uint32_t stride) const529*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::validateBufferSize(buffer_handle_t bufferHandle, uint32_t width,
530*38e8c45fSAndroid Build Coastguard Worker                                             uint32_t height, PixelFormat format,
531*38e8c45fSAndroid Build Coastguard Worker                                             uint32_t layerCount, uint64_t usage,
532*38e8c45fSAndroid Build Coastguard Worker                                             uint32_t stride) const {
533*38e8c45fSAndroid Build Coastguard Worker     {
534*38e8c45fSAndroid Build Coastguard Worker         auto value = getStandardMetadata<StandardMetadataType::WIDTH>(mMapper, bufferHandle);
535*38e8c45fSAndroid Build Coastguard Worker         if (width != value) {
536*38e8c45fSAndroid Build Coastguard Worker             ALOGW("Width didn't match, expected %d got %" PRId64, width, value.value_or(-1));
537*38e8c45fSAndroid Build Coastguard Worker             return BAD_VALUE;
538*38e8c45fSAndroid Build Coastguard Worker         }
539*38e8c45fSAndroid Build Coastguard Worker     }
540*38e8c45fSAndroid Build Coastguard Worker     {
541*38e8c45fSAndroid Build Coastguard Worker         auto value = getStandardMetadata<StandardMetadataType::HEIGHT>(mMapper, bufferHandle);
542*38e8c45fSAndroid Build Coastguard Worker         if (height != value) {
543*38e8c45fSAndroid Build Coastguard Worker             ALOGW("Height didn't match, expected %d got %" PRId64, height, value.value_or(-1));
544*38e8c45fSAndroid Build Coastguard Worker             return BAD_VALUE;
545*38e8c45fSAndroid Build Coastguard Worker         }
546*38e8c45fSAndroid Build Coastguard Worker     }
547*38e8c45fSAndroid Build Coastguard Worker     {
548*38e8c45fSAndroid Build Coastguard Worker         auto expected = static_cast<APixelFormat>(format);
549*38e8c45fSAndroid Build Coastguard Worker         if (expected != APixelFormat::IMPLEMENTATION_DEFINED) {
550*38e8c45fSAndroid Build Coastguard Worker             auto value =
551*38e8c45fSAndroid Build Coastguard Worker                     getStandardMetadata<StandardMetadataType::PIXEL_FORMAT_REQUESTED>(mMapper,
552*38e8c45fSAndroid Build Coastguard Worker                                                                                       bufferHandle);
553*38e8c45fSAndroid Build Coastguard Worker             if (expected != value) {
554*38e8c45fSAndroid Build Coastguard Worker                 ALOGW("Format didn't match, expected %d got %s", format,
555*38e8c45fSAndroid Build Coastguard Worker                       value.has_value() ? toString(*value).c_str() : "<null>");
556*38e8c45fSAndroid Build Coastguard Worker                 return BAD_VALUE;
557*38e8c45fSAndroid Build Coastguard Worker             }
558*38e8c45fSAndroid Build Coastguard Worker         }
559*38e8c45fSAndroid Build Coastguard Worker     }
560*38e8c45fSAndroid Build Coastguard Worker     {
561*38e8c45fSAndroid Build Coastguard Worker         auto value = getStandardMetadata<StandardMetadataType::LAYER_COUNT>(mMapper, bufferHandle);
562*38e8c45fSAndroid Build Coastguard Worker         if (layerCount != value) {
563*38e8c45fSAndroid Build Coastguard Worker             ALOGW("Layer count didn't match, expected %d got %" PRId64, layerCount,
564*38e8c45fSAndroid Build Coastguard Worker                   value.value_or(-1));
565*38e8c45fSAndroid Build Coastguard Worker             return BAD_VALUE;
566*38e8c45fSAndroid Build Coastguard Worker         }
567*38e8c45fSAndroid Build Coastguard Worker     }
568*38e8c45fSAndroid Build Coastguard Worker     // TODO: This can false-positive fail if the allocator adjusted the USAGE bits internally
569*38e8c45fSAndroid Build Coastguard Worker     //       Investigate further & re-enable or remove, but for now ignoring usage should be OK
570*38e8c45fSAndroid Build Coastguard Worker     (void)usage;
571*38e8c45fSAndroid Build Coastguard Worker     // {
572*38e8c45fSAndroid Build Coastguard Worker     //     auto value = getStandardMetadata<StandardMetadataType::USAGE>(mMapper, bufferHandle);
573*38e8c45fSAndroid Build Coastguard Worker     //     if (static_cast<BufferUsage>(usage) != value) {
574*38e8c45fSAndroid Build Coastguard Worker     //         ALOGW("Usage didn't match, expected %" PRIu64 " got %" PRId64, usage,
575*38e8c45fSAndroid Build Coastguard Worker     //               static_cast<int64_t>(value.value_or(BufferUsage::CPU_READ_NEVER)));
576*38e8c45fSAndroid Build Coastguard Worker     //         return BAD_VALUE;
577*38e8c45fSAndroid Build Coastguard Worker     //     }
578*38e8c45fSAndroid Build Coastguard Worker     // }
579*38e8c45fSAndroid Build Coastguard Worker     {
580*38e8c45fSAndroid Build Coastguard Worker         auto value = getStandardMetadata<StandardMetadataType::STRIDE>(mMapper, bufferHandle);
581*38e8c45fSAndroid Build Coastguard Worker         if (stride != value) {
582*38e8c45fSAndroid Build Coastguard Worker             ALOGW("Stride didn't match, expected %" PRIu32 " got %" PRId32, stride,
583*38e8c45fSAndroid Build Coastguard Worker                   value.value_or(-1));
584*38e8c45fSAndroid Build Coastguard Worker             return BAD_VALUE;
585*38e8c45fSAndroid Build Coastguard Worker         }
586*38e8c45fSAndroid Build Coastguard Worker     }
587*38e8c45fSAndroid Build Coastguard Worker     return OK;
588*38e8c45fSAndroid Build Coastguard Worker }
589*38e8c45fSAndroid Build Coastguard Worker 
getTransportSize(buffer_handle_t bufferHandle,uint32_t * outNumFds,uint32_t * outNumInts) const590*38e8c45fSAndroid Build Coastguard Worker void Gralloc5Mapper::getTransportSize(buffer_handle_t bufferHandle, uint32_t *outNumFds,
591*38e8c45fSAndroid Build Coastguard Worker                                       uint32_t *outNumInts) const {
592*38e8c45fSAndroid Build Coastguard Worker     mMapper->v5.getTransportSize(bufferHandle, outNumFds, outNumInts);
593*38e8c45fSAndroid Build Coastguard Worker }
594*38e8c45fSAndroid Build Coastguard Worker 
lock(buffer_handle_t bufferHandle,uint64_t usage,const Rect & bounds,int acquireFence,void ** outData,int32_t * outBytesPerPixel,int32_t * outBytesPerStride) const595*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect &bounds,
596*38e8c45fSAndroid Build Coastguard Worker                               int acquireFence, void **outData, int32_t *outBytesPerPixel,
597*38e8c45fSAndroid Build Coastguard Worker                               int32_t *outBytesPerStride) const {
598*38e8c45fSAndroid Build Coastguard Worker     if (outBytesPerPixel) *outBytesPerPixel = -1;
599*38e8c45fSAndroid Build Coastguard Worker     if (outBytesPerStride) *outBytesPerStride = -1;
600*38e8c45fSAndroid Build Coastguard Worker 
601*38e8c45fSAndroid Build Coastguard Worker     auto status = mMapper->v5.lock(bufferHandle, usage, bounds, acquireFence, outData);
602*38e8c45fSAndroid Build Coastguard Worker 
603*38e8c45fSAndroid Build Coastguard Worker     ALOGW_IF(status != AIMAPPER_ERROR_NONE, "lock(%p, ...) failed: %d", bufferHandle, status);
604*38e8c45fSAndroid Build Coastguard Worker     return static_cast<status_t>(status);
605*38e8c45fSAndroid Build Coastguard Worker }
606*38e8c45fSAndroid Build Coastguard Worker 
lock(buffer_handle_t bufferHandle,uint64_t usage,const Rect & bounds,int acquireFence,android_ycbcr * outYcbcr) const607*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::lock(buffer_handle_t bufferHandle, uint64_t usage, const Rect &bounds,
608*38e8c45fSAndroid Build Coastguard Worker                               int acquireFence, android_ycbcr *outYcbcr) const {
609*38e8c45fSAndroid Build Coastguard Worker     if (!outYcbcr) {
610*38e8c45fSAndroid Build Coastguard Worker         return BAD_VALUE;
611*38e8c45fSAndroid Build Coastguard Worker     }
612*38e8c45fSAndroid Build Coastguard Worker 
613*38e8c45fSAndroid Build Coastguard Worker     // TODO(b/262279301): Change the return type of ::unlock to unique_fd instead of int so that
614*38e8c45fSAndroid Build Coastguard Worker     //  ignoring the return value "just works" instead
615*38e8c45fSAndroid Build Coastguard Worker     auto unlock = [this](buffer_handle_t bufferHandle) {
616*38e8c45fSAndroid Build Coastguard Worker         int fence = this->unlock(bufferHandle);
617*38e8c45fSAndroid Build Coastguard Worker         if (fence != -1) {
618*38e8c45fSAndroid Build Coastguard Worker             ::close(fence);
619*38e8c45fSAndroid Build Coastguard Worker         }
620*38e8c45fSAndroid Build Coastguard Worker     };
621*38e8c45fSAndroid Build Coastguard Worker 
622*38e8c45fSAndroid Build Coastguard Worker     std::vector<ui::PlaneLayout> planeLayouts;
623*38e8c45fSAndroid Build Coastguard Worker     status_t error = getPlaneLayouts(bufferHandle, &planeLayouts);
624*38e8c45fSAndroid Build Coastguard Worker     if (error != NO_ERROR) {
625*38e8c45fSAndroid Build Coastguard Worker         return error;
626*38e8c45fSAndroid Build Coastguard Worker     }
627*38e8c45fSAndroid Build Coastguard Worker 
628*38e8c45fSAndroid Build Coastguard Worker     void *data = nullptr;
629*38e8c45fSAndroid Build Coastguard Worker     error = lock(bufferHandle, usage, bounds, acquireFence, &data, nullptr, nullptr);
630*38e8c45fSAndroid Build Coastguard Worker     if (error != NO_ERROR) {
631*38e8c45fSAndroid Build Coastguard Worker         return error;
632*38e8c45fSAndroid Build Coastguard Worker     }
633*38e8c45fSAndroid Build Coastguard Worker 
634*38e8c45fSAndroid Build Coastguard Worker     android_ycbcr ycbcr;
635*38e8c45fSAndroid Build Coastguard Worker 
636*38e8c45fSAndroid Build Coastguard Worker     ycbcr.y = nullptr;
637*38e8c45fSAndroid Build Coastguard Worker     ycbcr.cb = nullptr;
638*38e8c45fSAndroid Build Coastguard Worker     ycbcr.cr = nullptr;
639*38e8c45fSAndroid Build Coastguard Worker     ycbcr.ystride = 0;
640*38e8c45fSAndroid Build Coastguard Worker     ycbcr.cstride = 0;
641*38e8c45fSAndroid Build Coastguard Worker     ycbcr.chroma_step = 0;
642*38e8c45fSAndroid Build Coastguard Worker 
643*38e8c45fSAndroid Build Coastguard Worker     for (const auto &planeLayout : planeLayouts) {
644*38e8c45fSAndroid Build Coastguard Worker         for (const auto &planeLayoutComponent : planeLayout.components) {
645*38e8c45fSAndroid Build Coastguard Worker             if (!gralloc4::isStandardPlaneLayoutComponentType(planeLayoutComponent.type)) {
646*38e8c45fSAndroid Build Coastguard Worker                 continue;
647*38e8c45fSAndroid Build Coastguard Worker             }
648*38e8c45fSAndroid Build Coastguard Worker 
649*38e8c45fSAndroid Build Coastguard Worker             uint8_t *tmpData = static_cast<uint8_t *>(data) + planeLayout.offsetInBytes;
650*38e8c45fSAndroid Build Coastguard Worker 
651*38e8c45fSAndroid Build Coastguard Worker             // Note that `offsetInBits` may not be a multiple of 8 for packed formats (e.g. P010)
652*38e8c45fSAndroid Build Coastguard Worker             // but we still want to point to the start of the first byte.
653*38e8c45fSAndroid Build Coastguard Worker             tmpData += (planeLayoutComponent.offsetInBits / 8);
654*38e8c45fSAndroid Build Coastguard Worker 
655*38e8c45fSAndroid Build Coastguard Worker             uint64_t sampleIncrementInBytes;
656*38e8c45fSAndroid Build Coastguard Worker 
657*38e8c45fSAndroid Build Coastguard Worker             auto type = static_cast<PlaneLayoutComponentType>(planeLayoutComponent.type.value);
658*38e8c45fSAndroid Build Coastguard Worker             switch (type) {
659*38e8c45fSAndroid Build Coastguard Worker                 case PlaneLayoutComponentType::Y:
660*38e8c45fSAndroid Build Coastguard Worker                     if ((ycbcr.y != nullptr) || (planeLayout.sampleIncrementInBits % 8 != 0)) {
661*38e8c45fSAndroid Build Coastguard Worker                         unlock(bufferHandle);
662*38e8c45fSAndroid Build Coastguard Worker                         return BAD_VALUE;
663*38e8c45fSAndroid Build Coastguard Worker                     }
664*38e8c45fSAndroid Build Coastguard Worker                     ycbcr.y = tmpData;
665*38e8c45fSAndroid Build Coastguard Worker                     ycbcr.ystride = planeLayout.strideInBytes;
666*38e8c45fSAndroid Build Coastguard Worker                     break;
667*38e8c45fSAndroid Build Coastguard Worker 
668*38e8c45fSAndroid Build Coastguard Worker                 case PlaneLayoutComponentType::CB:
669*38e8c45fSAndroid Build Coastguard Worker                 case PlaneLayoutComponentType::CR:
670*38e8c45fSAndroid Build Coastguard Worker                     if (planeLayout.sampleIncrementInBits % 8 != 0) {
671*38e8c45fSAndroid Build Coastguard Worker                         unlock(bufferHandle);
672*38e8c45fSAndroid Build Coastguard Worker                         return BAD_VALUE;
673*38e8c45fSAndroid Build Coastguard Worker                     }
674*38e8c45fSAndroid Build Coastguard Worker 
675*38e8c45fSAndroid Build Coastguard Worker                     sampleIncrementInBytes = planeLayout.sampleIncrementInBits / 8;
676*38e8c45fSAndroid Build Coastguard Worker                     if ((sampleIncrementInBytes != 1) && (sampleIncrementInBytes != 2) &&
677*38e8c45fSAndroid Build Coastguard Worker                         (sampleIncrementInBytes != 4)) {
678*38e8c45fSAndroid Build Coastguard Worker                         unlock(bufferHandle);
679*38e8c45fSAndroid Build Coastguard Worker                         return BAD_VALUE;
680*38e8c45fSAndroid Build Coastguard Worker                     }
681*38e8c45fSAndroid Build Coastguard Worker 
682*38e8c45fSAndroid Build Coastguard Worker                     if (ycbcr.cstride == 0 && ycbcr.chroma_step == 0) {
683*38e8c45fSAndroid Build Coastguard Worker                         ycbcr.cstride = planeLayout.strideInBytes;
684*38e8c45fSAndroid Build Coastguard Worker                         ycbcr.chroma_step = sampleIncrementInBytes;
685*38e8c45fSAndroid Build Coastguard Worker                     } else {
686*38e8c45fSAndroid Build Coastguard Worker                         if ((static_cast<int64_t>(ycbcr.cstride) != planeLayout.strideInBytes) ||
687*38e8c45fSAndroid Build Coastguard Worker                             (ycbcr.chroma_step != sampleIncrementInBytes)) {
688*38e8c45fSAndroid Build Coastguard Worker                             unlock(bufferHandle);
689*38e8c45fSAndroid Build Coastguard Worker                             return BAD_VALUE;
690*38e8c45fSAndroid Build Coastguard Worker                         }
691*38e8c45fSAndroid Build Coastguard Worker                     }
692*38e8c45fSAndroid Build Coastguard Worker 
693*38e8c45fSAndroid Build Coastguard Worker                     if (type == PlaneLayoutComponentType::CB) {
694*38e8c45fSAndroid Build Coastguard Worker                         if (ycbcr.cb != nullptr) {
695*38e8c45fSAndroid Build Coastguard Worker                             unlock(bufferHandle);
696*38e8c45fSAndroid Build Coastguard Worker                             return BAD_VALUE;
697*38e8c45fSAndroid Build Coastguard Worker                         }
698*38e8c45fSAndroid Build Coastguard Worker                         ycbcr.cb = tmpData;
699*38e8c45fSAndroid Build Coastguard Worker                     } else {
700*38e8c45fSAndroid Build Coastguard Worker                         if (ycbcr.cr != nullptr) {
701*38e8c45fSAndroid Build Coastguard Worker                             unlock(bufferHandle);
702*38e8c45fSAndroid Build Coastguard Worker                             return BAD_VALUE;
703*38e8c45fSAndroid Build Coastguard Worker                         }
704*38e8c45fSAndroid Build Coastguard Worker                         ycbcr.cr = tmpData;
705*38e8c45fSAndroid Build Coastguard Worker                     }
706*38e8c45fSAndroid Build Coastguard Worker                     break;
707*38e8c45fSAndroid Build Coastguard Worker                 default:
708*38e8c45fSAndroid Build Coastguard Worker                     break;
709*38e8c45fSAndroid Build Coastguard Worker             };
710*38e8c45fSAndroid Build Coastguard Worker         }
711*38e8c45fSAndroid Build Coastguard Worker     }
712*38e8c45fSAndroid Build Coastguard Worker 
713*38e8c45fSAndroid Build Coastguard Worker     *outYcbcr = ycbcr;
714*38e8c45fSAndroid Build Coastguard Worker     return OK;
715*38e8c45fSAndroid Build Coastguard Worker }
716*38e8c45fSAndroid Build Coastguard Worker 
unlock(buffer_handle_t bufferHandle) const717*38e8c45fSAndroid Build Coastguard Worker int Gralloc5Mapper::unlock(buffer_handle_t bufferHandle) const {
718*38e8c45fSAndroid Build Coastguard Worker     int fence = -1;
719*38e8c45fSAndroid Build Coastguard Worker     AIMapper_Error error = mMapper->v5.unlock(bufferHandle, &fence);
720*38e8c45fSAndroid Build Coastguard Worker     if (error != AIMAPPER_ERROR_NONE) {
721*38e8c45fSAndroid Build Coastguard Worker         ALOGW("unlock failed with error %d", error);
722*38e8c45fSAndroid Build Coastguard Worker     }
723*38e8c45fSAndroid Build Coastguard Worker     return fence;
724*38e8c45fSAndroid Build Coastguard Worker }
725*38e8c45fSAndroid Build Coastguard Worker 
isSupported(uint32_t width,uint32_t height,PixelFormat format,uint32_t layerCount,uint64_t usage,bool * outSupported) const726*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::isSupported(uint32_t width, uint32_t height, PixelFormat format,
727*38e8c45fSAndroid Build Coastguard Worker                                      uint32_t layerCount, uint64_t usage,
728*38e8c45fSAndroid Build Coastguard Worker                                      bool *outSupported) const {
729*38e8c45fSAndroid Build Coastguard Worker     auto descriptorInfo = makeDescriptor("", width, height, format, layerCount, usage);
730*38e8c45fSAndroid Build Coastguard Worker     if (!descriptorInfo) {
731*38e8c45fSAndroid Build Coastguard Worker         *outSupported = false;
732*38e8c45fSAndroid Build Coastguard Worker         return OK;
733*38e8c45fSAndroid Build Coastguard Worker     }
734*38e8c45fSAndroid Build Coastguard Worker     auto status = getInstance().allocator->isSupported(*descriptorInfo, outSupported);
735*38e8c45fSAndroid Build Coastguard Worker     if (!status.isOk()) {
736*38e8c45fSAndroid Build Coastguard Worker         ALOGW("IAllocator::isSupported error %d (%s)", status.getStatus(), status.getMessage());
737*38e8c45fSAndroid Build Coastguard Worker         *outSupported = false;
738*38e8c45fSAndroid Build Coastguard Worker     }
739*38e8c45fSAndroid Build Coastguard Worker     return OK;
740*38e8c45fSAndroid Build Coastguard Worker }
741*38e8c45fSAndroid Build Coastguard Worker 
getBufferId(buffer_handle_t bufferHandle,uint64_t * outBufferId) const742*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getBufferId(buffer_handle_t bufferHandle, uint64_t *outBufferId) const {
743*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::BUFFER_ID>(mMapper, bufferHandle);
744*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
745*38e8c45fSAndroid Build Coastguard Worker         *outBufferId = *value;
746*38e8c45fSAndroid Build Coastguard Worker         return OK;
747*38e8c45fSAndroid Build Coastguard Worker     }
748*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
749*38e8c45fSAndroid Build Coastguard Worker }
750*38e8c45fSAndroid Build Coastguard Worker 
getName(buffer_handle_t bufferHandle,std::string * outName) const751*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getName(buffer_handle_t bufferHandle, std::string *outName) const {
752*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::NAME>(mMapper, bufferHandle);
753*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
754*38e8c45fSAndroid Build Coastguard Worker         *outName = *value;
755*38e8c45fSAndroid Build Coastguard Worker         return OK;
756*38e8c45fSAndroid Build Coastguard Worker     }
757*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
758*38e8c45fSAndroid Build Coastguard Worker }
759*38e8c45fSAndroid Build Coastguard Worker 
getWidth(buffer_handle_t bufferHandle,uint64_t * outWidth) const760*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getWidth(buffer_handle_t bufferHandle, uint64_t *outWidth) const {
761*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::WIDTH>(mMapper, bufferHandle);
762*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
763*38e8c45fSAndroid Build Coastguard Worker         *outWidth = *value;
764*38e8c45fSAndroid Build Coastguard Worker         return OK;
765*38e8c45fSAndroid Build Coastguard Worker     }
766*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
767*38e8c45fSAndroid Build Coastguard Worker }
768*38e8c45fSAndroid Build Coastguard Worker 
getHeight(buffer_handle_t bufferHandle,uint64_t * outHeight) const769*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getHeight(buffer_handle_t bufferHandle, uint64_t *outHeight) const {
770*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::HEIGHT>(mMapper, bufferHandle);
771*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
772*38e8c45fSAndroid Build Coastguard Worker         *outHeight = *value;
773*38e8c45fSAndroid Build Coastguard Worker         return OK;
774*38e8c45fSAndroid Build Coastguard Worker     }
775*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
776*38e8c45fSAndroid Build Coastguard Worker }
777*38e8c45fSAndroid Build Coastguard Worker 
getLayerCount(buffer_handle_t bufferHandle,uint64_t * outLayerCount) const778*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getLayerCount(buffer_handle_t bufferHandle,
779*38e8c45fSAndroid Build Coastguard Worker                                        uint64_t *outLayerCount) const {
780*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::LAYER_COUNT>(mMapper, bufferHandle);
781*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
782*38e8c45fSAndroid Build Coastguard Worker         *outLayerCount = *value;
783*38e8c45fSAndroid Build Coastguard Worker         return OK;
784*38e8c45fSAndroid Build Coastguard Worker     }
785*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
786*38e8c45fSAndroid Build Coastguard Worker }
787*38e8c45fSAndroid Build Coastguard Worker 
getPixelFormatRequested(buffer_handle_t bufferHandle,ui::PixelFormat * outPixelFormatRequested) const788*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getPixelFormatRequested(buffer_handle_t bufferHandle,
789*38e8c45fSAndroid Build Coastguard Worker                                                  ui::PixelFormat *outPixelFormatRequested) const {
790*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::PIXEL_FORMAT_REQUESTED>(mMapper,
791*38e8c45fSAndroid Build Coastguard Worker                                                                                    bufferHandle);
792*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
793*38e8c45fSAndroid Build Coastguard Worker         *outPixelFormatRequested = static_cast<ui::PixelFormat>(*value);
794*38e8c45fSAndroid Build Coastguard Worker         return OK;
795*38e8c45fSAndroid Build Coastguard Worker     }
796*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
797*38e8c45fSAndroid Build Coastguard Worker }
798*38e8c45fSAndroid Build Coastguard Worker 
getPixelFormatFourCC(buffer_handle_t bufferHandle,uint32_t * outPixelFormatFourCC) const799*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getPixelFormatFourCC(buffer_handle_t bufferHandle,
800*38e8c45fSAndroid Build Coastguard Worker                                               uint32_t *outPixelFormatFourCC) const {
801*38e8c45fSAndroid Build Coastguard Worker     auto value =
802*38e8c45fSAndroid Build Coastguard Worker             getStandardMetadata<StandardMetadataType::PIXEL_FORMAT_FOURCC>(mMapper, bufferHandle);
803*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
804*38e8c45fSAndroid Build Coastguard Worker         *outPixelFormatFourCC = *value;
805*38e8c45fSAndroid Build Coastguard Worker         return OK;
806*38e8c45fSAndroid Build Coastguard Worker     }
807*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
808*38e8c45fSAndroid Build Coastguard Worker }
809*38e8c45fSAndroid Build Coastguard Worker 
getPixelFormatModifier(buffer_handle_t bufferHandle,uint64_t * outPixelFormatModifier) const810*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getPixelFormatModifier(buffer_handle_t bufferHandle,
811*38e8c45fSAndroid Build Coastguard Worker                                                 uint64_t *outPixelFormatModifier) const {
812*38e8c45fSAndroid Build Coastguard Worker     auto value =
813*38e8c45fSAndroid Build Coastguard Worker             getStandardMetadata<StandardMetadataType::PIXEL_FORMAT_MODIFIER>(mMapper, bufferHandle);
814*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
815*38e8c45fSAndroid Build Coastguard Worker         *outPixelFormatModifier = *value;
816*38e8c45fSAndroid Build Coastguard Worker         return OK;
817*38e8c45fSAndroid Build Coastguard Worker     }
818*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
819*38e8c45fSAndroid Build Coastguard Worker }
820*38e8c45fSAndroid Build Coastguard Worker 
getUsage(buffer_handle_t bufferHandle,uint64_t * outUsage) const821*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getUsage(buffer_handle_t bufferHandle, uint64_t *outUsage) const {
822*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::USAGE>(mMapper, bufferHandle);
823*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
824*38e8c45fSAndroid Build Coastguard Worker         *outUsage = static_cast<uint64_t>(*value);
825*38e8c45fSAndroid Build Coastguard Worker         return OK;
826*38e8c45fSAndroid Build Coastguard Worker     }
827*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
828*38e8c45fSAndroid Build Coastguard Worker }
829*38e8c45fSAndroid Build Coastguard Worker 
getAllocationSize(buffer_handle_t bufferHandle,uint64_t * outAllocationSize) const830*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getAllocationSize(buffer_handle_t bufferHandle,
831*38e8c45fSAndroid Build Coastguard Worker                                            uint64_t *outAllocationSize) const {
832*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::ALLOCATION_SIZE>(mMapper, bufferHandle);
833*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
834*38e8c45fSAndroid Build Coastguard Worker         *outAllocationSize = *value;
835*38e8c45fSAndroid Build Coastguard Worker         return OK;
836*38e8c45fSAndroid Build Coastguard Worker     }
837*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
838*38e8c45fSAndroid Build Coastguard Worker }
839*38e8c45fSAndroid Build Coastguard Worker 
getProtectedContent(buffer_handle_t bufferHandle,uint64_t * outProtectedContent) const840*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getProtectedContent(buffer_handle_t bufferHandle,
841*38e8c45fSAndroid Build Coastguard Worker                                              uint64_t *outProtectedContent) const {
842*38e8c45fSAndroid Build Coastguard Worker     auto value =
843*38e8c45fSAndroid Build Coastguard Worker             getStandardMetadata<StandardMetadataType::PROTECTED_CONTENT>(mMapper, bufferHandle);
844*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
845*38e8c45fSAndroid Build Coastguard Worker         *outProtectedContent = *value;
846*38e8c45fSAndroid Build Coastguard Worker         return OK;
847*38e8c45fSAndroid Build Coastguard Worker     }
848*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
849*38e8c45fSAndroid Build Coastguard Worker }
850*38e8c45fSAndroid Build Coastguard Worker 
getCompression(buffer_handle_t bufferHandle,aidl::android::hardware::graphics::common::ExtendableType * outCompression) const851*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getCompression(
852*38e8c45fSAndroid Build Coastguard Worker         buffer_handle_t bufferHandle,
853*38e8c45fSAndroid Build Coastguard Worker         aidl::android::hardware::graphics::common::ExtendableType *outCompression) const {
854*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::COMPRESSION>(mMapper, bufferHandle);
855*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
856*38e8c45fSAndroid Build Coastguard Worker         *outCompression = *value;
857*38e8c45fSAndroid Build Coastguard Worker         return OK;
858*38e8c45fSAndroid Build Coastguard Worker     }
859*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
860*38e8c45fSAndroid Build Coastguard Worker }
861*38e8c45fSAndroid Build Coastguard Worker 
getCompression(buffer_handle_t bufferHandle,ui::Compression * outCompression) const862*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getCompression(buffer_handle_t bufferHandle,
863*38e8c45fSAndroid Build Coastguard Worker                                         ui::Compression *outCompression) const {
864*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::COMPRESSION>(mMapper, bufferHandle);
865*38e8c45fSAndroid Build Coastguard Worker     if (!value.has_value()) {
866*38e8c45fSAndroid Build Coastguard Worker         return UNKNOWN_TRANSACTION;
867*38e8c45fSAndroid Build Coastguard Worker     }
868*38e8c45fSAndroid Build Coastguard Worker     if (!gralloc4::isStandardCompression(*value)) {
869*38e8c45fSAndroid Build Coastguard Worker         return BAD_TYPE;
870*38e8c45fSAndroid Build Coastguard Worker     }
871*38e8c45fSAndroid Build Coastguard Worker     *outCompression = gralloc4::getStandardCompressionValue(*value);
872*38e8c45fSAndroid Build Coastguard Worker     return OK;
873*38e8c45fSAndroid Build Coastguard Worker }
874*38e8c45fSAndroid Build Coastguard Worker 
getInterlaced(buffer_handle_t bufferHandle,aidl::android::hardware::graphics::common::ExtendableType * outInterlaced) const875*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getInterlaced(
876*38e8c45fSAndroid Build Coastguard Worker         buffer_handle_t bufferHandle,
877*38e8c45fSAndroid Build Coastguard Worker         aidl::android::hardware::graphics::common::ExtendableType *outInterlaced) const {
878*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::INTERLACED>(mMapper, bufferHandle);
879*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
880*38e8c45fSAndroid Build Coastguard Worker         *outInterlaced = *value;
881*38e8c45fSAndroid Build Coastguard Worker         return OK;
882*38e8c45fSAndroid Build Coastguard Worker     }
883*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
884*38e8c45fSAndroid Build Coastguard Worker }
885*38e8c45fSAndroid Build Coastguard Worker 
getInterlaced(buffer_handle_t bufferHandle,ui::Interlaced * outInterlaced) const886*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getInterlaced(buffer_handle_t bufferHandle,
887*38e8c45fSAndroid Build Coastguard Worker                                        ui::Interlaced *outInterlaced) const {
888*38e8c45fSAndroid Build Coastguard Worker     if (!outInterlaced) {
889*38e8c45fSAndroid Build Coastguard Worker         return BAD_VALUE;
890*38e8c45fSAndroid Build Coastguard Worker     }
891*38e8c45fSAndroid Build Coastguard Worker     ExtendableType interlaced;
892*38e8c45fSAndroid Build Coastguard Worker     status_t error = getInterlaced(bufferHandle, &interlaced);
893*38e8c45fSAndroid Build Coastguard Worker     if (error) {
894*38e8c45fSAndroid Build Coastguard Worker         return error;
895*38e8c45fSAndroid Build Coastguard Worker     }
896*38e8c45fSAndroid Build Coastguard Worker     if (!gralloc4::isStandardInterlaced(interlaced)) {
897*38e8c45fSAndroid Build Coastguard Worker         return BAD_TYPE;
898*38e8c45fSAndroid Build Coastguard Worker     }
899*38e8c45fSAndroid Build Coastguard Worker     *outInterlaced = gralloc4::getStandardInterlacedValue(interlaced);
900*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
901*38e8c45fSAndroid Build Coastguard Worker }
902*38e8c45fSAndroid Build Coastguard Worker 
getChromaSiting(buffer_handle_t bufferHandle,aidl::android::hardware::graphics::common::ExtendableType * outChromaSiting) const903*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getChromaSiting(
904*38e8c45fSAndroid Build Coastguard Worker         buffer_handle_t bufferHandle,
905*38e8c45fSAndroid Build Coastguard Worker         aidl::android::hardware::graphics::common::ExtendableType *outChromaSiting) const {
906*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::CHROMA_SITING>(mMapper, bufferHandle);
907*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
908*38e8c45fSAndroid Build Coastguard Worker         *outChromaSiting = *value;
909*38e8c45fSAndroid Build Coastguard Worker         return OK;
910*38e8c45fSAndroid Build Coastguard Worker     }
911*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
912*38e8c45fSAndroid Build Coastguard Worker }
913*38e8c45fSAndroid Build Coastguard Worker 
getChromaSiting(buffer_handle_t bufferHandle,ui::ChromaSiting * outChromaSiting) const914*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getChromaSiting(buffer_handle_t bufferHandle,
915*38e8c45fSAndroid Build Coastguard Worker                                          ui::ChromaSiting *outChromaSiting) const {
916*38e8c45fSAndroid Build Coastguard Worker     if (!outChromaSiting) {
917*38e8c45fSAndroid Build Coastguard Worker         return BAD_VALUE;
918*38e8c45fSAndroid Build Coastguard Worker     }
919*38e8c45fSAndroid Build Coastguard Worker     ExtendableType chromaSiting;
920*38e8c45fSAndroid Build Coastguard Worker     status_t error = getChromaSiting(bufferHandle, &chromaSiting);
921*38e8c45fSAndroid Build Coastguard Worker     if (error) {
922*38e8c45fSAndroid Build Coastguard Worker         return error;
923*38e8c45fSAndroid Build Coastguard Worker     }
924*38e8c45fSAndroid Build Coastguard Worker     if (!gralloc4::isStandardChromaSiting(chromaSiting)) {
925*38e8c45fSAndroid Build Coastguard Worker         return BAD_TYPE;
926*38e8c45fSAndroid Build Coastguard Worker     }
927*38e8c45fSAndroid Build Coastguard Worker     *outChromaSiting = gralloc4::getStandardChromaSitingValue(chromaSiting);
928*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
929*38e8c45fSAndroid Build Coastguard Worker }
930*38e8c45fSAndroid Build Coastguard Worker 
getPlaneLayouts(buffer_handle_t bufferHandle,std::vector<ui::PlaneLayout> * outPlaneLayouts) const931*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getPlaneLayouts(buffer_handle_t bufferHandle,
932*38e8c45fSAndroid Build Coastguard Worker                                          std::vector<ui::PlaneLayout> *outPlaneLayouts) const {
933*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::PLANE_LAYOUTS>(mMapper, bufferHandle);
934*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
935*38e8c45fSAndroid Build Coastguard Worker         *outPlaneLayouts = *value;
936*38e8c45fSAndroid Build Coastguard Worker         return OK;
937*38e8c45fSAndroid Build Coastguard Worker     }
938*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
939*38e8c45fSAndroid Build Coastguard Worker }
940*38e8c45fSAndroid Build Coastguard Worker 
getDataspace(buffer_handle_t bufferHandle,ui::Dataspace * outDataspace) const941*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getDataspace(buffer_handle_t bufferHandle,
942*38e8c45fSAndroid Build Coastguard Worker                                       ui::Dataspace *outDataspace) const {
943*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::DATASPACE>(mMapper, bufferHandle);
944*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
945*38e8c45fSAndroid Build Coastguard Worker         *outDataspace = static_cast<ui::Dataspace>(*value);
946*38e8c45fSAndroid Build Coastguard Worker         return OK;
947*38e8c45fSAndroid Build Coastguard Worker     }
948*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
949*38e8c45fSAndroid Build Coastguard Worker }
950*38e8c45fSAndroid Build Coastguard Worker 
setDataspace(buffer_handle_t bufferHandle,ui::Dataspace dataspace) const951*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::setDataspace(buffer_handle_t bufferHandle, ui::Dataspace dataspace) const {
952*38e8c45fSAndroid Build Coastguard Worker     return setStandardMetadata<StandardMetadataType::DATASPACE>(mMapper, bufferHandle,
953*38e8c45fSAndroid Build Coastguard Worker                                                                 static_cast<Dataspace>(dataspace));
954*38e8c45fSAndroid Build Coastguard Worker }
955*38e8c45fSAndroid Build Coastguard Worker 
getBlendMode(buffer_handle_t bufferHandle,ui::BlendMode * outBlendMode) const956*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getBlendMode(buffer_handle_t bufferHandle,
957*38e8c45fSAndroid Build Coastguard Worker                                       ui::BlendMode *outBlendMode) const {
958*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::BLEND_MODE>(mMapper, bufferHandle);
959*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
960*38e8c45fSAndroid Build Coastguard Worker         *outBlendMode = static_cast<ui::BlendMode>(*value);
961*38e8c45fSAndroid Build Coastguard Worker         return OK;
962*38e8c45fSAndroid Build Coastguard Worker     }
963*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
964*38e8c45fSAndroid Build Coastguard Worker }
965*38e8c45fSAndroid Build Coastguard Worker 
getSmpte2086(buffer_handle_t bufferHandle,std::optional<ui::Smpte2086> * outSmpte2086) const966*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getSmpte2086(buffer_handle_t bufferHandle,
967*38e8c45fSAndroid Build Coastguard Worker                                       std::optional<ui::Smpte2086> *outSmpte2086) const {
968*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::SMPTE2086>(mMapper, bufferHandle);
969*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
970*38e8c45fSAndroid Build Coastguard Worker         *outSmpte2086 = *value;
971*38e8c45fSAndroid Build Coastguard Worker         return OK;
972*38e8c45fSAndroid Build Coastguard Worker     }
973*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
974*38e8c45fSAndroid Build Coastguard Worker }
975*38e8c45fSAndroid Build Coastguard Worker 
setSmpte2086(buffer_handle_t bufferHandle,std::optional<ui::Smpte2086> smpte2086) const976*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::setSmpte2086(buffer_handle_t bufferHandle,
977*38e8c45fSAndroid Build Coastguard Worker                                       std::optional<ui::Smpte2086> smpte2086) const {
978*38e8c45fSAndroid Build Coastguard Worker     return setStandardMetadata<StandardMetadataType::SMPTE2086>(mMapper, bufferHandle, smpte2086);
979*38e8c45fSAndroid Build Coastguard Worker }
980*38e8c45fSAndroid Build Coastguard Worker 
getCta861_3(buffer_handle_t bufferHandle,std::optional<ui::Cta861_3> * outCta861_3) const981*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getCta861_3(buffer_handle_t bufferHandle,
982*38e8c45fSAndroid Build Coastguard Worker                                      std::optional<ui::Cta861_3> *outCta861_3) const {
983*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::CTA861_3>(mMapper, bufferHandle);
984*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
985*38e8c45fSAndroid Build Coastguard Worker         *outCta861_3 = *value;
986*38e8c45fSAndroid Build Coastguard Worker         return OK;
987*38e8c45fSAndroid Build Coastguard Worker     }
988*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
989*38e8c45fSAndroid Build Coastguard Worker }
990*38e8c45fSAndroid Build Coastguard Worker 
setCta861_3(buffer_handle_t bufferHandle,std::optional<ui::Cta861_3> cta861_3) const991*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::setCta861_3(buffer_handle_t bufferHandle,
992*38e8c45fSAndroid Build Coastguard Worker                                      std::optional<ui::Cta861_3> cta861_3) const {
993*38e8c45fSAndroid Build Coastguard Worker     return setStandardMetadata<StandardMetadataType::CTA861_3>(mMapper, bufferHandle, cta861_3);
994*38e8c45fSAndroid Build Coastguard Worker }
995*38e8c45fSAndroid Build Coastguard Worker 
getSmpte2094_40(buffer_handle_t bufferHandle,std::optional<std::vector<uint8_t>> * outSmpte2094_40) const996*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getSmpte2094_40(
997*38e8c45fSAndroid Build Coastguard Worker         buffer_handle_t bufferHandle, std::optional<std::vector<uint8_t>> *outSmpte2094_40) const {
998*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::SMPTE2094_40>(mMapper, bufferHandle);
999*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
1000*38e8c45fSAndroid Build Coastguard Worker         *outSmpte2094_40 = std::move(*value);
1001*38e8c45fSAndroid Build Coastguard Worker         return OK;
1002*38e8c45fSAndroid Build Coastguard Worker     }
1003*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
1004*38e8c45fSAndroid Build Coastguard Worker }
1005*38e8c45fSAndroid Build Coastguard Worker 
setSmpte2094_40(buffer_handle_t bufferHandle,std::optional<std::vector<uint8_t>> smpte2094_40) const1006*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::setSmpte2094_40(buffer_handle_t bufferHandle,
1007*38e8c45fSAndroid Build Coastguard Worker                                          std::optional<std::vector<uint8_t>> smpte2094_40) const {
1008*38e8c45fSAndroid Build Coastguard Worker     return setStandardMetadata<StandardMetadataType::SMPTE2094_40>(mMapper, bufferHandle,
1009*38e8c45fSAndroid Build Coastguard Worker                                                                    smpte2094_40);
1010*38e8c45fSAndroid Build Coastguard Worker }
1011*38e8c45fSAndroid Build Coastguard Worker 
getSmpte2094_10(buffer_handle_t bufferHandle,std::optional<std::vector<uint8_t>> * outSmpte2094_10) const1012*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::getSmpte2094_10(
1013*38e8c45fSAndroid Build Coastguard Worker         buffer_handle_t bufferHandle, std::optional<std::vector<uint8_t>> *outSmpte2094_10) const {
1014*38e8c45fSAndroid Build Coastguard Worker     auto value = getStandardMetadata<StandardMetadataType::SMPTE2094_10>(mMapper, bufferHandle);
1015*38e8c45fSAndroid Build Coastguard Worker     if (value.has_value()) {
1016*38e8c45fSAndroid Build Coastguard Worker         *outSmpte2094_10 = std::move(*value);
1017*38e8c45fSAndroid Build Coastguard Worker         return OK;
1018*38e8c45fSAndroid Build Coastguard Worker     }
1019*38e8c45fSAndroid Build Coastguard Worker     return UNKNOWN_TRANSACTION;
1020*38e8c45fSAndroid Build Coastguard Worker }
1021*38e8c45fSAndroid Build Coastguard Worker 
setSmpte2094_10(buffer_handle_t bufferHandle,std::optional<std::vector<uint8_t>> smpte2094_10) const1022*38e8c45fSAndroid Build Coastguard Worker status_t Gralloc5Mapper::setSmpte2094_10(buffer_handle_t bufferHandle,
1023*38e8c45fSAndroid Build Coastguard Worker                                          std::optional<std::vector<uint8_t>> smpte2094_10) const {
1024*38e8c45fSAndroid Build Coastguard Worker     return setStandardMetadata<StandardMetadataType::SMPTE2094_10>(mMapper, bufferHandle,
1025*38e8c45fSAndroid Build Coastguard Worker                                                                    smpte2094_10);
1026*38e8c45fSAndroid Build Coastguard Worker }
1027*38e8c45fSAndroid Build Coastguard Worker 
1028*38e8c45fSAndroid Build Coastguard Worker } // namespace android